VPC Service Controls の境界内で Cloud Scheduler を使う

少し前のリリースに今更気付いたのですが、VPC Service Controls が Cloud Scheduler のサポートを GA したようです。

cloud.google.com

VPC Service Controls が新たにサービスのサポートを GA したときは VPC Service Controls のリリースノートに掲載されることが多いのですが、今回に関しては掲載されなかったようです。
(滅多に更新されない Cloud Scheduler のリリースノートでのみアナウンスされていました)

cloud.google.com

リリースノートには掲載されていなかったものの、VPC Service Controls のサポートしているプロダクトの一覧には登場していますね。

cloud.google.com

何ができるようになったか

従来は、VPC Service Controls (以下、VPC SC) の境界内で Cron 式ベースのスケジュールされたジョブを実行したい場合は、GKE の CronJob や GCE を利用する必要がありました。
今回のリリースによって、Cloud Scheduler の境界内での利用がサポートされたため、Cron 式ベースのジョブ実行をより簡単にトリガできるようになりました。

このリリースに伴い、VPC SC の境界内での Cloud Scheduler の利用方法に関する公式ドキュメントの新規ページも登場しています。

cloud.google.com

利用時の注意点として、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 ターゲットの構成でしか利用できない点は認識しておく必要がありますね。