【问题标题】:How to connect with DynamoDB using WebIdentityTokenFileCredentialsProvider如何使用 WebIdentityTokenFileCredentialsProvider 连接 DynamoDB
【发布时间】:2022-01-25 00:53:21
【问题描述】:

我有访问密钥、密钥、区域和 DynamoDB 端点,我可以通过它们连接到数据库,并且我已将配置保存在 application.properties 文件中。现在的要求是不要将访问密钥和秘密密钥保留在 application.properties 文件中并遵循Web identity token from AWS STS。我已从 application.properties 文件中删除了访问密钥和机密,并具有以下配置。当我启动应用程序时,我收到以下消息

考虑在您的配置中定义“com.amazonaws.services.dynamodbv2.AmazonDynamoDB”类型的 bean。

import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperConfig;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperConfig.DefaultTableNameResolver;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperConfig.TableNameOverride;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTypeConverterFactory;
import org.socialsignin.spring.data.dynamodb.repository.config.EnableDynamoDBRepositories;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import software.amazon.awssdk.auth.credentials.WebIdentityTokenFileCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;

@Configuration
@EnableDynamoDBRepositories(dynamoDBMapperConfigRef = "dynamoDBMapperConfig", basePackages = "com.xyz.repository")
public class DynamoDBConfiguration {

  @Value("${aws.dynamodb.endpoint}")
  private String endpoint;

  @Value("${aws.region}")
  private String region;

  @Value("${aws.dynamodb.table.name}")
  private String tableName;

  @Bean
  public DynamoDBMapperConfig dynamoDBMapperConfig(TableNameOverride tableNameOverrider) {
    DynamoDBMapperConfig.Builder builder = new DynamoDBMapperConfig.Builder();
    builder.withTypeConverterFactory(DynamoDBTypeConverterFactory.standard());
    builder.withTableNameResolver(DefaultTableNameResolver.INSTANCE);
    builder.withTableNameOverride(tableNameOverrider());
    return builder.build();
  }

  @Bean
  public TableNameOverride tableNameOverrider() {
    return TableNameOverride.withTableNamePrefix(tableName);
  }

  @Bean
  public DynamoDbClient amazonDynamoDB() {
    return DynamoDbClient.builder()
        .region(Region.of(region))
        .credentialsProvider(WebIdentityTokenFileCredentialsProvider.create())
        .build();
  }

} 

在 pom.xml 中,我有以下与 AWS 相关的依赖项。

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>software.amazon.awssdk</groupId>
                <artifactId>bom</artifactId>
                <version>2.15.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
</dependencyManagement>

        <dependency>
            <groupId>io.github.boostchicken</groupId>
            <artifactId>spring-data-dynamodb</artifactId>
            <version>5.2.5</version>
        </dependency>
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>dynamodb</artifactId>
        </dependency>
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>sts</artifactId>
        </dependency> 

【问题讨论】:

  • 您是否在 EC2 实例上运行此应用程序?实例已附加 IAM 角色?
  • 您好@OmarRosadio,不,我在本地运行应用程序并使用aws configure 配置密钥。我需要将应用程序部署到 EC2 并从那里检查吗?如果是,是否有任何可能的方法在本地进行测试?谢谢
  • Credentials Provider 类能够从 env vars、aws 配置文件或附加到实例的角色中读取访问密钥和秘密访问密钥。您提到了 STS 和 Web Identity Token,您需要从另一个帐户承担角色吗?
  • @OmarRosadio,您需要从另一个帐户担任角色吗?您能否添加更多详细信息我不确定您需要哪些信息。早些时候,我能够使用访问密钥和密钥连接到数据库,但是当我更改为 WebIdentityTokenFileCredentialsProvider 时无法这样做

标签: java spring amazon-web-services spring-boot amazon-dynamodb


【解决方案1】:

您的 Java 代码中存在更多的信任问题。更大的问题是你混淆了 V1 和 V2。

Java DynamoDB V1 API 是:

com.amazonaws.services.dynamodbv2.*

Java DyanamoDB V2 API 是:

software.amazon.awssdk.services.dynamodb.*

现在您的 POM 文件引用了 V2 API:

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>software.amazon.awssdk</groupId>
                <artifactId>bom</artifactId>
                <version>2.15.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
</dependencyManagement>

您不应混淆 V1 和 V2。您将 V2 用于服务客户端,将 V1 用于 DynamoDBMapperConfig 对象。这不是好的做法,也不会奏效。

摆脱 V1 API 并仅替换为 V2 API。您似乎想使用 DynamoDBMapper 功能。对于 V2,这现在是增强客户端的一部分。

Using the DynamoDB Enhanced Client in the AWS SDK for Java 2.x

要查看向您展示如何使用适用于 Java V2 的 AWS 开发工具包(包括增强型客户端)构建 Spring BOOT 应用程序的 AWS 教程,请参阅:

Creating the Amazon DynamoDB web application item tracker

在本教程中,EnvironmentVariableCredentialsProvider 用于处理 AWS 键值。

【讨论】:

  • 谢谢,@smac2020。我认为com.amazonawsio.github.boostchicken 中使用,我使用它来覆盖基于前缀的表名,并使用类似于spring data jpa 的功能来保存和检索记录。
猜你喜欢
  • 2016-03-11
  • 1970-01-01
  • 2016-12-28
  • 2019-06-07
  • 1970-01-01
  • 2016-08-13
  • 1970-01-01
  • 2022-11-11
  • 2023-02-23
相关资源
最近更新 更多