Cloud Scheduler を使用して、定期的なスケジュールで Cloud SQL インスタンスを起動および停止できます。たとえば、特定の時間帯にのみインスタンスを実行したい場合があります。
このチュートリアルでは、 Google Cloud プロダクトを使用してイベント ドリブン アーキテクチャを構築し、Cloud SQL for SQL Server インスタンスを自動的に起動および停止する方法について説明します。
目標
このチュートリアルでは、env=dev リソースラベルを持つ Cloud SQL インスタンスを特定の時間に実行するようにスケジュールする Cloud Scheduler ジョブを作成します。スケジュール設定するインスタンスは 1 つのみです。ただし、このチュートリアルで説明するアーキテクチャを使用して、リソースラベルが env=dev である複数のインスタンスを停止および起動できます。
この目標を達成するには、次の手順を行います。
- Cloud SQL for SQL Server インスタンスを作成し、特定のリソースラベル(
env=dev)を割り当てます。 - Eventarc トリガーのイベントソースとメッセージ ブローカーとして機能する 2 つの Pub/Sub トピックを作成します。
- Pub/Sub トピックを介してトリガーされる 2 つのイベント ドリブン Cloud Run functions を作成してデプロイします。トリガーされると、関数は、Pub/Sub メッセージ ペイロード(
env=dev)で指定されたラベルと一致する Cloud SQL インスタンスをプロジェクト内で検索します。 - 2 つの Eventarc トリガーを作成してデプロイします。Pub/Sub トピック イベントは HTTP リクエストとして関数に転送され、イベント メッセージのコンテンツは入力データとして関数に渡されます。
- 特定の時間にターゲット ラベルを含むメッセージを Pub/Sub トピックに公開する 2 つの Cloud Scheduler cron ジョブを作成します。インスタンスが月曜日から金曜日の午前 9 時に起動し、午後 5 時に停止するようにスケジュールを設定します。
次の図は、イベント ドリブン アーキテクチャの概要を示しています。
費用
このドキュメントでは、課金対象である次の Google Cloudコンポーネントを使用します。
-
Cloud Run functions
Cloud Run functions operate as Cloud Run services and are billed accordingly.
- Cloud Scheduler
- Cloud SQL for SQL Server
-
Eventarc
Cloud Run uses Eventarc for event delivery. Pricing for Eventarc is not included in the Cloud Run pricing.
- Pub/Sub
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。
始める前に
組織で定義されているセキュリティの制約により、次の手順を完了できない場合があります。トラブルシューティング情報については、制約のある Google Cloud 環境でアプリケーションを開発するをご覧ください。
- Google Cloud アカウントにログインします。 Google Cloudを初めて使用する場合は、 アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
-
Google Cloud CLI をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します。
gcloud init -
Google Cloud プロジェクトを作成または選択します。
プロジェクトの選択または作成に必要なロール
- プロジェクトを選択する: プロジェクトの選択に特定の IAM ロールは必要ありません。ロールが付与されているプロジェクトであれば、どのプロジェクトでも選択できます。
-
プロジェクトを作成する: プロジェクトを作成するには、
resourcemanager.projects.create権限を含むプロジェクト作成者ロール(roles/resourcemanager.projectCreator)が必要です。詳しくは、ロールを付与する方法をご覧ください。
-
Google Cloud プロジェクトを作成します。
gcloud projects create PROJECT_ID
PROJECT_IDは、作成する Google Cloud プロジェクトの名前に置き換えます。 -
作成した Google Cloud プロジェクトを選択します。
gcloud config set project PROJECT_ID
PROJECT_IDは、 Google Cloud プロジェクトの名前に置き換えます。
-
このガイドで既存のプロジェクトを使用する場合は、このガイドを完了するために必要な権限があることを確認します。新しいプロジェクトを作成した場合は、必要な権限がすでに付与されています。
Cloud Build、Cloud Functions、Cloud Pub/Sub、Cloud Run Admin、Cloud Scheduler、Cloud SQL Admin、Eventarc API を有効にします。
API を有効にするために必要なロール
API を有効にするには、
serviceusage.services.enable権限が必要です。プロジェクトを作成した場合は、オーナーロール(roles/owner)を介してこの権限がすでに付与されている可能性があります。それ以外の場合は、Service Usage 管理者ロール(roles/serviceusage.serviceUsageAdmin)を介してこの権限を取得できます。ロールを付与する方法をご覧ください。gcloud services enable cloudbuild.googleapis.com
cloudfunctions.googleapis.com pubsub.googleapis.com run.googleapis.com cloudscheduler.googleapis.com sqladmin.googleapis.com eventarc.googleapis.com -
認証を設定します。
-
サービス アカウントの作成 IAM ロール(
roles/iam.serviceAccountCreator)とプロジェクト IAM 管理者ロール(roles/resourcemanager.projectIamAdmin)があることを確認します。ロールを付与する方法を確認する。 -
サービス アカウントを作成します。
gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
SERVICE_ACCOUNT_NAMEをサービス アカウントの名前に置き換えます。 -
サービス アカウントにロールを付与します。次の IAM ロールごとに次のコマンドを 1 回実行します。
roles/cloudbuild.builds.builder, roles/cloudsql.editor, roles/run.invokergcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" --role=ROLE
以下を置き換えます。
SERVICE_ACCOUNT_NAME: サービス アカウントの名前PROJECT_ID: サービス アカウントを作成したプロジェクト IDROLE: 付与するロール
-
サービス アカウントの作成 IAM ロール(
-
Google Cloud CLI をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します。
gcloud init -
Google Cloud プロジェクトを作成または選択します。
プロジェクトの選択または作成に必要なロール
- プロジェクトを選択する: プロジェクトの選択に特定の IAM ロールは必要ありません。ロールが付与されているプロジェクトであれば、どのプロジェクトでも選択できます。
-
プロジェクトを作成する: プロジェクトを作成するには、
resourcemanager.projects.create権限を含むプロジェクト作成者ロール(roles/resourcemanager.projectCreator)が必要です。詳しくは、ロールを付与する方法をご覧ください。
-
Google Cloud プロジェクトを作成します。
gcloud projects create PROJECT_ID
PROJECT_IDは、作成する Google Cloud プロジェクトの名前に置き換えます。 -
作成した Google Cloud プロジェクトを選択します。
gcloud config set project PROJECT_ID
PROJECT_IDは、 Google Cloud プロジェクトの名前に置き換えます。
-
このガイドで既存のプロジェクトを使用する場合は、このガイドを完了するために必要な権限があることを確認します。新しいプロジェクトを作成した場合は、必要な権限がすでに付与されています。
Cloud Build、Cloud Functions、Cloud Pub/Sub、Cloud Run Admin、Cloud Scheduler、Cloud SQL Admin、Eventarc API を有効にします。
API を有効にするために必要なロール
API を有効にするには、
serviceusage.services.enable権限が必要です。プロジェクトを作成した場合は、オーナーロール(roles/owner)を介してこの権限がすでに付与されている可能性があります。それ以外の場合は、Service Usage 管理者ロール(roles/serviceusage.serviceUsageAdmin)を介してこの権限を取得できます。ロールを付与する方法をご覧ください。gcloud services enable cloudbuild.googleapis.com
cloudfunctions.googleapis.com pubsub.googleapis.com run.googleapis.com cloudscheduler.googleapis.com sqladmin.googleapis.com eventarc.googleapis.com -
認証を設定します。
-
サービス アカウントの作成 IAM ロール(
roles/iam.serviceAccountCreator)とプロジェクト IAM 管理者ロール(roles/resourcemanager.projectIamAdmin)があることを確認します。ロールを付与する方法を確認する。 -
サービス アカウントを作成します。
gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
SERVICE_ACCOUNT_NAMEをサービス アカウントの名前に置き換えます。 -
サービス アカウントにロールを付与します。次の IAM ロールごとに次のコマンドを 1 回実行します。
roles/cloudbuild.builds.builder, roles/cloudsql.editor, roles/run.invokergcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" --role=ROLE
以下を置き換えます。
SERVICE_ACCOUNT_NAME: サービス アカウントの名前PROJECT_ID: サービス アカウントを作成したプロジェクト IDROLE: 付与するロール
-
サービス アカウントの作成 IAM ロール(
Cloud SQL インスタンスを作成する
リソースラベル env=dev を使用して Cloud SQL for SQL Server インスタンスを作成するには、gcloud beta sql instances create コマンドを使用します。
gcloud beta sql instances create dev-instance \ --database-version=SQLSERVER_2019_EXPRESS \ --region=us-west1 \ --tier=db-custom-2-3840 \ --root-password=YourStrongPassword123! \ --labels=env=dev
インスタンスの作成には数分かかることがあります。詳細については、インスタンスの作成をご覧ください。
Pub/Sub トピックを作成する
Eventarc トリガーのイベントソースとして機能する 2 つの Pub/Sub トピックを作成するには、gcloud pubsub topics create コマンドを使用します。
gcloud pubsub topics create start-instance-event gcloud pubsub topics create stop-instance-event
詳細については、トピックを作成するをご覧ください。
Cloud Run functions を作成してデプロイする
Pub/Sub トピックを介して Eventarc によってトリガーされる 2 つの Cloud Run(Node.js)関数を作成してデプロイします。トリガーされると、関数は Pub/Sub メッセージ ペイロード(env=dev)で指定されたラベルと一致する Cloud SQL インスタンスをプロジェクト内で検索します。
- start 関数は、インスタンスの
activationPolicyをALWAYSに更新し、インスタンスをオンにします。 - 停止関数は
activationPolicyをNEVERに更新し、インスタンスをシャットダウンします。
詳細については、Cloud Run functions を作成すると Cloud Run 関数のトリガーをご覧ください。
関数を作成する
CloudEvents 仕様に準拠したイベントを自動的にアンマーシャルするイベント ドリブン Cloud Run functions を作成します。この業界標準仕様では、イベントデータが一般的な方法で記述されています。
ソースコードで関数のエントリ ポイントを定義する必要があります。これは、Cloud Run が関数を呼び出したときに実行されるコードです。関数のデプロイ時に、このエントリ ポイントを指定します。
コードをダウンロードします。
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
または、zip 形式のサンプルをダウンロードし、ファイルを抽出してもかまいません。
適切なディレクトリに移動します。
cd nodejs-docs-samples/functions/scheduleinstance/
イベント ドリブン関数をデプロイする
Cloud Run に関数をデプロイするには、gcloud run deploy コマンドを使用します。
Cloud SQL インスタンスを起動する関数をデプロイします。
gcloud run deploy startinstance \ --source . \ --function startInstanceEvent \ --base-image nodejs24 \ --region=us-west1 \ --build-service-account=projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \ --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
指定したリージョンにリポジトリを作成するように求められたら、
yと入力します。Allow unauthenticated invocationsプロンプトで、「n」と入力します。Cloud SQL インスタンスをシャットダウンする関数をデプロイします。
gcloud run deploy stopinstance \ --source . \ --function stopInstanceEvent \ --base-image nodejs24 \ --region=us-west1 \ --build-service-account=projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \ --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
指定したリージョンにリポジトリを作成するように求められたら、
yと入力します。Allow unauthenticated invocationsプロンプトで、「n」と入力します。
デプロイが完了すると、サービスが実行されている URL が Google Cloud CLI に表示されます。
Eventarc トリガーを作成する
Pub/Sub からイベントを転送する Eventarc トリガーを作成するには、gcloud eventarc triggers create コマンドを使用します。Pub/Sub トピックに公開されたすべてのメッセージが対応する関数をトリガーし、メッセージのコンテンツが入力データとして渡されます。
Cloud SQL インスタンスを起動するトリガーを作成します。
gcloud eventarc triggers create start-instance-trigger \ --location=us-west1 \ --destination-run-service=startinstance \ --destination-run-region=us-west1 \ --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \ --transport-topic=start-instance-event \ --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
Cloud SQL インスタンスを停止するトリガーを作成します。
gcloud eventarc triggers create stop-instance-trigger \ --location=us-west1 \ --destination-run-service=stopinstance \ --destination-run-region=us-west1 \ --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \ --transport-topic=stop-instance-event \ --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
新しいトリガーが有効になるまでには、最長で 2 分ほどかかることがあります。
省略可: 関数が動作することを確認する
関数が動作することを確認するには、Pub/Sub トピックにメッセージを直接公開します。Cloud SQL インスタンスの更新には数分かかることがあります。
ラベル
env=devのインスタンスを停止するには、gcloud pubsub topics publishコマンドを使用して停止トピックにメッセージをパブリッシュします。gcloud pubsub topics publish stop-instance-event --message='{"label":"env=dev"}'
インスタンスが停止したことを確認するには、
gcloud sql instances describeコマンドを使用してアクティベーション ポリシーを確認します。gcloud sql instances describe dev-instance --format="value(settings.activationPolicy)"
出力は
NEVERである必要があります。ラベル
env=devを使用してインスタンスを起動するには、開始トピックにメッセージをパブリッシュします。gcloud pubsub topics publish start-instance-event --message='{"label":"env=dev"}'
アクティベーション ポリシーを確認して、インスタンスが起動したことを確認します。
gcloud sql instances describe dev-instance --format="value(settings.activationPolicy)"
出力は
ALWAYSである必要があります。
Cloud Scheduler ジョブを作成する
定期的なスケジュールで Pub/Sub トピックにメッセージを公開する Cloud Scheduler ジョブを作成します。
月曜日から金曜日の午前 9 時に実行され、インスタンスを起動するジョブを作成するには、
gcloud scheduler jobs createコマンドを使用します。gcloud scheduler jobs create pubsub startup-dev-instances \ --schedule '0 9 * * 1-5' \ --topic start-instance-event \ --message-body '{"label":"env=dev"}' \ --time-zone 'America/Los_Angeles' \ --location us-east1
月曜日から金曜日の午後 5 時に実行され、インスタンスを停止するジョブを作成します。
gcloud scheduler jobs create pubsub shutdown-dev-instances \ --schedule '0 17 * * 1-5' \ --topic stop-instance-event \ --message-body '{"label":"env=dev"}' \ --time-zone 'America/Los_Angeles' \ --location us-east1
初期構成によっては、プロジェクトで作成された最初のジョブの実行に数分かかることがあります。
省略可: ジョブが動作することを確認する
Cloud Scheduler ジョブを手動で実行して、開始関数と停止関数が正常にトリガーされることを確認できます。Cloud SQL インスタンスの更新には数分かかることがあります。
ジョブを実行して Cloud SQL インスタンスを停止するには、
gcloud scheduler jobs runコマンドを使用します。gcloud scheduler jobs run shutdown-dev-instances --location="us-east1"
dev-instanceのアクティベーション ポリシーがNEVERであることを確認します。gcloud sql instances describe dev-instance --format="value(settings.activationPolicy)"
ジョブを実行してインスタンスを起動します。
gcloud scheduler jobs run startup-dev-instances --location="us-east1"
dev-instanceのアクティベーション ポリシーがALWAYSであることを確認します。gcloud sql instances describe dev-instance --format="value(settings.activationPolicy)"
クリーンアップ
このチュートリアルで使用したリソースに対して課金されないようにするには、リソースを削除してクリーンアップします。
- Cloud Scheduler ジョブを削除します。
gcloud scheduler jobs delete startup-dev-instances --location=us-east1 --quiet gcloud scheduler jobs delete shutdown-dev-instances --location=us-east1 --quiet
- Eventarc トリガーを削除します。
gcloud eventarc triggers delete start-instance-trigger --location=us-west1 --quiet gcloud eventarc triggers delete stop-instance-trigger --location=us-west1 --quiet
- Cloud Run サービスを削除します。
gcloud run services delete startinstance --region=us-west1 --quiet gcloud run services delete stopinstance --region=us-west1 --quiet
- Pub/Sub トピックを削除します。
gcloud pubsub topics delete start-instance-event gcloud pubsub topics delete stop-instance-event
- Cloud SQL インスタンスを削除します。
gcloud sql instances delete dev-instance --quiet
- また、 Google Cloud プロジェクトを削除して、料金が発生しないようにすることもできます。 Google Cloud プロジェクトを削除すると、そのプロジェクト内で使用されているすべてのリソースに対する課金が停止します。
Google Cloud プロジェクトを削除する:
gcloud projects delete PROJECT_ID
次のステップ
- Google Cloud に関するリファレンス アーキテクチャ、図、ベスト プラクティスを確認する。Cloud アーキテクチャ センターをご覧ください。