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プロジェクトのみ対応するなどのケースでは、積極的に利用していくのがよいと思います。