Как включить / выключить Cloud SQL, используя Python3 - PullRequest
0 голосов
/ 18 января 2020

Я пытаюсь использовать сценарий Python для включения / выключения облака. SQL Экземпляр в GoogleCloud. Наконец-то я нашел способ сделать это, используя GoogleCloudAPI, в Shell:

### shell script
ACCESS_TOKEN="$(gcloud auth print-access-token)"
ACTIVATION_POLICY="ALWAYS/NEVER" # Use 'ALWAYS' to turn on, 'NEVER' to turn off
curl --header "Authorization: Bearer ${ACCESS_TOKEN}"  --header 'Content-Type: application/json' --data '{"settings" : {"activationPolicy" : "${ACTIVATION_POLICY}"}}' -X PATCH https://www.googleapis.com/sql/v1beta4/projects/${PROJECT_ID}/instances/${INSTANCE_ID}

Итак, отлично, проблема решена ... за исключением того, что я не могу использовать 'gcloud auth print-access-token' на машина, на которой я запускаю скрипт, так что ничего не решается. Я обнаружил вопрос от 2017 , пытавшийся сгенерировать этот 'токен доступа', также используя Python, который, очевидно, тоже не работал.

Мне нужно иметь возможность сгенерировать это 'токен доступа', использующий сам Python. Я просматривал документацию Google, но мне так и не удалось найти ничего, связанного с этим, ближе всего я обнаружил использование oauth2 и googleapiclient для запуска списка экземпляров, но, похоже, не может изменить политику активации с Там:

### python3 script
from google.oauth2 import service_account
import googleapiclient.discovery
SCOPES = ['https://www.googleapis.com/auth/sqlservice.admin']
SERVICE_ACCOUNT_FILE = '/path/to/service.json'
credentials = service_account.Credentials.from_service_account_file(
        SERVICE_ACCOUNT_FILE, scopes=SCOPES)
sqladmin = googleapiclient.discovery.build('sqladmin', 'v1beta4', credentials=credentials)
response = sqladmin.instances().get(project=PROJECT_ID, instance=INSTANCE_ID).execute()

Документация не проясняет, как использовать какой-либо инструмент для отключения экземпляра Cloud SQL, или, по крайней мере, ни один из них, который я могу найти, делает. Приведенный выше код возвращает мне файл JSON, и я могу увидеть там «ActivPolicy» в настройках. Однако я не могу найти способ «изменить его».

Мне удалось последовать совету @norbjd и найти метод «patch», и он дал «SQL Admin» разрешение на мои учетные данные, чтобы он мог Теперь используйте API sqladmin. Попытался исправить это, используя следующий код:

instance = sqladmin.instances().patch(project=PROJECT_ID, instance=INSTANCE_ID)
instance.data = {"settings" : {"activationPolicy" : "NEVER"}} #also tried with it in a string, like this: instance.data = {"settings" : {"activationPolicy" : "NEVER"}}
instance.headers['Content-Type'] = 'application/json'
instance.execute()

Учитывая, что instance.data до этого не существовал, но экземпляры instance.headers сделали:

{'accept': 'application/json', 'accept-encoding': 'gzip, deflate', 'user-agent': '(gzip)', 'x-goog-api-client': 'gdcl/1.7.11 gl-python/3.6.9'}

После выполнения, хотя ничего не случилось. Это не изменило фактическую активацию Policy.

1 Ответ

1 голос
/ 20 января 2020

В конце концов, проблема была решена с помощью ACCESS_TOKEN и выполнением запроса Python с использованием модуля запросов. Если вы попытаетесь получить ACCESS_TOKEN из своих учетных данных сразу после их создания, вы их не получите, но если вы фактически используете свои учетные данные с googleapiclient.discovery, это обновит этот объект с действительным токеном доступа, который затем может быть используется в запросе Python следующим образом:

from google.oauth2 import service_account
import googleapiclient.discovery
import json
import requests

PROJECT_ID = '{PROJECT_ID_HERE}'
INSTANCE_ID = '{INSTANCE_ID_HERE}'

SCOPES = ['https://www.googleapis.com/auth/sqlservice.admin']
SERVICE_ACCOUNT_FILE = '/path/to/service.json'
credentials = service_account.Credentials.from_service_account_file(
        SERVICE_ACCOUNT_FILE, scopes=SCOPES)

sqladmin = googleapiclient.discovery.build('sqladmin', 'v1beta4', credentials=credentials)
response = sqladmin.instances().get(project=PROJECT_ID, instance=INSTANCE_ID).execute()
print(json.dumps(response))

access_token = credentials.token # Now that the credentials were used, they have a valid access_token associated with them!

activation_policy = 'NEVER' # or 'ALWAYS'

url = "https://www.googleapis.com/sql/v1beta4/projects/{PROJECT_ID}/instances/{INSTANCE_ID}".format(PROJECT_ID=PROJECT_ID, INSTANCE_ID=INSTANCE_ID)
header = {
    "Authorization" : "Bearer {}".format(access_token), 
    "Content-Type" : "application/json"
}
data = {
    "settings" : {
        "activationPolicy" : activation_policy
    }
}
response = requests.patch(url, headers=header, data=json.dumps(data))
print(response.text)

Все, что ему нужно, - это фактически использовать учетные данные для чего-либо, прежде чем пытаться получить ACCESS_TOKEN

...