🕌

Google CloudのRubyライブラリを利用して、Cloud Storageの署名付きURLを取得しようとして詰まったお話

2023/11/27に公開

アップロードするファイルが、少々センシティブなファイルなので、ウェブ公開せず、署名URLを取得してそのURLをAPIから返したい。

Cloud Runに載っているRailsからなのでADCでできるはずと。
ADCとは
https://cloud.google.com/docs/authentication/provide-credentials-adc?hl=ja
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

こちらで議論されているが、まだ問題は残るよう。
https://github.com/googleapis/google-cloud-ruby/issues/6268

いろんなパラメータがあるがどんな時に使うのか全くわからない。
https://cloud.google.com/ruby/docs/reference/google-cloud-storage/latest/Google-Cloud-Storage-File#Google__Cloud__Storage__File_signed_url_instance_

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で済むようになって欲しいな。

https://github.com/googleapis/google-cloud-ruby

Discussion