少し前のリリースに今更気付いたのですが、VPC Service Controls が Cloud Scheduler のサポートを GA したようです。
VPC Service Controls が新たにサービスのサポートを GA したときは VPC Service Controls のリリースノートに掲載されることが多いのですが、今回に関しては掲載されなかったようです。
(滅多に更新されない Cloud Scheduler のリリースノートでのみアナウンスされていました)
リリースノートには掲載されていなかったものの、VPC Service Controls のサポートしているプロダクトの一覧には登場していますね。
何ができるようになったか
従来は、VPC Service Controls (以下、VPC SC) の境界内で Cron 式ベースのスケジュールされたジョブを実行したい場合は、GKE の CronJob や GCE を利用する必要がありました。
今回のリリースによって、Cloud Scheduler の境界内での利用がサポートされたため、Cron 式ベースのジョブ実行をより簡単にトリガできるようになりました。
このリリースに伴い、VPC SC の境界内での Cloud Scheduler の利用方法に関する公式ドキュメントの新規ページも登場しています。
利用時の注意点として、Cloud Scheduler を境界内で利用する場合、構成は Pub/Sub ターゲットのみがサポート対象となっています。
HTTP や App Engine(明記されていませんが恐らく Eventarc も含む)といったその他のターゲット構成は利用できません。
試しに HTTP ターゲットで設定を試みたところ、エラーで弾かれることが確認できました。
検証
では実際に VPC SC の境界内で Cloud Scheduler による定期的なジョブ実行を試してみましょう。
今回作る環境のイメージ図は以下のとおりです。
サンプルのアプリケーションは Cloud Run で実行する構成としました。
余談ですが、VPC SC の境界内で Cloud Run を使うときはイメージレジストリのサービスも同じ境界内に入れておく必要があります。
今回はレジストリサービスに Artifact Registry を利用します。
$ gcloud projects describe perceptive-lamp-****** createTime: '2023-02-19T13:18:20.934Z' lifecycleState: ACTIVE name: perceptive-lamp-****** parent: id: ************ type: organization projectId: perceptive-lamp-****** projectNumber: ************ $ gcloud access-context-manager policies list --organization=************ NAME: ************ ORGANIZATION: ************ SCOPES: TITLE: default policy ETAG: ************ $ gcloud access-context-manager perimeters list --policy=************ NAME: sample_perimeter TITLE: sample-perimeter $ gcloud access-context-manager perimeters describe sample_perimeter --policy=************ name: accessPolicies/************/servicePerimeters/sample_perimeter status: ingressPolicies: - ingressFrom: identities: - user:************ sources: - accessLevel: '*' ingressTo: operations: - serviceName: '*' resources: - '*' resources: - projects/************ restrictedServices: - cloudscheduler.googleapis.com - run.googleapis.com - artifactregistry.googleapis.com vpcAccessibleServices: {} title: sample-perimeter $ gcloud artifacts docker images list us-central1-docker.pkg.dev/perceptive-lamp-******/sample-repository Listing items under project perceptive-lamp-******, location us-central1, repository sample-repository. IMAGE: us-central1-docker.pkg.dev/perceptive-lamp-******/sample-repository/hello DIGEST: sha256:2e70803db... CREATE_TIME: 2023-02-22T13:17:20 UPDATE_TIME: 2023-02-22T13:17:20 $ gcloud pubsub subscriptions list --- ackDeadlineSeconds: 10 expirationPolicy: ttl: 2678400s messageRetentionDuration: 604800s name: projects/perceptive-lamp-******/subscriptions/sample-subscription pushConfig: attributes: x-goog-version: v1 oidcToken: serviceAccountEmail: scheduled-app-invoker@perceptive-lamp-******.iam.gserviceaccount.com pushEndpoint: https://sample-app-zkh7f********.a.run.app state: ACTIVE topic: projects/perceptive-lamp-******/topics/sample-topic $ gcloud run services list ✔ SERVICE: sample-app REGION: us-central1 URL: https://sample-app-zkh7f********.a.run.app LAST DEPLOYED BY: ************ LAST DEPLOYED AT: 2023-02-22T13:34:22.319722Z
Pub/Sub から Cloud Run を呼び出すセットアップができました。
これを定期実行するために Cloud Scheduler のジョブを作成し、一定時間待ちます。
$ gcloud scheduler jobs list --location us-central1 ID: sample-scheduler LOCATION: us-central1 SCHEDULE (TZ): 0 */6 * * * (Asia/Tokyo) TARGET_TYPE: Pub/Sub STATE: ENABLED $ gcloud scheduler jobs describe sample-scheduler --location us-central1 lastAttemptTime: '2023-02-24T09:00:00.600638Z' name: projects/perceptive-lamp-******/locations/us-central1/jobs/sample-scheduler pubsubTarget: data: ************ topicName: projects/perceptive-lamp-******/topics/sample-topic retryConfig: maxBackoffDuration: 3600s maxDoublings: 5 maxRetryDuration: 0s minBackoffDuration: 5s schedule: 0 */6 * * * scheduleTime: '2023-02-24T15:00:00.782322Z' state: ENABLED status: {} timeZone: Asia/Tokyo userUpdateTime: '2023-02-22T14:18:37Z'
結果を Cloud Logging のログエクスプローラから確認してみましょう。
無事に定期実行できていることが確認できました。
まとめ
VPC Service Controls が Cloud Scheduler をサポートしたことで、境界内でも Cron 式ベースの定期実行が手軽に構成できるようになりました。
実機でも確認しましたが、境界内では現状 Pub/Sub ターゲットの構成でしか利用できない点は認識しておく必要がありますね。