Google Deployment Managerでインスタンス作成

Trick or Treat!! grasys加藤です。

前回、インスタンスの作成方法を3つご紹介しました。

[3つの方法でGoogle Compute Engineでインスタンスを作成する] (http://blog.grasys.io/post/kyouhei/createinstances/)

今回はGoogleが提供する Cloud Deployment Manager を使ってインスタンスを作成してみます。

Cloud Deployment Managerを使うとGoogle Compute Engine上のインスタンスに限らず、Google Cloud Storage, Google Container Engine, BigQueryなどGoogleプラットフォームでのリソースをYAMLで管理することが出来ます。

この YAMLで管理 という点がデプロイメントでは非常に重要です。再現可能、再利用可能、可読性も良いですね。

インスタンス作成

さっそくインスタンスを作成します。スペックは以下の通りとします。

名前: grasys-deployment-test01
ゾーン: asia-northeast1-a
マシンタイプ: g1-small
イメージ: rhel-7-v20171025
外部IP: NAT

このスペックをYAMLでの設定に落とすと次のようになります。

resources:
- type: compute.v1.instance
  name: grasys-deployment-test01
  properties:
    zone: asia-northeast1-a
    machineType: https://www.googleapis.com/compute/v1/projects/[PROJECT]/zones/asia-northeast1-a/machineTypes/g1-small
    disks:
    - deviceName: boot
      type: PERSISTENT
      boot: true
      autoDelete: true
      initializeParams:
        sourceImage: https://www.googleapis.com/compute/v1/projects/centos-cloud/global/images/centos-7-v20171025
    networkInterfaces:
    - network: https://www.googleapis.com/compute/v1/projects/[PROJECT]/global/networks/default
      accessConfigs:
      - name: External NAT
        type: ONE_TO_ONE_NAT

ちょっとAPIを書かせたり嫌な感じです。

このYAMLを適当なファイルで作成します。ひとまず test01.yaml にしてみました。 [PROJECT]はお使いのGoogle Cloud PlatformのProjectIdを入れて下さいね。

gcloudコマンドでデプロイします。

$ gcloud deployment-manager deployments create test01-deployment --config test01.yaml
The fingerprint of the deployment is CANz1JihS0_-oGDh48vjRQ==
Waiting for create [operation-1509429100388-55cd159579ea1-2290634c-712b5e30]...done.
Create operation operation-1509429100388-55cd159579ea1-2290634c-712b5e30 completed successfully.
NAME                      TYPE                 STATE      ERRORS  INTENT
grasys-deployment-test01  compute.v1.instance  COMPLETED  []

成功しました。

インスタンスが作成されていることがわかります。

$ gcloud compute instances list --filter grasys-deployment-test01
NAME                      ZONE               MACHINE_TYPE PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP      STATUS
grasys-deployment-test01  asia-notrheast1-a  g1-small                  10.XXX.X.X   XXX.XXX.XXX.XXX  RUNNING

template機能

次にtemplate機能を使ってみます。

おもむろにさきほどのYAMLをtemplate化します。インスタンス名は変数定義に変えておきます。

$ cp -p test01.yaml template.jinja
$ sed -e "s/name: grasys-deployment-test01/name: {{ env[\"name\"] }}/" -i template.jinja
$ cat template.jinja
resources:
- type: compute.v1.instance
  name: {{ env["name"] }}
  properties:
    zone: asia-northeast1-a
    machineType: https://www.googleapis.com/compute/v1/projects/clean-monitor-760/zones/asia-northeast1-a/machineTypes/g1-small
    disks:
    - deviceName: boot
      type: PERSISTENT
      boot: true
      autoDelete: true
      initializeParams:
        sourceImage: https://www.googleapis.com/compute/v1/projects/centos-cloud/global/images/centos-7-v20171025
    networkInterfaces:
    - network: https://www.googleapis.com/compute/v1/projects/clean-monitor-760/global/networks/default
      accessConfigs:
      - name: External NAT
        type: ONE_TO_ONE_NAT

templateはYAMLに近い形式のjinjaの他にpythonも使えますので、得意な方で作成するのが良いと思います。

次にtemplateを呼び出すYAMLを作成しましょう。名前はtemplate.yamlとしました。

imports:
- path: template.jinja

resources:
- name: grasys-template-test01
  type: template.jinja
- name: grasys-template-test02
  type: template.jinja

deployしてみましょう。

$ gcloud deployment-manager deployments create template-deployment --config template.yaml
The fingerprint of the deployment is 30iQy6P6ZeCapJ2cwraGaQ==
Waiting for create [operation-1509433148574-55cd24aa20930-c6868a0a-587101ca]...done.
Create operation operation-1509433148574-55cd24aa20930-c6868a0a-587101ca completed successfully.
NAME                    TYPE                 STATE      ERRORS  INTENT
grasys-template-test01  compute.v1.instance  COMPLETED  []
grasys-template-test02  compute.v1.instance  COMPLETED  []

今度は同じ構成のインスタンスが2つできていることが確認できます。

$ gcloud compute instances list --filter grasys-template
NAME                    ZONE               MACHINE_TYPE PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP      STATUS
grasys-template-test01  asia-notrheast1-a  g1-small                  10.XXX.X.X   XXX.XXX.XXX.XXX  RUNNING
grasys-template-test02  asia-notrheast1-a  g1-small                  10.XXX.X.X   XXX.XXX.XXX.XXX  RUNNING

最後に環境をキレイにクリーンアップしましょう。

$ gcloud deployment-manager deployments delete template-deployment
The following deployments will be deleted:
- template-deployment

Do you want to continue (y/N)?  y

Waiting for delete [operation-1509438271562-55cd37bfca111-26e52a27-980b3018]...done.
Delete operation operation-1509438271562-55cd37bfca111-26e52a27-980b3018 completed successfully.
$ gcloud deployment-manager deployments delete test01-deployment

まとめ

今回はGoogle Deployment Managerを使ってインスタンスを作成してみました。

こちらのコマンドでGoogle Deployment Managerがサポートしているリソースの一覧を取得することが可能です。

$ gcloud deployment-manager types list

実に多い!