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

开启IMDSv2强制模式后Java应用无法访问AWS Secrets Manager的解决方法

解决IMDSv2强制模式下Java SDK访问Secrets Manager的凭证加载问题

以下是针对性的排查和解决步骤:

1. 先验证EC2实例的IMDSv2可用性

在EC2实例的终端执行以下命令,确认IMDSv2本身能正常获取角色凭证:

# 获取IMDSv2会话令牌
TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
# 获取关联的IAM角色名称
curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/iam/security-credentials/

如果能返回你的IAM角色名称,说明IMDSv2服务正常,问题出在SDK配置;如果报错,先检查实例的IMDSv2强制配置是否正确,以及网络是否允许访问169.254.169.254。

2. 显式配置SDK使用IMDSv2获取凭证

AWS SDK v2默认支持IMDSv2,但在某些场景下需要显式启用。修改你的Java代码,指定凭证提供者并开启IMDSv2支持:

import software.amazon.awssdk.auth.credentials.Ec2InstanceProfileCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.secretsmanager.SecretsManagerClient;

public class SecretsManagerAccessor {
    public static void main(String[] args) {
        // 配置IMDSv2专属的凭证提供者
        Ec2InstanceProfileCredentialsProvider imdsV2Credentials = 
            Ec2InstanceProfileCredentialsProvider.builder()
                .imdsClientConfig(config -> config.useImdsVersion2(true))
                .build();

        // 初始化Secrets Manager客户端
        SecretsManagerClient secretsClient = SecretsManagerClient.builder()
            .region(Region.CN_NORTH_1) // 替换为你的实例所在区域
            .credentialsProvider(imdsV2Credentials)
            .build();

        // 后续调用Secrets Manager API的逻辑,例如获取密钥
        // String secretValue = secretsClient.getSecretValue(GetSecretValueRequest.builder().secretId("your-secret-id").build()).secretString();
    }
}

3. 确保依赖完整

检查你的pom.xml,确保包含IMDS相关的依赖(secretsmanager依赖可能未自动传递引入):

<dependency>
    <groupId>software.amazon.awssdk</groupId>
    <artifactId>secretsmanager</artifactId>
    <version>2.25.7</version>
</dependency>
<!-- 添加IMDS和EC2实例凭证依赖 -->
<dependency>
    <groupId>software.amazon.awssdk</groupId>
    <artifactId>imds</artifactId>
    <version>2.25.7</version>
</dependency>
<dependency>
    <groupId>software.amazon.awssdk</groupId>
    <artifactId>ec2-instance-credentials</artifactId>
    <version>2.25.7</version>
</dependency>

4. 验证IAM角色权限与信任关系

  • 权限策略:确保附加到EC2实例的IAM角色拥有Secrets Manager的必要权限,例如:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetSecretValue",
                "secretsmanager:DescribeSecret"
            ],
            "Resource": "arn:aws:secretsmanager:你的区域:你的账号ID:secret:你的密钥名称-*"
        }
    ]
}
  • 信任策略:确认角色信任EC2服务,信任策略需包含:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "ec2.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

5. 检查网络访问限制

  • 安全组:默认允许EC2实例访问IMDS服务(169.254.169.254),无需额外配置;
  • NACL:如果配置了自定义网络访问控制列表,需确保允许入站和出站到169.254.0.0/16网段的流量。

6. 开启SDK调试日志定位问题

如果以上步骤仍未解决,开启SDK的DEBUG日志,查看凭证加载的详细过程:
以Log4j2为例,添加日志配置:

<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Logger name="software.amazon.awssdk" level="DEBUG"/>
        <Root level="INFO">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

通过日志可以看到凭证链中每个提供者的尝试结果,定位具体失败环节。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 10:46:31