关于 Google Cloud S3 的提示

@Pfaffman 将此 Google Cloud 信息分拆出来,该信息不一定适合放在 OP 中,但应为遇到 Google Cloud 问题的用户保存。


您好,

感谢您的提示,但直到我将角色从“存储旧版对象所有者”更改为“存储旧版存储桶所有者”后,它才对我起作用。

在选择角色时,工具提示中明确写着:

存储旧版对象所有者

对现有对象的读/写访问权限不包括列出

存储旧版存储桶所有者

对现有存储桶的读写访问权限,包括列出、创建/删除对象。

现在它起作用了,包括列出功能,从而实现了自动备份!太棒了!!

3 个赞

关于在 Google Buckets 上使用 S3:

正如我在此处提到的:
https://meta.discourse.org/t/using-object-storage-for-uploads-s3-clones/148916/334
我可以确认,使用具有存储桶上的 Storage Legacy Bucket Owner 角色的服务帐户,列出文件和自动备份都可以正常工作。

请注意,将 S3 用于 Google Bucket 意味着只能选择在 Amazon 和 Google 中名称相同的区域。
我觉得需要从下拉菜单中选择(带有后端验证),而不是手动输入,这很愚蠢(我尝试过操作 API,但未成功)。

这意味着您例如不能使用欧洲的存储桶,因为 Amazon 上的前缀是 EU 而 Google 上是 EUROPE,也不能使用多区域。

AWS:

区域名称 代码
美国东部(俄亥俄州) us-east-2
美国东部(弗吉尼亚州北部) us-east-1
美国西部(加利福尼亚州北部) us-west-1
美国西部(俄勒冈州) us-west-2
非洲(开普敦) af-south-1
亚太地区(香港) ap-east-1
亚太地区(雅加达) ap-southeast-3
亚太地区(孟买) ap-south-1
亚太地区(大阪) ap-northeast-3
亚太地区(首尔) ap-northeast-2
亚太地区(新加坡) ap-southeast-1
亚太地区(悉尼) ap-southeast-2
亚太地区(东京) ap-northeast-1
加拿大(中部) ca-central-1
中国(北京) cn-north-1
中国(宁夏) cn-northwest-1
欧洲(法兰克福) eu-central-1
欧洲(爱尔兰) eu-west-1
欧洲(伦敦) eu-west-2
欧洲(米兰) eu-south-1
欧洲(巴黎) eu-west-3
欧洲(斯德哥尔摩) eu-north-1
中东(巴林) me-south-1
南美洲(圣保罗) sa-east-1

Google:

大洲 区域名称 区域描述
北美洲
NORTHAMERICA-NORTHEAST1 蒙特利尔 leaf icon 低碳排放
NORTHAMERICA-NORTHEAST2 多伦多 leaf icon 低碳排放
US-CENTRAL1 爱荷华州 leaf icon 低碳排放
US-EAST1 南卡罗来纳州
US-EAST4 弗吉尼亚州北部
US-EAST5 哥伦布
US-SOUTH1 达拉斯
US-WEST1 俄勒冈州 leaf icon 低碳排放
US-WEST2 洛杉矶
US-WEST3 盐湖城
US-WEST4 拉斯维加斯
南美洲
SOUTHAMERICA-EAST1 圣保罗 leaf icon 低碳排放
SOUTHAMERICA-WEST1 圣地亚哥
欧洲
EUROPE-CENTRAL2 华沙
EUROPE-NORTH1 芬兰 leaf icon 低碳排放
EUROPE-SOUTHWEST1 马德里 leaf icon 低碳排放
EUROPE-WEST1 比利时 leaf icon 低碳排放
EUROPE-WEST2 伦敦
EUROPE-WEST3 法兰克福
EUROPE-WEST4 荷兰
EUROPE-WEST6 苏黎世 leaf icon 低碳排放
EUROPE-WEST8 米兰
EUROPE-WEST9 巴黎 leaf icon 低碳排放
亚洲
ASIA-EAST1 台湾
ASIA-EAST2 香港
ASIA-NORTHEAST1 东京
ASIA-NORTHEAST2 大阪
ASIA-NORTHEAST3 首尔
ASIA-SOUTH1 孟买
ASIA-SOUTH2 德里
ASIA-SOUTHEAST1 新加坡
印度尼西亚
ASIA-SOUTHEAST2 雅加达
澳大利亚
AUSTRALIA-SOUTHEAST1 悉尼
AUSTRALIA-SOUTHEAST2 墨尔本

我也觉得在“文件设置”中设置这些选项很愚蠢。我没有使用 S3 上传文件,我只用它来备份。需要为上传和备份设置不同的存储桶,但只有一个地方可以设置区域,那就是在“文件设置”中。

希望这能为其他人节省一些排查问题的时间。

附注:我使用 https://discourse.example.com/logs/ 进行调试

列出 S3 备份失败:指定的地点约束无效。–区域问题

列出 S3 备份失败:访问被拒绝。-- Storage Legacy Object Owner 而不是 Storage Legacy Bucket Owner

1 个赞

如果您按照 OP 中的描述使用环境变量进行设置,并将 DISCOURSE_S3_ENDPOINT 设置为推荐值,则会忽略 DISCOURSE_S3_REGION,从而解决了这个问题。

2 个赞

谢谢,
问题是,我使用的是 Google Cloud Marketplace 上的 Bitnami VM 一键安装。
可能可以自定义环境变量,但并不直接。
在 UI 中设置端点不会忽略区域。

无论如何,谢谢。

非常感谢!
确实,我忘了添加代码片段。

不幸的是,我遇到了以下错误:

Aws::S3::Errors::InvalidArgument: 无效参数。

这与我在使用 Web UI 时遇到的错误非常一致,但没有太多信息可以解决这个问题……

我找到了这个帖子,其中建议可能与 Google 存储与 Amazon S3 存在不兼容性。

这是否可能导致 Google 存储出现问题?

手动运行任务时的完整堆栈跟踪:

root@discourse-2-app:/var/www/discourse# sudo -E -u discourse bundle exec rake s3:upload_assets --trace
** Invoke s3:upload_assets (first_time)
** Invoke environment (first_time)
** Execute environment
** Invoke s3:ensure_cors_rules (first_time)
** Invoke environment
** Execute s3:ensure_cors_rules
Installing CORS rules...
skipping
** Execute s3:upload_assets
Uploading: assets/docker-manager-app-ecd2975f42c4096057a046c086d6a43905c8a18442900d5293ae9a3489422bb0.js
rake aborted!
Aws::S3::Errors::InvalidArgument: 无效参数。
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-core-3.130.2/lib/seahorse/client/plugins/raise_response_errors.rb:17:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/sse_cpk.rb:24:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/dualstack.rb:27:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/accelerate.rb:56:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/checksum_algorithm.rb:111:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/jsonvalue_converter.rb:22:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/idempotency_token.rb:19:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/param_converter.rb:26:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-core-3.130.2/lib/seahorse/client/plugins/request_callback.rb:71:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/response_paging.rb:12:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-core-3.130.2/lib/seahorse/client/plugins/response_target.rb:24:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-core-3.130.2/lib/seahorse/client/request.rb:72:in `send_request'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-s3-1.114.0/lib/aws-sdk-s3/client.rb:12369:in `put_object'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-s3-1.114.0/lib/aws-sdk-s3/object.rb:1472:in `put'
/var/www/discourse/lib/s3_helper.rb:75:in `upload'
/var/www/discourse/lib/tasks/s3.rake:37:in `block in upload'
/var/www/discourse/lib/tasks/s3.rake:36:in `open'
/var/www/discourse/lib/tasks/s3.rake:36:in `upload'
/var/www/discourse/lib/tasks/s3.rake:192:in `block (2 levels) in <main>'
/var/www/discourse/lib/tasks/s3.rake:191:in `each'
/var/www/discourse/lib/tasks/s3.rake:191:in `block in <main>'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/task.rb:281:in `block in execute'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/task.rb:281:in `each'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/task.rb:281:in `execute'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/task.rb:219:in `block in invoke_with_call_chain'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/task.rb:199:in `synchronize'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/task.rb:199:in `invoke_with_call_chain'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/task.rb:188:in `invoke'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/application.rb:160:in `invoke_task'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/application.rb:116:in `block (2 levels) in top_level'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/application.rb:116:in `each'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/application.rb:116:in `block in top_level'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/application.rb:125:in `run_with_threads'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/application.rb:110:in `top_level'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/application.rb:83:in `block in run'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/application.rb:186:in `standard_exception_handling'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/application.rb:80:in `run'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/exe/rake:27:in `<top (required)>'
/var/www/discourse/vendor/bundle/ruby/2.7.0/bin/rake:25:in `load'
/var/www/discourse/vendor/bundle/ruby/2.7.0/bin/rake:25:in `<top (required)>'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.20/lib/bundler/cli/exec.rb:58:in `load'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.20/lib/bundler/cli/exec.rb:58:in `kernel_load'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.20/lib/bundler/cli/exec.rb:23:in `run'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.20/lib/bundler/cli.rb:485:in `exec'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.20/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.20/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.20/lib/bundler/vendor/thor/lib/thor.rb:392:in `dispatch'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.20/lib/bundler/cli.rb:31:in `dispatch'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.20/lib/bundler/vendor/thor/lib/thor/base.rb:485:in `start'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.20/lib/bundler/cli.rb:25:in `start'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.20/exe/bundle:48:in `block in <top (required)>'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.20/lib/bundler/friendly_errors.rb:120:in `with_friendly_errors'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.20/exe/bundle:36:in `<top (required)>'
/usr/local/bin/bundle:25:in `load'
/usr/local/bin/bundle:25:in `<main>'
Tasks: TOP => s3:upload_assets

PS:我没有考虑更换存储桶,但想知道虚拟机磁盘上之前上传的图片会怎么样。

编辑(已解决):
@gerhard @Falco
我通过启用 http_wire_trace 找到了问题所在。
来自 googleapis 的无效参数响应解释了原因:
当启用了统一存储桶级别访问时,无法为对象插入旧版 ACL。在此处了解更多信息:Uniform bucket-level access  |  Cloud Storage  |  Google Cloud

我启用了存储桶的精细 ACL,而不是统一 ACL,因为上传期间设置的标头指定它是公开的。(我有一个统一的 ACL,并将整个存储桶设置为公开)

我无权更新 OP,但我认为它应该提到,为了让 Google 存储桶正常工作,服务帐户需要在备份存储桶上拥有 Storage Legacy Bucket Owner 角色,并且上传存储桶需要使用精细 ACL。

希望这能为社区节省时间。
再次感谢 @Falco @pfaffman @gerhard @tuanpembual 的帮助。

2 个赞