Aws-cli: 支持生成用于 S3 访问的签名 URL

创建于 2013-11-02  ·  40评论  ·  资料来源: aws/aws-cli

feature-request

最有用的评论

令人印象深刻 - 官方 CLI 工具在 3 年内没有得到对签名 url 的支持,尽管它存在于 boto 和s3cmd 中

所有40条评论

是的,我认为这将是一个很棒的功能。 我在想这将是一个新的 s3 子命令? 我一直在对 s3 命​​令代码进行一些内部更改,以便更轻松地添加子命令。 我一直在使用它来开始重构ls命令以修复ls几个报告问题。

还没有完全完成,但这是我到目前为止所拥有的:
https://github.com/jamesls/aws-cli/compare/s3-ls-permissions#diff -b88a66f4bd148577a9390cb980d7eeb9R321

是的,这就是我要找的。 请允许不仅按持续时间指定到期时间,还可以按特定日期时间指定到期时间。 需要 UTC 时区、ISO 格式、完整秒数,以“Z”结尾的字符串在我看来很好用(例如“2014-05-30T00:00:00Z”)。

如果你真的需要从命令行生成 tmpurl,我可以推荐我的命令行工具s3tmpgen

无论如何,我真的会在 AWS CLI 中邀请这样的功能,它成为我日常使用 AWS S3 的宝贵工具。

+1

+1

我希望使用 S3 来托管要部署到 Heroku 的代码包,这将是一个很棒的功能:)

https://blog.heroku.com/archives/2014/5/22/introducing_the_app_json_application_manifest

+1

+1 在 AWS CLI 中有这个会很棒

只是对任何最终到达这里的人的说明,您可以通过深入到boto库中轻松完成此操作: https :

感谢您的反馈。 我会看看这个,我同意这将是添加到 AWS CLI 的一个很好的功能。

谢谢,@johnboxall。 Boto 当然是一种选择,但对于那些在没有本地 Python 部署的情况下部署 cli 二进制文件的人(想想 Windows 用户),走这条路与拉下 PowerShell SDK 并通过 .NET SDK 做事情一样多。 仍然希望在 CLI 中看到这个本机。 :咧嘴笑:

仅适用于现在直接使用 boto 的任何人,直到将其添加到 aws-cli 我想我会添加一个快速示例说明。 我现在已经找了几次了,宁愿把它和这张票和@johnboxall评论一起。 这对于某些人来说可能非常明显,但对于非 Python 开发者来说则不然

在已经安装了 python 的盒子上

$ python --version
Python 2.7.6
$ sudo pip install boto
$ python
>>> import boto
>>> s3 = boto.connect_s3()
>>> bucket = s3.get_bucket('your-bucket-name')
>>> key = bucket.get_key('the-prefix/the-name-of-the-object.mp4')
>>> key.generate_url(3600)
'https://your-bucket-name.s3.amazonaws.com/the-prefix/the-name-of-the-object.mp4?Signature=CgDfFa45DBXFiMfASxSTpiSuHKM%3D&Expires=1415913273&AWSAccessKeyId=ABCDEDKSY344ACVDG'

@isleshocky77的示例为基础...添加参数和小错误检查:

脚本

$ cat boto-get-signed-url.py
#!/usr/bin/python
import boto
import argparse

parser = argparse.ArgumentParser(description='Generate an S3 signed URL')
parser.add_argument('-b', '--bucket', help='bucket name')
parser.add_argument('-k', '--key', help='prefix/key')
parser.add_argument('-s', '--seconds', type=int, help='time in seconds until the URL will expire')
args = parser.parse_args()

s3 = boto.connect_s3()
bucket = s3.get_bucket(args.bucket)
key = bucket.get_key(args.key)
if bucket.get_key(args.key):
  print key.generate_url(args.seconds)
else:
  print 's3://' + args.bucket + '/' + args.key + ' does not exist'

示例用法和帮助

$ ./boto-get-signed-url.py -b superbucket -k "test" -s 60
https://superbucket.s3.amazonaws.com/test?Signature=n6cO8RH%2FbNwQhuZVNNazo3q04x0%3D&Expires=1416695021&AWSAccessKeyId=AKIEXAMPLEKEYNOTREAL

$ boto-get-signed-url.py --help
usage: boto-get-signed-url.py [-h] [-b BUCKET] [-k KEY] [-s SECONDS]

Generate an S3 signed URL

optional arguments:
  -h, --help            show this help message and exit
  -b BUCKET, --bucket BUCKET
                        bucket name
  -k KEY, --key KEY     prefix/key
  -s SECONDS, --seconds SECONDS
                        time in seconds until the URL will expire

大家好
在再次检查此问题的状态后,我对提供工具s3tmpgen 的Python 包 ttr.aws.utils.s3 进行了更新。 更新不仅允许使用 https 生成 url,而且(使用选项-http )还允许生成 http。

仍然期待用 awscli 解决方案替换它。

:+1:

+1 使 s3 签名的 url 成为 cli 的一部分

:+1:

+1

我想,我理解,为什么要花这么长时间:事情必须按顺序发生,好消息是,它看起来像是在路线图上。

由于 AWS CLI 基于botocore ,因此应首先在那里解决。 boto/botocore#291 正在请求它。

拉取请求 boto/botocore#504 已经合并到分支clients-only和路线图(在 https://github.com/boto/botocore 的自述文件中提到)声称,botocore 目前只是合并分支之前的一步clients-only进入开发(然后测试版、GA 和 AWS CLI 有“本机”工具为我们提供功能)。

@vlcinsky

是的,一旦仅客户端分支合并到 botocore,我们将能够在 CLI 中获取签名 url 的生成。 然后,必须在 CLI 端完成的主要工作量是创建一个公开该功能的良好 API。

:+1: 确实是一个方便的功能

+1

正如@kyleknap 所指出的,要做的一件事就是为此功能设计好的 API。

我看到以下用例:

  • "tmpGET": 为 GET 请求创建 tmpurl
  • "tmpPOST": 为 POST 请求创建 tmpurl
  • “tmp???”:还有什么方法可以支持? 我不知道(并且从未使用过
    获取和发布)

“tmpGET”真的很简单,因为唯一的输出是 url,唯一的输入是存储桶/密钥和过期时间
日期(到期时间)。

“tmpPOST”要复杂得多,因为必须定义发布策略。

要解决的一个问题是,将这些操作放在哪里,似乎有两种选择:

  • aws s3
  • aws s3api

我今天不会处理更复杂的“tmpPOST”,而是专注于更简单的“tmpGET”

快速解决方案:添加aws s3 tmpurl

这样的解决方案相当容易实施,将有助于 80% 的实际
使用情况(将对象发布到 AWS S3 并提供临时 url 以共享
与某人)。

该概念将建立在现有的aws s3 ls基础之上,但存在以下差异:

  • 添加一个选项--expires来定义 url 过期的日期和时间或--expires-in
    指定到期前的秒数
  • 将只输出 tmpurl,每个列出的对象一行

恐怕,目前没有简单的方法可以在确切的时间创建 tmp url,所以初始
版本将仅提供--expires-in选项,默认值为 3600 秒。

利弊

优点

为 AWS S3 上的现有对象数量创建一堆 tmp url 非常容易。 它节省了
获取准确的存储桶/键名称值的障碍。

缺点

这种基于aws s3 ls的方法的缺点是,不能为对象创建 tmp url,这
还不存在。

无论如何,这可以稍后通过aws s3api解决方案解决。

很好地放在那里。 文章几乎肯定会围绕已发布数据的某些服务器端处理而构建,而 get 方法用例通常要容易得多。 当您说这将涵盖大多数用例时,我非常同意。

我想补充一点,我认为临时 URL 与在 s3 上定位文件没有任何关系。 如果有人想要生成完整的签名 URL 集,这是逻辑 cli 不需要做更多包装的逻辑。 tmpurl 原语是我心目中最小可行的产品。

我已经在我的本地分支中为 s3 对象实现了(不完全)预先定义的 URL。

https://github.com/quiver/aws-cli/tree/s3-presigned-url

这是botocore.generate_presigned_url的薄包装器,还没有准备好生产。 正如@vlcinsky 所指出的,我们需要一个良好的 API 设计,如AWSCLI 。 一旦修复,我就可以实现它。

我注意到的一件事是generate_presigned_url需要client_method参数,该参数指定要签署的 S3 API(例如get_object )。 在我目前的实现中,它暴露给用户,但最好是用户友好的,比如提供不同的子命令( aws s3 geturlaws s3 uploadurl )或切换选项( --type upload )

用法

将对象上传到 S3

$ echo hello world > test.txt

$ aws s3 url s3://BUCKET/test.txt --client-method put_object --expires-in 180
https://BUCKET.s3.amazonaws.com/test.txt?AWSAccessKeyId=AKIAIXXXXXXXXXXXXXXX&Expires=1451449621&Signature=KgwO9lBx942fFvln0JW0NX7mKS0%3D

$ URL=`aws s3 url s3://BUCKET/test.txt --client-method put_object --expires-in 180`

$ curl -D - -X PUT --upload-file test.txt $URL
HTTP/1.1 100 Continue

HTTP/1.1 200 OK
x-amz-id-2: /90B1axPysBg3P8kv8BlR8RoqdO1JfajCN5BM5/TxIT3VjGphKmyGX8EgCQEtCXYhuNkVne5+GM=
x-amz-request-id: 685F03CA6C84FAC0
Date: Wed, 30 Dec 2015 05:18:38 GMT
ETag: "6f5902ac237024bdd0c176cb93063dc4"
Content-Length: 0
Server: AmazonS3

$ aws s3 cp s3://BUCKET/test.txt -
hello world

从 S3 获取对象

$ URL=`aws s3 url s3://BUCKET/test.txt --client-method get_object --expires-in 180`

$ curl -D - -X GET $URL
HTTP/1.1 200 OK
x-amz-id-2: WuRokcBm9wnDMaRkD8kNeGijuKEzVp3eagi7JbpPXmmchEljsiP4wZX5w1TaeuK94n2526FGKMI=
x-amz-request-id: 1EBCAA7A691A577D
Date: Wed, 30 Dec 2015 05:20:14 GMT
Last-Modified: Wed, 30 Dec 2015 05:19:15 GMT
ETag: "6f5902ac237024bdd0c176cb93063dc4"
Accept-Ranges: bytes
Content-Type: binary/octet-stream
Content-Length: 12
Server: AmazonS3

hello world

上面的python生成一个url,如:'https://.s3.amazonaws.com/dir/dir/file

当我尝试卷曲文件时,出现 SSL 证书问题:证书链无效
如果我使用选项 -k 卷曲,我可以通过这个,但我也知道如果 url 看起来像:' https://s3-.amazonaws.com//目录/目录/文件'
证书有效,有没有办法更改网址或其他修复方法?
谢谢,
加里

例如:' https://s3-us-west-1.amazonaws.com/bucket/dir/dir/file '

更新,使用 boto3 能够生成正确签名的 url。

+1

令人印象深刻 - 官方 CLI 工具在 3 年内没有得到对签名 url 的支持,尽管它存在于 boto 和s3cmd 中

1+

+1

+1

这事有进一步更新吗? 令人惊讶的是,这还没有。

+1

我写了一个作为解决方法并按预期工作: https :

大家好,感谢反馈。 这是我们积压的东西。 我还没有确切的日期,但是一旦我们提出拉取请求,我就会链接到这个问题。

伟大的! 谢谢!

是否有可能获得整个 s3 文件夹的预签名 url? 包括用于浏览文件夹的 Web 界面吗?

@tommeda不可能。 预签名 url 始终与单个存储对象相关。 您所说的类似于静态网站,但要控制对其的访问(如果基于 AWS S3),则必须编写一些代理。 已经存在的尝试很少,在我看来(大约一年前研究过)没有一个是容易的。

您始终可以生成一个网页,该网页为每个对象提供接口并包含预签名的 url,然后将接口放入 s3 并将预签名的 url 返回给接口。 不是很容易 peasy,并且界面希望是特定于使用的

此页面是否有帮助?
0 / 5 - 0 等级