Elastic Beanstalk切换至Amazon Linux 2后调用SES报MissingCredentialsError错误
排查思路
1. 先验证EC2实例层面的凭证获取能力
SSH登录到对应EB环境的EC2实例,执行命令:
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/aws-elasticbeanstalk-ec2-role
如果返回401/访问拒绝,说明实例元数据服务(IMDS)配置异常;如果正常返回包含AccessKeyId、SecretAccessKey的凭证内容,说明实例角色绑定、权限配置没有问题,问题出在应用侧的SDK或运行环境。
2. 核对AWS SDK版本兼容性
你使用的aws-sdk-rails v2.1.0依赖的aws-sdk-core如果版本低于3.110.0,默认不支持IMDSv2,而Amazon Linux 2的EB环境默认强制开启IMDSv2,旧版本SDK无法适配新的元数据服务校验规则,就会抛出凭证缺失错误。
可通过两种方式验证:
- 升级
aws-sdk-rails到最新兼容版本,重新部署后测试发信 - 临时关闭EB环境的IMDSv2强制要求:进入EB控制台→对应环境→配置→实例→实例元数据服务,关闭「IMDSv2 必需」选项,重启实例后测试功能,如果恢复正常即可确认是SDK版本兼容性问题。
3. 排查应用运行环境的凭证链优先级
Amazon Linux 2的EB环境中Rails应用默认以webapp用户运行,需要确认:
- 应用运行环境中没有被注入无效的
AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY环境变量 webapp用户的家目录下没有无效的~/.aws/credentials配置文件
以上两类配置的优先级高于实例角色凭证,存在错误配置会覆盖实例角色的凭证获取逻辑。
4. 可选调试手段
可在Rails应用中临时添加调试代码,输出凭证链获取结果,判断凭证缺失的具体环节:
Rails.logger.info Aws::CredentialProviderChain.new.resolve
如果输出为nil,说明SDK确实没有从任何凭证源拿到有效凭证,可以结合前面的步骤进一步定位。
内容的提问来源于stack exchange,提问作者stwr667
相关产品推荐
相关产品推荐

