У меня такой же вариант использования в моем проекте, и я использую эту функцию python для запуска и остановки виртуальной машины, моя функция может обрабатывать пути start
и stop
from flask import Flask, request, abort
import os
import logging
app = Flask(__name__)
@app.route('/')
@app.route('/<path:path>')
def power(path=None):
#this libraries are mandatory to reach compute engine api
from googleapiclient import discovery
from oauth2client.client import GoogleCredentials
#the function will take the service account of your function
credentials = GoogleCredentials.get_application_default()
#this line is to specify the api that we gonna use, in this case compute engine
service = discovery.build('compute', 'v1', credentials=credentials, cache_discovery=False)
logging.getLogger('googleapiclient.discovery_cache').setLevel(logging.ERROR)
# Project ID for this request.
project = yourprojectID # Update placeholder value.
zone = request.args.get('zone', None)
instance = request.args.get('instance', None)
#call the method to start or stop the instance
if (request.path == "/stop"):
req = service.instances().stop(project=project, zone=zone, instance=instance)
elif (request.path == "/start"):
req = service.instances().start(project=project, zone=zone, instance=instance)
else:
abort(418)
#execute the command
response = req.execute()
print(response)
return ("OK")
if __name__ == '__main__':
app.run(port=3000, debug=True)
файл requirements.txt
google-api-python-client
oauth2client
flask
Конфигурация планировщика
- Создайте учетную запись службы с помощью разрешение functions.invoker в вашей функции
- Создать новое задание облачного планировщика
- Укажите частоту в формате cron.
- В качестве целевого типа укажите HTTP.
- Добавьте URL-адрес вашей облачной функции и метода, как всегда.
- Выберите OIDC токена из раскрывающегося списка Auth header.
- Добавьте адрес электронной почты учетной записи службы в текстовое поле Учетная запись службы.
- В
audience field
вам нужно только написать URL-адрес функции без каких-либо дополнительных параметров
В облачном планировщике я нажимаю свою функцию, используя эти URL-адреса
https://us-central1-yourprojectID.cloudfunctions.net/power/stop?zone=us-central1-a&instance=instance-1
https://us-central1-yourprojectID.cloudfunctions.net/power/stop?zone=us-central1-a&instance=instance-1
и я использовал эту аудиторию
https://us-central1-yourprojectID.cloudfunctions.net/power
замените yourprojectID
в коде и в URL
us-central1
- это область, в которой расположена моя функция, power
- это имя моей функции, us-central1-a
- это зона, в которой находится мой экземпляр, а instance-1
- это имя моего экземпляра
обновление для java
Облачные функции поддерживают java11 и maven, но это бета-версия
сначала вам нужны эти зависимости, добавьте следующие строки в свой файл pom.xml:
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-compute</artifactId>
<version>beta-rev20200629-1.30.10</version>
</dependency>
<dependency>
<groupId>com.google.api-client</groupId>
<artifactId>google-api-client</artifactId>
<version>1.30.10</version>
</dependency>
Облачная функция для ЗАПУСКА ВМ
package com.example;
import com.google.cloud.functions.HttpFunction;
import com.google.cloud.functions.HttpRequest;
import com.google.cloud.functions.HttpResponse;
import java.io.BufferedWriter;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.compute.Compute;
import com.google.api.services.compute.model.Operation;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Arrays;
public class Example implements HttpFunction {
@Override
public void service(HttpRequest request, HttpResponse response) throws Exception, IOException, GeneralSecurityException {
// Project ID for this request.
String project = "my-project"; // TODO: Update placeholder value.
// The name of the zone for this request.
String zone = "my-zone"; // TODO: Update placeholder value.
// Name of the instance resource to start.
String instance = "my-instance"; // TODO: Update placeholder value.
Compute computeService = createComputeService();
// you can change the method start to stop
Compute.Instances.Start request = computeService.instances().start(project, zone, instance);
Operation xresponse = xrequest.execute();
// TODO: Change code below to process the `response` object:
System.out.println(xresponse);
BufferedWriter writer = response.getWriter();
writer.write("Done");
}
public static Compute createComputeService() throws IOException, GeneralSecurityException {
HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
GoogleCredential credential = GoogleCredential.getApplicationDefault();
if (credential.createScopedRequired()) {
credential =
credential.createScoped(Arrays.asList("https://www.googleapis.com/auth/cloud-platform"));
}
return new Compute.Builder(httpTransport, jsonFactory, credential)
.setApplicationName("Google-ComputeSample/0.1")
.build();
}
}
Дополнительную информацию можно найти в документе. в этом документе приведены несколько примеров на разных языках программирования.
person
Jan Hernandez
schedule
28.07.2020