创建一个调用 Pub-Sub 主题的 Cloud Scheduler 作业,该主题应与 Cloud Function 绑定。要从 Cloud Function 访问 Cloud SQL 实例,您需要启用Cloud SQL Admin API。
方法一
使用此方法,您之前的 SQL 配置在执行以下任何源代码后都不会丢失。这只会停止和启动您的实例。
-
STOP SQL 实例云函数源代码(Python 3.7)
main.py
>
# This file uses the Cloud SQL API to turn on a Cloud SQL instance.
from googleapiclient import discovery
from oauth2client.client import GoogleCredentials
credentials = GoogleCredentials.get_application_default()
service = discovery.build('sqladmin', 'v1beta4', credentials=credentials)
project = '<YOUR_PROJECT_ID>'
def stop_database(event, context):
instance = '<YOUR_SQL_INSTANCE_ID>'
request = service.instances().get(project=project, instance=instance)
response = request.execute()
response["settings"]["activationPolicy"] = "NEVER"
request = service.instances().update(
project=project,
instance=instance,
body=response)
response = request.execute()
requirements.txt
google-api-python-client==1.7.8
google-auth-httplib2==0.0.3
google-auth==1.6.2
oauth2client==4.1.3
-
START SQL 实例云函数源代码(Python 3.7)
main.py
>
# This file uses the Cloud SQL API to turn on a Cloud SQL instance.
from googleapiclient import discovery
from oauth2client.client import GoogleCredentials
credentials = GoogleCredentials.get_application_default()
service = discovery.build('sqladmin', 'v1beta4', credentials=credentials)
project = '<YOUR_PROJECT_ID>'
def start_database(event, context):
instance = '<YOUR_SQL_INSTANCE_ID>'
request = service.instances().get(project=project, instance=instance)
response = request.execute()
response["settings"]["activationPolicy"] = "ALWAYS"
request = service.instances().update(
project=project,
instance=instance,
body=response)
response = request.execute()
requirements.txt
google-api-python-client==1.7.8
google-auth-httplib2==0.0.3
google-auth==1.6.2
oauth2client==4.1.3
- 将每个 Pub-Sub 主题与相关的云函数相关联。
- 在 Cloud Scheduler 中安排 Cron 作业。
为启动和停止 SQL 实例创建单独的调度程序作业。然后为日常工作添加如下频率。
例子:
- 每天上午 9:00 -> 0 9 * * *
- 每天晚上 10:30 -> 30 22 * * *
方法二
使用此方法,您可以在每次通过这些函数启动或停止实例时放置相同的预定义配置。但是,如果您从 Google Cloud Console 更改任何配置,一旦这些功能将由计划的作业执行,这些配置就会丢失。
-
STOP SQL 实例云函数源代码(Python 3.7)
main.py
>
# This file uses the Cloud SQL API to turn on a Cloud SQL instance.
from googleapiclient import discovery
from oauth2client.client import GoogleCredentials
credentials = GoogleCredentials.get_application_default()
service = discovery.build('sqladmin', 'v1beta4', credentials=credentials)
project = '<YOUR_PROJECT_ID>'
def stop_database(event, context):
instance = '<YOUR_SQL_INSTANCE_ID>'
request = service.instances().get(project=project, instance=instance)
response = request.execute()
j = response["settings"]
settingsVersion = int(j["settingsVersion"])
dbinstancebody = {
"settings": {
"settingsVersion": settingsVersion,
"tier": "db-f1-micro",
"activationPolicy": "NEVER",
"databaseFlags": [
{
"name": "default_time_zone",
"value": "+05:30"
}
],
"ipConfiguration": {
"authorizedNetworks": [
{
"name": "VM",
"value": "<YOUR_EXTERNAL_ACCESS_IP>"
}
]
},
"backupConfiguration": {
"enabled": "true"
}
}
}
request = service.instances().update(
project=project,
instance=instance,
body=dbinstancebody)
response = request.execute()
requirements.txt
Same as above Method 1
-
START SQL 实例云函数源代码(Python 3.7)
main.py
>
# This file uses the Cloud SQL API to turn on a Cloud SQL instance.
from googleapiclient import discovery
from oauth2client.client import GoogleCredentials
credentials = GoogleCredentials.get_application_default()
service = discovery.build('sqladmin', 'v1beta4', credentials=credentials)
project = '<YOUR_PROJECT_ID>'
def start_database(event, context):
instance = '<YOUR_SQL_INSTANCE_ID>'
request = service.instances().get(project=project, instance=instance)
response = request.execute()
j = response["settings"]
settingsVersion = int(j["settingsVersion"])
dbinstancebody = {
"settings": {
"settingsVersion": settingsVersion,
"tier": "db-f1-micro",
"activationPolicy": "ALWAYS",
"databaseFlags": [
{
"name": "default_time_zone",
"value": "+05:30"
}
],
"ipConfiguration": {
"authorizedNetworks": [
{
"name": "VM",
"value": "<YOUR_EXTERNAL_ACCESS_IP>"
}
]
},
"backupConfiguration": {
"enabled": "true"
}
}
}
request = service.instances().update(
project=project,
instance=instance,
body=dbinstancebody)
response = request.execute()
requirements.txt
Same as above Method 1
- 同方法一->步骤三
- 同方法一->第四步