1

我正在尝试使用Ansible 的社区 S3 任务将文件上传到与 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”,“已更改”:false,“错误”:{“code”:“AccessDenied”,“消息": "未授权"}, "item": "/home/user/file.txt", "msg": "无法设置对象 ACL:调用 PutObjectAcl 操作时发生错误 (AccessDenied):未授权", “response_metadata”:{“host_id”:“aZWQ4m”,“http_headers”:{“cache-control”:“max-age=0,无缓存,无存储”,“内容长度”:“139”, “内容类型”:“应用程序/xml”,“日期”:“星期日,2022 年 1 月 16 日 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 文档

Put Object ACL 调用仅支持前面提到的相同的固定 ACL 值。只有指定的 ACL 与存储桶的 ACL 匹配时,调用才会成功。

这意味着对象权限(“私有”)需要与存储桶权限匹配......但我的存储桶被标记为私有,所以应该已经可以了。我正在使用的应用程序密钥确实具有“writeFiles”权限(在 UI 中确认),该权限应该可以根据同一个 BackBlaze 文档页面访问“Put Object ACL”。

所以,我很惊讶它不起作用,并且不知道如何解决它。以前有人让 Ansible 与 BackBlaze 一起工作吗?谢谢!

编辑:哦,上传确实有效(它需要一段时间才能显示在 UI 中)。但它仍然会出错,这对 Ansible 任务不利。我想它必须在内部作为一个步骤上传,然后尝试将 ACL 调整为另一个步骤,这是失败的部分。

4

1 回答 1

2

对于那些偶然发现这一点的人......解决方案是生成一个具有“writeBuckets”权限的访问密钥(这是通过在下面的屏幕截图中选择“全部”来设置的,而不是选择特定的存储桶)。

这显然是一个不理想的解决方案,因为您必须让该应用程序密钥访问所有存储桶,而不仅仅是您想要用于特定应用程序用例的存储桶(这违反了安全最佳实践)。这似乎对所有人都不是必需的,因为您只与那个单一的存储桶进行交互。

我将向 BackBlaze 团队反馈它并不理想。

在此处输入图像描述

于 2022-01-20T20:04:08.690 回答