我在帐户A中有一个lambda函数,试图从帐户B中访问资源。创建了一个具有基本执行权限的新lambda角色,可以将日志上传到Cloud Watch。
这是我在Python 3.7中的功能代码:
import boto3
allProfiles = ['account2']
def lambda_handler(event, context):
sts_connection = boto3.client('sts')
acct_b = sts_connection.assume_role(
RoleArn="arn:aws:iam::2222222222:role/role-on-source-account",
RoleSessionName="account2"
)
for profiles in allProfiles:
print("\nusing profile %s" % profiles)
newMethod..
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
还按照文档https://aws.amazon.com/premiumsupport/knowledge-center/lambda-function-assume-iam-role/
中所述修改了帐户B中假定角色的信任策略。错误:调用AssumeRole时发生错误(AccessDenied) 操作:用户: arn:aws:sts :: 11111111:假定角色/ lambda-role / lambda函数不 授权执行:资源上的sts:AssumeRole: arn:aws:iam :: 2222222222:role / role-on-source-account“
注意:我可以在本地成功运行此代码,但不能在lambda中运行此代码。
答案 0 :(得分:3)
创建了一个具有基本执行权限的新lambda角色,可以将日志上传到Cloud Watch
lambda的基本执行角色还不够。您需要明确允许您的功能为AssumeRole
。执行角色中的以下语句应有所帮助:
{
"Effect": "Allow",
"Action": [
"sts:AssumeRole"
],
"Resource": [
"arn:aws:iam::2222222222:role/role-on-source-account"
]
}
答案 1 :(得分:1)
好的,我们所拥有的是:
您的lambda将访问的AccountB(信任帐户)中的角色,比如说是一个存储桶。
AccountBBucket
您提到您的lambda具有基本执行能力,仅凭这还不够...
解决方案:
创建一个角色“ UpdateBucket”:
您需要在AccountB(帐户ID号:999)和AccountA之间建立信任。
创建一个IAM角色,并将AccountA定义为受信任的实体,指定允许受信任的用户更新AccountB_resource(AccountBBucket)的权限策略。
我们现在在AccountA中了
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::AccountBBucket"
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::AccountBBucket/*"
}
]
}
授予访问权限:
我们现在将使用我们先前创建的角色,(UpdateBucket)角色
这需要添加到您的AccountB权限中
我们现在在AccountB中:
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::999:role/UpdateBucket"
}
}
请注意,上面的999是AccountB帐户ID,UpdateBucket是在AccountA中创建的角色
有关此处的更多信息: Delegate Access Across AWS Accounts Using IAM Roles