RM-BLOG

IT系技術職のおっさんがIT技術とかライブとか日常とか雑多に語るブログです。* 本ブログに書かれている内容は個人の意見・感想であり、特定の組織に属するものではありません。/All opinions are my own.*

【GCP】Cloud FunctionsをGithub ActionsからDeployする

はじめに

Cloud FunctionsをGithub Actionsからデプロイする方法のメモ。
基本的には自分用の備忘録。
というより大体ここに載ってます。。。

Google Cloud側の準備

まずService AcountのJSONファイルの取得が必要である。
上のGithubからも辿れるが、GCPの公式ドキュメントにその辺の手順が書いてある。

このService AcountはGithub Actionsが実際にデプロイを行う際に使用されるものになる。
このため、Cloud Functionsを変更できる権限の付与が必要である。
具体的にどれかは実のところよくわかってないが、ここを見る限りでは「編集者」あるいは「所有者」が付いてれば問題なさそうである。

JSONファイルを取得したら中身を開いて全部コピーし、GithubのSecret(リポジトリのSettings>Secret)でシークレットを新規作成した後、Value欄にそのままペタッと貼りつける。
鍵の内容だけを律儀に取り出して張り付けたりとか、そういうのは必要ない。
JSONファイルの中身をそっくりそのまま貼りつければ良い。

ちなみに上の例だとPROJECT IDもシークレットにしていたので、同様の方法でPROJECT IDもシークレットといて用意する。

ワークフローのYAML

下記はNode.jsランタイムのCloud Functionsにデプロイする場合のYAMLの例。

name: Deploy to GCP Cloud Functions

on:
  push:
    branches:
      - main
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      # 1.ソースのチェックアウト
      - uses: actions/checkout@v2
      # 2.Node.jsのセットアップ
      - uses: actions/setup-node@v1
        with:
          node-version: 14.x
      # 3.npm install(yarn使う場合はyarnに要変更)
      - name: npm install
        run: npm install
      # 4.GCP SDK setup
      - uses: google-github-actions/setup-gcloud@master
        name: Set up Cloud SDK
        with:
          project_id: ${{ secrets.GCP_PROJECT_ID }}
          service_account_key: ${{ secrets.GCP_SA_KEY }}
          export_default_credentials: true
      # 5.GcloudのFunctionsのRegion設定(東京=asia-northeast-1を指定)
      - name: gcloud config set functions/region
        run: gcloud config set functions/region asia-northeast1
      # 6.deploy
      - name: gcloud functions deploy
        run: sh ./deploy2gcp.sh
  1. おきまり文句。
  2. Node.jsのバージョンを指定する。この例だと14系。
  3. npm installする。yarnの場合はyarn installになると思う。環境に合わせて適宜変更。
  4. GCPSDKのセットアップ。project_idにシークレットとして用意したGoogle CloudのPROJECT IDを、service_account_keyに同じくシークレットとして用意したService AcountのJSONファイル内容を、それぞれセットする指示。なお、export_default_credentialsは、なんだかよくわからんが必須らしいので付けておく。
  5. これは自分の時には指定しないと駄目だったので(ワークフローが落ちた)指定している。上の例には書いてないのでもしかしたらSDKのセットアップ(4.の項)を工夫したらなんとかなるのかもしれない。この例では東京=asia-northeast-1を指定している。面倒くさかったのでリージョン名をYAMLファイル内にべた書きしているが、シークレット等で外だしするのも検討するべきである。(って自分で言うなって感じだが)
  6. コマンドが長くなったので、デプロイの内容を個別のshellに切り出した。平たく言えばgcloud functions deployに過ぎない。今回の場合のshellの中身は以下のようになる
#!/bin/sh

gcloud functions deploy [Cloud Function名]\
   --allow-unauthenticated \
   --trigger-http \
   --entry-point [Cloud Functionのエントリーポイント名]\
   --runtime nodejs14

exit $?

HTTPトリガーではないとか、runtimeがNode.jsではないとか、諸々のFunctionの実装や設定で変わる部分だと思われる。この辺は適宜要変更。