🐡

Cloud Storageで署名付きURLの作成

2023/06/22に公開

https://cloud.google.com/storage/docs/access-control/signed-urls?hl=ja

署名付きURLを生成する方法

署名方式 備考
サービスアカウント認証によるV4署名
サービスアカウント認証によるV2署名 レガシーメカニズム・非推奨
HMAC認証による署名

プログラム(go)から署名付きURL発行してみるよ

CloudStorage

コンソールでぽちぽちと…
作成後Objectを1つおいておきます。

バケット名:public-image-smpeotn
Object:IMG_3766.JPG

※ 署名付きURLでアクセスするのでインターネット非公開です!

サービスアカウント

V4署名をするためにサービスアカウントを準備しておきます。
IAM > サービスアカウント > 作成 > 新しい鍵を作成
https://cloud.google.com/iam/docs/creating-managing-service-account-keys?hl=ja#creating

  • 発行したキーはJSON形式でDLしておいてください(credentials.json)
  • キーを適切な場所に配置(便宜上HomeDirにおいたことにします)
    GOOGLE_APPLICATION_CREDENTIALS に フルパスを設定します
export GOOGLE_APPLICATION_CREDENTIALS=/User/smpeotn/credentials.json

サンプルコード

公式のサンプルコード ほぼそのままですが…
https://github.com/smpeotn/gcs_signedURL_sample/blob/main/main.go
bucket
object
expiresTime < 検証のため3分にしてる
参考:https://cloud.google.com/storage/docs/access-control/signing-urls-with-helpers?hl=ja#storage-signed-url-object-go

実行

-> % go run main.go
https://storage.googleapis.com/public-image-smpeotn/IMG_3766.JPG?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=storage-access%40smpeotn-cdn.iam.gserviceaccount.com%2F20230621%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20230621T154017Z&X-Goog-Expires=179&X-Goog-Signature=391cf233ed1d16dc7dbc2e3caaf0ae47e16eeb053e20e660cac5bab386096df4a843b24474e67aeb674ef4f4b2363c2d06e176f9477f578242a51a059c0c6725b207ee788211ba6b708520d2b813b0ba3a98c8860afed10660172e984703758ef32a53e390c830c6b7c77820177708490bef75da0ab0feeda2cf44ee487103ad81d9f19c009a07b77e149228667d559e9670c358887d2285a9236b199063f999da6253075f4b7947578b1ce7aedc673b2df3b270ed07f1ccb642be707b6eecfe0f7868d725e84b95706019012670f41416759d42c2d9c2decf40a613ddb2ab6cbb8c1ff66037382c525bd506f88bbefb33aeb2307d2c3ac6d1a85791132b8b08&X-Goog-SignedHeaders=host

こんな感じで署名付きURLが発行されます!
認証していないシークレットブラウザでアクセスしてもこの通りインターネットからアクセス可能になります!!


期限が切れるとExpireしたよって教えてくれます

まとめ

比較的簡単に署名付きURLを発行することができました!
毎回URL発行していると計算コストがあがりそうなので使い所は選ばないといけないかなと思います。
CloudCDNとか使うと良いのかもしれないですね。次回検証してみます!!

Discussion