我正试图使用boto3从我的AWS Lambda访问另一个帐户中的S3 bucket。以下是我配置的步骤
1.在我的Lambda所在的帐户A中,我创建执行角色(Lambda-S3-SNS-VPC-role(,并将一个AmazonS3FullAccess管理策略和一个内联策略附加为:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1489133353000",
"Effect": "Allow",
"Action": [
"sts:AssumeRole"
],
"Resource": [
"arn:aws:iam::<Account-B-ID>:role/access-s3-bucket-from-lambda-in-another-acc-role"
]
}
]
}
在我的S3 bucket所在的Account-B中,我创建了一个IAM角色(access-S3-bucket-from-lambda-In-another-acc-ole(,如下所示:-附件AmazonS3FullAccess管理的政策和信任关系:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<Account-A-ID>:role/Lambda-S3-SNS-VPC-Role",
"Service": "lambda.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
此外,在账户B中的S3 Bucket中,给出了低于Bucket策略的
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<Account-A-ID>:role/Lambda-S3-SNS-VPC-Role"
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::my-bucket-in-acc-B",
"arn:aws:s3:::my-bucket-in-acc-B/*"
]
}
]
}
下面是我的Lambda函数代码:
def lambda_handler(event, context):
sts_connection = boto3.client('sts')
acct_b = sts_connection.assume_role(
RoleArn="arn:aws:iam::<Account-B-ID>:role/access-s3-bucket-from-lambda-in-another-acc-role",
RoleSessionName="cross_acct_lambda"
)
print('acct_b: ',acct_b)
但是在测试时,什么也没发生,函数超时了。请引导。
我不确定你的函数为什么超时,但我想推荐一种不同的方法:
与IAM角色Lambda-S3-SNS-VPC-Role
一起运行的Account-A
中的Lambda函数
Account-B
中的Bucket-B
,具有允许从Lambda-S3-SNS-VPC-Role
访问的Bucket策略(这与上面所示完全相同(这就是你所需要的!
不需要从Account-B
承担IAM角色,因为Bucket-B
上的Bucket策略允许Lambda函数使用的IAM角色进行访问。
考虑到您可能需要为STS API指定区域和区域端点。(https://docs.aws.amazon.com/sdkref/latest/guide/feature-sts-regionalized-endpoints.html)
def lambda_handler(event, context):
sts_connection = boto3.client('sts'
region_name='eu-west-1',
endpoint_url="https://sts.eu-west-1.amazonaws.com")
acct_b = sts_connection.assume_role(
RoleArn="arn:aws:iam::<Account-B-ID>:role/access-s3-bucket-from-lambda-in-another-acc-role",
RoleSessionName="cross_acct_lambda"
)
print('acct_b: ',acct_b)