當我使用 AWS Lambda 函式將檔案上傳到 Amazon Simple Storage Service (Amazon S3) 儲存貯體時,出現「拒絕存取」錯誤。Amazon S3 儲存貯體位於另一個 AWS 帳戶中。
簡短說明
如果 Lambda 函式和 Amazon S3 儲存貯體之間的許可不完整或不正確,則 Lambda 會傳回「拒絕存取」錯誤。
下列解決方案需要在帳戶 A 中使用 Lambda 函式,在帳戶 B 中需要 S3 儲存貯體。
若要在帳戶 A 中的 Lambda 函式與帳戶 B 的 S3 儲存貯體之間設定許可,請完成以下步驟:
- 在帳戶 A 中建立 Lambda 執行角色,以允許 Lambda 函式將物件上傳到 Amazon S3。
- 在帳戶 B 中更新 S3 儲存貯體政策,以允許 Lambda 函式將物件上傳到儲存貯體。
解決方法
在帳戶 A 中建立 Lambda 執行角色,以允許 Lambda 函式將物件上傳到 Amazon S3
將檔案上傳到 S3 儲存貯體的 Lambda 函式的 Python 版本 3.12
import json
import boto3
s3 = boto3.client('s3')
def lambda_handler(event, context):
bucket = 'EXAMPLE-DESTINATION-BUCKET'
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)
print("Put Complete")
請完成下列步驟:
-
在帳戶 A 中為 Lambda 函式建立 AWS Identity and Access Management (IAM) 執行角色:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
-
將政策附加到 IAM 角色,該角色授予將物件上傳至帳戶 B 中的儲存貯體的權限。
授予 IAM 角色 s3:PutObject 許可的 IAM 政策範例
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::AccountBBucketName/*"
}
]
}
注意: 將 AccountBBucketName 取代為帳戶 B 的 S3 儲存貯體名稱。
-
將您的 Lambda 函式執行角色變更為您在上一個步驟中建立的 IAM 角色。如需詳細資訊,請參閱設定 Lambda 函式。
在帳戶 B 中修改 S3 儲存貯體政策,以允許 Lambda 函式將物件上傳到儲存貯體
更新儲存貯體政策,使其將 Lambda 執行角色的 ARN 指定為可存取動作s3:PutObject 的主體。
允許 Lambda 函式將物件上傳至儲存貯體的範例 S3 儲存貯體政策
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::AccountA:role/AccountARole"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::AccountBBucketName/*"
}
]
}
注意: 將 AccountBBucketName 取代為帳戶 B 的 S3 儲存貯體名稱。
檢查 AWS KMS 加密組態
如果 IAM 實體對物件具有完整許可,但仍收到「拒絕存取」錯誤,則請檢查您的組態需求。檢查該物件是否具有 AWS Key Management Service (KMS) 加密 (SSE-KMS)。使用 Amazon S3 主控台來檢視物件的屬性,並檢查物件的 SSE-KMS 資訊。
如果目的地儲存貯體使用客戶受管金鑰進行預設加密,則請檢查您的組態需求。KMS 金鑰政策必須允許您的 Lambda 執行角色執行 kms:GenerateDataKey 或 kms:Decrypt 動作。如需詳細資訊,請參閱允許存取 AWS 帳戶並啟用 IAM 政策。
如果 IAM 實體所屬的帳戶與 AWS KMS key 不同,則編輯 IAM 政策以授予 kms:GenerateDataKey 許可。例如,若要上傳 SSE-KMS 物件,您必須在金鑰政策和 IAM 政策中同時指定 kms:GenerateDataKey 許可。如需有關 IAM 使用者與 KMS 金鑰之間的跨帳戶存取權詳細資訊,請參閱允許其他帳戶的使用者使用 KMS 金鑰。
相關資訊
如何對來自 Amazon S3 的「403 拒絕存取」錯誤進行疑難排解?
如何允許 Lambda 函式存取 Amazon S3 儲存貯體?
當我將檔案上傳到具有 AWS KMS 預設加密的 Amazon S3 儲存貯體時,為什麼會收到「拒絕存取」錯誤訊息?
其他 AWS 帳戶的 IAM 使用者嘗試存取我的 Amazon S3 儲存貯體時出現「拒絕存取」錯誤,如何對此問題進行疑難排解?