Plantillas de instancia deterministas


En esta página se describe cuándo y por qué deberías crear plantillas de instancias deterministas. Las plantillas de instancia deterministas dejan claro el tipo de servicios o aplicaciones de terceros que se van a instalar en tus instancias cuando se implemente la plantilla de instancia. Si creas plantillas de instancia deterministas, minimizas la ambigüedad y el comportamiento inesperado de tus plantillas de instancia.

Por qué crear plantillas de instancia deterministas

En general, te recomendamos que las propiedades de tu plantilla de instancia sean lo más explícitas y deterministas posible. Si utilizas secuencias de comandos de inicio en tus plantillas de instancia que instalan o usan servicios de terceros, asegúrate de que estas secuencias proporcionen información explícita, como la versión de la aplicación que se va a instalar. Compute Engine solo puede basarse en la información definida en la plantilla y no tiene ningún control sobre los servicios de terceros a los que se hace referencia. Si tu plantilla es demasiado imprecisa, es posible que tu plantilla de instancia se comporte de forma inesperada.

Por ejemplo, considera el siguiente comando para crear una plantilla de instancia con una secuencia de comandos de inicio que instale apache2 y use un archivo alojado en un servidor externo:

gcloud compute instance-templates create example-template-with-startup \
    --image-family debian-9 \
    --image-project debian-cloud \
    --metadata startup-script='#! /bin/bash
    sudo apt install -y apache2
    scp myuser@108.59.87.185:index.php /var/www/'

Este script de inicio puede tener dos problemas:

  • La secuencia de comandos no define explícitamente qué versión de apache2 se va a instalar, sino que se basa en la versión actual disponible en el repositorio apt.
  • La secuencia de comandos depende de un archivo alojado en un tercero que no tiene versiones y que podría haber cambiado desde la última vez que se usó la plantilla de instancia.

Si usas un escalador automático, una plantilla de instancia no determinista puede provocar que el escalador automático añada nuevas instancias a un grupo de instancias gestionado con una configuración diferente, como una versión diferente de apache2.

Del mismo modo, si aplicaste esta plantilla a un grupo de instancias gestionado, actualizaste el grupo a otro servicio de plantilla y, después, decidiste volver a la plantilla anterior, es posible que las instancias utilicen una versión diferente del archivo apache2 o index.php que antes de la actualización, ya que las instancias siempre obtendrían la versión más reciente al iniciarse.

Evitar comportamientos ambiguos o inesperados de las plantillas de instancia

Para evitar comportamientos inesperados de las plantillas, utiliza los siguientes métodos:

  • Usa imágenes optimizadas para contenedores o Docker con etiquetas de Docker. Por ejemplo, te recomendamos que asignes etiquetas nuevas a cada nueva compilación de tu imagen de Docker y que uses estas etiquetas en tus plantillas de instancia en lugar de la etiqueta predeterminada latest. En el caso de las imágenes optimizadas para contenedores, puedes hacer referencia explícitamente a una compilación concreta de tu imagen en el archivo de manifiesto. En el siguiente ejemplo se usa la imagen de Docker "myimage" en la versión etiquetada como "version_2_1_3":

    version: v1beta2
    containers:
      - name: simple-echo
        image: myimage:version_2_1_3
           [ rest of your manifest file ]
    
  • Crea una imagen personalizada para usarla como imagen de la plantilla. Es preferible a las secuencias de comandos de inicio, ya que garantiza que todas las instancias sean iguales. Las secuencias de comandos de inicio pueden dar resultados diferentes después de las actualizaciones del paquete de distribución. Usa secuencias de comandos de inicio en tus plantillas de instancia para crear prototipos y desarrollar rápidamente, y usa imágenes personalizadas cuando quieras desplegar servicios de calidad de producción.

  • Si usas secuencias de comandos de inicio, te recomendamos que las actualices para que sean deterministas. Por ejemplo, cree una nueva versión de la plantilla anterior y especifique una secuencia de comandos de inicio determinista de la siguiente manera:

    gcloud compute instance-templates create example-template-with-startup-2-1-3 \
        --image-family debian-9 \
        --image-project debian-cloud \
        --metadata startup-script='#! /bin/bash
        sudo apt install -y apache2=2.2.20-1ubuntu1
        scp myuser@108.59.87.185:version_2_1_3/index.php /var/www/'
    

    donde "version_2_1_3" es un subdirectorio que contiene secuencias de comandos PHP para la versión 2.1.3 de tu servicio.

  • Cuando especifiques una plantilla de instancia (por ejemplo, al crear o actualizar un grupo de instancias gestionado), Google te recomienda que especifiques el valor del ID de la plantilla en lugar del valor del nombre. Aunque ambos valores son válidos, el ID es único, lo que significa que la plantilla de instancia que especifiques es la que se usará al crear VMs a partir de esa plantilla. Usar un ID en lugar de un nombre ayuda a mitigar posibles vulnerabilidades de seguridad. Por ejemplo, las vulnerabilidades TOCTOU, en las que un atacante puede eliminar una plantilla y volver a crearla con el mismo nombre antes de que se use.

    Para ver el ID de una plantilla de instancia, consulta Obtener información sobre una plantilla de instancia.

Siguientes pasos