Aws::Errors::MissingCredentialsError(无法在没有设置凭证的情况下签署请求)- Beanstalk,通过 IAM 角色实现安全

Posted

技术标签:

【中文标题】Aws::Errors::MissingCredentialsError(无法在没有设置凭证的情况下签署请求)- Beanstalk,通过 IAM 角色实现安全【英文标题】:Aws::Errors::MissingCredentialsError (unable to sign request without credentials set) - Beanstalk, security via IAM Roles 【发布时间】:2021-11-07 15:41:20 【问题描述】:

我的设置:

Rails 5.2 应用程序 Amazon SES,使用aws-sdk-rails gem 使用 IAM 角色进行身份验证(不是访问密钥和秘密) 弹性豆茎

我刚刚将我的 Elastic Beanstalk 环境从 Amazon Linux AMI (v1) 切换到使用 Amazon Linux 2 (v2) 的新环境。我已尽可能保持我的配置相同以维护应用程序行为,但在使用由 Amazon Simple Email Service (SES) 提供支持的 Rails 应用程序发送电子邮件时,我收到以下错误:

Aws::Errors::MissingCredentialsError (unable to sign request without credentials set)

此处的文档描述了对 AWS 开发工具包进行身份验证的多种方法,我使用的是“使用 IAM 设置凭证”方法: https://docs.aws.amazon.com/sdk-for-ruby/v3/developer-guide/setup-config.html

我正在使用 Rails gem 在这里发送 AWS SES 电子邮件: https://github.com/aws/aws-sdk-rails/tree/v2.1.0 并且鉴于我使用的是 IAM 角色,我只需要在初始化邮件程序时设置区域:

Aws::Rails.add_action_mailer_delivery_method(:aws_sdk, region: "us-west-2")

我的旧 v1 EB 环境和我的新 v2 EB 环境都创建了具有相同角色的 EC2 实例,即aws-elasticbeanstalk-ec2-role,我可以看到它附加了与我不久前设置的相同的安全策略称为“MySendEmailPolicy”。并且此策略看起来赋予了发送电子邮件的正确权限:

我想不出 AWS 会说我的凭据现在失败的任何其他原因。有什么想法吗?也许 Amazon Linux 2 有什么不同?

【问题讨论】:

AL2 有一些东西会破坏以前的部署。在昨天对我可怜的无辜监视器尖叫了几个小时之后,我今天早上刚刚完成了部署。从您的帖子中不清楚这是否适用,但如果在部署后需要访问环境变量,默认情况下它们在环境中不可用。你可以像这样添加它们:docs.aws.amazon.com/elasticbeanstalk/latest/dg/…祝你好运! @DrewJohnston 我不认为这会是原因,因为如果环境变量在应用程序启动时不正确,那么 100 的事情将会中断。但这只是 SES。话虽如此,我注意到我曾经能够eb ssh,然后是sudo -i,然后是cd /var/app/current,然后是bin/rails console,但由于没有设置ENV变量而失败(例如RACK_ENV=production等关键变量) )。运行这个可以解决这种情况:export $(cat /opt/elasticbeanstalk/deployment/env | xargs) 【参考方案1】:

这不是解决问题的 IAM 角色解决方案,而是我正在使用的一种解决方法,它至少现在可以让电子邮件正常工作。

我只是在这里使用我自己的 AWS CLI 凭证,我已通过 Elastic Beanstalk Web 控制台将其添加为环境变量:

creds = Aws::Credentials.new(ENV["AWS_ACCESS_KEY_ID"], ENV["AWS_SECRET_ACCESS_KEY"])
Aws::Rails.add_action_mailer_delivery_method(:aws_sdk, credentials: creds, region: "us-west-2")

在上面部署之后,我收到了这个错误:Aws::SES::Errors::AccessDenied (User 'arn:aws:iam::XXXXXXXXXXXX:user/<userName>' is not authorized to perform 'ses:SendRawEmail' on resource 'arn:aws:ses:us-west-2:XXXXXXXXXXXX:identity/<example.com>'),但是通过将我的“MySendEmailPolicy”策略直接附加到我的 IAM 用户来解决这个问题。

欢迎对 IAM 角色解决方案提出任何建议。

【讨论】:

以上是关于Aws::Errors::MissingCredentialsError(无法在没有设置凭证的情况下签署请求)- Beanstalk,通过 IAM 角色实现安全的主要内容,如果未能解决你的问题,请参考以下文章