created: 2022-01-27T07:36:24.000Z
CloudTaskで認証のついたCloudFunctionを実行するまで
CloudTaskは、任意の場所にhttpリクエストを投げてくれるようなサービスで、リトライやワーカーの管理(同時実行数など)が設定できる。
CloudFunction を CloudTask から認証付きでキックする場合はざっくり以下のような手続きとなる。
- まず CloudFunction をデプロイ
- http エンドポイントモードでデプロイする
--allow-unauthenticated
はつけない- 認証が必要な関数としてデプロイする
- CloudTask のキューを作成
- ジョブのリトライ数などはここで設定
- 作成した CloudTask キューにジョブを追加
--url
でさきほど作ったhttpエンドポイントを叩くように設定--oidc-service-account-email
で関数の実行権限があるアカウントを指定する
前提
たとえば下記のような設定で関数をデプロイして、ジョブを追加する場合。
export QUEUE_NAME="..."
export CLOUD_FUNCNAME="..."
export URL="https://..."
export SERVICE_ACCOUNT="...@prod-name-123456.iam.gserviceaccount.com"
CloudFunctionのリリース
# CloudFunctionごとにインスタンスのスペックやタイムアウトの設定
option="--timeout=540 --memory=1024MB "
# memory増やしてもCPUは比例して大きくならないかもしれない
# https://pc.atsuhiro-me.net/entry/2021/01/10/230254
gcloud functions deploy $CLOUD_FUNCNAME \
--source=./dist \
--entry-point=$CLOUD_FUNCNAME \
--trigger-http \
--region=asia-northeast1 \
--runtime=nodejs14 \
$option
リリース時に「認証不要のエンドポイントにしますか?」とプロンプトされるのでNoを選択。
CloudTaskキューの作成
$ gcloud tasks queues create "${QUEUE_NAME}" \
--location=asia-northeast1 \
--log-sampling-ratio=1.0 \
--max-concurrent-dispatches 36 \
--max-attempts=1
CloudTaskキューにジョブを追加
$ gcloud tasks create-http-task \
--location=asia-northeast1 \
--queue="${QUEUE_NAME}" \
--url="https://asia-northeast1-${URL}" \
--header=content-type:application/json \
--oidc-service-account-email="${SERVICE_ACCOUNT}" \
--body-file="/tmp/_.json"