とろろこんぶろぐ

かけだしR&Dフロントエンジニアの小言

GCP の Cloud Function にアクセス制限をつける

GCP の Cloud Function は誰でも呼び出せる

GCP の Cloud Function で HTTP 関数を作成すると、デフォルトでは誰でもアクセスできてしまう。

(9/25現在。今後変わるらしい。)

アクセス制限をつける

  1. 自身のアカウントに cloudfunctions/admin 権限がついていることを確認(そうでないと、未認証の呼び出しを許可するチェックボックスを操作できない)。また、呼び出す側のサービスアカウントに cloudfunctions/invoker 権限がついていることを確認。

  2. gcloud の CLI からアクセス制限かけられないので、GCPのwebページからGUI で新規作成し、「未認証の呼び出しを許可する」のチェックを外す。

  3. アクセストークンを生成する( gcloud auth print-identity-token ${service account email}

  4. Cloud function へアクセスする際に header の Authorization に Bearer: アクセストークン をつけて呼び出す

上記の操作を行うことで、アクセス制限をかけられる。

アクセストークンは1時間で有効期限が切れる

gcloud の CLI で呼び出す形だと、1時間で有効期限が切れてしまう。 node.js などのプログラム上からトークンを更新しながら呼び出す必要がある。

firebase を利用している場合は、firebase の npm モジュールで、getIdToken 関数を利用することができる。 そうでない場合は、 google-auth-library のライブラリを用いて、JWT を利用した呼び出しを行う。

このサンプルが参考になる。

github.com

target_audience に cloud function のURLを指定して、token を発行してリクエストを行うことができる。

まとめ

GCP の Cloud Function は誰でも呼び出せてしまうので、アクセス制限をつける1方法をまとめた。 今回はサービスアカウントを利用した方法だが、GKE などを利用している場合は、GKE 自体に権限をつけてアクセスを許容することなどもできるっぽい。


Kubernetesを勉強するなら Kubernetes実践ガイド