问题描述
当我尝试将数据播种到 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 时,请按照以下故障排除步骤操作:
- 验证您使用的 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 上的凭证结合使用。 >
- 检查 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