Google Cloud S3 のコツ

@Pfaffman Google Cloud の情報を分割しました。これは必ずしも OP には適合しませんが、Google Cloud で問題が発生している場合に保存しておくべきです。


こんにちは、

ヒントをありがとうございます。しかし、ロールを Storage Legacy Object Owner から Storage Legacy Bucket Owner に変更するまで、それは私には機能しませんでした。

ロールを選択する際に具体的に記載されているのは次のとおりです。

Storage Legacy Object Owner

既存のオブジェクトへの読み取り/書き込みアクセス(リスト表示なし)。

Storage Legacy Bucket Owner

オブジェクトのリスト表示/作成/削除を含む、既存のバケットへの読み取りおよび書き込みアクセス。

これで、リスト表示を含めて機能するようになり、自動バックアップが可能になりました!やったー!!

「いいね!」 3

Google バケットでの S3 の使用について:

ここで言及したように:
https://meta.discourse.org/t/using-object-storage-for-uploads-s3-clones/148916/334
バケットに対する Storage Legacy Bucket Owner ロールを持つサービスアカウントを使用して、一覧表示と自動バックアップが機能することをここに確認します。

Google バケットで S3 を使用する場合は、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 モントリオール 葉のアイコン 低 CO2
NORTHAMERICA-NORTHEAST2 トロント 葉のアイコン 低 CO2
US-CENTRAL1 アイオワ 葉のアイコン 低 CO2
US-EAST1 サウスカロライナ
US-EAST4 バージニア北部
US-EAST5 コロンバス
US-SOUTH1 ダラス
US-WEST1 オレゴン 葉のアイコン 低 CO2
US-WEST2 ロサンゼルス
US-WEST3 ソルトレイクシティ
US-WEST4 ラスベガス
南米
SOUTHAMERICA-EAST1 サンパウロ 葉のアイコン 低 CO2
SOUTHAMERICA-WEST1 サンティアゴ
ヨーロッパ
EUROPE-CENTRAL2 ワルシャワ
EUROPE-NORTH1 フィンランド 葉のアイコン 低 CO2
EUROPE-SOUTHWEST1 マドリード 葉のアイコン 低 CO2
EUROPE-WEST1 ベルギー 葉のアイコン 低 CO2
EUROPE-WEST2 ロンドン
EUROPE-WEST3 フランクフルト
EUROPE-WEST4 オランダ
EUROPE-WEST6 チューリッヒ 葉のアイコン 低 CO2
EUROPE-WEST8 ミラノ
EUROPE-WEST9 パリ 葉のアイコン 低 CO2
アジア
ASIA-EAST1 台湾
ASIA-EAST2 香港
ASIA-NORTHEAST1 東京
ASIA-NORTHEAST2 大阪
ASIA-NORTHEAST3 ソウル
ASIA-SOUTH1 ムンバイ
ASIA-SOUTH2 デリー
ASIA-SOUTHEAST1 シンガポール
インドネシア
ASIA-SOUTHEAST2 ジャカルタ
オーストラリア
AUSTRALIA-SOUTHEAST1 シドニー
AUSTRALIA-SOUTHEAST2 メルボルン

また、Files 設定でこれらのオプションを設定する必要があるのも馬鹿げていると思います。ファイルのアップロードに S3 を使用したのではなく、バックアップにのみ使用しました。アップロードとバックアップで別のバケットが必要ですが、リージョンを設定できるのは Files 設定の 1 か所だけです。

これが他の誰かの時間を節約できれば幸いです。

追伸: https://discourse.example.com/logs/ でデバッグしました

S3 からバックアップを一覧表示できませんでした: 指定された場所の制約が無効です。–リージョンの問題

S3 からバックアップを一覧表示できませんでした: アクセスが拒否されました。-- Storage Legacy Object Owner (Storage Legacy Bucket Owner の代わりに)

「いいね!」 1

OPで説明されているようにENV変数を設定し、推奨されているように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
CORSルールをインストール中...
スキップ
** Execute s3:upload_assets
アップロード中: 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:バケットを変更することは考えていませんが、VMディスク上の以前にアップロードされた画像はどうなるのか気になります。

編集(解決済み):
@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