我已经编写了以下代码来使用boto对URL进行签名,但是,我无法访问已签名的URL。任何帮助将不胜感激。
con = cloudfront.CloudFrontConnection(
settings.AWS_USER_DETAILS.access_key_id,
settings.AWS_USER_DETAILS.secret_key_id,
)
identities = con.get_all_origin_access_identity()
if len(identities) < 1:
oai = con.create_origin_access_identity(
'cv-oai',
'OAI signing iOS video requests'
)
else:
oai = con.get_all_origin_access_identity()[0]
distro_summary = con.get_all_distributions()[0]
distro_info = con.get_distribution_info(distro_summary.id)
bucket = boto.connect_s3(
settings.AWS_USER_DETAILS.access_key_id,
settings.AWS_USER_DETAILS.secret_key_id,
host='s3-eu-west-1.amazonaws.com'
).get_bucket(u'cv-video')
key_str = video.video_url.split('/')[-1]
key = bucket.get_key(key_str)
key.add_user_grant("READ", oai.s3_user_id)
distro = distro_summary.get_distribution()
# For local testing
if ip_addr == '127.0.0.1':
ip_addr = None
private_key_string = open(settings.CF_PRIV_KEY_LOC).read()
print private_key_string
signed_url = distro.create_signed_url(
"https://%s/%s" % (distro_info.domain_name, key_str),
'APKAI3I3QZ7I73OIQIXA',
expire_time=int(time.time()) + video.video_length + 5 * 60,
#valid_after_time=None,
#ip_address=ip_addr,
#policy_url=None,
private_key_string=private_key_string
)
错误:
更新:这是访问上述代码生成的网址时收到的错误。我无法找到CloudFront错误的文档来确定可能发生这种情况的原因。
<Error>
<Code>InvalidKey</Code>
<Message>Unknown Key</Message>
</Error>
示例网址
密钥对肯定是有效的:
只有一个Origin Access Identity和一个发行版:
[<boto.cloudfront.identity.OriginAccessIdentitySummary object at 0x10f356110>]
[<boto.cloudfront.distribution.DistributionSummary object at 0x10f356090>]
答案 0 :(得分:4)
我有同样的问题。
我想知道canfront和s3是否还没有逻辑连接到“原始访问身份”。这是cloudfront用于从S3提取内容的身份,使用您指定的私钥对验证签名。
果然,这就是问题所在。禁用对底层S3存储桶的公共访问,然后告诉AWS使用适当的标识,然后再次尝试使用您的代码。
以下是来自网络的内容:
在CloudFront信息中心(https://console.aws.amazon.com/cloudfront/home)中,点击左侧的“发布”,查看您的所有发行版。选择所需的一个,单击[i]图标以获取更多信息。从那里,单击[Origins]选项卡,然后选择存储桶旁边的单选按钮。单击它,将出现“编辑”按钮。单击编辑。在出现的新面板中选择“限制存储桶访问”。该站点将提示您要执行的访问标识。选择您创建的身份。单击“是,编辑”以保存更改。
祝你好运!