0

我想创建一个 cron 作业,触发该作业时将启动一个 Cloud SQL 实例。我找到了一种启动计算引擎实例的方法,但是我该如何启动云 Sql 实例呢?

用于启动计算引擎实例的链接-

https://cloud.google.com/scheduler/docs/start-and-stop-compute-engine-instances-on-a-schedule

4

2 回答 2

1

为了实现这一点,您可以使用Cloud Function调用Cloud SQL Admin API来启动和停止 Cloud SQL 实例(您将需要 2 个 Cloud 函数)

def hello_world(request):

instance = 'test'  # TODO: Update placeholder value.
request = service.instances().get(project=project, instance=instance)
response = request.execute()
j = response["settings"]
settingsVersion = int(j["settingsVersion"])

dbinstancebody = {
   "settings": {
       "settingsVersion": settingsVersion,
       "tier": "db-n1-standard-1",
       "activationPolicy": "Always"
   }
}

request = service.instances().update(
   project=project,
   instance=instance,
   body=dbinstancebody)
response = request.execute()
pprint(response)

request_json = request.get_json()

if request.args and 'message' in request.args:
    return request.args.get('message')
elif request_json and 'message' in request_json:
    return request_json['message']
else:
    return f"Hello World!"

requirements.txt

google-api-python-client==1.7.8
google-auth-httplib2==0.0.3
google-auth==1.6.2
oauth2client==4.1.3

您可以查看我关于如何使用 Cloud Function启动 Cloud SQL 实例停止 Cloud SQL 实例的代码

创建 Cloud Function 后,您可以配置 Cloud Scheduler以触发每个 Cloud Function 的 HTTP 地址,或者您可以按照本指南的推荐方法并使用 pub/sub 触发函数

于 2019-11-15T07:25:42.963 回答
0

创建一个调用 Pub-Sub 主题的 Cloud Scheduler 作业,该主题应与 Cloud Function 绑定。要从 Cloud Function 访问 Cloud SQL 实例,您需要启用Cloud SQL Admin API。

方法一

使用此方法,您之前的 SQL 配置在执行以下任何源代码后都不会丢失。这只会停止和启动您的实例。

  1. STOP SQL实例云函数源码(Python 3.7)

主文件

# 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()

要求.txt

google-api-python-client==1.7.8
google-auth-httplib2==0.0.3
google-auth==1.6.2
oauth2client==4.1.3

  1. START SQL实例云函数源码(Python 3.7)

主文件

# 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()

要求.txt

google-api-python-client==1.7.8
google-auth-httplib2==0.0.3
google-auth==1.6.2
oauth2client==4.1.3

  1. 将每个 Pub-Sub 主题与相关的 Cloud Functions 链接。

  1. 在 Cloud Scheduler 中安排 Cron 作业。

为启动和停止 SQL 实例创建单独的调度程序作业。然后为日常工作添加如下频率。

例子:

  • 每天上午 9:00 -> 0 9 * * *
  • 每天晚上 10:30 -> 30 22 * * *

方法二

使用这种方法,您可以在每次通过这些函数启动或停止实例时放置相同的预定义配置。但是,如果您从 Google Cloud Console 更改任何配置,一旦这些功能将由计划的作业执行,这些配置就会丢失。

  1. STOP SQL实例云函数源码(Python 3.7)

主文件

# 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()

要求.txt

Same as above Method 1

  1. START SQL实例云函数源码(Python 3.7)

主文件

# 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()

要求.txt

Same as above Method 1

  1. 与方法 1 相同 -> 步骤 3

  1. 与方法 1 相同 -> 步骤 4
于 2021-02-18T06:31:32.167 回答