배포 업데이트

배포를 만든 후에는 애플리케이션 또는 서비스 변경사항에 따라 이를 업데이트할 수 있습니다. Deployment Manager에서 다음을 수행하여 배포를 업데이트할 수 있습니다.

  • 배포에서 리소스를 추가 또는 삭제합니다.
  • 배포에서 기존 리소스의 속성을 업데이트합니다.

단일 업데이트에는 이러한 변경사항이 조합된 형태로 포함될 수 있습니다. 예를 들어 기존 리소스의 속성을 변경하고 동일한 요청에 새 리소스를 추가할 수 있습니다. 배포를 업데이트하려면 다음 단계를 따릅니다.

  1. 구성 파일을 변경하거나 원하는 변경사항으로 구성 파일을 만듭니다.
  2. 선택적으로 업데이트에 사용할 정책을 선택하거나 기본 정책을 사용합니다.
  3. Deployment Manager에 대해 업데이트 요청을 수행합니다.

시작하기 전에

업데이트 준비

배포를 업데이트하기 전, 다음 안내에 따라 업데이트를 준비하세요.

  • 프로젝트에 새 리소스를 추가하도록 배포를 업데이트하는 경우 리소스가 이미 있는지 확인합니다.

    기본적으로, 추가하려는 리소스가 프로젝트에 존재할 경우 새 리소스를 생성하지 않아도 배포에 사용됩니다. 기존 리소스를 사용하지 않으려면 업데이트에 사용할 정책을 변경해야 합니다.

    배포를 업데이트할 때 사용할 수 있는 정책에 대한 자세한 내용은 리소스 추가 정책을 참조하세요.

  • 리소스를 대체하도록 배포를 업데이트하는 경우 해당 종속 항목을 확인합니다.

    배포의 리소스를 대체하려면 먼저 리소스를 삭제해도 배포 순환이 발생하지 않는지 확인해야 합니다. 배포 순환은 리소스가 직접 또는 간접적으로 그 자체에 종속될 때 발생합니다. 예를 들어 다음 배포를 참조하세요.

    resources:
    - name: vm-a
      properties:
        zone: us-central1-f
        ...
        metadata:
          dependsOn:
          - vm-depends-on
    
    # The second VM
    - name: vm-depends-on
      properties:
        zone: $(ref.vm-a.zone)
        ...
    

    이 배포에서 vm-a의 경우 dependsOn 문은 vm-a 전에 vm-depends-on을 만들도록 지정합니다. 하지만 vm-depends-onvm-a의 영역에 대한 참조를 사용하므로 vm-depends-on 전에 vm-a가 생성되어 있어야 합니다. 이러한 시나리오에서는 종속 항목이 루프에 빠지고 배포가 실패합니다.

    서로에게 종속된 리소스가 두 개 있는 경우, 이 리소스를 대체하면 배포 순환이 발생할 수 있습니다.

    예를 들어 disk-a라는 영구 디스크, vm-a라는 VM, ig-a라는 인스턴스 그룹이 포함된 배포가 있다고 가정합니다. vm-a 구성에는 disk-a 참조가 포함되고, ig-a 구성에는 vm-a 참조가 포함됩니다. 업데이트된 구성에서는 vm-a를 삭제하고 vm-b로 바꿔야 합니다. 이러한 시나리오에서 vm-a와 vm-b에 대한 종속 항목을 확인하면 배포 순환이 발생하고 배포가 실패합니다.

    일련의 종속 항목이 연결된 상태에서 리소스를 대체하려는 경우, 배포 순환을 방지하기 위해서는 다음 중 하나를 수행하세요.

    • dependsOn 절을 삭제하거나 다른 리소스에 대한 참조를 삭제 또는 변경하여 대체하려는 리소스에 대해 종속 항목을 삭제합니다. 이러한 변경사항으로 배포를 업데이트한 후 또 다른 업데이트를 수행하여 리소스를 대체합니다.

    • 종속된 리소스의 연결을 삭제하고 배포를 업데이트합니다. 그런 후 다음 업데이트에서 사용하려는 리소스를 다시 만듭니다.

  • 업데이트를 지원하는 기본 API가 있는지 확인합니다.

    Deployment Manager는 각 서비스의 API를 사용하여 배포를 만들고 수정합니다. Deployment Manager가 해당 요청을 완료할 수 있는지 확인하기 위해 업데이트하려는 리소스에 대해 Cloud Platform 서비스의 API 문서를 검토합니다.

    예를 들어 배포에서 BigQuery 데이터세트를 업데이트하려면 Dataset API 참조에서 사용 가능한 메서드를 참조하세요. 메서드에는 update 메서드가 포함되며, 이는 Deployment Manager를 사용하여 데이터세트를 업데이트할 수 있음을 나타냅니다.

    일부 API에는 리소스를 업데이트할 수 있는 커스텀 메서드가 포함되어 있습니다. 예를 들어 Compute Engine은 setMetadata라는 인스턴스 메타데이터를 업데이트할 수 있는 커스텀 메서드를 제공합니다. 이러한 경우 Deployment Manager는 커스텀 메서드를 사용하려 합니다.

  • 업데이트하려는 리소스가 변경 가능한지 확인합니다.

    일부 리소스는 생성된 후 변경이 불가능하며 업데이트될 수 없습니다. 리소스를 변경할 수 없는지 확인하려면 리소스의 API 참조를 확인하세요. 일반적으로 변경 불가능한 리소스는 리소스의 속성을 업데이트하는 update API 메서드 또는 커스텀 메서드가 없습니다.

제한사항

  • 각 배포마다 업데이트를 한 번에 하나씩 적용할 수 있습니다. 업데이트가 이미 진행 중이면 새 업데이트를 시작하기 전에 현재 업데이트를 중지해야 합니다.

  • Google Cloud 콘솔 또는 gcloud와 같이 Deployment Manager를 사용하지 않고 배포에서 리소스를 수정한 경우 업데이트에서 리소스를 수정하려고 하면 오류나 예기치 않은 문제가 발생할 수 있습니다.

구성 변경

기존 구성을 저장한 경우 해당 구성을 변경하고, 이를 업데이트 요청에서 사용합니다.

저장된 기존 구성이 없으면 새 구성을 만듭니다. 구성 파일을 만드는 단계는 구성을 참조하세요.

Deployment Manager는 업데이트 요청에서 개발자가 제공한 구성을 이전 매니페스트와 비교하고 그 차이에 따라 배포를 업데이트합니다.

예를 들어 다음 표에서는 2가지 구성을 보여줍니다. 하나는 기존 배포를 기술하며, 다른 하나는 원하는 업데이트 배포 상태를 기술합니다. 업데이트된 구성을 제공하면 Deployment Manager가 차이를 평가하고 적절하게 업데이트를 수행합니다.

이 예에서는 일부 커스텀 메타데이터를 포함하도록 기존 인스턴스 리소스를 업데이트하고, 배포에 새로운 가상 머신 리소스를 추가합니다. 굵게 표시된 부분은 템플릿 간의 차이입니다.

현재 템플릿 업데이트된 템플릿
resources:
- name: vm-created-by-cloud-config
  type: compute.v1.instance
  properties:
    zone: us-central1-a
    machineType: machine-type-url
    disks:
    - deviceName: boot
      type: PERSISTENT
      boot: true
      autoDelete: true
      initializeParams:
        diskName: disk-created-by-cloud-config
        sourceImage: image-url
    networkInterfaces:
    - network: network-url
resources:
- name: vm-created-by-cloud-config
  type: compute.v1.instance
  properties:
    zone: us-central1-a
    machineType: machine-type-url
    disks:
    - deviceName: boot
      type: PERSISTENT
      boot: true
      initializeParams:
        diskName: disk-created-by-cloud-config
        sourceImage: image-url
    networkInterfaces:
    - network: network-url
    metadata:
      items:
      - key: 'foo'
        value: 'bar'
      - key: 'dev'
        value: 'vm'

- name: a-new-vm
  type: compute.v1.instance
  properties:
    zone: us-central1-a
    machineType: machine-type-url
      - deviceName: boot
      type: PERSISTENT
      boot: true
      autoDelete: false
      initializeParams:
        diskName: a-new-vm-disk
        sourceImage: image-url
    networkInterfaces:
    - network: network-url

(선택사항) 업데이트에 사용할 정책 결정

그런 다음 업데이트에 사용하려는 정책을 결정합니다. 이 정책은 배포를 업데이트할 때 리소스가 업데이트되는 방법을 결정합니다.

Deployment Manager는 다음과 같은 기본 정책을 사용합니다.

  • 리소스 추가의 기본 정책은 CREATE_OR_ACQUIRE입니다.
  • 리소스 삭제의 기본 정책은 DELETE입니다.
  • 리소스 업데이트의 기본 정책은 UPDATE입니다.

각 정책에 대한 자세한 내용은 아래 섹션을 참조하세요.

리소스 추가 정책

리소스를 추가할 때 새 리소스를 만들고 배포에 추가하거나 기존 리소스를 사용할 수 있습니다.

  • CREATE_OR_ACQUIRE - [기본값] Deployment Manager가 프로젝트에 있는 리소스를 사용하거나, 리소스가 없으면 리소스를 만듭니다. 리소스를 가져오기 위해 Deployment Manager는 구성에서 개발자가 만들려는 리소스의 속성을 확인합니다. 동일한 속성의 기존 리소스가 있으면 Deployment Manager가 이 리소스를 배포 중에 가져옵니다.

    Deployment Manager가 확인하는 속성은 개발자가 만들려는 리소스 유형에 따라 달라지며 다음을 포함할 수 있습니다.

    • 리소스의 name
    • 리소스의 type
    • 리소스의 zone 또는 region(해당되는 경우)

    속성은 리소스의 GET API 요청에 대한 URL의 일부입니다. 리소스를 가져오기 위해 Deployment Manager에서 사용하는 속성을 확인하려면 리소스의 GET 메서드에 대한 API 참고 리소스를 참조하세요. 예를 들어 Compute Engine 인스턴스의 경우 instances.get 메서드의 요청 URL에는 resourceId(구성의 name), zone, project가 포함됩니다.

  • CREATE - Deployment Manager가 존재하지 않는 리소스를 만듭니다. 구성에 포함된 리소스가 프로젝트에 이미 존재할 경우 배포가 실패합니다.

  • ACQUIRE - Deployment Manager가 CREATE_OR_ACQUIRE와 동일한 기준을 사용하여 이미 있는 리소스를 가져옵니다.

    프로젝트에 이미 리소스가 다수 있고 이를 단일 배포로 함께 관리하려면 ACQUIRE 정책을 사용합니다.

    템플릿 또는 구성에서는 리소스를 만들 때와 마찬가지로 이러한 리소스의 필수 속성을 제공해야 합니다. 구성에 포함된 리소스가 프로젝트에 없으면 배포가 실패합니다.

리소스 삭제를 위한 정책

리소스를 삭제할 수 있도록 다음 정책 중 하나를 제공합니다.

  • DELETE - [기본값] 이 정책은 배포에서 리소스에 대한 모든 참조를 삭제하고 기본 리소스를 삭제합니다. 이 정책은 영구적이고 실행취소할 수 없지만 동일한 속성으로 새 리소스를 다시 만들 수 있습니다.

  • ABANDON - 이 정책은 배포에서 리소스에 대한 모든 참조를 삭제하지만 기본 리소스를 삭제하지 않습니다. 예를 들어 인스턴스를 포기한다는 것은 배포에서 인스턴스가 삭제되지만, 인스턴스가 여전히 존재하며 이를 개발자가 사용할 수 있음을 의미합니다.

    ABANDON 정책은 전체 리소스를 삭제할 경우에만 적용되며 리소스 속성을 삭제하거나 리소스를 새 속성으로 업데이트할 경우에는 적용되지 않습니다. 리소스의 속성을 유지하려면 업데이트된 구성에 원래 속성이 모두 포함된 리소스를 포함해야 합니다. 업데이트에 새 구성 파일을 사용하는 경우 원래 구성에서 리소스 정의를 복사하는 것이 좋습니다.

기존 리소스 업데이트 정책

기존 리소스 업데이트의 UPDATE 메소드가 존재할 경우 Deployment Manager가 이를 사용합니다.

이와 달리 커스텀 메서드가 존재하면 Deployment Manager가 이 커스텀 메서드를 사용합니다. Deployment Manager는 set 동사를 사용하는 커스텀 메서드를 지원합니다. 예를 들어 setMetadata()는 유효한 커스텀 메서드이지만 addAccessConfigs()는 그렇지 않습니다.

(선택사항) 업데이트된 구성 미리보기

Google Cloud CLI 또는 API를 사용하여 변경사항을 커밋하기 전 변경하려는 업데이트의 미리보기를 표시할 수 있습니다. Deployment Manager 서비스는 전체 구성을 확장하고 '셸' 리소스를 만들어서 구성 미리보기를 표시합니다.

Deployment Manager는 개발자가 구성을 미리 볼 때 실제 리소스를 인스턴스화하지 않으므로 커밋하기 전에 배포를 확인할 수 있습니다.

gcloud

Google Cloud CLI를 사용하여 --preview 매개변수로 update 요청을 수행합니다.

gcloud deployment-manager deployments update example-deployment \
    --config configuration-file.yaml \
    --preview

API

API에서 기존 배포로 PUT() 요청을 만들고 preview=true 쿼리 매개변수를 지정합니다. 요청 본문에는 intent, target, name 필드가 포함되어야 합니다. URL과 요청 본문 모두 배포 이름을 제공합니다.

예를 들어 다음 API 요청은 간단한 업데이트의 미리보기를 표시합니다.

PUT https://www.googleapis.com/deploymentmanager/v2/projects/myproject/global/deployments/example-deployment?preview=true

{
 "target": {
  "config": {
   "content": "resources:\n- name: vm-created-by-cloud-config\n  type: compute.v1.instance\n  properties:\n    zone: us-central1-a\n    machineType: https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/machineTypes/n1-standard-1\n    disks:\n    - deviceName: boot\n      type: PERSISTENT\n      boot: true\n      autoDelete: true\n      initializeParams:\n        diskName: disk-created-by-cloud-config\n        sourceImage: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-9-stretch-v20180716\n    networkInterfaces:\n    - network: https://www.googleapis.com/compute/v1/projects/myproject/global/networks/default"
  }
 },
 "name": "example-deployment"
}

배포 미리보기를 표시한 후 구성과 preview 쿼리 매개변수를 모두 생략하고 동일한 PUT() 요청을 수행하여 구성을 완전히 배포할 수 있습니다. Deployment Manager는 마지막 미리보기를 사용하여 업데이트를 수행합니다. 예를 들면 다음과 같습니다.

gcloud deployment-manager deployments update example-deployment

업데이트 요청을 위한 단계는 업데이트 요청하기를 참조하세요.

진행하던 업데이트를 중단하기로 결정했다면 다른 업데이트나 미리보기를 요청하기 전에 현재 미리보기를 취소합니다.

미리보기 취소

업데이트 미리보기를 표시한 후에는 업데이트를 계속할지 여부를 결정해야 합니다. 계속하지 않으려거나 다른 구성 파일을 사용해서 배포를 업데이트하려는 경우에는 현재 미리보기를 취소합니다.

gcloud

Google Cloud CLI를 사용하여 deployments cancel-preview 요청을 수행합니다.

gcloud deployment-manager deployments cancel-preview my-first-deployment

API

API에서 cancelPreview 메서드에 PUT() 요청을 보내고 최신 배포 지문을 제공합니다. 지문은 업데이트 요청을 수행할 때마다 바뀌는 무작위로 생성된 값입니다. 업데이트 중 오류를 방지하려면 요청에 최신 지문을 제공합니다.

배포의 최신 지문을 가져오려면 get() 메서드를 사용하여 배포를 가져오고 지문 값을 찾습니다. 지문 값은 다음과 같이 표시됩니다.

"fingerprint": "nU2v7bzeA7gBBI8bdbtmFg=="

cancelPreview() 요청은 다음과 같이 표시됩니다.

POST https://www.googleapis.com/deploymentmanager/v2/projects/myproject/global/deployments/example-deployment/cancelPreview

{
 "fingerprint": "nU2v7bzeA7gBBI8bdbtmFg=="
 }

업데이트 요청하기

업데이트를 수행하려면 다음 안내를 따르세요.

gcloud

Google Cloud CLI에서 deployments update 하위 명령어를 사용하여 새로운 구성을 제공하고, 원하는 경우 업데이트 정책을 제공합니다.

gcloud deployment-manager deployments update my-first-deployment \
    --create-policy POLICY \
    --delete-policy POLICY

이전에 구성 미리보기를 표시한 경우 구성을 생략하면 Deployment Manager가 마지막으로 미리보기가 표시된 구성을 사용하여 업데이트를 수행합니다.

gcloud deployment-manager deployments update my-first-deployment

API

API에서 update 요청을 수행하고 최신 배포 지문을 제공합니다. 지문은 업데이트 요청을 수행할 때마다 바뀌는 무작위로 생성된 값입니다. 업데이트 중 오류를 방지하려면 요청에 최신 지문을 제공합니다.

배포의 최신 지문을 가져오려면 get() 메서드를 사용하여 배포를 가져오고 지문 값을 찾습니다. 지문 값은 다음과 같이 표시됩니다.

"fingerprint": "nU2v7bzeA7gBBI8bdbtmFg=="

그런 다음 요청에서 새로운 구성 및 업데이트 정책과 함께 지문을 제공합니다. 이전에 구성 미리보기를 수행한 경우, 구성과 업데이트 정책을 생략하면 Deployment Manager가 마지막으로 미리보기가 수행된 구성을 사용하여 업데이트를 수행합니다.

URL과 요청 본문 모두 배포 이름을 제공합니다.

PUT https://www.googleapis.com/deploymentmanager/v2/projects/myproject/global/deployments/example-deployment?createPolicy=ACQUIRE&deletePolicy=ABANDON

{
 "target": {
  "config": {
   "content": "resources:\n- name: vm-created-by-cloud-config\n  type: compute.v1.instance\n  properties:\n    zone: us-central1-a\n    machineType: https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/machineTypes/n1-standard-1\n    disks:\n    - deviceName: boot\n      type: PERSISTENT\n      boot: true\n      autoDelete: true\n      initializeParams:\n        diskName: disk-created-by-cloud-config\n        sourceImage: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-9-stretch-v20180716\n    networkInterfaces:\n    - network: https://www.googleapis.com/compute/v1/projects/myproject/global/networks/default"
  }
 },
 "name": "example-deployment",
 "fingerprint": "nU2v7bzeA7gBBI8bdbtmFg=="
}

업데이트 중지

stop() 메서드를 사용하여 진행 중인 업데이트를 중지할 수 있습니다. 그러면 특정 업데이트의 추가 진행이 취소되지만, 이미 수행된 변경은 실행 취소되지 않습니다.

미리보기를 취소하려는 경우 미리보기 취소 섹션을 참조하세요.

gcloud

Google Cloud CLI를 사용하여 deployments stop 요청을 수행합니다.

gcloud deployment-manager deployments stop my-first-deployment

API

API에서 stop 메서드에 POST() 요청을 보내고 최신 지문 속성을 제공합니다. 지문은 업데이트 요청을 수행할 때마다 바뀌는 무작위로 생성된 값입니다. 변경사항 충돌을 방지하려면 요청에 최신 지문을 제공하고 업데이트를 한 번에 하나씩 수행할 수 있도록 낙관적 잠금을 수행해야 합니다.

배포의 최신 지문을 가져오려면 get() 메서드를 사용하여 배포를 가져오고 지문 값을 찾습니다. 지문 값은 다음과 같이 표시됩니다.

"fingerprint": "nU2v7bzeA7gBBI8bdbtmFg=="

요청은 다음과 같이 표시됩니다.

POST https://www.googleapis.com/deploymentmanager/v2/projects/myproject/global/deployments/example-deployment/stop

{
 "fingerprint": "nU2v7bzeA7gBBI8bdbtmFg=="
 }

다음 단계