我有兩個 aws 賬戶,A 和 B。賬戶 A 有一個 lambda 函式,需要訪問賬戶 B 中的 s3 存盤桶。
為了模擬這種情況,我有以下設定:
Account B(資料源)有一個作用:
arn:aws:iam::${Account_B}:role/jeff-full-s3-access-role并附有AmazonS3FullAccess政策。此角色有一個受信任的物體arn:aws:iam::${Account_A}:role/jeff-test-lambda-role
同時,arn:aws:iam::${Account_A}:role/jeff-test-lambda-role駐留在賬戶 A 中,它有一個受信任的物體lambda.amazonaws.com。我附上了以下行內政策:
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::${Account_B}:role/jeff-full-s3-access-role"
}
}
現在當我呼叫 lambda 函式(python)時:
import json
from boto3 import client
def lambda_handler(event, context):
conn = client('s3') # again assumes boto.cfg setup, assume AWS S3
for key in conn.list_objects(Bucket='Bucket_in_Account_B')['Contents']:
print(key['Key'])
return {}
但得到以下錯誤:
{
"errorMessage": "An error occurred (AccessDenied) when calling the ListObjects operation: Access Denied",
"errorType": "ClientError",
"stackTrace": [
" File \"/var/task/lambda_function.py\", line 6, in lambda_handler\n for key in conn.list_objects(Bucket='Bucket_in_Account_B')['Contents']:\n",
" File \"/var/runtime/botocore/client.py\", line 386, in _api_call\n return self._make_api_call(operation_name, kwargs)\n",
" File \"/var/runtime/botocore/client.py\", line 705, in _make_api_call\n raise error_class(parsed_response, operation_name)\n"
]
}
有誰知道這不起作用的原因?這篇文章可能有用,但它是幾年前的事了。我想知道是否有辦法在不使用存盤桶策略的情況下實作這一目標。
謝謝!
uj5u.com熱心網友回復:
滿足您的要求的最簡單方法是在賬戶 B 中的存盤桶上添加存盤桶策略,該策略允許從賬戶 A 中的 AWS Lambda 函式使用的 IAM 角色進行訪問。這避免了承擔角色的任何要求。
至于您當前的代碼,它失敗了,因為您的程式需要呼叫assume_role()以從帳戶 B 獲取憑據。然后它需要使用這些憑據創建一個新boto3.client()物件,以便在訪問帳戶 B 中的資源時使用。例如,請參閱:boto - AWS:Boto3:AssumeRole 示例,其中包括角色使用 - 代碼日志
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/422514.html
標籤:
