Ansible S3 对象上传到 BackBlaze returns 403 for PutObjectAcl
Ansible S3 object upload to BackBlaze returns 403 for PutObjectAcl
我正在尝试使用 Ansible's community S3 task 将文件上传到 S3 兼容的 BackBlaze,但是没有成功。
我的任务定义是:
- name: Install required dependencies
pip: name=boto3
- name: Copy backup files to S3 bucket
amazon.aws.aws_s3:
bucket: personal-backup
object: "{{ inventory_hostname }}/{{ item }}"
src: "{{ item }}"
mode: put
permission: "private"
s3_url: "https://s3.us-west-002.backblazeb2.com"
environment:
AWS_ACCESS_KEY: "<redacted>"
AWS_SECRET_ACCESS_KEY: "{{ personal_backup_secret }}"
loop: "{{ backup_files }}"
这似乎应该是正确的。但我不断收到此错误:
{"ansible_loop_var": "item", "boto3_version": "1.20.37", "botocore_version": "1.23.37", "changed": false, "error": {"code": "AccessDenied", "message": "not entitled"}, "item": "/home/user/file.txt", "msg": "Unable to set object ACL: An error occurred (AccessDenied) when calling the PutObjectAcl operation: not entitled", "response_metadata": {"host_id": "aZWQ4m", "http_headers": {"cache-control": "max-age=0, no-cache, no-store", "content-length": "139", "content-type": "application/xml", "date": "Sun, 16 Jan 2022 23:40:01 GMT", "x-amz-id-2": "aZWQ4mDC", "x-amz-request-id": "9c8d9f2f6"}, "http_status_code": 403, "request_id": "9c8d9f2f61", "retry_attempts": 0}}
这很奇怪,因为根据 BackBlaze documentation:
The Put Object ACL call only supports the same canned ACL values mentioned previously. The call will succeed only when specified ACL matches the ACL of the bucket.
这意味着对象权限(“私有”)需要与存储桶权限相匹配...但是我的存储桶被标记为私有,所以应该已经没问题了。我正在使用的应用程序密钥确实具有“writeFiles”权限(在 UI 中确认),根据相同的 BackBlaze 文档页面,它应该有权访问“Put Object ACL”。
所以,我很惊讶它不起作用,并且不确定如何解决它。有人以前让 Ansible 与 BackBlaze 一起工作吗?谢谢!
编辑:哦,上传确实成功了(它需要一段时间才能显示在 UI 中)。但它仍然会出错,这对 Ansible 任务不利。我猜它必须在内部作为一个步骤上传,然后尝试将 ACL 调整为另一个步骤,这是失败的部分。
对于那些偶然发现这个问题的人...解决方案是生成一个具有“writeBuckets”权限的访问密钥(这是通过在下面的屏幕截图中选择“全部”来设置的,而不是选择特定的存储桶)。
这显然不是一个理想的解决方案,因为您必须让该应用程序密钥访问所有存储桶,而不仅仅是您想要用于特定应用程序用例的存储桶(这违反安全最佳实践)。这似乎不是所有人都需要的,因为您只会与那个桶进行交互。
我将向 BackBlaze 团队反馈它并不理想。
我正在尝试使用 Ansible's community S3 task 将文件上传到 S3 兼容的 BackBlaze,但是没有成功。
我的任务定义是:
- name: Install required dependencies
pip: name=boto3
- name: Copy backup files to S3 bucket
amazon.aws.aws_s3:
bucket: personal-backup
object: "{{ inventory_hostname }}/{{ item }}"
src: "{{ item }}"
mode: put
permission: "private"
s3_url: "https://s3.us-west-002.backblazeb2.com"
environment:
AWS_ACCESS_KEY: "<redacted>"
AWS_SECRET_ACCESS_KEY: "{{ personal_backup_secret }}"
loop: "{{ backup_files }}"
这似乎应该是正确的。但我不断收到此错误:
{"ansible_loop_var": "item", "boto3_version": "1.20.37", "botocore_version": "1.23.37", "changed": false, "error": {"code": "AccessDenied", "message": "not entitled"}, "item": "/home/user/file.txt", "msg": "Unable to set object ACL: An error occurred (AccessDenied) when calling the PutObjectAcl operation: not entitled", "response_metadata": {"host_id": "aZWQ4m", "http_headers": {"cache-control": "max-age=0, no-cache, no-store", "content-length": "139", "content-type": "application/xml", "date": "Sun, 16 Jan 2022 23:40:01 GMT", "x-amz-id-2": "aZWQ4mDC", "x-amz-request-id": "9c8d9f2f6"}, "http_status_code": 403, "request_id": "9c8d9f2f61", "retry_attempts": 0}}
这很奇怪,因为根据 BackBlaze documentation:
The Put Object ACL call only supports the same canned ACL values mentioned previously. The call will succeed only when specified ACL matches the ACL of the bucket.
这意味着对象权限(“私有”)需要与存储桶权限相匹配...但是我的存储桶被标记为私有,所以应该已经没问题了。我正在使用的应用程序密钥确实具有“writeFiles”权限(在 UI 中确认),根据相同的 BackBlaze 文档页面,它应该有权访问“Put Object ACL”。
所以,我很惊讶它不起作用,并且不确定如何解决它。有人以前让 Ansible 与 BackBlaze 一起工作吗?谢谢!
编辑:哦,上传确实成功了(它需要一段时间才能显示在 UI 中)。但它仍然会出错,这对 Ansible 任务不利。我猜它必须在内部作为一个步骤上传,然后尝试将 ACL 调整为另一个步骤,这是失败的部分。
对于那些偶然发现这个问题的人...解决方案是生成一个具有“writeBuckets”权限的访问密钥(这是通过在下面的屏幕截图中选择“全部”来设置的,而不是选择特定的存储桶)。
这显然不是一个理想的解决方案,因为您必须让该应用程序密钥访问所有存储桶,而不仅仅是您想要用于特定应用程序用例的存储桶(这违反安全最佳实践)。这似乎不是所有人都需要的,因为您只会与那个桶进行交互。
我将向 BackBlaze 团队反馈它并不理想。