🕌
Google CloudのRubyライブラリを利用して、Cloud Storageの署名付きURLを取得しようとして詰まったお話
アップロードするファイルが、少々センシティブなファイルなので、ウェブ公開せず、署名URLを取得してそのURLをAPIから返したい。
Cloud Runに載っているRailsからなのでADCでできるはずと。
ADCとは
Cloud Runなど、Google Cloud サービスでは紐づいているサービスアカウントのクレデンシャルを勝手に使ってくれるもの。
require "google/cloud/storage"
storage = Google::Cloud::Storage.new
bucket = storage.bucket "my-todo-app"
bucket.create_file "/var/todo-app/avatars/heidi/400x400.png",
"avatars/heidi/400x400.png"
これでアップロードはできたので、署名URLも簡単だろうと
require "google/cloud/storage"
storage = Google::Cloud::Storage.new
bucket = storage.bucket "my-todo-app"
file = bucket.file "avatars/heidi/400x400.png"
shared_url = file.signed_url
Service account credentials 'issuer (client_email)' is missing
こちらで議論されているが、まだ問題は残るよう。
いろんなパラメータがあるがどんな時に使うのか全くわからない。
issuerが足りないということなので、結局は環境変数でissuerとsigning_keyを渡すことになりました。
require "google/cloud/storage"
storage = Google::Cloud::Storage.new
bucket = storage.bucket "my-todo-app"
file = bucket.file "avatars/heidi/400x400.png"
signing_key = OpenSSL::PKey::RSA.new ENV.fetch("GCP_SECRET_BUCKET_SIGNING_KEY").gsub("\\n", "\n")
shared_url = file.signed_url issuer: ENV.fetch("GCP_SECRET_BUCKET_ISSUER"), signing_key: signing_key
ADCで済むようになって欲しいな。
Discussion