Cloud SQL(MySQL) をスケジュール的に停止・再開してコストを抑えたい…
そのような場面で便利なのが、Cloud Functions からの activationPolicy
操作です。
やりたいこと
- Cloud SQL を夜間は「停止」しておきたい
- 朝になったら「再開」させたい
- Cloud Functions から制御したい
正しい方法:activationPolicy
の変更
Cloud SQL のインスタンス設定には activationPolicy
という項目があります。
値と意味
値 | 説明 |
---|---|
ALWAYS | 常に起動(通常状態) |
NEVER | 手動でしか起動しない(停止相当) |
※
ON_DEMAND
は SQL Server 専用で、MySQL では無視されます。
Cloud Functions からの制御例
環境変数 PROJECT_ID
と INSTANCE_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専用機能 |