0

当我尝试将数据播种到 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),那么我会看到密钥。所以它给出了“缺少凭据”错误,但我知道它可以看到凭据。诡异的。

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

其他注意事项:

  • 我确认通过简单运行设置了rails主密钥heroku run env,我可以看到它
4

1 回答 1

0

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

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

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

aws iam 列表访问密钥

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

aws sts 获取调用者身份

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

  1. 检查防火墙、HTTP 代理或 Amazon VPC 终端节点是否允许对 Amazon S3 的 AWS 开发工具包请求。
  • 如果配置的凭证相同,则检查通过 AWS CLI 和 AWS 开发工具包对 Amazon S3 的请求是否来自同一来源。例如,检查请求是否来自同一个 Amazon Elastic Compute Cloud (Amazon EC2) 实例。

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

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

{
    "Statement": [
        {
            "Sid": "Access-to-specific-bucket-only",
            "Principal": "*",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::DOC-EXAMPLE-BUCKET",
                "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
            ]
        }
    ]
  }
于 2020-12-20T22:30:26.550 回答