Cloud Run 関数(旧: Cloud Functions)をCloud IAMの認証を用いてWorkflowsから起動する
2024.9.30
はじめに
こんにちは、wakaです。
私が過去に対応した案件で、Cloud Schedulerを用いて定期的にCloud Run 関数を起動する設定にしていました。
結果としてそれなりに処理に時間がかかるパターンが発生し、イベントドリブン関数で設定できるタイムアウト上限の9分(=540秒)では足りないケースが発生しました。
HTTP関数の場合最大1時間(=3,600秒)まで設定できるため、サービスアカウントのトークンを利用してHTTP関数をWorkflowsを活用する構成を紹介したいと思います。
参考 : 関数のタイムアウト
想定フロー

Cloud Schedulerの紐付け先が、Pub/SubになるかWorkflowsになるかという点が大きな違いになります。
イベントドリブン関数とHTTP関数ではfunctions_framework周りの記載が少し異なりますので、関数を作り変える際は注意が必要です。
参考: サポートされる関数のタイプ
workflows.yaml
main:
steps:
- getAccessToken:
call: http.post
args:
url: >-
${"https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/"
+ sys.get_env("SERVICE_ACCOUNT_NAME") + ":generateIdToken"}
auth:
type: OAuth2
headers:
Content-Type: application/json
body:
audience: ${sys.get_env("FUNCTION_URL")}
includeEmail: false
result: accessTokenResponse
- logAccessTokenResponse:
call: sys.log
args:
text: ${accessTokenResponse.body}
- extractAccessToken:
assign:
- accessToken: ${accessTokenResponse.body.token}
- callFunction:
call: http.post
args:
url: ${sys.get_env("FUNCTION_URL")}
headers:
Authorization: ${"Bearer " + accessToken}
Content-Type: application/json
timeout: 1800
result: functionResponse
Cloud IAM認証
HTTPでCloud Run 関数を設定する際に、未認証の呼び出しは許可したくない場合が多いかと思います。
Workflows上でサービスアカウントのアクセストークンを取得してからCloud Run 関数に渡すことで、Cloud IAMの認証を通して関数の実行ができるようになります。
デプロイコマンド
Workflowsデプロイ
gcloud workflows deploy {ワークフロー名} \
--source=workflows.yaml \
--location=asia-northeast1 \
--set-env-vars FUNCTION_URL={関数のURL},SERVICE_ACCOUNT_NAME={サービスアカウント名}@{プロジェクトID}.iam.gserviceaccount.com
Cloud Schedulerの紐付け
gcloud scheduler jobs create http {scheduler名} \
--location="asia-northeast1" \
--schedule="{cron形式で指定する実行日時}" \
--uri="https://workflowexecutions.googleapis.com/v1/projects/{プロジェクトID}/locations/asia-northeast1/workflows/{ワークフロー名}/executions" \
--message-body="{}" \
--time-zone="Asia/Tokyo" \
--oauth-service-account-email="{サービスアカウント名}@{プロジェクトID}.iam.gserviceaccount.com"
Workflowsの実行に必要な権限
Schedulerから実行する場合、サービスアカウントには以下の権限が必要です。
– Cloud Run 起動元
– Cloud Workflows サービス エージェント
– サービス アカウント トークン作成者
– ログ書き込み
– ワークフロー起動元
Workflows作成時のオプション
--set-env-vars
Workflows作成時に環境変数を設定するオプションです。
このオプションを利用せず、yamlの中に直接関数名やサービスアカウント名を記載する形でも動作可能です。
Workflowsのタイムアウト上限について
Cloud Run 関数のタイムアウト上限は3,600秒ですが、Workflowsとしては1,800秒となります。
1800秒を超えてしまうとWorkflowsとしてはタイムアウトエラーになってしまいますので注意が必要です。
例外がスローされるまでに、リクエストを実行できる時間(秒)。最大値は 1,800 秒です。
引用: HTTP エンドポイントの呼び出し
さいごに
今後似たような実装をする方の助けになれば幸いです。
テックブログ新着情報のほか、AWSやGoogle Cloudに関するお役立ち情報を配信中!
Follow @twitter2022年に中途入社した人です。好きなAWSサービスはLambdaです。
Recommends
こちらもおすすめ
-
【Google Cloud】Cloud Runを触ってみた!
2024.6.26
Special Topics
注目記事はこちら
データ分析入門
これから始めるBigQuery基礎知識
2024.02.28

AWSの料金が 10 %割引になる!
『AWSの請求代行リセールサービス』
2024.07.16
