【问题标题】:How to create a cron job in Google Cloud Platform that will start Cloud SQL instances at a predefined time?如何在 Google Cloud Platform 中创建将在预定义时间启动 Cloud SQL 实例的 cron 作业?
【发布时间】:2019-11-15 06:48:48
【问题描述】:

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

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

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

【问题讨论】:

标签: google-cloud-platform google-cloud-functions google-cloud-scheduler


【解决方案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

您可以查看我的代码,了解如何将云函数用于start a Cloud SQL instancestop a Cloud SQL instance

创建云函数后,您可以configure the Cloud Scheduler触发每个云函数的HTTP地址,或者您可以按照guide的推荐方法使用pub/sub触发函数

【讨论】:

    【解决方案2】:

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

    方法一

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

    1. 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
    

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

    1. 将每个 Pub-Sub 主题与相关的云函数相关联。

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

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

    例子:

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

    方法二

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

    1. 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
    

    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
    

    1. 同方法一->步骤三

    1. 同方法一->第四步

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多