0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Cloud FunctionsからCloud SQL(MySQL)を擬似的に停止・再開する方法【activationPolicy活用】

Last updated at Posted at 2025-04-17

Cloud SQL(MySQL) をスケジュール的に停止・再開してコストを抑えたい…
そのような場面で便利なのが、Cloud Functions からの activationPolicy 操作です。


やりたいこと

  • Cloud SQL を夜間は「停止」しておきたい
  • 朝になったら「再開」させたい
  • Cloud Functions から制御したい

正しい方法:activationPolicy の変更

Cloud SQL のインスタンス設定には activationPolicy という項目があります。

値と意味

説明
ALWAYS 常に起動(通常状態)
NEVER 手動でしか起動しない(停止相当)

ON_DEMAND は SQL Server 専用で、MySQL では無視されます。


Cloud Functions からの制御例

環境変数 PROJECT_IDINSTANCE_ID を設定した上で以下のような関数を用意します。

起動(再開)用の関数

import os
from googleapiclient.discovery import build
from google.auth import default
import functions_framework

@functions_framework.http
def start_cloud_sql(request):
    credentials, _ = default()
    service = build('sqladmin', 'v1beta4', credentials=credentials)

    project_id = os.environ.get("PROJECT_ID")
    instance_id = os.environ.get("INSTANCE_ID")

    result = service.instances().patch(
        project=project_id,
        instance=instance_id,
        body={"settings": {"activationPolicy": "ALWAYS"}}
    ).execute()

    return f"Cloud SQL instance {instance_id} set to ALWAYS: {result}", 200

停止用の関数

import os
from googleapiclient.discovery import build
from google.auth import default
import functions_framework

@functions_framework.http
def stop_cloud_sql(request):
    credentials, _ = default()
    service = build('sqladmin', 'v1beta4', credentials=credentials)

    project_id = os.environ.get("PROJECT_ID")
    instance_id = os.environ.get("INSTANCE_ID")

    result = service.instances().patch(
        project=project_id,
        instance=instance_id,
        body={"settings": {"activationPolicy": "NEVER"}}
    ).execute()

    return f"Cloud SQL instance {instance_id} set to NEVER: {result}", 200

環境変数の指定方法(第1世代)

CLIでデプロイする例

gcloud functions deploy start-cloud-sql \
  --runtime python310 \
  --trigger-http \
  --entry-point start_cloud_sql \
  --set-env-vars PROJECT_ID=my-project,INSTANCE_ID=my-instance

gcloud functions deploy stop-cloud-sql \
  --runtime python310 \
  --trigger-http \
  --entry-point stop_cloud_sql \
  --set-env-vars PROJECT_ID=my-project,INSTANCE_ID=my-instance

注意点:アクセスがあると起動する

activationPolicy: "NEVER" にしても、接続が発生するとインスタンスが自動で起動します。

これを防ぎたい場合は、接続元IPを遮断するのが有効です。

service.instances().patch(
    project=project_id,
    instance=instance_id,
    body={
        "settings": {
            "ipConfiguration": {
                "authorizedNetworks": []
            }
        }
    }
).execute()

まとめ

操作 MySQL対応 解説
activationPolicy = "NEVER" 疑似停止。アクセスがあると再起動するので注意
activationPolicy = "ALWAYS" 常時稼働状態
start() / stop() × SQL Server専用機能

参考

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?