【发布时间】:2020-05-11 17:01:10
【问题描述】:
在我的用例中,我想访问在 AWS 账户 A 中创建的 DynamoDB 表和在账户 B 中创建的 Lambda。为此,我在 Internet 上关注了许多建议我使用 AWS 承担角色功能的参考资料。
我在 Lambda 执行角色中添加了以下权限
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::aws-account-A-number:role/test-db-access"
}
}
以下是Lambda的信任关系
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": "sts:AssumeRole"
},
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::aws-account-A-number:root"
},
"Action": "sts:AssumeRole"
}
]
}
在帐户 A 中,我创建了角色 (test-db-access) 以允许其他人访问此帐户,并添加了 AmazonDynamoDBFullAccess 和 AdministratorAccess 策略。以下是我在这个账号中添加的信任关系
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::aws-account-B-number:role/sam-dev-test-
TestLambda-LambdaRole-1FH5IC18J0MYT"
},
"Action": "sts:AssumeRole"
},
{
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
以下是我添加的用于访问 Dynamo 数据库实例的 Java 代码
AssumeRoleRequest assumeRequest = new AssumeRoleRequest()
.withRoleArn("arn:aws:iam::aws-account-A-number:role/test-db-access").withRoleSessionName("cross_acct_lambda").withDurationSeconds(900);
final AWSSecurityTokenService sts = AWSSecurityTokenServiceClientBuilder.standard().withRegion("eu-west-1").build();
final Credentials credentials = sts.assumeRole(assumeRequest).getCredentials();
以下是执行 lambda 时出现的崩溃日志
{
"errorMessage": "User: arn:aws:sts::aws-account-B-number:assumed-role/sam-dev-test-TestLambda-LambdaRole-1FH5IC18J0MYT/sam-dev-test-TestLambda-LambdaFunction-73TVOBN6VXXX is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::aws-account-A-number:role/test-db-access (Service: AWSSecurityTokenService; Status Code: 403; Error Code: AccessDenied; Request ID: 100bd3a3-3f9c-11ea-b642-d3b4d9ff35de)",
"errorType": "com.amazonaws.services.securitytoken.model.AWSSecurityTokenServiceException"
}
【问题讨论】:
-
能否请您澄清一下:哪个账户拥有 IAM 用户凭证,您正在使用该账户服务?另外,您能否澄清一下您希望在账户 B 中使用 Lambda 做什么?您只想调用 Lambda 函数吗?
-
@JohnRotenstein 我希望在账户 B 中调用 lambda。此 lambda 正在尝试访问账户 A 中存在的 Dynamo DB 表。
-
@JohnRotenstein 您能否澄清一下:哪个账户拥有 IAM 用户凭证,您正在使用该账户的服务?我无法理解这个问题。我在具有 adminAccess policy 的 Account A 中创建了一个角色。我试图在我的 lambda 代码中扮演这个角色,但它抛出了 unauth 异常
标签: aws-lambda amazon-dynamodb amazon-iam aws-access-policy assume-role