参照の使用

構成またはテンプレートのプロパティを定義するときには、値を直接指定する代わりに、他のリソースのプロパティへの参照を使用できます。たとえば、同じデプロイのインスタンス テンプレートを使用するインスタンス グループ マネージャーを作成する場合は、インスタンス テンプレートの完全なリンクを明示的に入力する代わりに、$(ref.instance-template.selfLink) という構文のリファレンスを使用できます。

参照を使用すると、次のようなことが可能です。

  • リソースが作成されるまでは未定義であるプロパティにアクセスできます。たとえば、構成内で仮想マシンを定義する時点で、そのマシンの IP アドレスは不明です。この場合、IP アドレスのリファレンスを使用できます。構成をデプロイすると、まず VM が作成され、外部 IP アドレスが取得可能になった時点で Deployment Manager がその IP アドレスを取得します。

  • 構成やテンプレートを読みやすくして、トラブルシューティングを容易にします。たとえば、複数の転送ルールを構成する必要がある場合は、使用するネットワークも指定する必要があります。転送ルールごとにネットワークへのリンクを指定する代わりに、次の構文を使用することによって、ネットワークの selfLink プロパティへの参照を作成できます。

    $(ref.network-name.selfLink)
    

    構成のトラブルシューティングが必要な場合は、この参照により、転送ルールでどのネットワークが使用されているかが判別しやすくなります。

リソースへの参照を作成する場合は、リソース間の依存関係も作成します。たとえば、次のスニペットについて考えます。このスニペットでは、sandbox-vmnetwork-a への参照を使用しています。

resources:
- name: sandbox-vm
  type: compute.v1.instance
  properties:
    network: $(ref.network-a.selfLink)
    ...
...
- name: network-a
  type: compute.v1.network
  properties:
    ...

この構成をデプロイすると、Deployment Manager は参照を解決するために、sandbox-vm の前に network-a を作成します。参照が正しく解決されないとデプロイは失敗します。

参照は、構成とテンプレートの両方で使用できます。

始める前に

構成ファイル内で参照を作成する

構成内で参照を宣言するには、次の形式を使用します。

$(ref.RESOURCE_NAME.PROPERTY)

次の例では、ネットワークを作成してから、新しく作成されたネットワークへの参照を使用する 2 つのインスタンスを作成します。この例では、参照は次のようになります。

$(ref.a-new-network.selfLink)
# Copyright 2016 Google Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

resources:
- name: the-first-vm
  type: compute.v1.instance
  properties:
    zone: us-central1-f
    machineType: https://www.googleapis.com/compute/v1/projects/MY_PROJECT/zones/us-central1-f/machineTypes/f1-micro
    disks:
    - deviceName: boot
      type: PERSISTENT
      boot: true
      autoDelete: true
      initializeParams:
        sourceImage: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/family/debian-11
    networkInterfaces:
    # The resource's "network value" has been replaced with a
    # reference to the new network's "selfLink" property. The network 
    # resource has been added to the end of this file.
    - network: $(ref.a-new-network.selfLink)
      accessConfigs:
      - name: External NAT
        type: ONE_TO_ONE_NAT
- name: the-second-vm
  type: compute.v1.instance
  properties:
    zone: us-central1-f
    machineType: https://www.googleapis.com/compute/v1/projects/MY_PROJECT/zones/us-central1-f/machineTypes/g1-small
    disks:
    - deviceName: boot
      type: PERSISTENT
      boot: true
      autoDelete: true
      initializeParams:
        sourceImage: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/family/debian-11
    networkInterfaces:
    # As in the resource above, the "network" value has been replaced with 
    # the new network's "selfLink" property. 
    - network: $(ref.a-new-network.selfLink)
      accessConfigs:
      - name: External NAT
        type: ONE_TO_ONE_NAT
# The following network is a new resource added to the "two-vms.yaml" file.
- name: a-new-network
  type: compute.v1.network
  properties:
    routingConfig:
      routingMode: REGIONAL
    autoCreateSubnetworks: true

この構成をデプロイすると、2 つのインスタンスの前にネットワークが作成され、参照はネットワーク リソースの selfLink に解決されます。

テンプレートで参照を作成する

テンプレート ファイルの場合、参照の先頭に $ を付け、全体をかっこで囲みます。

$(ref.RESOURCE_NAME.PROPERTY)

参照と他の機能(テンプレート プロパティや環境変数など)を組み合わせることもできます。Deployment Manager が参照を正しく解析できるように、参照の文字列全体をかっこで囲んでください。

以下では、テンプレートで参照を宣言する例を示します。

Jinja

  • 環境変数を含む参照

    network: $(ref.{{ env["deployment"] }}-network.selfLink)
    
  • 配列内の値への参照

    subnetwork: $(ref.{{ env["deployment"] }}-vm.networkInterfaces[2].subnetwork)
    
  • テンプレート プロパティを含む参照

    network: $(ref.{{ properties["network"] }}.selfLink)
    
  • Jinja パラメータを使用した参照

    network: $(ref.{{ NETWORK_NAME }}.selfLink)
    
  • 出力内の参照

      outputs:
      - name: UrlToService
        value: http://$(ref.{{ env["deployment"] }}-network.networkInterfaces[0].accessConfigs[0].natIp):8080/
    

Python

  • 環境変数を含む参照

    'network': '$(ref.' + context.env['deployment'] + '-network.selfLink)'
    
  • 配列内の値への参照

    'subnetwork': '$(ref.' + context.env['deployment'] + '-vm.networkInterfaces[2].subnetwork)'
    
  • テンプレート プロパティを含む参照

    'network': '$(ref.' + context.properties['network'] + '.selfLink)'
    
  • Python パラメータを使用した参照

    'value': '$(ref.' + base_name + '.networkInterfaces[0].networkIP)'
    
  • 出力内の参照

    outputs = [{'name': 'UrlToService',
                'value': '$(ref.' + context.env['deployment'] + '-network.networkInterfaces[0].accessConfigs[0].natIP):8080'}]
    

次のステップ