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

生产环境中如何获取AWS IoT的AWSCredentialsProvider?

问题与解决方案

问题描述

我目前可通过证书和私钥连接AWS IoT Core,对应代码如下:

KeyStorePasswordPair pair = getKeyStorePasswordPair(certificateFilePath, privateKeyFilePath, keyAlgorithm);
if (pair != null) {
    awsIotClient = new AWSIotMqttClient(clientEndpoint, clientId, pair.getKeyStore(), pair.getKeyPassword());
}

该代码在开发或POC环境运行正常,但生产环境需使用AWS IAM凭证或EKS中的值。我尝试使用代码:

new AWSIotMqttClient(clientEndpoint, clientId, awsCredentialsProvider(), Regions.AP_SOUTH_1.getName());

却无法获取awsCredentialsProvider(),请提供帮助。我使用的Gradle依赖为:

implementation 'com.amazonaws:aws-iot-device-sdk-java:1.3.11'
implementation 'com.amazonaws:aws-java-sdk-iot:1.12.506'

解决方案

1. 明确凭证提供者的正确用法

你找不到awsCredentialsProvider()是因为这不是SDK提供的现成方法,需要你使用AWS SDK标准的凭证提供者类,或者自定义实现:

  • EKS环境下优先用DefaultAWSCredentialsProviderChain,它会自动从EKS绑定的IAM角色、环境变量、系统属性等优先级顺序获取凭证
  • 也可根据场景选择InstanceProfileCredentialsProvider(适用于EC2/EKS节点)、EnvironmentVariableCredentialsProvider等具体实现

2. 修正客户端初始化代码

替换为以下可直接运行的示例代码:

// 实例化标准凭证提供者
AWSCredentialsProvider credentialsProvider = DefaultAWSCredentialsProviderChain.getInstance();

// 初始化支持IAM认证的MQTT客户端
awsIotClient = new AWSIotMqttClient(clientEndpoint, clientId, credentialsProvider, Regions.AP_SOUTH_1.getName());

3. 权限与依赖检查

  • 你的依赖版本完全支持IAM认证,SDK会自动处理MQTT连接的签名逻辑
  • 确保EKS的服务账号已绑定具备iot:Connect、iot:Publish等必要权限的IAM角色

4. 自定义凭证提供者(可选)

如果需要定制凭证获取逻辑,可实现AWSCredentialsProvider接口:

public class CustomEksCredentialsProvider implements AWSCredentialsProvider {
    @Override
    public AWSCredentials getCredentials() {
        // 此处可添加从EKS ServiceAccount Token获取临时凭证的逻辑
        return new BasicAWSCredentials("tempAccessKey", "tempSecretKey");
    }

    @Override
    public void refresh() {
        // 实现凭证刷新逻辑
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 14:21:11