GCP の Cloud Function は誰でも呼び出せる
GCP の Cloud Function で HTTP 関数を作成すると、デフォルトでは誰でもアクセスできてしまう。
(9/25現在。今後変わるらしい。)
アクセス制限をつける
自身のアカウントに cloudfunctions/admin 権限がついていることを確認(そうでないと、未認証の呼び出しを許可するチェックボックスを操作できない)。また、呼び出す側のサービスアカウントに cloudfunctions/invoker 権限がついていることを確認。
gcloud の CLI からアクセス制限かけられないので、GCPのwebページからGUI で新規作成し、「未認証の呼び出しを許可する」のチェックを外す。
アクセストークンを生成する(
gcloud auth print-identity-token ${service account email}
)Cloud function へアクセスする際に header の Authorization に
Bearer: アクセストークン
をつけて呼び出す
上記の操作を行うことで、アクセス制限をかけられる。
アクセストークンは1時間で有効期限が切れる
gcloud の CLI で呼び出す形だと、1時間で有効期限が切れてしまう。 node.js などのプログラム上からトークンを更新しながら呼び出す必要がある。
firebase を利用している場合は、firebase の npm モジュールで、getIdToken 関数を利用することができる。
そうでない場合は、 google-auth-library
のライブラリを用いて、JWT を利用した呼び出しを行う。
このサンプルが参考になる。
target_audience に cloud function のURLを指定して、token を発行してリクエストを行うことができる。
まとめ
GCP の Cloud Function は誰でも呼び出せてしまうので、アクセス制限をつける1方法をまとめた。 今回はサービスアカウントを利用した方法だが、GKE などを利用している場合は、GKE 自体に権限をつけてアクセスを許容することなどもできるっぽい。
Kubernetesを勉強するなら Kubernetes実践ガイド