【问题标题】:Making a call to a Dynamo DB set up on a different account with AWS Java SDK using Roles使用角色调用 AWS Java SDK 在不同账户上设置的 Dynamo DB
【发布时间】: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


【解决方案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 代码。请参考这个post和这个repo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-16
    • 2021-03-15
    相关资源
    最近更新 更多