Cloud Workflowsを使用しCloud Runを実行する

こんにちは、香田です。

今回はCloud Workflowsを使用しCloud Runを実行する方法について紹介してきます。

実行するCloud Runについては、認証機能を利用しCloud Workflowsのみ使用できるようにしていきます。

サンプルアプリの作成

はじめにCloud Runへデプロイするサンプルアプリ用のディレクトリを作成します。

mkdir helloworld
cd helloworld

下記のコードをコピーし、main.pyという名前でファイルを作成します。

import os

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello_world():
    name = os.environ.get("NAME", "World")
    return "Hello {}!".format(name)

if __name__ == "__main__":
    app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))

コンテナイメージをビルド

次にアプリをコンテナ化するために下記をコピーし、Dockerfileを作成します。

FROM python:3.9-slim

ENV PYTHONUNBUFFERED True

ENV APP_HOME /app
WORKDIR $APP_HOME
COPY . ./

RUN pip install Flask gunicorn
CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app

Cloud Build を使用してコンテナ イメージをビルドします。ビルドが完了するとContainer Registryへ保存されます。

export GOOGLE_CLOUD_PROJECT=$(gcloud config get-value project)
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/helloworld

Cloud Runへデプロイする

作成したコンテナイメージをCloud Runへデプロイします。

認証された呼び出しのみ許可させるように、フラグにno-allow-unauthenticatedを使用しています。

gcloud run deploy helloworld \
--image gcr.io/${GOOGLE_CLOUD_PROJECT}/helloworld \
--platform managed \
--no-allow-unauthenticated \
--region asia-northeast1

ワークフローの作成

次にワークフローで使用するサービスアカウントを作成します。

gcloud iam service-accounts create workflows-cloud-run \
--display-name=workflows-cloud-run

Cloud Runを呼び出せるようにrun.invokerロールを付与します。

gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \
--member "serviceAccount:workflows-cloud-run@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \
--role "roles/run.invoker"

下記の内容を元にworkflow.yamlという名前でファイルを作成します。

urlの箇所はデプロイしたCloud Runのurlを指定してください。

- helloWorldFunction:
    call: http.get
    args:
      url: <Cloud RunのURLを指定する>
      auth:
        type: OIDC
    result: theMessage
- returnValule:
    return: ${theMessage.body}

ワークフローをデプロイ

作成したワークフローをデプロイします。

gcloud beta workflows deploy workflows-cloud-run \
--source=workflow.yaml \
--service-account=workflows-cloud-run@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com \
--location=us-central1

デプロイしたワークフローを実行します。

gcloud beta workflows execute workflows-cloud-run \
--location=us-central1

GCP コンソール画面の[ワークフロー]を選択し、対象ワークフローの[実行の詳細]にて下記の用に表示されていれば成功です。

クリーンアップ

アカウントが課金されないように下記で作成したリソースは削除可能です。

ワークフローの削除

gcloud beta workflows delete workflows-cloud-run \
--location=us-central1

サービスアカウントの削除

gcloud iam service-accounts delete workflows-cloud-run@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com

Cloud Runの削除

gcloud run services delete helloworld \
--platform managed \
--region asia-northeast1

Container Registryのイメージ削除

gcloud container images delete gcr.io/${GOOGLE_CLOUD_PROJECT}/helloworld:latest

さいごに

Cloud Workflowsを使用しCloud Runを実行する方法いかがでしたでしょうか。

どちらもサーバーレス製品でインフラの管理が不要な為、組み合わせとしては相性がよいのではないでしょうか。

最後までご覧いただきありがとうございます。

SNSでもご購読できます。