@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 |
蒙特利尔 |
低碳排放 |
|
NORTHAMERICA-NORTHEAST2 |
多伦多 |
低碳排放 |
|
US-CENTRAL1 |
爱荷华州 |
低碳排放 |
|
US-EAST1 |
南卡罗来纳州 |
|
|
US-EAST4 |
弗吉尼亚州北部 |
|
|
US-EAST5 |
哥伦布 |
|
|
US-SOUTH1 |
达拉斯 |
|
|
US-WEST1 |
俄勒冈州 |
低碳排放 |
|
US-WEST2 |
洛杉矶 |
|
|
US-WEST3 |
盐湖城 |
|
|
US-WEST4 |
拉斯维加斯 |
|
| 南美洲 |
|
|
|
|
SOUTHAMERICA-EAST1 |
圣保罗 |
低碳排放 |
|
SOUTHAMERICA-WEST1 |
圣地亚哥 |
|
| 欧洲 |
|
|
|
|
EUROPE-CENTRAL2 |
华沙 |
|
|
EUROPE-NORTH1 |
芬兰 |
低碳排放 |
|
EUROPE-SOUTHWEST1 |
马德里 |
低碳排放 |
|
EUROPE-WEST1 |
比利时 |
低碳排放 |
|
EUROPE-WEST2 |
伦敦 |
|
|
EUROPE-WEST3 |
法兰克福 |
|
|
EUROPE-WEST4 |
荷兰 |
|
|
EUROPE-WEST6 |
苏黎世 |
低碳排放 |
|
EUROPE-WEST8 |
米兰 |
|
|
EUROPE-WEST9 |
巴黎 |
低碳排放 |
| 亚洲 |
|
|
|
|
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 个赞
Falco
(Falco)
3
如果您按照 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 个赞