Open6

S3バッチオペレーションが「Job failure rate 50% is above 50%」で失敗

dehio3dehio3

S3バッチの復元オペレーションを実行したら「Job failure rate 50% is above 50%」で失敗

  • 復元を実行しようとしたS3バケットは、ライフサイクル設定でIntelligent-Tieringクラスに設定
  • バケット内のほとんどのオブジェクトがIntelligent-Tieringクラスになっている
dehio3dehio3

S3バッチでの復元ジョブ作成コマンド

    aws s3control create-job \
    --account-id 123456789012 \
    --region ap-northeast-1 \
    --operation '{
        "S3InitiateRestoreObject": {
            "GlacierJobTier": "STANDARD"
        }
    }' \
    --report '{
        "Bucket": "arn:aws:s3:::report-bucket",
        "Format": "Report_CSV_20180820",
        "Enabled": true,
        "ReportScope": "AllTasks",
        "Prefix": "reports"
    }' \
    --manifest-generator '{
        "S3JobManifestGenerator": {
            "SourceBucket": "arn:aws:s3:::source-bucket",
            "EnableManifestOutput": true,
            "ManifestOutputLocation": {
                "Bucket": "arn:aws:s3:::manifest-output-bucket",
                "ManifestPrefix": "manifests",
                "ManifestFormat": "S3InventoryReport_CSV_20211130"
            },
            "Filter": {
                "MatchAnyStorageClass": ["INTELLIGENT_TIERING"]
            }
        }
    }' \
    --priority 10 \
    --role-arn arn:aws:iam::123456789012:role/S3BatchOperationsRole \
    --client-request-token $(uuidgen) \
    --confirmation-required \
    --description "Restore request for Intelligent-Tiering objects in Archive Access"
dehio3dehio3

Job failure rate 50% is above 50%とは?

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/batch-ops-job-status.html

ジョブが大量の失敗したオペレーションを実行するのを防ぐために、Amazon S3 はすべてのバッチ操作ジョブにタスク失敗のしきい値を設定します。ジョブが 1000 個以上のタスクを実行すると、Amazon S3 はタスクの失敗率を監視します。いずれかの時点で、失敗率 (実行されたタスクの総数に対する失敗したタスクの数の割合) が 50 パーセントを超えると、そのジョブは失敗します。

dehio3dehio3

失敗している原因

reportからresultのファイルを確認

failed,403,InvalidObjectState,Restore is not allowed for the object's current storage class (Service: Amazon S3; Status Code: 403; Error Code: InvalidObjectState; Request ID: 8KHJY3Q1QPPZ1Z5G; S3 Extended Request ID: 9ft/A27aa6F1zicaDXIwDIERX7ej6raaySvM0Xi3LNogPMR9DAciW4M4waRWAxIIR3d5qGolTHQ=; Proxy: null)

失敗したオブジェクトの情報ストレージクラスを確認

aws s3api head-object --bucket backet_name --key object_key
{
    "AcceptRanges": "bytes",
    "Expiration": "expiry-date=\"Sun, 16 Jul 2034 00:00:00 GMT\", rule-id=\"expiration_days\"",
    "LastModified": "2024-07-17T05:04:14+00:00",
    "ContentLength": 1667301,
    "ETag": "\"db132fda85277c8ec82c45b39cd77105\"",
    "ContentType": "application/x-gzip",
    "ServerSideEncryption": "AES256",
    "Metadata": {},
    "StorageClass": "INTELLIGENT_TIERING"
}

"ArchiveStatus": "ARCHIVE_ACCESS"の表示がないので、アーカイブ階層には移動しておらず、そもそも復元対象外のオブジェクトだから失敗

dehio3dehio3

復元ジョブ作成時にアーカイブ階層のみに絞れる?

ジョブ作成コマンドの以下の部分で対象のオブジェクトの条件を指定している

    --manifest-generator '{
        "S3JobManifestGenerator": {
            "SourceBucket": "arn:aws:s3:::source-bucket",
            "EnableManifestOutput": true,
            "ManifestOutputLocation": {
                "Bucket": "arn:aws:s3:::manifest-output-bucket",
                "ManifestPrefix": "manifests",
                "ManifestFormat": "S3InventoryReport_CSV_20211130"
            },
            "Filter": {
                "MatchAnyStorageClass": ["INTELLIGENT_TIERING"]
            }
        }
    }'

MatchAnyStorageClassに指定可能な条件

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/API/API_control_JobManifestGeneratorFilter.html

Valid Values: STANDARD | STANDARD_IA | ONEZONE_IA | GLACIER | INTELLIGENT_TIERING | DEEP_ARCHIVE | GLACIER_IR

INTELLIGENT_TIERINGまでしか指定できず、INTELLIGENT_TIERINGのアーカイブ階層は指定できない

dehio3dehio3

回避策の検討

S3バッチオペレーションで復元するには、アーカイブ階層のオブジェクト一覧を手動で作るか、Lambda呼び出しにして、Lambdaで1オブジェクトの階層を判断しながら復元するしかなさそう

オブジェクトの一覧を作成する方法

aws s3api

list-objectsだとStorageClassしかわからない

list-objects
{
    "Key": "app/log/dt=2023-08-31-17/202308311702_be32d37e-8d73-4ac8-aeb0-a1d87c54eb59.gz",
    "LastModified": "2023-08-31T08:03:12+00:00",
    "ETag": "\"22fa03622bd97ae265155bba2d3ff738\"",
    "Size": 132723,
    "StorageClass": "INTELLIGENT_TIERING",
    "Owner": {
        "DisplayName": "*****************",
        "ID": "5356a6974dda53ead79bcee099ecb6c9bb1e8c1bf3ff2ff29b305c576a80315d"
    }
}
list-objects-v2
{
    "Key": "app/log/dt=2023-08-31-17/202308311702_be32d37e-8d73-4ac8-aeb0-a1d87c54eb59.gz",
    "LastModified": "2023-08-31T08:03:12+00:00",
    "ETag": "\"22fa03622bd97ae265155bba2d3ff738\"",
    "Size": 132723,
    "StorageClass": "INTELLIGENT_TIERING"
}

S3インベントリ

S3インベントリだとアクセス階層の情報も取得可能
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/storage-inventory.html