0

我在 AWS_ACCOUNT_A 上的 EC2 实例上设置了一个 Java 应用程序,并试图调用已在 AWS_ACCOUNT_B 上设置的 Dynamo_DB 表。

我通过在 EC2 上假设一个已配置的实例角色来做到这一点,以便它可以访问相关的 Dynamo DB。该角色附加了一个策略,其中包括以下内容:

{
"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 路径。

任何帮助将不胜感激。

4

1 回答 1

1

要在另一个账户上调用 DynamoDB 资源,您需要执行以下操作:

  1. 在账户 A(DynamoDB 资源所有者)上创建角色
  2. 在帐户 B(您的应用程序运行的位置)上创建策略,并有权承担在步骤 1 中创建的角色
  3. 在账户 B 上创建角色并附加在步骤 2 中创建的策略
  4. 最后,在您的代码上,您首先调用 STS:AssumeRole API 以生成具有账户 A 角色权限的临时凭证(步骤 1)。要进行第一次调用(对 STS),您无需明确提供任何凭证,AWS SDK 客户端将检测来自环境变量、配置文件或附加到实例的 IAM 角色的配置。但在使用 STS 生成临时凭证后,您需要在新客户端上设置它们。

所需内容的简单图表是: 解决方案图

有一个完整的示例,其中包含进一步的分步说明和使用 AWS SDK for Java V2 的 GitHub 代码。请参考这篇文章和这个repo

于 2021-12-24T13:37:30.287 回答