【问题标题】:Can't sign cloudfront URLs using boto无法使用 boto 签署云端 URL
【发布时间】:2014-01-10 23:17:45
【问题描述】:

我已经编写了以下代码来使用 boto 对 URLS 进行签名,但是,我无法访问已签名的 URLS。任何帮助将不胜感激。

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
)

错误:

更新:这是访问上述代码生成的 URL 时收到的错误。我无法找到 CloudFront 错误的文档来确定为什么会发生这种情况。

<Error>
<Code>InvalidKey</Code>
<Message>Unknown Key</Message>
</Error>

示例网址:

https://d1xvt07pr26drp.cloudfront.net/2iwjz3wn9atqlfw4.mov?Expires=1388705061&Signature=auPWW-X1LzZJkPxJ5YPCqQMatchbAb3BxCWTG5oMY78G6LrH0sZiQL6EKdCX-l3Fi9E475b11uFL~HnxfBUY9QqQH86478QU5BnpmR-U7uEikRs7kTDWOVj4Riv3PHUmjmzlBW8xU7-n9C0m2UZSXedPsYYFdPoWHH0VLlyKk2TzgYydLqu~jtq0iNdmz-C9TOgUCaICiMYi082AVc7bt6xTfVszA9BeAD4KLKnr42raFDLojbA78Q-7bLNA2CiStdT-8BblQOQ5IXUCxYdkw7ak0vp77vER1pCG9cEBkCHD~9dZccyQEGJApO~ax4D5wDtCpeQj3l0pW6kYNUlP8Q__&Key-Pair-Id=APKAI3I3QZ7I73OIQIXA

密钥对肯定是有效的:

只有一个 Origin Access Identity 和一个分布:

[<boto.cloudfront.identity.OriginAccessIdentitySummary object at 0x10f356110>]
[<boto.cloudfront.distribution.DistributionSummary object at 0x10f356090>]

【问题讨论】:

    标签: python boto amazon-cloudfront


    【解决方案1】:

    我有同样的问题。

    我想知道 canfront 和 s3 是否还没有在逻辑上连接到“源访问身份”。这是 cloudfront 用来从 S3 提取内容的身份,使用您指定的私钥对验证签名。

    果然,这就是问题所在。禁用对底层 S3 存储桶的公共访问,然后告诉 AWS 使用适当的身份,然后再次尝试您的代码。

    以下是来自网络的方法:

    在 CloudFront 控制面板 (https://console.aws.amazon.com/cloudfront/home) 中,单击左侧的“分发”以查看您的所有发行版。选择您想要的,单击 [i] 图标了解更多信息。从那里,单击 [Origins] 选项卡,然后选择存储桶旁边的单选按钮。单击它,将出现一个编辑按钮。单击编辑。在出现的新面板中选择“限制存储桶访问”。该站点将提示您执行哪个访问身份。选择您创建的身份。单击“是,编辑”以保存您的更改。

    祝你好运!

    【讨论】:

    • 非常感谢。我会尽快调查这个问题,并希望在它起作用时奖励你。
    • 当你让它工作时告诉我!我也在研究 cloudfront,现在玩 CNAME 以获得更多“乐趣”。
    • 当我使用 CNAME 主机时,我需要多一步。完成上述操作后,进入 S3 存储桶。点击“权限”。在这里,您会看到您的帐户以及“所有人”。删除“所有人”。然后单击“添加权限”。将弹出一个新的下拉列表。在这里,选择 Cloudfront Access Identity,然后单击“列表”和“查看”。这告诉 S3 您希望 cloudfront 通过 cloudfront 创建的特殊用户查看和列出存储桶中的项目。
    • @ScottPenberthy 我在下拉列表中看不到任何“Cloudfront 访问身份”。我怎样才能让它出现在下拉列表中?
    • @Anthony Kong 如果列表中没有,您可以创建一个新的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    • 1970-01-01
    • 2013-10-06
    • 1970-01-01
    • 2014-03-01
    • 2021-12-01
    • 2018-12-29
    相关资源
    最近更新 更多