Amazon S3 のバッチオペレーションに関する問題のトラブルシューティング方法を教えてください。

最終更新日:2021年12月16日

バケットに保存されているオブジェクトに対して Amazon Simple Storage Service (Amazon S3)バッチオペレーションジョブを作成しようとしています。ただし、Amazon S3 がエラーを返し続けるか、バッチジョブが失敗し続けます。これを解決するにはどうすればよいですか?

簡単な説明

Amazon S3 バッチオペレーションジョブが正常に実行されない問題が発生した場合、ジョブは失敗します。たとえば、S3 が指定されたマニフェストを読み取れない場合、またはマニフェスト内のオブジェクトが指定されたバケットに存在しない場合、ジョブは失敗します。ジョブが失敗すると、1 つまたは複数の失敗コードと理由が生成されます。S3 Batch Operations はジョブとともに失敗コードと理由を保存し、ジョブの詳細をリクエストして表示できるようにします。ジョブの完了レポートで、失敗コードと失敗理由を確認することもできます。

ジョブが大量に失敗したオペレーションを実行するのを防ぐため、 Amazon S3 ではすべてのバッチオペレーションジョブにタスク失敗のしきい値を課しています。Amazon S3 は、1,000 個以上のタスクが実行された後のタスクの失敗率をモニタリングします。ジョブが失敗率の 50% を超えると、ジョブは失敗します。このエラーを解決するには、ジョブを再サブミットする前に、エラーの原因を確認して修正します。

Amazon S3 バッチオペレーションが失敗する、またはエラーが返される一般的な理由は次のとおりです。

  • マニフェストファイル形式 (CSV または JSON)
  • マニフェストファイルに複数のバケット名が指定されているか、複数のヘッダー行が含まれている
  • マニフェストファイルを読み取る権限
  • バッチジョブリージョン
  • S3 インベントリレポートのターゲットバケット
  • AWS Identity アクセス管理 (IAM) ロールの信頼ポリシー
  • バッチジョブを作成するための IAM ロールのアクセス許可
  • ソースバケット、S3 インベントリレポート、レプリケート先バケットへの IAM ロールアクセス
  • AWS Organizations のサービスコントロールポリシー(SCP)

解決方法

マニフェストファイル形式 (CSV または JSON)

Amazon S3 バッチオペレーションは CSV および JSON (S3 インベントリレポート) マニフェストファイルをサポートAmazon S3 で新しいバッチジョブを作成する場合、マニフェストファイルに対して正しいマニフェスト形式を選択または指定します。

  • Amazon S3 インベントリレポートでは、必ず CSV 形式のレポートを使用し、インベントリレポートに関連付けられている manifest.json ファイルを指定してください。
  • CSV ファイルの場合、マニフェストファイルの各行に、マニフェストオブジェクトキー、ETag、およびオプションのバージョン ID を含める必要があります。オブジェクトキーは URL エンコードされている必要があります。マニフェストには、すべてのオブジェクトのバージョン ID を含めるか、すべてのオブジェクトのバージョン ID を省略する必要があります。注:マニフェスト内のオブジェクトがバージョニング対応のバケット内にある場合は、オブジェクトのバージョン ID を指定する必要があります。そうしないと、バッチジョブが失敗することがあります。または、バッチジョブが (ジョブの作成時に存在していたオブジェクトではなく) オブジェクトの最新バージョンに適用される場合もあります。

マニフェストファイルと形式の詳細については、「マニフェストの指定」を参照してください。

マニフェストファイルに複数のバケット名が指定されているか、複数のヘッダー行が含まれている

S3 Batch Operations を使用すると、オブジェクトのコピーオブジェクトのオブジェクトロック保持日の変更、オブジェクトロックの法的保持ステータスの変更を行うことができます。これら 3 つのバッチジョブオペレーションでは、マニフェストファイルにリストされているすべてのオブジェクトが同じバケットに存在する必要があります。そうしなければ、次のようなエラーが表示されます:

Reasons for failure:
Cannot have more than 1 bucket per Job. <Job ID>

これら 3 つのバッチジョブオペレーションのいずれかを実行する場合は、マニフェストファイルでバケット名が 1 つだけ指定されていることを確認してください。また、マニフェストファイルにはヘッダー行が含まれていてはなりません。たとえば、マニフェストファイルが次のようになっている (ヘッダー行が複数ある) 場合、Amazon S3 はエラーを返します。

bucket,key
my-batch-bucket,object001.txt
my-batch-bucket,object002.txt
my-batch-bucket,object003.txt
my-batch-bucket,object004.txt

マニフェストファイルを読み取る権限

S3 バッチオペレーションジョブの作成に使用する IAM ロールに、マニフェストファイルの読み取りを許可する GetObject 権限があることを確認します。そのためには、オブジェクトのメタデータをチェックします。マニフェストファイルの暗号化に使用されている S3 オブジェクト所有権またはサポートされていない AWS KMS キーとのアクセスに不一致がないか確認します。

マニフェストファイルを読み取る権限がない場合、S3 Batch Operations ジョブを作成しようとすると次のエラーが表示されます。

AWS CLI:

Reason for failure
Reading the manifest is forbidden: AccessDenied

Amazon S3 コンソール:

Warning: Unable to get the manifest object's ETag. Specify a different object to continue

注:S3 バッチオペレーションでは、AWS KMS で暗号化された CSV インベントリレポートがサポートされています。S3 バッチオペレーションでは、AWS KMS で暗号化された CSV マニフェストファイルはサポートされていません。詳細については、「インベントリの設定」または「マニフェストの指定」を参照してください。

バッチジョブリージョン

S3 バッチオペレーションのコピージョブは、オブジェクトのコピー先バケットと同じ AWS リージョンに作成する必要があります。したがって、バッチジョブの作成時には、レプリケート先バケットと同じリージョンを必ず選択してください。たとえば、レプリケート先バケットが us-west-2 リージョンに存在する場合、バッチジョブのリージョンとして us-west-2 を選択します。

S3 インベントリレポートのターゲットバケット

S3 インベントリレポートのターゲットバケットが存在することを確認します。また、S3 バケットポリシーが s3: PutObject アクションを拒否していないことを確認します。レポートが別の AWS アカウントに配信された場合は、ターゲットバケットが IAM ロールに s3: PutObject アクションの実行を許可しているかどうかを確認します。

IAM ロールの信頼ポリシー

注:IAM ユーザーではなく IAM ロールを指定していることを確認してください。

IAM ユーザーとは異なり、 IAM ロールには、他のプリンシパルが引き受けるために満たす必要がある条件を定義する信頼ポリシーがあります。S3 Batch Operations サービスプリンシパルが IAM ロールを引き受けることを許可するには、信頼ポリシーをロールにアタッチします

以下の信頼ポリシーの例では、アクセスを Amazon S3 に委任すると同時に、特権の昇格に伴うリスクを軽減します。

{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Effect":"Allow",
         "Principal":{
            "Service":"batchoperations.s3.amazonaws.com"
         },
         "Action":"sts:AssumeRole"
      }
   ]
}

バッチジョブを作成するための IAM アクセス許可

S3 バッチオペレーションジョブを作成して実行する前に、必要なアクセス権限を付与してください。S3 バッチオペレーションジョブを実行するために必要なアクセス権限が IAM ロールにない場合、バッチジョブは失敗します。

S3 バッチオペレーションジョブを作成するには、 s3: CreateJob 権限が必要です。ジョブを作成するエンティティには、バッチジョブに指定された IAM ロールを渡すための iam: PassRole アクセス権限も必要です。IAM リソースの指定の詳細については、「IAM JSON ポリシー、リソース要素」を参照してください。

ソースバケット、S3 インベントリレポート、レプリケート先バケットへの IAM ロールアクセス

S3 バッチオペレーションに使用している IAM ロールに、バッチジョブを実行するために必要なアクセス権限があることを確認します。たとえば、コピーオペレーションの IAM ポリシーは次のようになります:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:PutObjectTagging"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::{{DestinationBucket}}/*"
        },
        {
            "Action": [
                "s3:GetObject",
                "s3:GetObjectAcl",
                "s3:GetObjectTagging",
                "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::{{SourceBucket}}",
                "arn:aws:s3:::{{SourceBucket}}/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion"
            ],
            "Resource": [
                "arn:aws:s3:::{{ManifestBucket}}/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::{{ReportBucket}}/*"
            ]
        }
    ]
}

詳細については、「Amazon S3 バッチオペレーションに対するアクセス権限の付与」を参照してください。

AWS Organizations のサービスコントロールポリシー(SCP)

AWS Organizations を使用している場合は、Amazon S3 へのアクセスを拒否する可能性のある拒否ステートメントがないことを確認します。たとえば、サービスコントロールポリシーですべての S3 アクションが明示的に拒否されている場合、バッチジョブの作成時に Access Denied エラーが表示されることがあります。

すべての S3 アクションを明示的に拒否するポリシーの例を次に示します。

{
    "Version": "2012-10-17",
    "Statement": [
        {   
            "Principal":"*",
            "Effect": "Deny",
            "Action": "s3:*",
            "Resource": "*"
        }
    ]
}

制限付きポリシーを適用する場合は、S3 Batch Operations がオペレーションの実行に使用する IAM ロールを許可リストに登録できます。例:

{
    "Version": "2012-10-17",
    "Statement": [
        {   
            "Principal":"*",
            "Effect": "Deny",
            "Action": "s3:*",
            "Resource": "*",
            "Condition": {
            "StringNotLike": {
                "aws:userId": [
                    "AROAEXAMPLEID:*",
                    "AIDAEXAMPLEID",
                    "111111111111"
                ]
            }
        }
        }
    ]
}

この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?