You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在API网关后的Lambda中实现DynamoDB客户端凭证自动刷新?

解决Lambda中STS Assume Role凭证自动刷新问题

问题场景

当前通过STS Assume Role获取IAM凭证创建DynamoDB增强客户端的实现,在Lambda容器复用场景下会遭遇凭证过期无法自动刷新的问题。原代码仅在客户端初始化阶段一次性获取凭证,并用StaticCredentialsProvider固定凭证内容,当Lambda执行环境被复用超过STS凭证有效期(默认1小时,最长12小时),后续请求会因凭证失效报错。

原DDB客户端提供代码:

@Provides
public DynamoDbEnhancedClient DdbClientProvider() {

final AWSSecurityTokenServiceClientBuilder stsClientBuilder = AWSSecurityTokenServiceClientBuilder.standard()
        .withClientConfiguration(new ClientConfiguration());

final AssumeRoleRequest assumeRoleRequest = new AssumeRoleRequest().withRoleSessionName("some.session.name");

assumeRoleRequest.setRoleArn("arnRole");

final AssumeRoleResult assumeRoleResult = stsClientBuilder.build().assumeRole(assumeRoleRequest);


final Credentials creds = assumeRoleResult.getCredentials();
final AwsSessionCredentials sessionCredentials = AwsSessionCredentials.create(creds.getAccessKeyId()
        , creds.getSecretAccessKey(), creds.getSessionToken());
final AwsCredentialsProviderChain credsProvider = AwsCredentialsProviderChain.builder()
        .credentialsProviders(StaticCredentialsProvider.create(sessionCredentials))
        .build();

final DynamoDbClient ddbClient = DynamoDbClient.builder().region(Region.US_EAST_1)
        .credentialsProvider(credsProvider).build();
final DynamoDbEnhancedClient ddbEnhancedclient =
        DynamoDbEnhancedClient.builder().dynamoDbClient(ddbClient).build();

return ddbEnhancedclient;
}

Lambda处理器代码:

public class LambdaMainHandler {

DynamoDbEnhancedClient ddbClient;

@Inject
public LambdaMainHandler(final DynamoDbEnhancedClient client) {
    this.ddbClient = client;
}

public LambdaResponse processRequest(final LambdaRequest request) {
    QueryResponse queryResponse = ddbClient.query("...");
    return LambdaResponse.builder().setContent(queryResponse.getByteBuffer()).build();
}

}

解决方案

核心是替换静态凭证提供者,使用AWS SDK内置的StsAssumeRoleCredentialsProvider——该类会自动跟踪凭证过期时间,在凭证即将失效时自动调用STS接口刷新凭证,无需手动处理刷新逻辑。

修改后的DDB客户端提供代码:

@Provides
public DynamoDbEnhancedClient DdbClientProvider() {
    // 初始化STS客户端
    AWSSecurityTokenService stsClient = AWSSecurityTokenServiceClientBuilder.standard()
            .withClientConfiguration(new ClientConfiguration())
            .build();

    // 构建自动刷新的Assume Role凭证提供者
    StsAssumeRoleCredentialsProvider credentialsProvider = StsAssumeRoleCredentialsProvider.builder()
            .stsClient(stsClient)
            .roleArn("arnRole") // 替换为你的目标角色ARN
            .roleSessionName("some.session.name") // 建议设置带标识的会话名,比如lambda-ddb-session
            // 可选:默认在凭证剩余有效期不足15分钟时触发刷新,可自定义提前量
            .refreshRequest(RefreshRequest.builder().build())
            .build();

    // 构建DynamoDbClient并关联自动刷新的凭证提供者
    DynamoDbClient ddbClient = DynamoDbClient.builder()
            .region(Region.US_EAST_1)
            .credentialsProvider(credentialsProvider)
            .build();

    return DynamoDbEnhancedClient.builder()
            .dynamoDbClient(ddbClient)
            .build();
}

关键说明

  1. 自动刷新逻辑:StsAssumeRoleCredentialsProvider内部会记录凭证过期时间,每次获取凭证时自动检查是否需要刷新,当凭证即将过期时自动发起AssumeRole请求获取新凭证。
  2. Lambda容器复用适配:Lambda执行环境复用期间,DynamoDbEnhancedClient实例会被保留,但凭证提供者会自动处理凭证更新,无需重新创建客户端。
  3. 权限要求:确保Lambda的执行角色拥有sts:AssumeRole权限,且目标角色的信任策略允许该Lambda执行角色进行AssumeRole操作。

内容的提问来源于stack exchange,提问作者alchems

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 16:09:45