如何對 Amazon S3 批次操作問題進行疑難排解?

上次更新日期:2021 年 12 月 16 日

我正在嘗試為儲存貯體中存放的物件建立 Amazon Simple Storage Service (Amazon S3) 批次操作任務。但是,Amazon S3 不斷傳回錯誤,或者我的批次任務一直失敗。如何對此問題進行疑難排解?

簡短描述

如果 Amazon S3 批次操作任務遇到阻止其成功執行的問題,則該任務會失敗。例如,如果 S3 無法讀取指定的資訊清單,或者資訊清單中的物件在指定的儲存貯體中不存在,則任務會失敗。失敗的任務會產生一個或多個失敗代碼和原因。S3 批次操作會將失敗代碼和原因與任務一起存放,以便您透過請求任務的詳細資訊來檢視。您還可以在任務的完成報告中檢閱失敗代碼和原因

為阻止任務執行大量不成功的操作,Amazon S3 還會對每項批次操作任務設定 task-failure 閾值。Amazon S3 會在至少執行 1,000 項任務後監控任務失敗率。如果任務的失敗率超過 50%,則任務會失敗。若要解決此失敗,請在重新提交任務之前檢閱失敗的原因並進行更正。

以下是 Amazon S3 批次操作失敗或傳回錯誤的一些常見原因:

  • 資訊清單檔案格式 (CSV 或 JSON)
  • 資訊清單檔案會指定多個儲存貯體名稱或包含多個標題列
  • 讀取資訊清單檔案的許可
  • 批次任務區域
  • S3 庫存報告的目標儲存貯體
  • AWS Identity Access Management (IAM) 角色的信任政策
  • 建立批次任務的 IAM 角色許可
  • IAM 角色存取來源儲存貯體、S3 庫存報告和目的地儲存貯體
  • 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 批次操作,您可以複製物件修改物件的物件鎖定保留日期,或修改物件鎖定合法保留狀態。這三個批次任務操作需要資訊清單檔案中列出的所有物件也存在於同一儲存貯體。否則,您會收到以下錯誤:

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

如果您正在執行這三個批次任務操作中其中一個,請確認資訊清單檔案僅指定一個儲存貯體名稱。此外,資訊清單檔案不得包含任何標題列。例如,如果您的資訊清單檔案看起來像這樣 (有多個標題列),則 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 批次操作任務時會出現以下錯誤。

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 批次操作服務主體擔任 IAM 角色,請將信任政策連接至該角色。

以下範例信任政策委託對 Amazon S3 的存取權,同時降低與權限升級關聯的任何風險:

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

建立批次任務的 IAM 許可

在建立和執行 S3 批次操作任務之前,請授予必要的許可。如果您的 IAM 角色缺少執行 S3 批次操作任務所需的許可,則批次任務會失敗。

若要建立 S3 批次操作任務,需要 s3:CreateJob 許可。建立任務的同一實體還必須擁有 iam:PassRole 許可,才能傳遞針對批次任務指定的 IAM 角色。如需有關指定 IAM 資源的詳細資訊,請參閲 IAM JSON 政策、資源元素

IAM 角色存取來源儲存貯體、S3 庫存報告和目的地儲存貯體

檢查以確認您用於 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 操作,則在建立批次任務時可能會收到存取遭拒錯誤。

以下是明確拒絕所有 S3 動作的範例政策:

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

如果您打算套用限制性政策,可以將 S3 批次操作用於執行操作的 IAM 角色列入允許清單。例如:

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

此文章是否有幫助?


您是否需要帳單或技術支援?