我正在开发一个在 AWS 中的 EC2 实例上运行的 Java 应用程序。我的目标是使用适用于 Java 的 AWS 开发工具包和附加到 EC2 实例的 IAM 角色来访问 AWS Secrets Manager。
当 IMDSv2(实例元数据服务版本 2)可选时,一切都会顺利进行。但是,当按照建议将其设置为必需时,我遇到了问题。
具体来说,我收到错误
'software.amazon.awssdk.core.exception.SdkClientException: Unable to load credentials from any of the providers in the chain AwsCredentialsProviderChain'
。
如何解决此问题并在 IMDSv2 设置为必需的情况下成功访问 AWS Secrets Manager?
尝试附加不同的策略,创建一些自定义策略,但结果是相同的。
使用的java sdk版本:
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>secretsmanager</artifactId>
<version>2.25.7</version>
</dependency>
我做了一些更多的研究并能够弄清楚这一点。 IMDSv2 网络请求存在问题,建议将 ec2 实例上的跃点限制增加到“2”。正如注意事项部分中所述 https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html#imds-considerations
增加跳数限制: “使用modify-instance-metadata-options CLI命令并将http-put-response-hop-limit参数设置为所需的跳数。在以下示例中,跳数限制设置为2。请注意,指定http-put-response-hop-limit 的值,您还必须将 http-endpoint 设置为启用”
使用aws cli:
aws ec2 modify-instance-metadata-options \
--instance-id <instance-id> \
--http-put-response-hop-limit 2 \
--http-endpoint enabled