【发布时间】:2018-07-24 22:44:07
【问题描述】:
使用 Ansible,我正在尝试将 AWS CloudFormation 模板上传到 S3 存储桶,然后使用生成的 URL 运行模板。
- name: create s3 bucket
s3_bucket:
name: '{{ s3.bucket_name }}'
state: present
register: s3_bucket
- name: stage cloudformation template
aws_s3:
bucket: '{{ s3_bucket.name }}'
object: cloudformation-template-vpc.yaml
src: ../files/cloudformation-template-vpc.yaml
mode: put
register: s3_file
- name: 'call cloudformation with state {{ vpc.state }}'
cloudformation:
stack_name: '{{ vpc.stack_name }}'
state: '{{ vpc.state | default("present") }}'
template: '{{ s3_file.url }}'
register: vpc_ref
但是当我这样做时,我得到一个错误:
IOError: [Errno 2] No such file or directory:
'https://mybucket.s3.amazonaws.com/cloudformation-template-vpc.yaml?AWSAccessKeyId=<access-key>&Expires=<a-number>&Signature=<signature>'
(我明显修改了url。但真正的url是那个格式的。)
显然在那个 url 上有一个对象。 Ansible 刚刚创建了它,我正在使用它返回给我的值,并且我通过 Web 控制台查看了 S3 存储桶以验证它是否存在。对象存在。有“这样的文件或目录”。
这可能是权限问题。我的意思是,我正在运行一个连续的 Ansible 游戏:上传文件,取回 url,然后使用该 url 运行。这一切都是作为同一个 IAM 角色完成的。所以我不明白为什么这会是一个权限问题,但是我还是不太了解 S3 权限、公共、私有等。
为什么会失败?为什么 Ansible 上传后看不到对象?
【问题讨论】:
-
能否详细说明在哪个任务中显示错误
-
我不熟悉
aws_s3模块,但您是否尝试设置permission: public-read?我认为这可能是由于需要一些时间才能使对象可用,所以也许您必须使用get和until关键字进行pause或url 检查以执行几次重试。 -
按照建议,将该对象设为公开。您可以从控制台执行此操作。如果可能,请在另一个选项卡中以隐身模式验证来自浏览器的公共访问权限。这将有助于确定这是否是 S3 权限问题。
-
好建议!我尝试将权限设置为“bucket-owner-full-control”,我无法设置公共读取,即使只是为了测试。 (“不能?还是不会?”——好吧,不会。这太荒谬了。)让剧本在做之前暂停是个好主意。我试过了,但很可惜,它没有帮助。不过,我确实想通了,我会在稍后发布答案。
标签: amazon-web-services amazon-s3 ansible amazon-cloudformation