こんにちは、香田です。
今回は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を実行する方法いかがでしたでしょうか。
どちらもサーバーレス製品でインフラの管理が不要な為、組み合わせとしては相性がよいのではないでしょうか。
最後までご覧いただきありがとうございます。