使用临时凭据将数据从S3存储桶传输到GCP存储桶

时间:2019-12-17 14:41:32

标签: python amazon-s3 google-cloud-platform

我想从NIMH Data Archive下载公共数据集。在他们的网站上创建帐户并接受他们的数据使用协议后,我可以下载一个CSV文件,其中包含我感兴趣的数据集中所有文件的路径。每个路径的格式均为s3://NDAR_Central_1/...

1在我的个人计算机上下载

NDA Github repository中,nda-tools Python库公开了一些有用的Python代码,可以将这些文件下载到我自己的计算机上。假设我要下载以下文件:

s3://NDAR_Central_1/submission_13364/00m/0.C.2/9007827/20041006/10263603.tar.gz

鉴于我的用户名(USRNAME)和密码(PASSWD)(我用来在NIMH数据存档上创建帐户的用户名)和密码,以下代码使我可以将此文件下载到{{ 1}}在我的个人计算机上:

TARGET_PATH

在后台,from NDATools.clientscripts.downloadcmd import configure from NDATools.Download import Download config = configure(username=USRNAME, password=PASSWD) s3Download = Download(TARGET_PATH, config) target_fnames = ['s3://NDAR_Central_1/submission_13364/00m/0.C.2/9007827/20041006/10263603.tar.gz'] s3Download.get_links('paths', target_fnames, filters=None) s3Download.get_tokens() s3Download.start_workers(False, None, 1) 的{​​{3}}方法将使用s3DownloadUSRNAME生成临时访问密钥,秘密密钥和安全性令牌。然后,get_tokens方法将使用boto3和s3transfer Python库将start_workers选定的文件。

一切正常!

2下载到GCP存储桶

现在,说我在GCP上创建了一个项目,想直接将此文件下载到GCP存储桶中。

理想情况下,我想执行以下操作:

PASSWD

为此,我在Cloud Shell中执行以下Python代码(通过运行gsutil cp s3://NDAR_Central_1/submission_13364/00m/0.C.2/9007827/20041006/10263603.tar.gz gs://my-bucket ):

python3

这给了我访问密钥,秘密密钥和会话令牌。确实,在下面,

  • from NDATools.TokenGenerator import NDATokenGenerator data_api_url = 'https://nda.nih.gov/DataManager/dataManager' generator = NDATokenGenerator(data_api_url) token = generator.generate_token(USRNAME, PASSWD) 是指ACCESS_KEY的值,
  • token.access_key是指SECRET_KEY的值,
  • token.secret_key是指SECURITY_TOKEN的值。

然后,我将这些凭据设置为Cloud Shell中的环境变量:

token.session

最终,我还在家中设置了export AWS_ACCESS_KEY_ID = [copy-paste ACCESS_KEY here] export AWS_SECRET_ACCESS_KEY = [copy-paste SECRET_KEY here] export AWS_SECURITY_TOKEN = [copy-paste SECURITY_TOKEN here] 配置文件。看起来像这样:

.boto

当我运行以下命令时:

[Credentials]
aws_access_key_id = $AWS_ACCESS_KEY_ID
aws_secret_access_key = $AWS_SECRET_ACCESS_KEY
aws_session_token = $AWS_SECURITY_TOKEN
[s3]
calling_format = boto.s3.connection.OrdinaryCallingFormat
use-sigv4=True
host=s3.us-east-1.amazonaws.com

我最终得到:

  

AccessDeniedException:403 AccessDenied

完整的追溯如下:

gsutil cp s3://NDAR_Central_1/submission_13364/00m/0.C.2/9007827/20041006/10263603.tar.gz gs://my-bucket
  

我希望能够将文件从S3存储桶直接下载到我的GCP存储桶(而无需创建VM,安装Python并运行上面的代码)。为什么临时生成的凭据在我的计算机上可以使用,但是在GCP Cloud Shell中却不能使用?

调试命令的完整日志

Non-MD5 etag ("a21a0b2eba27a0a32a26a6b30f3cb060-6") present for key <Key: NDAR_Central_1,submission_13364/00m/0.C.2/9007827/20041006/10263603.tar.gz>, data integrity checks are not possible.
Copying s3://NDAR_Central_1/submission_13364/00m/0.C.2/9007827/20041006/10263603.tar.gz [Content-Type=application/x-gzip]...
Exception in thread Thread-2:iB]
Traceback (most recent call last):
  File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner
    self.run()
  File "/usr/lib/python2.7/threading.py", line 754, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/google/google-cloud-sdk/platform/gsutil/gslib/daisy_chain_wrapper.py", line 213, in PerformDownload
    decryption_tuple=self.decryption_tuple)
  File "/google/google-cloud-sdk/platform/gsutil/gslib/cloud_api_delegator.py", line 353, in GetObjectMedia
    decryption_tuple=decryption_tuple)
  File "/google/google-cloud-sdk/platform/gsutil/gslib/boto_translation.py", line 590, in GetObjectMedia
    generation=generation)
  File "/google/google-cloud-sdk/platform/gsutil/gslib/boto_translation.py", line 1723, in _TranslateExceptionAndRaise
    raise translated_exception  # pylint: disable=raising-bad-type
AccessDeniedException: AccessDeniedException: 403 AccessDenied
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>A93DBEA60B68E04D</RequestId><HostId>Z5XqPBmUdq05btXgZ2Tt7HQMzodgal6XxTD6OLQ2sGjbP20AyZ+fVFjbNfOF5+Bdy6RuXGSOzVs=</HostId></Error>

AccessDeniedException: 403 AccessDenied
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>A93DBEA60B68E04D</RequestId><HostId>Z5XqPBmUdq05btXgZ2Tt7HQMzodgal6XxTD6OLQ2sGjbP20AyZ+fVFjbNfOF5+Bdy6RuXGSOzVs=</HostId></Error>

可以找到download

1 个答案:

答案 0 :(得分:0)

您要实施的过程称为"Transfer Job"

要将文件从Amazon S3存储桶传输到Cloud Storage存储桶:

  

A。点击左上角的汉堡菜单

     

B。转到存储>传输

     

C。点击创建转移

     
      
  1. 在“选择源”下,选择“ Amazon S3存储桶”。

  2.   
  3. 在Amazon S3存储桶文本框中,指定源Amazon S3存储桶名称。     存储桶名称是在AWS管理控制台中显示的名称。

  4.   
  5. 在相应的文本框中,输入关联的访问密钥ID和秘密密钥     使用Amazon S3存储桶。

  6.   
  7. 要在源中指定文件的子集,请单击下面的“指定文件过滤器”     桶字段。您可以根据文件名前缀和     文件年龄。

  8.   
  9. 在“选择目标”下,选择一个水槽或创建一个新的水槽。

         
        
    • 要选择现有存储桶,请输入存储桶的名称(不带前缀   gs://),或单击浏览并浏览到它。
    •   
    • 要将文件传输到新存储桶,请单击浏览,然后单击新建存储桶   图标。
    •   
  10.   
  11. 根据需要启用覆盖/删除选项。

         

    默认情况下,您的传输作业仅在源版本为     与接收器版本不同。没有其他对象被覆盖或删除。     在“转移”选项下启用其他覆盖/删除选项。

  12.   
  13. 在“配置传输”下,将传输作业安排为“立即运行”(一次)或“运行”     每天在您指定的当地时间。

  14.   
  15. 单击创建。

  16.   

设置转移作业之前,请确保您已为帐户分配了必要的角色,并说明了here中所述的必需权限。

还要考虑到设置转移作业 << em>的 AMAZON S3 标签下介绍的某些Amazon S3地区当前可以使用存储转移服务。 / p>

传输作业也可以通过编程方式完成。更多信息here

让我知道这是否有帮助。

编辑

即使AWS支持,“传输服务”或gsutil命令目前也不支持“临时安全证书”。一种解决方法是更改​​gsutil命令的源代码。

我还代表您提交了Feature Request,建议您加注星标以获取该程序的更新。