Usa la biblioteca cliente de Python

En este documento, se muestra cómo usar la biblioteca cliente de Google Python para Compute Engine. Se describe cómo autorizar solicitudes y cómo crear instancias, generar listas de instancias y cómo borrarlas. En este ejercicio, se analiza cómo usar la biblioteca google-api-python-client para acceder a los recursos de Compute Engine. Puedes ejecutar esta muestra desde tu máquina local o en una instancia de VM, siempre y cuando la autorices correctamente.

Para obtener una lista completa de las bibliotecas cliente disponibles, incluidas otras bibliotecas cliente de Google y bibliotecas de código abierto de terceros, consulta la página Bibliotecas cliente.

Para omitir el ejercicio y ver la muestra de código completa, visita la página de GitHub GoogleCloudPlatform/python-docs-samples.

Objetivos

  • Realizar el proceso de autorización de OAuth 2.0 con la biblioteca oauth2client
  • Crear una instancia con la biblioteca google-python-client
  • Generar una lista de instancias con la biblioteca google-python-client
  • Borrar una instancia con la biblioteca google-python-client

Costos

En este instructivo, se usan componentes facturables de Cloud Platform, incluido Compute Engine.

Los usuarios nuevos de Cloud Platform pueden ser aptos para una prueba gratuita.

Antes de comenzar

  1. Accede a tu Cuenta de Google.

    Si todavía no tienes una cuenta, regístrate para obtener una nueva.

  2. Selecciona o crea un proyecto de GCP.

    Ir a la página Administrar recursos

  3. Comprueba que la facturación esté habilitada en tu proyecto.

    Descubre cómo puedes habilitar la facturación

  4. Instala el SDK de Cloud.
  5. Una vez instalado, ejecuta gcloud auth application-default login.
  6. Instala la biblioteca google-api-python-client. Normalmente, puedes ejecutar el siguiente comando:
    $ pip install --upgrade google-api-python-client

    Para obtener más información sobre cómo instalar esta biblioteca, consulta las instrucciones de instalación. También debes tener Python 2.7 o 3.3+ para ejecutar la biblioteca cliente de Python en Google.

  7. Habilita la API de Google Cloud Storage.
  8. Crea un depósito de almacenamiento y anota el nombre para usarlo más adelante.

Autoriza solicitudes

En esta muestra, se usa la autorización de OAuth 2.0. Existen muchas formas de autorizar solicitudes con OAuth 2.0, pero en esta muestra usarás las credenciales predeterminadas de la aplicación. Esto te permite volver a usar las credenciales de la herramienta de gcloud si ejecutas la muestra en una estación de trabajo local o las credenciales de una cuenta de servicio si la ejecutas desde Compute Engine o App Engine. Deberías haber instalado y autorizado la herramienta de gcloud en la sección Antes de comenzar.

Las credenciales predeterminadas de la aplicación se proporcionan automáticamente en las bibliotecas cliente de la API de Google. Solo tienes que compilar y, luego, inicializar la API:

compute = googleapiclient.discovery.build('compute', 'v1')

Por ejemplo, el siguiente fragmento es el método principal de esta muestra, el cual compila la API, la inicializa y, luego, realiza algunas llamadas para crear, generar una lista y borrar una instancia:

def main(project, bucket, zone, instance_name, wait=True):
    compute = googleapiclient.discovery.build('compute', 'v1')

    print('Creating instance.')

    operation = create_instance(compute, project, zone, instance_name, bucket)
    wait_for_operation(compute, project, zone, operation['name'])

    instances = list_instances(compute, project, zone)

    print('Instances in project %s and zone %s:' % (project, zone))
    for instance in instances:
        print(' - ' + instance['name'])

    print("""
Instance created.
It will take a minute or two for the instance to complete work.
Check this URL: http://storage.googleapis.com/{}/output.png
Once the image is uploaded press enter to delete the instance.
""".format(bucket))

    if wait:
        input()

    print('Deleting instance.')

    operation = delete_instance(compute, project, zone, instance_name)
    wait_for_operation(compute, project, zone, operation['name'])

if __name__ == '__main__':
    parser = argparse.ArgumentParser(
        description=__doc__,
        formatter_class=argparse.RawDescriptionHelpFormatter)
    parser.add_argument('project_id', help='Your Google Cloud project ID.')
    parser.add_argument(
        'bucket_name', help='Your Google Cloud Storage bucket name.')
    parser.add_argument(
        '--zone',
        default='us-central1-f',
        help='Compute Engine zone to deploy to.')
    parser.add_argument(
        '--name', default='demo-instance', help='New instance name.')

    args = parser.parse_args()

    main(args.project_id, args.bucket_name, args.zone, args.name)

Genera una lista de instancias

Con la biblioteca cliente de Python, puedes generar una lista de instancias con el método compute.instances().list. Deberás proporcionar el ID del proyecto y la zona para la que deseas generar una lista de instancias. Por ejemplo:

def list_instances(compute, project, zone):
    result = compute.instances().list(project=project, zone=zone).execute()
    return result['items'] if 'items' in result else None

Agrega una instancia

Para agregar una instancia, usa el método instances().insert y especifica las propiedades de la instancia nueva. Estas propiedades se especifican en el cuerpo de la solicitud; a fin de obtener más información sobre cada propiedad, consulta la referencia de la API para instances.insert.

Como mínimo, tu solicitud debe proporcionar valores para las siguientes propiedades cuando creas una instancia nueva:

  • Nombre de la instancia
  • Disco persistente raíz
  • Tipo de máquina
  • Zona
  • Interfaces de red

En esta muestra, se inicia una instancia con las siguientes propiedades en la zona que elijas:

  • Tipo de máquina: n1-standard-1
  • Disco persistente raíz: un disco persistente nuevo basado en la última imagen de Debian 8
  • La cuenta de servicio predeterminada de Compute Engine con los siguientes alcances:

    • https://www.googleapis.com/auth/devstorage.read_write: para permitir que la instancia lea y escriba archivos en Google Cloud Storage
    • https://www.googleapis.com/auth/logging.write: para permitir que los registros de instancias se suban a Google Cloud Logging
  • Metadatos para especificar los comandos que la instancia debe ejecutar al inicio

def create_instance(compute, project, zone, name, bucket):
    # Get the latest Debian Jessie image.
    image_response = compute.images().getFromFamily(
        project='debian-cloud', family='debian-9').execute()
    source_disk_image = image_response['selfLink']

    # Configure the machine
    machine_type = "zones/%s/machineTypes/n1-standard-1" % zone
    startup_script = open(
        os.path.join(
            os.path.dirname(__file__), 'startup-script.sh'), 'r').read()
    image_url = "http://storage.googleapis.com/gce-demo-input/photo.jpg"
    image_caption = "Ready for dessert?"

    config = {
        'name': name,
        'machineType': machine_type,

        # Specify the boot disk and the image to use as a source.
        'disks': [
            {
                'boot': True,
                'autoDelete': True,
                'initializeParams': {
                    'sourceImage': source_disk_image,
                }
            }
        ],

        # Specify a network interface with NAT to access the public
        # internet.
        'networkInterfaces': [{
            'network': 'global/networks/default',
            'accessConfigs': [
                {'type': 'ONE_TO_ONE_NAT', 'name': 'External NAT'}
            ]
        }],

        # Allow the instance to access cloud storage and logging.
        'serviceAccounts': [{
            'email': 'default',
            'scopes': [
                'https://www.googleapis.com/auth/devstorage.read_write',
                'https://www.googleapis.com/auth/logging.write'
            ]
        }],

        # Metadata is readable from the instance and allows you to
        # pass configuration from deployment scripts to instances.
        'metadata': {
            'items': [{
                # Startup script is automatically executed by the
                # instance upon startup.
                'key': 'startup-script',
                'value': startup_script
            }, {
                'key': 'url',
                'value': image_url
            }, {
                'key': 'text',
                'value': image_caption
            }, {
                'key': 'bucket',
                'value': bucket
            }]
        }
    }

    return compute.instances().insert(
        project=project,
        zone=zone,
        body=config).execute()

En las siguientes secciones, se describen los parámetros para crear la instancia.

Discos persistentes raíz

Todas las instancias se deben iniciar desde un disco persistente raíz. El disco persistente raíz contiene todos los archivos necesarios para iniciar una instancia. Cuando crees un disco persistente raíz, deberás especificar la imagen de SO de origen que se debe aplicar al disco. En la muestra anterior, creaste un disco persistente raíz nuevo basado en Debian 8 al mismo tiempo que la instancia. Sin embargo, también se puede crear un disco con anticipación y conectarlo a la instancia.

Metadatos de la instancia

Cuando crees la instancia, es posible que quieras incluir sus metadatos, como una secuencia de comandos de inicio, variables de configuración y Llaves SSH. En el ejemplo anterior, usaste el campo metadata en el cuerpo de tu solicitud a fin de especificar una secuencia de comandos de inicio para la instancia y algunas variables de configuración como pares clave-valor. En la secuencia de comandos de inicio que se indica a continuación, se muestra cómo leer estas variables y usarlas para aplicar texto a una imagen y subirla a Google Cloud Storage.

apt-get update
apt-get -y install imagemagick

# Use the metadata server to get the configuration specified during
# instance creation. Read more about metadata here:
# https://cloud.google.com/compute/docs/metadata#querying
IMAGE_URL=$(curl http://metadata/computeMetadata/v1/instance/attributes/url -H "Metadata-Flavor: Google")
TEXT=$(curl http://metadata/computeMetadata/v1/instance/attributes/text -H "Metadata-Flavor: Google")
CS_BUCKET=$(curl http://metadata/computeMetadata/v1/instance/attributes/bucket -H "Metadata-Flavor: Google")

mkdir image-output
cd image-output
wget $IMAGE_URL
convert * -pointsize 30 -fill white -stroke black -gravity center -annotate +10+40 "$TEXT" output.png

# Create a Google Cloud Storage bucket.
gsutil mb gs://$CS_BUCKET

# Store the image in the Google Cloud Storage bucket and allow all users
# to read it.
gsutil cp -a public-read output.png gs://$CS_BUCKET/output.png

Borra una instancia

Para borrar una instancia, debes llamar al método instances().delete y proporcionar el nombre, la zona y el ID del proyecto de la instancia que deseas borrar. Dado que configuraste el parámetro autoDelete para el disco de arranque, este también se borrará cuando se borre la instancia. Esta configuración está desactivada de manera predeterminada, pero resulta útil cuando tu caso práctico requiere que los discos y las instancias se borren en conjunto.

def delete_instance(compute, project, zone, name):
    return compute.instances().delete(
        project=project,
        zone=zone,
        instance=name).execute()

Ejecuta la muestra

Si deseas ejecutar la muestra completa, puedes descargar el código y ejecutarlo en la línea de comandos. Asegúrate de descargar los archivos create_instance.py y startup-script.sh. Realiza lo siguiente para ejecutar la muestra:

python create_instance.py --name [INSTANCE_NAME] --zone [ZONE] [PROJECT_ID] [CLOUD_STORAGE_BUCKET]

donde:

  • [INSTANCE_NAME] es el nombre de la instancia que deseas crear.
  • [ZONE] es la zona deseada para esta solicitud.
  • [PROJECT_ID] es nuestro ID del proyecto.
  • [CLOUD_STORAGE_BUCKET] es el nombre del depósito que configuraste inicialmente, pero sin el prefijo gs://.

Por ejemplo:

python python-example.py --name example-instance --zone us-central1-a example-project my-gcs-bucket

Espera a que se completen las operaciones

Las solicitudes a la API de Compute Engine que modifican recursos, como las instancias, mostrarán inmediatamente una respuesta en la que se reconoce tu solicitud. El reconocimiento te permitirá verificar el estado de la operación solicitada. Las operaciones pueden tardar unos minutos en completarse, por lo que a veces resulta más fácil esperar a que se complete la operación antes de continuar. Este método auxiliar esperará a que se complete la operación antes de mostrar el siguiente código:

def wait_for_operation(compute, project, zone, operation):
    print('Waiting for operation to finish...')
    while True:
        result = compute.zoneOperations().get(
            project=project,
            zone=zone,
            operation=operation).execute()

        if result['status'] == 'DONE':
            print("done.")
            if 'error' in result:
                raise Exception(result['error'])
            return result

        time.sleep(1)

Limpia

Sigue estos pasos para evitar que se apliquen cargos a tu cuenta de Google Cloud Platform por los recursos que usaste en este instructivo:

Borra el depósito de Cloud Storage

Para borrar un depósito de Cloud Storage, haz lo siguiente:

Qué sigue

  • Descarga y observa la muestra de código completa. La muestra completa incluye una pequeña muestra del uso de todos estos métodos juntos. No dudes en descargarla, modificarla y ejecutarla para adaptarla a tus necesidades.
  • Revisa la referencia de la API para aprender cómo realizar otras tareas con la API.
  • Comienza a crear tus propias aplicaciones.
¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Documentación de Compute Engine