使用角色调用使用 AWS Java SDK 在不同帐户上设置的 Dynamo DB
Making a call to a Dynamo DB set up on a different account with AWS Java SDK using Roles
我在 AWS_ACCOUNT_A 上的 EC2 实例上设置了一个 Java 应用程序,我正在尝试调用已设置的 Dynamo_DB table在 AWS_ACCOUNT_B.
我通过在已配置的 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 数据库 table。这是我收到的错误消息:
用户 CORRECT_INSTANCE_ROLE 无权对资源执行查询 arn:ARN_OF_AWS_ACCOUNT_A/CORRECT_TABLE_PATH
显然,问题在于它正在尝试查询错误 AWS 帐户上的资源。但是,我一直无法弄清楚如何指示我的代码查询正确的 Dynamo 路径。
如有任何帮助,我们将不胜感激。
要调用另一个帐户上的 DynamoDB 资源,您需要执行以下操作:
- 在账户 A(DynamoDB 资源所有者)上创建角色
- 为帐户 B(运行您的应用程序的地方)创建策略,允许其代入在步骤 1 中创建的角色
- 在账户 B 上创建角色并附加在步骤 2 中创建的策略
- 最后,在您的代码中,您首先调用 STS:AssumeRole API 以生成具有账户 A 角色权限的临时凭证(步骤 1)。
要进行首次调用(对 STS),您无需明确提供任何凭证,AWS SDK 客户端将从环境变量、配置文件或附加到实例的 IAM 角色中检测配置。但是在使用STS生成临时凭证后,您需要在新客户端上设置它们。
所需内容的简单图表如下:
有一个完整的示例,其中包含进一步的分步说明和 GitHub 使用 AWS SDK for Java V2 的代码。请参考这个post and this repo.
我在 AWS_ACCOUNT_A 上的 EC2 实例上设置了一个 Java 应用程序,我正在尝试调用已设置的 Dynamo_DB table在 AWS_ACCOUNT_B.
我通过在已配置的 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 数据库 table。这是我收到的错误消息:
用户 CORRECT_INSTANCE_ROLE 无权对资源执行查询 arn:ARN_OF_AWS_ACCOUNT_A/CORRECT_TABLE_PATH
显然,问题在于它正在尝试查询错误 AWS 帐户上的资源。但是,我一直无法弄清楚如何指示我的代码查询正确的 Dynamo 路径。
如有任何帮助,我们将不胜感激。
要调用另一个帐户上的 DynamoDB 资源,您需要执行以下操作:
- 在账户 A(DynamoDB 资源所有者)上创建角色
- 为帐户 B(运行您的应用程序的地方)创建策略,允许其代入在步骤 1 中创建的角色
- 在账户 B 上创建角色并附加在步骤 2 中创建的策略
- 最后,在您的代码中,您首先调用 STS:AssumeRole API 以生成具有账户 A 角色权限的临时凭证(步骤 1)。 要进行首次调用(对 STS),您无需明确提供任何凭证,AWS SDK 客户端将从环境变量、配置文件或附加到实例的 IAM 角色中检测配置。但是在使用STS生成临时凭证后,您需要在新客户端上设置它们。
所需内容的简单图表如下:
有一个完整的示例,其中包含进一步的分步说明和 GitHub 使用 AWS SDK for Java V2 的代码。请参考这个post and this repo.