Aparece un misterioso error de campo faltante al crear un compute.v1.instanceTemplate con Deployment Manager

Aparece un misterioso error de campo faltante al crear un compute.v1.instanceTemplate con Deployment Manager

Estoy intentando crear un compute.v1.instanceTemplatecon el Administrador de implementación (v2), pero aparece el siguiente error:

Unexpected response from resource of type compute.v1.instanceTemplate: 400 {statusMessage=Bad Request, errors=[{message=Invalid value for field 'resource.properties': ''.  Instance Templates must provide instance properties., domain=global, reason=invalid}]}

Supongo que es una queja por una propiedad perdida, pero no puedo ni por mi vida saber cuál podría ser. He echado un vistazo alPlantillas de instanciarecurso y elimplementación avanzada ejemplos, y yo noparecerfaltar nada. Sin embargo, me encantaría que me demostraran que estoy equivocado.

Aquí está el recurso completo adquirido con gcloud deployment-manager deployments describe --log-http name:

{
 "id": "redacted",
 "insertTime": "2015-10-03T05:13:33.325-07:00",
 "updateTime": "2015-10-03T05:42:50.152-07:00",
 "name": "tpl-redacted",
 "type": "compute.v1.instanceTemplate",
 "update": {
  "manifest": "https://www.googleapis.com/deploymentmanager/v2/projects/project-redacted/global/deployments/redacted/manifests/manifest-redacted",
  "error": {
   "errors": [
    {
     "code": "RESOURCE_ERROR",
     "location": "redacted/tpl-redacted",
     "message": "Unexpected response from resource of type compute.v1.instanceTemplate: 400 {statusMessage=Bad Request, errors=[{message=Invalid value for field 'resource.properties': ''.  Instance Templates must provide instance properties., domain=global, reason=invalid}]}"
    }
   ]
  },
  "state": "FAILED",
  "intent": "CREATE_OR_ACQUIRE",
  "properties": "canIpForward: true\ndisks:\n- autoDelete: true\n  boot: true\n  deviceName: boot\n  initializeParams:\n    diskSizeGb: 10\n    diskType: pd-standard\n    sourceImage: https://www.googleapis.com/compute/v1/projects/project-redacted/global/images/redacted-image\n  mode: READ_WRITE\n  type: PERSISTENT\nmachineType: https://www.googleapis.com/compute/v1/projects/project-redacted/zones/asia-east1-c/machineTypes/g1-small\nnetworkInterfaces:\n- accessConfigs: []\n  network: $(ref.nw-redacted.selfLink)\nscheduling:\n  automaticRestart: true\n  onHostMaintenance: MIGRATE\nserviceAccounts:\n- scopes:\n  - storage-ro\ntags:\n  items:\n  - redacted\nzone: asia-east1-c\n",
  "finalProperties": "canIpForward: true\ndisks:\n- autoDelete: true\n  boot: true\n  deviceName: boot\n  initializeParams:\n    diskSizeGb: 10\n    diskType: pd-standard\n    sourceImage: https://www.googleapis.com/compute/v1/projects/project-redacted/global/images/redacted-image\n  mode: READ_WRITE\n  type: PERSISTENT\nmachineType: https://www.googleapis.com/compute/v1/projects/project-redacted/zones/asia-east1-c/machineTypes/g1-small\nnetworkInterfaces:\n- accessConfigs: []\n  network: https://www.googleapis.com/compute/v1/projects/project-redacted/global/networks/nw-redacted\nscheduling:\n  automaticRestart: true\n  onHostMaintenance: MIGRATE\nserviceAccounts:\n- scopes:\n  - storage-ro\ntags:\n  items:\n  - redacted\nzone: asia-east1-c\n"
 }
}

Y aquí hay una versión más amigable para los humanos de finalProperties:

canIpForward: true
disks:
- autoDelete: true
  boot: true
  deviceName: boot
  initializeParams:
    diskSizeGb: 10
    diskType: pd-standard
    sourceImage: https://www.googleapis.com/compute/v1/projects/project-redacted/global/images/redacted-image
  mode: READ_WRITE
  type: PERSISTENT
machineType: https://www.googleapis.com/compute/v1/projects/project-redacted/zones/asia-east1-c/machineTypes/g1-small
networkInterfaces:
- accessConfigs: []
  network: https://www.googleapis.com/compute/v1/projects/project-redacted/global/networks/nw-redacted
scheduling:
  automaticRestart: true
  onHostMaintenance: MIGRATE
serviceAccounts:
- scopes:
  - storage-ro
tags:
  items:
  - redacted
zone: asia-east1-c

¿Algunas ideas? Alternativamente, compute.v1.instanceTemplatese agradecerían mucho ejemplos de implementaciones exitosas.

Respuesta1

Resulta que uno de los ejemplos de implementación avanzada efectivamente tenía unaejemplo de uso de compute.v1.instanceTemplate. En lugar de a zone, el recurso debería especificar a project, lo que de hecho tiene más sentido, aunque no parece estar documentado en ningún lugar excepto en ese ejemplo. Sin embargo, de manera menos sensata, los parámetros reales de la plantilla de instancia se colocan dentrootroobjeto de propiedades. No estoy seguro de dónde viene esto, pero aquí está mi plantilla jinja funcional final (tenga en cuenta que algunos campos usan sus valores predeterminados y, de hecho, podrían omitirse):

resources:
  - name: {{ env["name"] }}
    type: compute.v1.instanceTemplate
    properties:
      project: {{ env["project"] }}
      properties:
        machineType: {{ properties["machineType"] }}
        canIpForward: true
        scheduling:
          automaticRestart: true
          onHostMaintenance: MIGRATE
          preemptible: false
        tags:
          items:
            - redacted
        disks:
          - deviceName: boot
            boot: true
            autoDelete: true
            mode: READ_WRITE
            type: PERSISTENT
            initializeParams:
              diskSizeGb: 10
              diskType: pd-standard
              sourceImage: https://www.googleapis.com/compute/v1/projects/{{ env["project"] }}/global/images/redacted
        networkInterfaces:
          - network: $(ref.{{ properties["network"] }}.selfLink)
        serviceAccounts:
          - email: default
            scopes:
              - https://www.googleapis.com/auth/devstorage.read_only

información relacionada