【问题标题】:Transfer From S3 to Google Storage - Incorrect Key从 S3 转移到 Google 存储 - 密钥不正确
【发布时间】:2016-05-14 11:58:15
【问题描述】:

过去几个小时我一直在尝试设置从 S3 到我的谷歌存储桶的传输。

我在创建传输时不断收到的错误是:“无效的访问密钥。确保您的 S3 存储桶的访问密钥正确,或将存储桶权限设置为授予所有人。”

访问密钥和秘密都是正确的,因为它们当前正在生产中用于 S3 完全访问。

需要注意的几点:

  1. 在 S3 存储桶上启用了 CORS
  2. 存储桶策略仅允许经过身份验证的 AWS 用户列出/查看其内容
  3. S3 需要签名 URL 才能访问

存储桶政策:

{
    "Version": "2008-10-17",
    "Id": "Policy234234234",
    "Statement": [
        {
            "Sid": "Stmt234234",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": [
                "s3:AbortMultipartUpload",
                "s3:GetObjectAcl",
                "s3:RestoreObject",
                "s3:GetObjectVersion",
                "s3:DeleteObject",
                "s3:DeleteObjectVersion",
                "s3:PutObjectVersionAcl",
                "s3:PutObjectAcl",
                "s3:GetObject",
                "s3:PutObject",
                "s3:GetObjectVersionAcl"
            ],
            "Resource": "arn:aws:s3:::mybucket/*"
        },
        {
            "Sid": "2",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity xyzmatey"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::mybucket/*"
        },
        {
            "Sid": "3",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Resource": "arn:aws:s3:::mybucket"
        }
    ]
}

CORS 政策

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>http://www.mywebsite.com</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>PUT</AllowedMethod>
        <AllowedMethod>DELETE</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedHeader>AUTHORIZATION</AllowedHeader>
    </CORSRule>
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>HEAD</AllowedMethod>
        <AllowedHeader>AUTHORIZATION</AllowedHeader>
    </CORSRule>
</CORSConfiguration>

知道我哪里出错了吗?

编辑:我在 google 计算实例上设置了 gsutil 工具,并在确切的存储桶上使用相同的 AWS 密钥进行了复制。像魅力一样工作..

【问题讨论】:

  • 您的存储桶策略不包括“s3:ListBucket”。我猜传输服务可能需要它来获取要传输的对象列表。尝试将其添加到列表中?当然,这并不能解释 gsutil 如何设法复制存储桶,所以这可能是错误的。
  • 嘿,布兰登,我添加了您上面提到的政策。相同的结果:无效的密钥。看看我是否能掌握谷歌的支持人员。谢谢。

标签: amazon-s3 google-cloud-storage file-transfer


【解决方案1】:

我是 Transfer Service 的开发者之一。

您需要将“s3:GetBucketLocation”添加到您的权限中。

如果您收到的错误更具体地与您的 ACL 相关,而不是无效的密钥,那会更好。我会调查的。

编辑:在这篇文章中添加更多信息。有列出此要求的文档:https://cloud.google.com/storage/transfer/

这是“配置访问”部分的引述:

“如果您的源数据是 Amazon S3 存储桶,则设置 AWS Identity and Access Management (IAM) 用户,以便您让用户能够列出 Amazon S3 存储桶,获取桶,并读取桶中的对象。” [强调我的。]

EDIT2:此答案中提供的大部分信息可能对其他人有用,因此将保留在这里,但约翰的答案实际上触及了 OP 问题的根源。

【讨论】:

  • 嗨,jabob,将s3:GetBucketLocation 添加到策略中。同样的错误。然后我尝试对该存储桶及其对象使用最宽松的策略:Principal:"*"Action:"*"。错误保持不变。 IAM 用户对 S3 具有完全访问权限,并且 AWS 策略模拟器在该存储桶的所有权限上标记为绿色,对于匿名用户和经过身份验证的 AWS 用户。有什么见解吗?
  • 进一步测试:当存储桶位置在美国或欧盟时,正确传输设置(使用相同的访问密钥)。当存储桶位置在我所在地区的新加坡时,它会显示无效的密钥。所有测试都使用相同的许可策略和 CORS 规则。
  • 嗨,Jacob,从我没有存储桶级权限的特定 S3 目录转移的最佳选择是什么?跨度>
  • @JulianV.Modesto 我的理解是您没有存储桶级别的权限来列出,但有权限读取存储桶中的所有对象。那是对的吗?假设是这种情况,传输服务将不适合您。列表权限是必需的。您可以尝试我们的 HTTP 传输服务,该服务需要提供 URL 列表,但这需要列出 S3 存储桶的内容才能获取。
  • @JacobCriner 好吧,我只有在用户特定的 S3 目录中读取和列出对象的权限,所以我觉得我的选择非常有限
【解决方案2】:

我是传输服务的工程师。 您遇到此问题的原因是 Transfer 服务尚不支持 AWS S3 区域 ap-southeast-1(新加坡),因为 GCP 在该区域没有与 AWS S3 的联网安排。我们现在可以考虑支持该地区,但您的传输将比其他地区慢得多。

我们正在修复以显示更清晰的错误消息。

【讨论】:

  • 感谢约翰的澄清。我将使用gsutil 工具进行计划备份。
  • 这仍然是一个显示错误的可怕过程 - “无效的访问密钥”似乎是去!
【解决方案3】:

如果您尝试传输子目录而不是根 S3 存储桶,也可能会收到“无效的访问密钥”错误。例如,我尝试转移s3://my-bucket/my-subdirectory,尽管我向谷歌授予了整个 S3 存储桶的读取权限,但它仍然因无效访问密钥错误而失败。原来google传输服务不支持传输S3存储桶的子目录,必须指定根为传输源:s3://my-bucket

【讨论】:

  • 乔希,gsutil 可以与 s3 子目录一起使用吗?如果没有,还有其他解决方法吗?
  • 我不确定 gsutil,但使用传输服务可以在传输规范中设置一个名为“includePrefixes”的参数。这可以设置为前缀列表(可以是子目录),并防止传输服务复制其他子目录。不过,您仍然必须将根存储桶指定为源!
  • 现在仍然如此——这是糟糕的用户体验
  • 这太糟糕了。即使在 2020 年。我在 S3 上的子目录中有一些文件。我无权访问根目录,即使使用前缀也无法使用,因为它需要访问根目录。
【解决方案4】:

这可能会有所帮助:

首先,在你的boto配置文件中指定S3_host,即endpoint-url包含区域(如果区域是us,则无需指定s3-host-东部 1,这是默认值)。例如,

vi ~/.boto

s3_host = s3-us-west-1.amazonaws.com

就是这样, 现在您可以继续执行以下任一命令:

gsutil -m cp -r s3://bucket-name/folder-name gs://Bucket/

gsutil -m cp -r s3://bucket-name/folder-name/specific-file-name gs://Bucket/

gsutil -m cp -r s3://bucket-name/folder-name/ gs://Bucket/*

gsutil -m cp -r s3://bucket-name/folder-name/file-name-Prefix gs://Bucket/**

您也可以尝试 rsync

https://cloud.google.com/storage/docs/gsutil/commands/rsync

【讨论】:

    【解决方案5】:

    几分钟前我遇到了同样的问题。我很容易通过提供管理员访问密钥和密钥来解决它。

    它对我有用。仅供参考,我的 s3 存储桶是北弗吉尼亚州。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-02
      • 2019-03-30
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 2021-11-09
      相关资源
      最近更新 更多