从 S3 传输到 Google 存储 - 密钥不正确

Transfer From S3 to Google Storage - Incorrect Key

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

创建传输时我不断收到的错误是:"Invalid access key. Make sure the access key for your S3 bucket is correct, or set the bucket permissions to Grant Everyone."

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

有两点需要注意:

  1. 在 S3 存储桶上启用了 CORS
  2. 存储桶策略只允许经过身份验证的 AWS 用户list/view其内容
  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 密钥进行了复制。工作起来很有魅力..

我是 Transfer Service 的开发者之一。

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

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

编辑:为此 post 添加更多信息。有列出此要求的文档:https://cloud.google.com/storage/transfer/

引用 "Configuring Access" 部分:

"If your source data is an Amazon S3 bucket, then set up an AWS Identity and Access Management (IAM) user so that you give the user the ability to list the Amazon S3 bucket, get the location of the bucket, and read the objects in the bucket." [强调我的。]

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

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

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

如果您尝试传输子目录而不是根 S3 存储桶,也可能会遇到 'Invalid access key' 错误。例如,我尝试传输 s3://my-bucket/my-subdirectory,尽管我为整个 S3 存储桶授予了 google 的读取权限,但它一直因访问密钥无效错误而失败。原来 google 传输服务不支持传输 S3 存储桶的子目录,您必须指定根目录作为传输源:s3://my-bucket.

也许这可以帮助:

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

vi ~/.boto

s3_host = s3-美国西部-1.amazonaws.com

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

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

gsutil -m cp -r s3://bucket-name/folder-name/特定文件名 gs://Bucket/

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

gsutil -m cp -r s3://bucket-name/folder-name/文件名前缀 gs://Bucket/**

你也可以试试rsync.

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

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

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