Github actions + Cloud Run Functionsのデプロイで権限エラー

Github actionsでデプロイしたいのに権限エラーで通らない…

 
今回はGithub actionsからGoogle CloudのCloud Run Functionsにデプロイ時の権限エラーでハマったことをまとめようと思います。
 

前提

 
以下のサービスを利用しています。
今回はGithub actionsの使用方法に関して割愛させていいただきます。
  • Google Cloud
    • IAM
    • Pub/Sub
    • Cloud Run Functions
  • Github actions
  • Slack API
 

デプロイ準備

 
Cloud Run FunctionsからイベントフックでSlack通知する処理をGithub actionsでデプロイしようとYAMLを書き、実行を試みたところいくつかエラーが出ておりました。
※actionsのデプロイ設定を一部抜粋
 

エラー① - 借用するサービスアカウント

 
デプロイしてみると以下のエラーが出ていました。
cloudfunctions.functions.generateUploadUrlが足りない…
Github actionsで借用するサービスアカウントに「Cloud Functions 閲覧者」のロールつけていたのですが、「Cloud Functions 開発者」でないと権限が足りていないようでした。
単純にドキュメント読みながら追加した時に間違えた疑惑があります笑
 

エラー② - Functions実行用サービスアカウント

 
再度デプロイしてみると別のエラーが出ていました。
 
「サービス アカウント ユーザー」はサービスアカウントとリソースの紐付けに必要なため、Functions実行用サービスアカウントにロール付与してあげる必要がありました。
 

エラー③ - Functionsビルド用サービスアカウント

 
これでデプロイできるかな?と期待してデプロイしたところ再度エラーがでました。
 
なぜ初期設定で使用していたサービスアカウントの権限エラーが出るんだ?と思い、Functionsの詳細を確認したところ、Functionsの「Build サービス アカウント」で使用していました!
一旦このサービスアカウントに先程と同様に「サービス アカウント ユーザー」のロールを付与して再度デプロイしてみると…
 
無事デプロイできました!
実はここに至る前に実行用サービスアカウントも初期設定のサービスアカウントを使用し、Build用サービスアカウントを認識できていなかったので、「ロールつけたのに更新されないぞ!」と見事にハマっていました笑
IAM管理の大切さを改めて思い知ることになるとは…
 
借用するサービスアカウントから何かする場合は「サービス アカウント ユーザー(roles/iam.serviceAccountUser)」が必要になる、と記憶しておこうと思います。
 

参考

 
サービス アカウント ユーザー」についての公式ドキュメント
 

さいごに

 
権限周りは常に整理していかないと問題が複雑になりやすいので注意が必要ですね。
個人的にはTerraformでコード管理してしまうのが良い、と考えています。
その他Google Cloudのインフラ構築・運用やシステム開発についてお悩みの際は弊社お問い合わせにて気軽にご連絡ください。