谷歌云:使用gsutil将数据从AWS S3下载到GCS

2023-11-26

我们的一位合作者在 AWS 上提供了一些数据,我试图使用 gsutil 将其放入我们的谷歌云存储桶中(只有部分文件对我们有用,所以我不想使用 GCS 上提供的 GUI) )。合作者向我们提供了 AWS 存储桶 ID、aws 访问密钥 id 和 aws 秘密访问密钥 id。

我查看了 GCE 上的文档并编辑了 ~/.botu 文件,以便合并访问密钥。我重新启动了终端并尝试执行“ls”,但出现以下错误:

gsutil ls s3://cccc-ffff-03210/
AccessDeniedException: 403 AccessDenied
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied

我还需要配置/运行其他东西吗?

thanks!

EDITS:

感谢您的回复!

我安装了 Cloud SDK,并且可以访问并运行我的 google 云存储项目上的所有 gsutil 命令。我的问题是尝试访问(例如“ls”命令)与我共享的亚马逊S3。


  1. 我取消了 ~/.boto 文件中两行的注释并放置了访问密钥:


    # To add HMAC aws credentials for "s3://" URIs, edit and uncomment the
    # following two lines:
    aws_access_key_id = my_access_key
    aws_secret_access_key = my_secret_access_key
    

  1. “gsutil 版本 -l”的输出:


    | => gsutil version -l
    
    my_gc_id
    gsutil version: 4.27
    checksum: 5224e55e2df3a2d37eefde57 (OK)
    boto version: 2.47.0
    python version: 2.7.10 (default, Oct 23 2015, 19:19:21) [GCC 4.2.1                                                 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)]
    OS: Darwin 15.4.0
    multiprocessing available: True
    using cloud sdk: True
    pass cloud sdk credentials to gsutil: True
    config path(s): /Users/pc/.boto, /Users/pc/.config/gcloud/legacy_credentials/[email protected]/.boto
    gsutil path: /Users/pc/Documents/programs/google-cloud-        sdk/platform/gsutil/gsutil
    compiled crcmod: True
    installed via package manager: False
    editable install: False
    

  1. 使用 -DD 选项的输出是:


    => gsutil -DD ls s3://my_amazon_bucket_id
    
    multiprocessing available: True
    using cloud sdk: True
    pass cloud sdk credentials to gsutil: True
    config path(s): /Users/pc/.boto, /Users/pc/.config/gcloud/legacy_credentials/[email protected]/.boto
    gsutil path: /Users/pc/Documents/programs/google-cloud-sdk/platform/gsutil/gsutil
    compiled crcmod: True
    installed via package manager: False
    editable install: False
    Command being run: /Users/pc/Documents/programs/google-cloud-sdk/platform/gsutil/gsutil -o GSUtil:default_project_id=my_gc_id -DD ls s3://my_amazon_bucket_id
    config_file_list: ['/Users/pc/.boto', '/Users/pc/.config/gcloud/legacy_credentials/[email protected]/.boto']
    config: [('debug', '0'), ('working_dir', '/mnt/pyami'), ('https_validate_certificates', 'True'), ('debug', '0'), ('working_dir', '/mnt/pyami'), ('content_language', 'en'), ('default_api_version', '2'), ('default_project_id', 'my_gc_id')]
    DEBUG 1103 08:42:34.664643 provider.py] Using access key found in shared credential file.
    DEBUG 1103 08:42:34.664919 provider.py] Using secret key found in shared credential file.
    DEBUG 1103 08:42:34.665841 connection.py] path=/
    DEBUG 1103 08:42:34.665967 connection.py] auth_path=/my_amazon_bucket_id/
    DEBUG 1103 08:42:34.666115 connection.py] path=/?delimiter=/
    DEBUG 1103 08:42:34.666200 connection.py] auth_path=/my_amazon_bucket_id/?delimiter=/
    DEBUG 1103 08:42:34.666504 connection.py] Method: GET
    DEBUG 1103 08:42:34.666589 connection.py] Path: /?delimiter=/
    DEBUG 1103 08:42:34.666668 connection.py] Data: 
    DEBUG 1103 08:42:34.666724 connection.py] Headers: {}
    DEBUG 1103 08:42:34.666776 connection.py] Host: my_amazon_bucket_id.s3.amazonaws.com
    DEBUG 1103 08:42:34.666831 connection.py] Port: 443
    DEBUG 1103 08:42:34.666882 connection.py] Params: {}
    DEBUG 1103 08:42:34.666975 connection.py] establishing HTTPS connection: host=my_amazon_bucket_id.s3.amazonaws.com, kwargs={'port': 443, 'timeout': 70}
    DEBUG 1103 08:42:34.667128 connection.py] Token: None
    DEBUG 1103 08:42:34.667476 auth.py] StringToSign:
    GET
    
    
    Fri, 03 Nov 2017 12:42:34 GMT
    /my_amazon_bucket_id/
    DEBUG 1103 08:42:34.667600 auth.py] Signature:
    AWS RN8=
    DEBUG 1103 08:42:34.667705 connection.py] Final headers: {'Date': 'Fri, 03 Nov 2017 12:42:34 GMT', 'Content-Length': '0', 'Authorization': u'AWS AK6GJQ:EFVB8F7rtGN8=', 'User-Agent': 'Boto/2.47.0 Python/2.7.10 Darwin/15.4.0 gsutil/4.27 (darwin) google-cloud-sdk/164.0.0'}
    DEBUG 1103 08:42:35.179369 https_connection.py] wrapping ssl socket; CA certificate file=/Users/pc/Documents/programs/google-cloud-sdk/platform/gsutil/third_party/boto/boto/cacerts/cacerts.txt
    DEBUG 1103 08:42:35.247599 https_connection.py] validating server certificate: hostname=my_amazon_bucket_id.s3.amazonaws.com, certificate hosts=['*.s3.amazonaws.com', 's3.amazonaws.com']
    send: u'GET /?delimiter=/ HTTP/1.1\r\nHost: my_amazon_bucket_id.s3.amazonaws.com\r\nAccept-Encoding: identity\r\nDate: Fri, 03 Nov 2017 12:42:34 GMT\r\nContent-Length: 0\r\nAuthorization: AWS AN8=\r\nUser-Agent: Boto/2.47.0 Python/2.7.10 Darwin/15.4.0 gsutil/4.27 (darwin) google-cloud-sdk/164.0.0\r\n\r\n'
    reply: 'HTTP/1.1 403 Forbidden\r\n'
    header: x-amz-bucket-region: us-east-1
    header: x-amz-request-id: 60A164AAB3971508
    header: x-amz-id-2: +iPxKzrW8MiqDkWZ0E=
    header: Content-Type: application/xml
    header: Transfer-Encoding: chunked
    header: Date: Fri, 03 Nov 2017 12:42:34 GMT
    header: Server: AmazonS3
    DEBUG 1103 08:42:35.326652 connection.py] Response headers: [('date', 'Fri, 03 Nov 2017 12:42:34 GMT'), ('x-amz-id-2', '+iPxKz1dPdgDxpnWZ0E='), ('server', 'AmazonS3'), ('transfer-encoding', 'chunked'), ('x-amz-request-id', '60A164AAB3971508'), ('x-amz-bucket-region', 'us-east-1'), ('content-type', 'application/xml')]
    DEBUG 1103 08:42:35.327029 bucket.py] <?xml version="1.0" encoding="UTF-8"?>
    <Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>6097164508</RequestId><HostId>+iPxKzrWWZ0E=</HostId></Error>
    DEBUG: Exception stack trace:
    Traceback (most recent call last):
      File "/Users/pc/Documents/programs/google-cloud-sdk/platform/gsutil/gslib/__main__.py", line 577, in _RunNamedCommandAndHandleExceptions
        collect_analytics=True)
      File "/Users/pc/Documents/programs/google-cloud-sdk/platform/gsutil/gslib/command_runner.py", line 317, in RunNamedCommand
        return_code = command_inst.RunCommand()
      File "/Users/pc/Documents/programs/google-cloud-sdk/platform/gsutil/gslib/commands/ls.py", line 548, in RunCommand
        exp_dirs, exp_objs, exp_bytes = ls_helper.ExpandUrlAndPrint(storage_url)
      File "/Users/pc/Documents/programs/google-cloud-sdk/platform/gsutil/gslib/ls_helper.py", line 180, in ExpandUrlAndPrint
        print_initial_newline=False)
      File "/Users/pc/Documents/programs/google-cloud-sdk/platform/gsutil/gslib/ls_helper.py", line 252, in _RecurseExpandUrlAndPrint
        bucket_listing_fields=self.bucket_listing_fields):
      File "/Users/pc/Documents/programs/google-cloud-sdk/platform/gsutil/gslib/wildcard_iterator.py", line 476, in IterAll
        expand_top_level_buckets=expand_top_level_buckets):
      File "/Users/pc/Documents/programs/google-cloud-sdk/platform/gsutil/gslib/wildcard_iterator.py", line 157, in __iter__
        fields=bucket_listing_fields):
      File "/Users/pc/Documents/programs/google-cloud-sdk/platform/gsutil/gslib/boto_translation.py", line 413, in ListObjects
        self._TranslateExceptionAndRaise(e, bucket_name=bucket_name)
      File "/Users/pc/Documents/programs/google-cloud-sdk/platform/gsutil/gslib/boto_translation.py", line 1471, in _TranslateExceptionAndRaise
        raise translated_exception
    AccessDeniedException: AccessDeniedException: 403 AccessDenied
    
    
    AccessDeniedException: 403 AccessDenied
    

我假设您可以使用设置 gcloud 凭据gcloud init and gcloud auth login or gcloud auth activate-service-account,并且可以成功列出/写入对象到 GCS。

从那里,你需要两件事。正确配置的 AWS IAM 角色应用于您正在使用的 AWS 用户,并且正确配置~/.boto file.

用于存储桶访问的 AWS S3 IAM 策略

必须通过授予用户的角色或附加到用户的内联策略来应用此类策略。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::some-s3-bucket/*",
                "arn:aws:s3:::some-s3-bucket"
            ]
        }
    ]
}

重要的是你有ListBucket and GetObject操作,并且这些操作的资源范围至少包括您希望从中读取的存储桶(或其前缀)。

.boto 文件配置

服务提供商之间的互操作总是有点棘手。在撰写本文时,为了支持AWS 签名 V4(所有 AWS 区域都普遍支持的唯一一个),您必须向您的~/.boto文件不仅仅是凭证,在[s3] group.

[Credentials]
aws_access_key_id = [YOUR AKID]
aws_secret_access_key = [YOUR SECRET AK]
[s3]
use-sigv4=True
host=s3.us-east-2.amazonaws.com

The use-sigv4 property通过 gsutil 提示 Boto 使用 AWS Signature V4 来处理请求。不幸的是,目前这需要在配置中指定主机。计算出主机名非常容易,因为它遵循以下模式s3.[BUCKET REGION].amazonaws.com.

如果您有来自多个 S3 区域的 rsync/cp 工作,您可以通过几种方式处理它。您可以设置一个环境变量,例如BOTO_CONFIG在运行命令以在多个文件之间进行更改之前。或者,您可以使用顶级参数覆盖每次运行的设置,例如:

gsutil -o s3:host=s3.us-east-2.amazonaws.com ls s3://some-s3-bucket

Edit:

只是想补充...完成这项工作的另一种很酷的方法是rclone.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

谷歌云:使用gsutil将数据从AWS S3下载到GCS 的相关文章

随机推荐

  • C++ 为什么向我的类添加析构函数会使我的类不可移动?

    编译器提醒我我正在使用删除的函数 https ideone com 3YAIlA include
  • 为什么我无法访问远程 Jupyter Notebook 服务器?

    我已经在我的 centos6 5 服务器上启动了 Jupyter Notebook 服务器 并且 jupyter 的运行方式如下 I 17 40 59 649 NotebookApp Serving notebooks from local
  • 如何在不复制元素的情况下将 Vec 转换为数组?

    我有一个Vec具有我确定的大小的非平凡类型 我需要将其转换为固定大小的数组 理想情况下我想这样做 无需复制数据 我想使用Vec 无需用零数据预初始化数组 因为这会浪费 CPU 周期 问题写成代码 struct Point x i32 y i
  • Next.js:窗口未定义

    我正在尝试将 apexcharts 用于 next js 应用程序 但它返回窗口未定义 我希望得到任何帮助 有人知道发生了什么以及为什么吗 import React from react import Chart from react ap
  • 检索 PostgreSQL 的 Ltree 模块下按列排序的完整层次结构

    我正在使用 PostgreSQL 的Ltree用于存储分层数据的模块 我正在寻找按特定列排序的完整层次结构 考虑下表 votes path 1 1 2 1 1 4 1 2 1 1 2 1 3 2 1 2 1 2 2 1 1 4 2 1 2
  • MVC4 RC WebApi参数绑定

    我从 MVC4 beta 升级到 RC 和最新的 autofac 以下操作已正确绑定 但现在两个参数均为空 我看到他们改变了格式化程序等方面的内容 但我不确定是什么导致了我的问题 HttpPost RedirectModel MyActio
  • ggplot2 - 在所有方面包含一个因素的一个级别

    我有一些由变量 处理 包裹的时间序列数据 这种 治疗 的因素之一是阴性对照 我想将其包含在每个方面 例如使用 R 数据集 Theoph data Theoph head Theoph Subject Wt Dose Time conc 1
  • Range() vs Cells() vs Range.Cells()

    我知道Range and Cells 属性是访问工作表上单元格的等效方法 然而 什么时候使用才是明智的Range Cells 在这个组合中 我遇到了一个他们使用的例子Range A1 Resize 2 3 cells value 这相当于R
  • dart 上的 pubspec 的部署策略是什么

    实际部署具有 pubspec yaml 依赖项的 dart 代码的最佳方法是什么 我过去做过的一件常见的事情是创建演示并部署到 github 页面 现在 pub 使用符号链接 依赖项不会被推送到 github 还想知道这是否应该是一个要向
  • 在 Razor (chtml) 中渲染动态视图,如何在 asp.net core 3.0 中将 FileProvider 添加到 razor?

    我正在从 asp net core 2 2 迁移到 asp net core 3 0 我使用此块来定义我的文件类提供程序 如您所知 这是用于创建动态剃刀视图 动态 cshtml 我的问题是该段确实不行 我已经实现了经典 services C
  • 服务器端 Blazor 页面发布到 Razor 页面 http 错误 400

    我试图将我的用户名和密码从 Blazor 页面 razor 发布到 Razor 页面 cshtml 但我总是收到 http 错误 400 登录控件 razor
  • 具有特定形状的词云[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 Suppose I have a dataframe which contains some words with their frequencie
  • 搜索 -lcudart 时跳过不兼容的 libcudart.so

    当我使用 nvcc 5 0 编译 cu 文件时 编译器会提供以下信息 usr bin ld 搜索 lcudart 时跳过不兼容的 usr local cuda 5 0 lib libcudart so 看起来要么是警告 要么是错误 我不知道
  • R ggplot2中scale_x_discrete的使用

    我在 R 中使用 ggplot2 中的离散比例时遇到问题 g scale x discrete breaks 1 7 labels 1 7 错误地改变了绘图的限制 Before After 我看不到用于生成图像的代码有任何可疑之处 但它是
  • 用不同的图像替换单选按钮

    我需要创建一组 2 个单选按钮 选项 男 女 来显示图像而不是实际按钮 图像应根据选择而变化 所以应该有 4 个图像 男性 开 男性 关 女性 开 女性 关 我在整个网站中使用 jQuery 如果可能的话 我也想使用 jQuery 我发现了
  • 为什么bash中的循环终止后变量值会丢失? [复制]

    这个问题在这里已经有答案了 我有一个非常简单的 bash 脚本来计算文件每一行出现的数字总和 我知道有更好的方法可以做到这一点 但我实际上需要这个总和作为辅助信息 并且该脚本应该稍后再做一些事情 脚本如下 TOTAL 0 cat DATAF
  • 对具有外键的 mySQL 表进行分区?

    这样做的合适方法是什么 因为 mySQL 显然不喜欢这样做 对我来说 将分区或外键从数据库设计中排除似乎不是一个好主意 我猜有一个解决方法吗 03 24 更新 http opendba blogspot com 2008 10 mysql
  • 共享首选项和内部文件存储之间的主要区别[重复]

    这个问题在这里已经有答案了 我想知道哪个更适合存储目的 共享首选项或内部文件存储 哪个更快 他们中有人有记忆问题吗 Thanks 共享偏好 将私有原始数据存储在键值对中 存储小条目 数据 内部存储器 将私有数据存储在设备内存上 用于存储大型
  • 如何使用 webpack 直接在 React 组件中加载 SVG?

    我想直接在我的中渲染材质设计图标NextButton使用 webpack 的组件 这是我的代码的相关部分 var NextIcon require material design icons navigation svg productio
  • 谷歌云:使用gsutil将数据从AWS S3下载到GCS

    我们的一位合作者在 AWS 上提供了一些数据 我试图使用 gsutil 将其放入我们的谷歌云存储桶中 只有部分文件对我们有用 所以我不想使用 GCS 上提供的 GUI 合作者向我们提供了 AWS 存储桶 ID aws 访问密钥 id 和 a