【发布时间】:2020-11-11 02:22:24
【问题描述】:
我在从帐户 A 中的不同 lambda 调用帐户 B 中的 lambda 时遇到问题。
账户 A 的角色 arn 是 arn:aws:iam::ACCOUNT_A:role/DeviceApiStack-simServiceRole427DA44E-1WS2T3INIV6IP
账户 A 的角色名称是 DeviceApiStack-simServiceRole427DA44E-1WS2T3INIV6IP
账户B的角色名称是Chris-APIStack1-Q6AJ1PZ8V-LambdaCrossAccountExecut-1N3JU88L5AON1
账户 B 的角色 arn 是 arn:aws:lambda:us-east-1:462087996972:function:GetActiveDeviceIdsLambdaChris
对于帐户 A,我的 lambda 角色具有以下权限:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::ACCOUNT_B:role/Chris-APIStack1-Q6AJ1PZ8V-LambdaCrossAccountExecut-1N3JU88L5AON1",
"Effect": "Allow"
},
{
"Action": "lambda:InvokeFunction",
"Resource": "*",
"Effect": "Allow"
},
{
"Action": "lambda:InvokeFunction",
"Resource": "arn:aws:iam::ACCOUNT_B:role/Chris-APIStack1-Q6AJ1PZ8V-LambdaCrossAccountExecut-1N3JU88L5AON1",
"Effect": "Allow"
}
]
}
账户 B 中的我的 lambda 具有以下使用 cloudformation 定义的角色:
"CrossAccountExecutionRoleDemo": {
"Type": "AWS::IAM::Role",
"Properties": {
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:sts::ACCOUNT_A:role/DeviceApiStack-simServiceRole427DA44E-1WS2T3INIV6IP"
},
"Action": "sts:AssumeRole"
},
{
"Effect": "Allow",
"Principal": { "Service": ["lambda.amazonaws.com"] },
"Action": ["sts:AssumeRole"]
}
]
}
}
},
"CrossAccountExecutionPolicyDemo": {
"Type": "AWS::IAM::ManagedPolicy",
"Properties": {
"PolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "lambda:InvokeFunction",
"Resource": { "Fn::GetAtt": ["GetActiveDeviceIdsLambdaDemo", "Arn"] }
}
]
},
"Roles": [
{
"Ref": "CrossAccountExecutionRoleDemo"
}
]
}
}
当我提出以下请求时,我得到一个错误
let roleArn = 'arn:aws:iam::ACCOUNT_B:role/Chris-APIStack1-Q6AJ1PZ8V-CrossAccountExecutionRol-1ANKXFZ6YS23'
sts.assumeRole(
{
RoleArn: roleArn,
RoleSessionName: 'NightlySimService',
}, function(err, res){ ... }
错误:
' AccessDenied:用户:arn:aws:sts::ACCOUNT_A:assumed-role/DeviceApiStack-simServiceRole427DA44E-1WS2T3INIV6IP/DeviceApiStack-nightlySimServiceLambdaA51B2AFE-JSUFU8F5BZGC 无权执行:sts:AssumeRole 资源:arn:aws:iam::ACCOUNT_B:role /Chris-APIStack1-Q6AJ1PZ8V-CrossAccountExecutionRol-1ANKXFZ6YS23F '
【问题讨论】:
-
基本流程是:Account-A 中的 Lambda 函数调用 Role-B 上的 AssumeRole。然后它使用这些临时凭证在 Lambda-B 上调用
Invoke。 Role-A 不需要授予 Lambda-A 调用Invoke的权限,因为 Role-A 不会用于调用 Lamda-B。相反,需要授予 Role-B 调用 Lambda-B 的权限。
标签: amazon-web-services aws-lambda amazon-cloudformation