AWS CloudFormationは、よく利用するのですが、GCPにも、CloudFormationにも、Infrastructure as Codeを実現できるDeveloper Managerというサービスがあるので、動かして確認してみたいと思います。

前提

Developer Managerを利用するためには、下記のような準備が必要です。

  • 課金が有効になったGCP プロジェクトがある
  • gcloud CLIコマンドが利用できる環境
  • Deployment ManagerのAPIを有効化

Deployment Managerを使う

Deployment Managerを利用するためには、下記のセットアップが必要になります。

  • Deployment ManagerのAPIを有効
  • Deployment Manager利用向けの専用サービスアカウントを発行する(GAE, GCP以外から利用する場合)

上の準備ができたら、Compute Engineを作成するサンプルを見ていきたいと思います。
こちらは、Compute Engineをdefaultネットワークの上に作成するサンプルです。MY_PROJECTの部分は、ご自身でご利用されているプロジェクトIDに置き換えてください。

resources:
- type: compute.v1.instance
  name: quickstart-deployment-vm
  properties:
    # The properties of the resource depend on the type of resource. For a list
    # of properties, see the API reference for the resource.
    zone: us-central1-f
    # Replace [MY_PROJECT] with your project ID
    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:
        # See a full list of image families at https://cloud.google.com/compute/docs/images#os-compute-support
        # The format of the sourceImage URL is: https://www.googleapis.com/compute/v1/projects/[IMAGE_PROJECT]/global/images/family/[FAMILY_NAME]
        sourceImage: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/family/debian-9
    # Replace [MY_PROJECT] with your project ID
    networkInterfaces:
    - network: https://www.googleapis.com/compute/v1/projects/[MY_PROJECT]/global/networks/default
      # Access Config required to give the instance a public IP address
      accessConfigs:
      - name: External NAT
        type: ONE_TO_ONE_NAT

では、さっそく利用してみましょう。gcloud deployment-managerコマンドを利用します。PROJECT_ID等は、各自の環境に合わせてください。

// 必要な情報を設定
DEPLOY_SA_KEY_FILE_NAME:=xxxxxxxxx.json
DEPLOY_SA_KEY_FILE_PATH:=conf/sa/$(DEPLOY_SA_KEY_FILE_NAME)
DEPLOY_NAME:=vm-sample
BOOT_YAML:=vm.yml
PROJECT_ID:=xxxxxx
DEPLOY_NAME:=vm-sample
BOOT_YAML:=vm.yml

//  サービスアカウントで認証する
$ gcloud auth activate-service-account --key-file ${DEPLOY_SA_KEY_FILE_PATH} --project ${PROJECT_ID}

// デプロイメントを生成する
$ gcloud deployment-manager deployments create ${DEPLOY_NAME} --config ${BOOT_YAML} --project ${PROJECT_ID}

コマンドが完了するまで、待ってからGCPのDeployment Managerを確認します。 下記のようにvm-sampleが作成されていることがわかります。

削除するには、下記のようにします。

$ gcloud deployment-manager deployments delete ${DEPLOY_NAME} --project ${PROJECT_ID}

しばらく待つと削除されます。

他にも、一覧表示、gcloud deployment-manager deployments list、詳細表示、gcloud deployment-manager deployments describeなどがあります。

リソースファイルの書き方

チュートリアルのサンプルを見て、Deployment Manager が動くことは確認できました。構成ファイルの書き方を確認しましょう。
構成ファイル自体は、resourceセクションが必須です。

resources:
- type: compute.v1.instance  <--- 生成するリソース種別
  name: quickstart-deployment-vm  <--- リソース名
  properties:
    ここは、リソースに応じたプロパティ

リソース一覧は、下記のgcloudコマンドで取得できます。

$ gcloud deployment-manager types list

properties要素については、生成するリソースに該当するAPI仕様書に記載されています。 

構成ファイルについては、直接リソースを記載する方法以外にも、別のファイルをimportsする機能もあるようです。

#  imported templates, if applicable
imports:
  #  path relative to the configuration file
- path: path/to/template.jinja
  name: my-template
- path: path/to/another/template.py
  name: another-template

resources:
  - name: NAME_OF_RESOURCE
    type: TYPE_OF_RESOURCE
    properties:
      property-a: value
      property-b: value
      ...
      property-z: value
  - name: NAME_OF_RESOURCE
    type: TYPE_OF_RESOURCE
    properties:
      property-a: value
      property-b: value
      ...
      property-z: value

ローカルにある別のファイル(テンプレート)を読み込めるのは、嬉しいですね。ここは、AWS Cloud Formationと少し違いますね。このテンプレートに関しては、Python または Jinja で別ファイルに記載した定義を import することもできます。これは、地味にありがたいですね。

まとめ

AWS CloudFormation 同様、GCP の Deployment Manager も簡単に実行できて非常に便利である感じがします。AWS CloudFormationに関する知識、GCPに関する知識をお持ちの方は、意外とすんなり入門できるかと思います。コマンド一発で削除、GCP側で状態を管理してくれるのは、Terraformなどよりも使いやすい気がします。GCPプロジェクトのみ対応するなどのケースでは、積極的に利用していくのがよいと思います。