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


id=“はじめに”>はじめに

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. GCPのSDKのセットアップ。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の実装や設定で変わる部分だと思われる。この辺は適宜要変更。