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の料金が 8 %割引になる!
『AWSの請求代行リセールサービス』
2023.01.15