【发布时间】:2016-12-08 14:42:14
【问题描述】:
默认情况下,在 s3 中上传图片时,url 是私有的。我可以通过在控制台上添加权限来使它们公开,但我不想对每个图像都这样做,我想自动化它。我正在使用通过 url 访问图像的非 AWS 云服务。该服务无法访问图像,因为 URL 是私有的。如何将网址公开给特定服务?公开整个存储桶不是一种选择。
【问题讨论】:
标签: amazon-web-services amazon-s3
默认情况下,在 s3 中上传图片时,url 是私有的。我可以通过在控制台上添加权限来使它们公开,但我不想对每个图像都这样做,我想自动化它。我正在使用通过 url 访问图像的非 AWS 云服务。该服务无法访问图像,因为 URL 是私有的。如何将网址公开给特定服务?公开整个存储桶不是一种选择。
【问题讨论】:
标签: amazon-web-services amazon-s3
可以通过在创建对象时在初始上传请求中设置请求标头x-amz-acl: public-read来公开S3中的各个对象。
公共“对特定服务”不是一个有效的概念。 S3 不知道哪个“服务”正在访问它(除非“服务”恰好是 CloudFront,它具有可用于授权下载的原始访问身份,但我怀疑这不相关,在这里)。如果服务使用提供的 URL,您只需向服务提交预签名的 URL,即可授权下载。
【讨论】:
aws s3 presign 使用cli。
我写了一个 python 脚本,它会吐出预签名的 url。
import sys
from boto.s3.connection import S3Connection
def sign(bucket, path, access_key, secret_key, https, expiry):
c = S3Connection(access_key, secret_key)
return c.generate_url(
expires_in=long(expiry),
method='GET',
bucket = bucket,
key=path,
query_auth=True,
force_http=(not https)
)
预签名的 url 可以被任何云服务访问,只要它们是由授权用户创建的。 Google 很乐意接受这些网址。也可以添加过期时间,从而避免将整个存储桶公开。
【讨论】: