Использование gcloud services vpc-peerings connect в диспетчере развертывания

Я настраиваю пакет диспетчера развертывания в .jinja, который выполняет следующие действия: - Создает сеть VPC, подсеть и частный диапазон для служб GCP - Создает пиринг между servicenetworking.googleapis.com и моей сетью VPC - Назначает облачный SQL базу данных в частный диапазон, назначенный службам Google в моем VPC

Второй шаг оказывается невозможным с помощью диспетчера развертывания, поскольку для этого нет действий, которые можно было бы вызвать. Я подтвердил, что исправление вручную на этом этапе заключается в вызове следующей команды gcloud и затем настройке базы данных Cloud SQL в VPC:

gcloud services vpc-peerings connect --service=servicenetworking.googleapis.com --ranges=<my-range> --network=<my-network> --project=<my-project>

Использование следующего типа gcp в моем .jinja недостаточно, так как он не позволяет сопоставить с уже существующими службами gcp, но ожидает исходную и целевую сети.

- name: {{ env['deployment' ]}}-gcp-private-vpc-peering
  action: gcp-types/compute-v1:compute.networks.addPeering
  metadata:
    runtimePolicy:
    - CREATE
  properties:
    network: $(ref.{{ env['deployment']}}-network.name)
    name: {{ env['deployment' ]}}-gcp-private-vpc-peering
    autoCreateRoutes: true
    peerNetwork: servicenetworking.googleapis.com
    dependsOn:
    - $(ref.{{ env['deployment']}}-network.selfLink)

Есть ли способ вызвать команду gcloud из диспетчера развертывания или действие, которое я могу вызвать для достижения пиринга служб. Я могу подтвердить, что сервисный API действительно включен в проекте.

(Обратите внимание, что целевой VPC и проект являются переменными, назначенными Google, поэтому я не могу ввести это значение в приведенный выше шаблон)


Обновление 05/07/19 Я считаю, что нашел вызов службы API, который мне нужно сделать, но я очень не уверен в синтаксисе, чтобы на самом деле сделать вызов для создания ссылки службы из диспетчера развертывания:

https://cloud.google.com/service-infrastructure/docs/service-networking/reference/rest/v1beta/services.connections/create

Вам нужно немного направления - как показано ниже?

- name: {{ env['deployment' ]}}-gcp-private-vpc-peering
  action:  gcp-types/servicenetworking.googleapis.com:services.connections
  metadata:
    runtimePolicy:
    - CREATE
  properties:
    propertyA: valueA
    ...



Ответы (2)


@ u-phoria

Вы правы - и это то, что у них сейчас в разработке.

Я собрал для них билет на улучшение продукта, его можно увидеть здесь:


Частный пиринг VPC для Cloud SQL не поддерживается диспетчером развертывания. Это привело к необходимости выполнять пиринг VPC из экземпляра виртуальной машины с расширенными привилегиями в соответствующем VPC, поскольку это наиболее безопасный вариант (обновлено 9 июля 2019 г.) https://issuetracker.google.com/137033144

Пример ресурса, который вам нужен для этого, показан ниже:

{# Bootstrapped box to complete the VPC Peering Setup #}
- name: {{ env['deployment'] }}-peering-setup
  type: compute.v1.instance
  properties:

    {# Checking whether the creation of new resources are specified #}
    {% if properties['createNewResources'] %}
    zone: {{ properties["zone"] }}
    machineType: https://www.googleapis.com/compute/v1/projects/{{ env["project"] }}/zones/{{ properties["zone"] }}/machineTypes/f1-micro
    networkInterfaces:
    - network: $(ref.{{ env['deployment']}}-network.selfLink)
      subnetwork: $(ref.{{ env['deployment']}}-subnetwork.selfLink)
      accessConfigs:
      - name: External NAT
        type: ONE_TO_ONE_NAT
    {% else %}
    zone: {{ common.ZONES[0] }}
    machineType: https://www.googleapis.com/compute/v1/projects/{{ env["project"] }}/zones/{{ common.ZONES[0] }}/machineTypes/f1-micro
    networkInterfaces:
    - network: https://www.googleapis.com/compute/v1/projects/{{ env["project"] }}/global/networks/default
      subnetwork: https://www.googleapis.com/compute/v1/projects/{{ env["project"] }}/regions/{{ common.REGION }}/subnetworks/default
      accessConfigs:
      - name: External NAT
        type: ONE_TO_ONE_NAT
    {% endif %}

    disks:
    - deviceName: boot
      type: PERSISTENT
      boot: true
      autoDelete: true
      initializeParams:
        sourceImage: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/family/debian-9
    metadata:
      items:
      - key: startup-script
        value: |
          {# Creating VPC Peering to Google Services for the Managed Postgres in the existing network or the newly created one #}
          {% if properties['createNewResources'] %}
          #!/bin/bash
          sudo su -
          echo "Checking relevant peering connections to google services exist in local VPC" >> checking-status.sh
          output=$(gcloud services vpc-peerings list --network={{ env['deployment'] }}-network | grep "servicenetworking.googleapis.com")
          if [[ -z $output ]]; then
          echo "Peering not found, creating peering to servicenetworking.googleapis.com from private VPC" && gcloud services vpc-peerings connect --service=servicenetworking.googleapis.com --ranges={{ env['deployment'] }}-google-managed-services --network={{ env['deployment'] }}-network
          else
          echo "No peering created as relevant peering already exists"
          fi
          echo "Sending the signal to deployment manager to carry on with the deployment"
          gcloud beta runtime-config configs variables set success/{{ env['deployment'] }}-vpc-peering-setup success --config-name {{ env['deployment'] }}-startup-config

          echo "Destroying this instance now that it has succesfully executed peering change"
          gcloud compute instances delete --quiet --delete-disks=all --zone=europe-west1-b {{ env['deployment'] }}-peering-setup
          {% else %}
          #!/bin/bash
          sudo su -
          echo "Checking relevant peering connections to google services exist in local VPC" >> checking-status.sh
          output=$(gcloud services vpc-peerings list --network={{ properties['network'] }} | grep "servicenetworking.googleapis.com")

          if [[ -z $output ]]; then
          echo "Known GCP bug when re-creating GCP peering deployment into the same network reserved range, using the workaround published here: https://issuetracker.google.com/issues/118849070 and here https://github.com/terraform-providers/terraform-provider-google/issues/3294 to make sure this has no effect on the deployment"
          gcloud beta services vpc-peerings update --service=servicenetworking.googleapis.com --ranges={{ env['deployment'] }}-google-managed-services --network={{ properties['network'] }} --project={{ env['project'] }} --force

          echo "Peering not found, creating peering to servicenetworking.googleapis.com from private VPC" && gcloud services vpc-peerings connect --service=servicenetworking.googleapis.com --ranges={{ env['deployment'] }}-google-managed-services --network={{ properties['network'] }}
          else
          echo "No peering created as relevant peering already exists"
          fi
          echo "Sending the signal to deployment manager to carry on with the deployment"
          gcloud beta runtime-config configs variables set success/{{ env['deployment'] }}-vpc-peering-setup success --config-name {{ env['deployment'] }}-startup-config

          echo "Destroying this instance now that it has succesfully executed peering change"
          gcloud compute instances delete --quiet --delete-disks=all --zone=europe-west1-b {{ env['deployment'] }}-peering-setup
          {% endif %}
    serviceAccounts:
        - email: default
          scopes:
          - 'https://www.googleapis.com/auth/cloud-platform'
          - 'https://www.googleapis.com/auth/cloudruntimeconfig'
    dependsOn:
    - $(ref.{{ env['deployment'] }}-google-managed-services.selfLink)
    {% if properties['createNewResources'] %}
    - $(ref.{{ env['deployment'] }}-subnetwork.selfLink)
    {% endif %}

Таким образом, если соответствующие параметры установлены (в данном случае флаг createNewResources), будет создан пиринг vpc между двумя сетями.

Имейте в виду, что для этого вам также потребуется настроить глобальный диапазон адресов, прежде чем выполнять указанную выше jinja. Пример этого показан ниже:

- name: {{ env['deployment'] }}-google-managed-services
  type: compute.v1.globalAddresses
  properties:
    name: google-managed-services-{{ env['deployment'] }}
    {% if properties['createNewResources'] %}
    address: 10.73.144.0
    prefixLength: 20
    {% else %}
    address: {{ CIDRSplit[0] }}
    prefixLength: {{ CIDRSplit[1] }}
    {% endif %}
    addressType: INTERNAL
    purpose: VPC_PEERING

    {# Create the peering to the new network or the specified one #}
    {% if properties['createNewResources'] %}
    network: $(ref.{{ env['deployment']}}-network.selfLink)
    {% else %}
    network: https://www.googleapis.com/compute/v1/projects/{{ env["project"] }}/global/networks/{{ properties['network'] }}
    {% endif %}

    description: >
      Address range reserved for Google Managed Services.
      https://cloud.google.com/vpc/docs/configure-private-services-access

    {% if properties['createNewResources'] %}
    dependsOn:
    - $(ref.{{ env['deployment']}}-network.selfLink)
    {% endif %}

Я надеюсь, что это помогает кому-то.

person John W    schedule 26.11.2019

Единственные необходимые параметры для создания пиринга - это network и reservedPeeringRanges. Вот синтаксис для них обоих: "projects / {project} / global / networks / {network}" reservedPeeringRanges: "x.x.x.x / x" Я думаю, вам может не хватать какой-то переменной в сети. Я протестировал его с помощью API, и он работает без проблем.

person Lozano    schedule 08.07.2019
comment
Спасибо за ответ - я согласен с API, что он работает должным образом, это демонстрируется вызовом команды gcloud, как указано в вопросе. `gcloud services vpc-peerings connect --service = servicenetworking.googleapis.com ...` Однако, когда я пытаюсь смоделировать этот пиринг из шаблона диспетчера развертывания, я не могу создать пиринг для службы Google. Не могли бы вы рассказать, как бы вы это сделали с помощью ресурса диспетчера развертывания? - person John W; 08.07.2019
comment
Я обнаружил, что перед созданием пиринга сети должны быть успешно созданы. Чтобы сделать это в том же YAML, вам нужно использовать параметр dependsOn [1], чтобы убедиться, что сеть создана, и при удалении развертывания это должно быть сделано с помощью метода removePeering [2]. И после этого сети можно удалить. Я думаю, это может быть проблема, с которой вы столкнулись. [1]: cloud.google.com/deployment-manager/ docs / configuration / [2]: облако. google.com/compute/docs/reference/rest/v1/networks/ - person Lozano; 09.07.2019
comment
Похоже, что сервисный сетевой API в настоящее время не входит в список поставщиков типов GCP для Deployment Manager: cloud.google.com/deployment-manager/docs/configuration/. - person u-phoria; 24.11.2019