AWS S3 在生产中找不到凭证?

问题描述

当我尝试将数据播种到 heroku(生产)上的应用程序时,我看到:

Aws::S3::Errors::AccessDenied:拒绝访问

当我尝试手动测试时:

s3 = Aws::S3::Resource.new(region: 'us-east-1')
Aws::sigv4::Errors::MissingCredentialsError: missing credentials,provide credentials with one of the following options:
  - :access_key_id and :secret_access_key
  - :credentials
  - :credentials_provider
from /app/vendor/bundle/ruby/2.7.0/gems/aws-sigv4-1.2.1/lib/aws-sigv4/signer.rb:613:in `extract_credentials_provider'

但那是不可能的,因为

# storage.yml
amazon:
  service: S3
  access_key_id: <%= Rails.application.credentials.dig(:aws,:access_key_id) %>
  secret_access_key: <%= Rails.application.credentials.dig(:aws,:secret_access_key) %>
  region: us-east-1  

如果我在 heroku 上的 rails 控制台中运行它:Rails.application.credentials.dig(:aws,:access_key_id),那么我会看到密钥。所以它给出了“缺少凭据”的错误,但我知道它可以看到凭据。奇怪。

所以我认为我错过了一些(可能是基本的)步骤,但我不知道是什么。

其他注意事项:

  • 我通过简单地运行 heroku run env 确认设置了 rails master key,我可以看到它

解决方法

当您可以使用 AWS CLI 而不是 AWS 开发工具包访问 Amazon S3 时,请按照以下故障排除步骤操作:

  1. 验证您使用的 AWS CLI 和 AWS 开发工具包是 配置了相同的凭据。

要获取在 AWS CLI 上配置的凭证,请运行以下命令:

aws iam list-access-keys

如果您使用与 AWS CLI 关联的 AWS Identity and Access Management (IAM) 角色,请运行以下命令以获取该角色:

aws sts get-caller-identity

注意*如果 AWS CLI 和 AWS 开发工具包使用不同的凭证,请尝试将 AWS 开发工具包与存储在 AWS CLI 上的凭证结合使用。 >

  1. 检查 AWS SDK 对 Amazon S3 的请求是否被允许 防火墙、HTTP 代理或 Amazon VPC 终端节点。
  • 如果配置的凭据相同,则检查请求是否 通过 AWS CLI 访问 Amazon S3 和 AWS SDK 来自同一个 来源。例如,检查请求是否来自同一个亚马逊 弹性计算云 (Amazon EC2) 实例。

  • 如果请求来自不同的来源,则检查来源是否 使用 AWS SDK 通过防火墙、HTTP 代理发送请求, 或 VPC 终端节点。然后,验证防火墙、HTTP 代理或 VPC 端点允许您尝试发送到 Amazon S3 的请求。

例如,以下 VPC 端点策略允许 DOC-EXAMPLE-BUCKET 的下载和上传权限。如果您使用此 VPC 终端节点,您将被拒绝访问任何其他存储桶。

/records