Cloud SQL インスタンスの開始または停止をスケジュールする

Cloud Scheduler を使用して、定期的なスケジュールで Cloud SQL インスタンスを起動および停止できます。たとえば、特定の時間帯にのみインスタンスを実行したい場合があります。

このチュートリアルでは、 Google Cloud プロダクトを使用してイベント ドリブン アーキテクチャを構築し、Cloud SQL for SQL Server インスタンスを自動的に起動および停止する方法について説明します。

目標

このチュートリアルでは、env=dev リソースラベルを持つ Cloud SQL インスタンスを特定の時間に実行するようにスケジュールする Cloud Scheduler ジョブを作成します。スケジュール設定するインスタンスは 1 つのみです。ただし、このチュートリアルで説明するアーキテクチャを使用して、リソースラベルが env=dev である複数のインスタンスを停止および起動できます。

この目標を達成するには、次の手順を行います。

  1. Cloud SQL for SQL Server インスタンスを作成し、特定のリソースラベルenv=dev)を割り当てます。
  2. Eventarc トリガーのイベントソースとメッセージ ブローカーとして機能する 2 つの Pub/Sub トピックを作成します。
  3. Pub/Sub トピックを介してトリガーされる 2 つのイベント ドリブン Cloud Run functions を作成してデプロイします。トリガーされると、関数は、Pub/Sub メッセージ ペイロード(env=dev)で指定されたラベルと一致する Cloud SQL インスタンスをプロジェクト内で検索します。
  4. 2 つの Eventarc トリガーを作成してデプロイします。Pub/Sub トピック イベントは HTTP リクエストとして関数に転送され、イベント メッセージのコンテンツは入力データとして関数に渡されます。
  5. 特定の時間にターゲット ラベルを含むメッセージを Pub/Sub トピックに公開する 2 つの Cloud Scheduler cron ジョブを作成します。インスタンスが月曜日から金曜日の午前 9 時に起動し、午後 5 時に停止するようにスケジュールを設定します。

次の図は、イベント ドリブン アーキテクチャの概要を示しています。

スケジュールに従って Cloud SQL インスタンスを起動および停止する
スケジュールに従って Cloud SQL インスタンスを起動、停止する(図をクリックすると拡大表示されます)。

費用

このドキュメントでは、課金対象である次の Google Cloudコンポーネントを使用します。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。

新規の Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。

始める前に

組織で定義されているセキュリティの制約により、次の手順を完了できない場合があります。トラブルシューティング情報については、制約のある Google Cloud 環境でアプリケーションを開発するをご覧ください。

  1. Google Cloud アカウントにログインします。 Google Cloudを初めて使用する場合は、 アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. Google Cloud CLI をインストールします。

  3. 外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。

  4. gcloud CLI を初期化するには、次のコマンドを実行します。

    gcloud init
  5. 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 プロジェクトの名前に置き換えます。

  6. このガイドで既存のプロジェクトを使用する場合は、このガイドを完了するために必要な権限があることを確認します。新しいプロジェクトを作成した場合は、必要な権限がすでに付与されています。

  7. Google Cloud プロジェクトに対して課金が有効になっていることを確認します

  8. 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
  9. 認証を設定します。

    1. サービス アカウントの作成 IAM ロール(roles/iam.serviceAccountCreator)とプロジェクト IAM 管理者ロール(roles/resourcemanager.projectIamAdmin)があることを確認します。ロールを付与する方法を確認する
    2. サービス アカウントを作成します。

      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME

      SERVICE_ACCOUNT_NAME をサービス アカウントの名前に置き換えます。

    3. サービス アカウントにロールを付与します。次の IAM ロールごとに次のコマンドを 1 回実行します。roles/cloudbuild.builds.builder, roles/cloudsql.editor, roles/run.invoker

      gcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" --role=ROLE

      以下を置き換えます。

      • SERVICE_ACCOUNT_NAME: サービス アカウントの名前
      • PROJECT_ID: サービス アカウントを作成したプロジェクト ID
      • ROLE: 付与するロール
  10. Google Cloud CLI をインストールします。

  11. 外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。

  12. gcloud CLI を初期化するには、次のコマンドを実行します。

    gcloud init
  13. 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 プロジェクトの名前に置き換えます。

  14. このガイドで既存のプロジェクトを使用する場合は、このガイドを完了するために必要な権限があることを確認します。新しいプロジェクトを作成した場合は、必要な権限がすでに付与されています。

  15. Google Cloud プロジェクトに対して課金が有効になっていることを確認します

  16. 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
  17. 認証を設定します。

    1. サービス アカウントの作成 IAM ロール(roles/iam.serviceAccountCreator)とプロジェクト IAM 管理者ロール(roles/resourcemanager.projectIamAdmin)があることを確認します。ロールを付与する方法を確認する
    2. サービス アカウントを作成します。

      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME

      SERVICE_ACCOUNT_NAME をサービス アカウントの名前に置き換えます。

    3. サービス アカウントにロールを付与します。次の IAM ロールごとに次のコマンドを 1 回実行します。roles/cloudbuild.builds.builder, roles/cloudsql.editor, roles/run.invoker

      gcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" --role=ROLE

      以下を置き換えます。

      • SERVICE_ACCOUNT_NAME: サービス アカウントの名前
      • PROJECT_ID: サービス アカウントを作成したプロジェクト ID
      • ROLE: 付与するロール

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 関数は、インスタンスの activationPolicyALWAYS に更新し、インスタンスをオンにします。
  • 停止関数は activationPolicyNEVER に更新し、インスタンスをシャットダウンします。

詳細については、Cloud Run functions を作成するCloud Run 関数のトリガーをご覧ください。

関数を作成する

CloudEvents 仕様に準拠したイベントを自動的にアンマーシャルするイベント ドリブン Cloud Run functions を作成します。この業界標準仕様では、イベントデータが一般的な方法で記述されています。

ソースコードで関数のエントリ ポイントを定義する必要があります。これは、Cloud Run が関数を呼び出したときに実行されるコードです。関数のデプロイ時に、このエントリ ポイントを指定します。

  1. コードをダウンロードします。

    git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git

    または、zip 形式のサンプルをダウンロードし、ファイルを抽出してもかまいません。

  2. 適切なディレクトリに移動します。

    cd nodejs-docs-samples/functions/scheduleinstance/

イベント ドリブン関数をデプロイする

Cloud Run に関数をデプロイするには、gcloud run deploy コマンドを使用します。

  1. 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
  2. 指定したリージョンにリポジトリを作成するように求められたら、y と入力します。

  3. Allow unauthenticated invocations プロンプトで、「n」と入力します。

  4. 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
  5. 指定したリージョンにリポジトリを作成するように求められたら、y と入力します。

  6. Allow unauthenticated invocations プロンプトで、「n」と入力します。

デプロイが完了すると、サービスが実行されている URL が Google Cloud CLI に表示されます。

Eventarc トリガーを作成する

Pub/Sub からイベントを転送する Eventarc トリガーを作成するには、gcloud eventarc triggers create コマンドを使用します。Pub/Sub トピックに公開されたすべてのメッセージが対応する関数をトリガーし、メッセージのコンテンツが入力データとして渡されます。

  1. 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
  2. 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 インスタンスの更新には数分かかることがあります。

  1. ラベル env=dev のインスタンスを停止するには、gcloud pubsub topics publish コマンドを使用して停止トピックにメッセージをパブリッシュします。

    gcloud pubsub topics publish stop-instance-event --message='{"label":"env=dev"}'
  2. インスタンスが停止したことを確認するには、gcloud sql instances describe コマンドを使用してアクティベーション ポリシーを確認します。

    gcloud sql instances describe dev-instance --format="value(settings.activationPolicy)"

    出力は NEVER である必要があります。

  3. ラベル env=dev を使用してインスタンスを起動するには、開始トピックにメッセージをパブリッシュします。

    gcloud pubsub topics publish start-instance-event --message='{"label":"env=dev"}'
  4. アクティベーション ポリシーを確認して、インスタンスが起動したことを確認します。

    gcloud sql instances describe dev-instance --format="value(settings.activationPolicy)"

    出力は ALWAYS である必要があります。

Cloud Scheduler ジョブを作成する

定期的なスケジュールで Pub/Sub トピックにメッセージを公開する Cloud Scheduler ジョブを作成します。

  1. 月曜日から金曜日の午前 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
  2. 月曜日から金曜日の午後 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 インスタンスの更新には数分かかることがあります。

  1. ジョブを実行して Cloud SQL インスタンスを停止するには、gcloud scheduler jobs run コマンドを使用します。

    gcloud scheduler jobs run shutdown-dev-instances --location="us-east1"
  2. dev-instance のアクティベーション ポリシーが NEVER であることを確認します。

    gcloud sql instances describe dev-instance --format="value(settings.activationPolicy)"
  3. ジョブを実行してインスタンスを起動します。

    gcloud scheduler jobs run startup-dev-instances --location="us-east1"
  4. dev-instance のアクティベーション ポリシーが ALWAYS であることを確認します。

    gcloud sql instances describe dev-instance --format="value(settings.activationPolicy)"

クリーンアップ

このチュートリアルで使用したリソースに対して課金されないようにするには、リソースを削除してクリーンアップします。

  1. Cloud Scheduler ジョブを削除します。
    gcloud scheduler jobs delete startup-dev-instances --location=us-east1 --quiet
    gcloud scheduler jobs delete shutdown-dev-instances --location=us-east1 --quiet
  2. Eventarc トリガーを削除します。
    gcloud eventarc triggers delete start-instance-trigger --location=us-west1 --quiet
    gcloud eventarc triggers delete stop-instance-trigger --location=us-west1 --quiet
  3. Cloud Run サービスを削除します。
    gcloud run services delete startinstance --region=us-west1 --quiet
    gcloud run services delete stopinstance --region=us-west1 --quiet
  4. Pub/Sub トピックを削除します。
    gcloud pubsub topics delete start-instance-event
    gcloud pubsub topics delete stop-instance-event
  5. Cloud SQL インスタンスを削除します。
    gcloud sql instances delete dev-instance --quiet
  6. また、 Google Cloud プロジェクトを削除して、料金が発生しないようにすることもできます。 Google Cloud プロジェクトを削除すると、そのプロジェクト内で使用されているすべてのリソースに対する課金が停止します。

    Google Cloud プロジェクトを削除する:

    gcloud projects delete PROJECT_ID

次のステップ