【发布时间】:2022-01-24 10:47:20
【问题描述】:
我在 AWS_ACCOUNT_A 上的 EC2 实例上设置了 Java 应用程序,并尝试调用已在 AWS_ACCOUNT_B 上设置的 Dynamo_DB 表。
我通过在 EC2 上假设一个实例角色来执行此操作,该角色已配置为可以访问相关的 Dynamo 数据库。该角色附加了一项政策,其中包括以下内容:
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"dynamodb:BatchGetItem",
"dynamodb:ConditionCheckItem",
"dynamodb:DescribeContributorInsights",
"dynamodb:Scan",
"dynamodb:ListTagsOfResource",
"dynamodb:Query",
"dynamodb:DescribeStream",
"dynamodb:DescribeTimeToLive",
"dynamodb:DescribeGlobalTableSettings",
"dynamodb:PartiQLSelect",
"dynamodb:DescribeTable",
"dynamodb:GetShardIterator",
"dynamodb:DescribeGlobalTable",
"dynamodb:GetItem",
"dynamodb:DescribeContinuousBackups",
"dynamodb:DescribeExport",
"dynamodb:DescribeKinesisStreamingDestination",
"dynamodb:DescribeBackup",
"dynamodb:GetRecords",
"dynamodb:DescribeTableReplicaAutoScaling"
],
"Resource": "ARN_OF_AWS_ACCOUNT_B:CORRECT_TABLE_PATH"
},
调用代码如下:
AmazonDynamoDBClientBuilder.standard()
.withCredentials(new InstanceProfileCredentialsProvider(false))
.withRegion(awsRegion)
.build();
执行此操作时,Java 应用会承担正确的角色,但调用本身会失败,因为它正在寻找不存在的 Dynamo DB 表。这是我收到的错误消息:
用户 CORRECT_INSTANCE_ROLE 无权对资源 arn:ARN_OF_AWS_ACCOUNT_A/CORRECT_TABLE_PATH
执行查询显然,问题在于它试图查询错误 AWS 账户上的资源。但是,我一直无法弄清楚如何指示我的代码查询正确的 Dynamo 路径。
任何帮助将不胜感激。
【问题讨论】:
-
您不能从账户 A 直接使用账户 B 上的 DynamoDB 表。您需要在账户 B 上创建一个角色,允许账户 A 代入该角色。然后,从账户 A 创建一个包含权限“sts:AssumeRole”的策略。此外,您需要更改代码以首先调用 STS AssumeRole API,一旦担任该角色,您将能够使用 Account B DynamoDB Table
-
感谢您的回复。根据我从文档中收集的信息,如果不提供任何凭据就无法调用 STS AssumeRole API?我想要实现的全部目的是能够在无需提供任何凭据的情况下调用该 Dynamo DB(仅使用实例角色;没有凭据)。从你写的看来这是不可能的?
-
我已经添加并回答了。您将需要进行 2 次 API 调用:首先到 STS 以从另一个帐户承担角色(生成临时凭证)。对于此调用,您不需要在代码上显式设置凭据,它是从配置(环境变量、配置文件、角色)中读取的。生成临时凭证后,您可以使用这些凭证初始化一个新的 AWS 凭证客户端,然后您就可以对 DynamoDB 进行任何所需的调用。
标签: amazon-web-services amazon-ec2 aws-java-sdk aws-roles