S3バッチオペレーションが「Job failure rate 50% is above 50%」で失敗
S3バッチの復元オペレーションを実行したら「Job failure rate 50% is above 50%」で失敗
- 復元を実行しようとしたS3バケットは、ライフサイクル設定でIntelligent-Tieringクラスに設定
- バケット内のほとんどのオブジェクトがIntelligent-Tieringクラスになっている
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"
Job failure rate 50% is above 50%とは?
ジョブが大量の失敗したオペレーションを実行するのを防ぐために、Amazon S3 はすべてのバッチ操作ジョブにタスク失敗のしきい値を設定します。ジョブが 1000 個以上のタスクを実行すると、Amazon S3 はタスクの失敗率を監視します。いずれかの時点で、失敗率 (実行されたタスクの総数に対する失敗したタスクの数の割合) が 50 パーセントを超えると、そのジョブは失敗します。
失敗している原因
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"
の表示がないので、アーカイブ階層には移動しておらず、そもそも復元対象外のオブジェクトだから失敗
復元ジョブ作成時にアーカイブ階層のみに絞れる?
ジョブ作成コマンドの以下の部分で対象のオブジェクトの条件を指定している
--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に指定可能な条件
Valid Values: STANDARD | STANDARD_IA | ONEZONE_IA | GLACIER | INTELLIGENT_TIERING | DEEP_ARCHIVE | GLACIER_IR
INTELLIGENT_TIERING
までしか指定できず、INTELLIGENT_TIERINGのアーカイブ階層は指定できない
回避策の検討
S3バッチオペレーションで復元するには、アーカイブ階層のオブジェクト一覧を手動で作るか、Lambda呼び出しにして、Lambdaで1オブジェクトの階層を判断しながら復元するしかなさそう
オブジェクトの一覧を作成する方法
aws s3api
list-objects
だとStorageClassしかわからない
{
"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"
}
}
{
"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インベントリだとアクセス階層の情報も取得可能