使用 Ansible 创建 AWS S3 存储桶

Posted

技术标签:

【中文标题】使用 Ansible 创建 AWS S3 存储桶【英文标题】:creating AWS S3 bucket with Ansible 【发布时间】:2020-05-04 14:33:53 【问题描述】:

下面是我创建 S3 存储桶的 yml 文件。出于安全目的,我没有在此处粘贴实际的 aws_access_key 和 aws_secret_key,只是在下面的 sn-p 中将它们显示为 *****。我已经在安装了 Ansible 的 Ec2 实例上安装了 boto3、boto、AWS CLI。

--- - 主机:本地主机 任务: - 名称:创建 S3 存储桶 变成:真 aws_s3: aws_access_key=****** aws_secret_key=**** 存储桶=testbuck 模式=创建权限=公共读取区域=us-east-1

当我使用 ansible-playbook 命令执行上面的 yml 文件时,它会给出如下所示的异常。 请帮助我解决此问题,以便创建名为“testbuck”的 S3 存储桶。

任务执行期间发生异常。要查看完整的回溯,请使用 -vvv。错误是:botocore.exceptions.ClientError:调用 HeadBucket 操作时发生错误(403):禁止 致命的:[本地主机]:失败! => “boto3_version”:“1.10.44”,“botocore_version”:“1.13.44”,“已更改”:false,“错误”:“代码”:“403”,“消息”:“禁止” ,“msg”:“查找存储桶时失败(在bucket_check期间)testbuck。:调用HeadBucket操作时发生错误(403):Forbidden”,“response_metadata”:“host_id”:“OmIY2bLkh4T4JwxD/UJsM47n7oUUS6ttEL9ZMl+vv66bVsLcwQuP2pzAGr05m1LdtznYudr , "http_headers": "content-type": "application/xml", "date": "Fri, 17 Jan 2020 16:54:49 GMT", "server": "AmazonS3", "transfer-encoding": “分块”,“x-amz-bucket-region”:“us-east-1”,“x-amz-id-2”:“OmIY2bLkh4T4JwxD/UJsM47n7oUUS6ttEL9ZMl+vv66bVsLcwQuP2pzAGr05m1LdtznYudrrapk=”,“x-amz-request-id” :“51740FB276A10A18”,“http_status_code”:403,“request_id”:“51740FB276A10A18”,“retry_attempts”:0

【问题讨论】:

【参考方案1】:

HeadBucket 操作是检查 s3 存储桶是否存在以及您是否有权访问它。要使用此操作,您的 IAM 角色/用户必须能够执行 s3:ListBucket 操作。 Bucket Owner 默认拥有此权限,并将此权限授予其他人。更多信息参考s3官方文档https://docs.aws.amazon.com/en_us/AmazonS3/latest/API/API_HeadBucket.html

【讨论】:

【参考方案2】:

您应该需要检查是否有s3:ListBucket 访问权限。这是官方 s3 文档https://docs.aws.amazon.com/en_us/AmazonS3/latest/API/API_HeadBucket.html

【讨论】:

【参考方案3】:

默认情况下,Ansible 命令在创建之前使用check if a bucket exists 运行。也许您使用的 IAM 用户没有检查存储桶是否存在的权限。尝试添加:

aws_s3: ... ignore_nonexistent_bucket: True

或者授予用户s3:ListBucket权限。

【讨论】:

我的用户是拥有所有权限的管理员用户。正如你所建议的,我修改了我的 yml 以包含 ignore_nonexistent_bucket=true。 aws_s3: aws_access_key=****** aws_secret_key=**** 存储桶=testbuck 模式=创建权限=公共读取区域=us-east-1 ignore_nonexistent_bucket=true 现在 yml 没有给出错误并且执行成功,但是没有创建存储桶“testbuck”。下面是 yml [root@redhat ~]# ansible-playbook create_S3_bucket.yml TASK [Create an S3 bucket] 的输出 ************************ ****************************************************** **** 好的:[localhost] 播放回顾 *************************************** ****************************************************** ****************************************************** ****************** localhost : 好的=2 更改=0 无法访问=0 失败=0 跳过=0 获救=0 忽略=0 这很可能是因为testbuck存在于另一个帐户中,并且bucket名称应该是全局唯一的,请尝试设置一个唯一的bucket名称。 感谢 Yann 提供的所有帮助。它现在正在工作。 :)

以上是关于使用 Ansible 创建 AWS S3 存储桶的主要内容,如果未能解决你的问题,请参考以下文章

我们如何使用 serverless.yml 创建 AWS S3 存储桶并向其中添加文件?

AWS Lambda使用S3

将 aws 快照复制到 S3 存储桶

Powershell:使用临时凭证访问AWS s3存储桶

aws s3 存储桶策略

Cloudfront 提供通过 AWS CDK Python 为 S3 存储桶来源创建的访问被拒绝响应,无需公共访问