【问题标题】:How can I specify a signed S3 URL as template in CloudFormation?如何在 CloudFormation 中将签名的 S3 URL 指定为模板?
【发布时间】:2016-06-17 12:38:58
【问题描述】:

在 AWS CloudFormation 中,您可以通过上传模板文件或指定模板的 S3 URL 来指定模板。 (指定 Amazon S3 模板 URL)

如果存储桶是公共的,您可以构建一个 URL 供任何人访问对象/模板。只要 S3 模板 URL 是一个简单的 URL,就可以正常工作:

https://s3.amazonaws.com/public-bucket/unsigned.template

但如果存储桶是私有的,如果您想将对象共享给其他人,您可以生成一个签名的 S3 URL。我得到一个 URL,它是私有存储桶中模板的签名 S3 URL:

https://s3.amazonaws.com/private-bucket/signed.template?Signature=Cs6sqUABadcfZAuFu5FSMWAQ%3D&Expires=1459636414&AWSAccessKeyId=AKIAJ23456AXIOUBCNQ

不幸的是,CF 不尊重签名的 URL,并删除了 .template 之后的所有内容。因此,我收到Access Denied 错误。有谁知道在 CloudFormation 中将签名的 S3 URL 指定为模板的方法?

【问题讨论】:

    标签: amazon-web-services amazon-s3 amazon-cloudformation


    【解决方案1】:

    AWS 最终承认这是 CloudFormation 中的一个错误,他们正在努力修复。目前还没有预计到达时间。

    【讨论】:

    • 如果您有任何指向问题页面或公告的链接,它们在这里会有所帮助。
    • 快速更新,现在允许 echo us-west-2.console.aws.amazon.com/cloudformation/… s3 presign s3://jeffrey-cf-test/test.template)&stackName=testpresignURL 似乎可以解决问题
    • @jeffrey 谢谢。让我验证并更新答案。
    • 嘿,我说得太早了,看起来这将在我创建的帐户内工作,但不能跨帐户,这对我来说似乎很奇怪。
    • 在两个玩具帐户中对此进行了更多尝试,但我仍然觉得正在发生一些时髦的事情。如上所述,我创建了一个预签名的获取 url,并在我的浏览器中使用所述存储桶登录到帐户,我收到提示创建我的堆栈,当我将相同的 url 放入登录到不同帐户的浏览器中时,访问被拒绝错误。我回去让模板的 acl 允许公众阅读,然后突然间带有 presign url 的 same cf 链接在隔离帐户中工作。这让我相信,尽管 url 有一个 s3.GetObject 调用在幕后进行,奇怪。
    【解决方案2】:

    您似乎只能使用您有权访问的 URL(签名 URL 就足够了)。但是如果您愿意使用 aws cli,您也可以使用 curl 获取模板的内容并使用 --template-body

    创建堆栈
    $ aws cloudformation create-stack --template-body "$(curl -s '<signed url>')" --stack-name test --parameters ParameterKey=string,ParameterValue=string
    

    如果您正在编写脚本,请将模板保存到临时文件中,然后将其传递给 template-body

    【讨论】:

    • 我正在使用 AWS 仪表板,因此 CLI 和脚本不是选项。
    • 您是在使用签名的 url 来授予一定时间的权限,还是控制谁拥有访问权限。如果是第二种选择,您可以使用存储桶策略而不是签名网址:docs.aws.amazon.com/AmazonS3/latest/dev/…
    猜你喜欢
    • 2021-09-23
    • 2023-04-11
    • 1970-01-01
    • 2018-11-24
    • 2015-12-03
    • 2017-05-25
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多