如何在未配置AWS凭证的情况下通过IAM角色运行Jar文件?
排查与解决步骤
检查Jar的AWS SDK版本
确保Jar依赖的AWS SDK版本支持自动获取EC2实例IAM角色的临时凭证。旧版本SDK可能需要显式配置默认凭证链,避免代码中硬编码凭证或自定义凭证提供者,否则会跳过实例角色的凭证获取流程。验证实例元数据访问权限
确认运行Jar的Rundeck进程(通常是rundeck用户)能访问EC2实例元数据服务(IMDS,地址169.254.169.254)。检查是否有防火墙规则、SELinux策略限制了该地址的访问,或者进程的网络权限被限制。确认默认凭证链优先级
Jar代码不能显式设置AWS凭证,需让SDK遵循默认凭证链:环境变量→系统属性→实例元数据(IAM角色)。可添加JVM调试参数追踪凭证获取流程:java -Daws.sdk.debug=true -jar your-app.jar <EC2实例ID> <堆栈名称>查看日志是否走到实例元数据获取步骤。
清理Rundeck任务的AWS环境变量
检查Rundeck任务配置的“环境变量”部分,确保没有设置AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY这类变量,它们会覆盖实例角色的凭证。验证IAM角色权限
确认Rundeck使用的IAM角色拥有Jar所需的全部权限(如ec2:RunInstances、cloudformation:CreateStack等)。可在EC2实例上用AWS CLI模拟Jar操作,验证权限是否足够:aws ec2 run-instances --image-id <镜像ID> --instance-type t2.micro aws cloudformation create-stack --stack-name <测试堆栈名> --template-body file://<测试模板路径>适配Rundeck 2.6.9的临时解决方案
由于该版本较旧,可能存在子进程无法继承实例角色的问题,可手动获取临时凭证后运行Jar:# 获取实例角色的临时凭证 CREDS=$(curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/<你的IAM角色名>) export AWS_ACCESS_KEY_ID=$(echo $CREDS | jq -r '.AccessKeyId') export AWS_SECRET_ACCESS_KEY=$(echo $CREDS | jq -r '.SecretAccessKey') export AWS_SESSION_TOKEN=$(echo $CREDS | jq -r '.Token') # 执行Jar文件 java -jar your-app.jar <EC2实例ID> <堆栈名称>替换
<你的IAM角色名>为实际角色名称,并确保实例已安装jq工具。
内容的提问来源于stack exchange,提问作者Vanaan

