當我使用 Lambda 函數將檔案上傳到另一個 AWS 帳戶的 Amazon S3 儲存貯體時,為什麼會出現存取遭拒的錯誤?

2 分的閱讀內容
0

當我使用 AWS Lambda 函數將檔案上傳到 Amazon Simple Storage Service (Amazon S3) 儲存貯體時,出現拒絕存取錯誤。Amazon S3 儲存貯體位於另一個 AWS 帳戶中。 

簡短描述

如果 Lambda 函數和 Amazon S3 儲存貯體之間的許可不完整或不正確,則 Lambda 會傳回拒絕存取錯誤。

若要在一個帳戶 (帳戶 1) 中的 Lambda 函數與另一個帳戶 (帳戶 2) 的 S3 儲存貯體之間設定許可,請執行以下操作:

1.    (在帳戶 1) 建立 Lambda 執行角色,以允許 Lambda 函數將物件上傳到 Amazon S3。

2.    (在帳戶 2 中) 修改 S3 儲存貯體的儲存貯體政策,以允許 Lambda 函數將物件上傳到儲存貯體。

分辨率

**重要事項:**下列解決方案需要在一個 AWS 帳戶中使用 Lambda 函數,另一個帳戶需要 S3 儲存貯體

將檔案上傳到 S3 儲存貯體的 Lambda 函數的範例程式碼 (Python 版本 3.8)

import json
            import boto3

            s3 = boto3.client('s3')

            def lambda_handler(event,context):
            bucket = 'AccountBBucketName'
            transactionToUpload = {}
            transactionToUpload['transactionId'] = '12345'
            transactionToUpload['type'] = 'PURCHASE'
            transactionToUpload['amount'] = 20
            transactionToUpload['customerId'] = 'CID-1111'

            filename = 'CID-1111'+'.json'
            uploadByteStream = bytes(json.dumps(transactionToUpload).encode('UTF-8'))
            s3.put_object(Bucket=bucket, Key=filename, Body=uploadByteStream, ACL='bucket-owner-full-control')
            print("Put Complete")

**注意:**在上傳要求中傳遞儲存貯體擁有者完整控制 ACL 之前,請確認 ACL 未在值區上停用。在 S3 儲存貯體的擁有權設定中執行此操作。如需詳細資訊,請參閱控制物件的擁有權和停用儲存貯體的 ACL

(在帳戶 1) 建立 Lambda 執行角色,以允許 Lambda 函數將物件上傳到亞馬遜 S3

1.    為您的 Lambda 函數建立 AWS 身分和存取管理 (IAM) 角色

2.    複製 IAM 角色的Amazon Resource Name (ARN)

**注意:**您必須先取得 IAM 角色的 ARN,才能更新 S3 儲存貯體的儲存貯體政策。取得 IAM 角色的 ARN 的一種方法是執行 AWS Command Line Interface (AWS CLI) get-role命令。如果您在執行 AWS CLI 命令時收到錯誤訊息,請確定您使用的是最新版本的 AWS CLI

3.    將政策附加到 IAM 角色,該角色授予將物件 (S3: PutoObject) 上傳至帳戶 2 中的儲存貯體的權限。

授予 IAM 角色 s3:PutObject 與s3:PutObjectAcl 存取權管理的 IAM 政策範例

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:PutObjectAcl"
      ],
      "Resource": "arn:aws:s3:::AccountBBucketName/*"
    }
  ]
}

4.    將 Lambda 函數的執行角色變更為您建立的 IAM 角色。如需指示,請參閱設定 Lambda 函數選項

(在帳戶 2 中) 修改 S3 儲存貯體的儲存貯體政策,以允許 Lambda 函數將物件上傳到儲存貯體

更新儲存貯體政策,使其將 Lambda 執行角色的 ARN 指定為可存取動作s3:PutObject主體

允許 Lambda 函數將物件上傳至儲存貯體的範例 S3 儲存貯體政策

注意:下列政策也會授予 Lambda 函數的執行角色權限給s3:PutObjectAcl

{
            "Version": "2012-10-17",
            "Statement": [
            {
            "Effect": "Allow",
            "Principal": {
            "AWS": "arn:aws:iam::AccountA:role/AccountARole"
            },
            "Action": [
            "s3:PutObject",
            "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::AccountBBucketName/*",
            "Condition": {
            "StringEquals": {
            "s3:x-amz-acl": "bucket-owner-full-control"
            }
            }
            }
            ]
            }

相關資訊

如何解決來自 Amazon S3的 403 存取被拒絕錯誤?

AWS 官方
AWS 官方已更新 1 年前