🌐

GitHub Actionsを利用して、Google Cloud Functionsに自動でデプロイする

2024/03/23に公開

2024年3月23日の記事です。書いた背景はSandbox的な環境を作るための時間を短縮するためです。UIが変更された場合には、この手順は利用できません。

想定読者

  • とりあえず動くものを作りたい人向け
  • Google Cloud を触り始めた方で、詳しいことはわからないけどGitHub Actionsってのをつかうと、自動でデプロイできるらしい、ということを知っている方向け

前提

  • Google Cloud Functions (以下、Functions)で使っている関数をGitHubで管理している
  • クライアントPCからVScodeで変更したコードをCommitし、GitHubにPushできる

目的

  • 変更したコードをGitHubにPushしたら、GitHub Actionsを利用してFunctionsに自動でデプロイする

必要な知識

  1. Google Cloud
    • IAMと管理
    • サービスアカウント
  2. GitHub
    • Secretの設定
    • Actionsを動かすプログラム(.yml)
  3. APIとサービス

ここで言及する範囲

  1. Google Cloud
    • IAMと管理
    • サービスアカウント
  2. GitHub
    • Secretの設定
    • Actionsを動かすプログラム(.yml)

動かす環境を作る手順

  1. Functionsの関数を作る
  2. サービスアカウントを作る
  3. サービスアカウントのKeyを発行する
  4. GitHub Repositoryを作る
  5. Repository secretsを設定する
  6. Actionsを動かすコード(.yml)を作成する
  7. GitHubにコードを配置する
  8. 実行する

1、4、7、8は説明を省きます。

詳細手順

2. サービスアカウントを作る

  1. IAMと管理に遷移する。
  2. サービス アカウントに遷移する。
  3. サービス アカウントの作成を押下する。
  4. サービスアカウント名を記入する
  5. このサービス アカウントにプロジェクトへのアクセスを許可するで、次のロールを設定する
    • サービス アカウント ユーザー
    • Cloud Functions 開発者
    • Cloud Run 管理者
  6. 完了を押下する

3. サービスアカウントのKeyを発行する

  1. サービス アカウントに遷移する。
  2. [2. サービスアカウントを作る]で作成したサービスアカウントを選び、右端の操作をクリックし、「鍵の管理」を選択する。
  3. 鍵を追加を押下し、新しい鍵を作成するを選択。ポップアップ画面からキータイプJSONを選択し作成を押下する。「秘密鍵がパソコンに保存されました」が表示されたら、ブラウザが指定しているダウンロードファイルの保存先に保存される。

5. Repository secretsを設定する

  1. 自動デプロイしたいGitHub Repositoryを選択し、Setting => Actions secrets and variables => Actionsを押下する。
  2. New repository secret を押下する。
  3. Nameを任意で設定する。Secretには、[3. サービスアカウントのKeyを発行する]でダウンロードしたファイルの内容をコピー&ペーストする。
  4. Add secretを押下する

6. Actionsを動かすコード(.yml)を作成する

  1. GitHub Actionsに遷移し、set up a workflow yourself をクリックする。
  2. [.github/workflows/main.yml]を作成する。
    • mainは変更可能です
    • Enter file contens hereにはGitHub Actionsワークフローを動かすためのコードを記載します。

例)

---
#名前なので任意です。
name: Deploy to Google Cloud Functions 

# mainのbrancheにpushされた時に、動くことを指定しています。
on:
  push:
    branches:
      - main


jobs:
  deploy:
    runs-on: ubuntu-latest # Workflowで利用する仮想環境イメージを指定します。

    steps:
    - name: Checkout code # 仮想環境にコードを取り込みます。
      uses: actions/checkout@v4 

    - name: Setup Google Cloud Authentication  # functionsにアクセスするための認証を行います。
      uses: google-github-actions/auth@v1
      with:
        credentials_json: ${{ secrets.[任意で設定したsecretsの名前を記載します] }}
        project_id: [プロジェクトIDを記載します]
        export_default_credentials: true

    - name: Deploy to Google Cloud Functions  # functionsにコードをデプロイします。
      run: |
        gcloud functions deploy function-1 \
          --trigger-http \
          --region [リージョンを記載します] \
          --runtime [ランタイムを記載します] \
          --entry-point [エントリーポイントを記載します] \
          --allow-unauthenticated #公開アクセスを許可します

  1. 上記のコードで変更する点は6つです。各々設定した情報を記載してください。
    • credentials_json: ${{ secrets.[任意で設定したsecretsの名前を記載します] }}
    • project_id: [プロジェクトIDを記載します]
    • --region [リージョンを記載します] \
    • --runtime [ランタイムを記載します] \
    • --entry-point [エントリーポイントを記載します] \
    • --allow-unauthenticated #公開アクセスを許可します

備忘録

困ったことは、IAMの設定。サービスアカウントを作成した際に、必要なロールがわからず後で設定しようとしたら詰まった。サービスアカウントの画面で指定のプリンシパルにはロールがあるけど、エラーを起こしていた。
これは、継承にプロジェクトが入っていないために起こっていたみたい。これがわからず2時間くらいとかした。

あと、yamlの方はデプロイは成功しているが、warningがある。これは、google-github-actions/auth@v1 が Node.js 16を使っているから変えてね、という話。
これもあとで修正できたらなと思う。

Discussion