Cloud Run 関数(旧: Cloud Functions)をCloud IAMの認証を用いてWorkflowsから起動する

Google Cloud

2024.9.30

Topics

はじめに

こんにちは、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に関するお役立ち情報を配信中!

waka

2022年に中途入社した人です。好きなAWSサービスはLambdaです。

Recommends

こちらもおすすめ

Special Topics

注目記事はこちら