この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは、みかみです。
AWS CloudFormation を初めて知ったとき、その便利さに感動しました。 GCP にも、CloudFormation 同様 Infrastructure as Code を実現できる Deployment Manager というサービスがあるそうなので、使い勝手はどんなものなのか、実際に動かして確認してみました。
やりたいこと
- Deployment Manager を使ってみたい(簡単に使えるのか確認してみたい)
- Deployment Manager で、GCS バケットと BigQuery のデータセットとテーブルを作成してみたい
前提
課金が有効になっている GCP プロジェクトがあり、gcloud CLI を実行できる環境は準備済みです。
まずは動かしてみる
とりあえず Deployment Manager をさわってみたいので、まずはチュートリアルをそのまま実行してみます。
チュートリアルでは、Deployment Manager で f1-micro の GCE を作成します。
ドキュメントに従って、初めに Deployment Manager と Compute Engine の API を有効にします。
続いて、ドキュメントに記載の構成ファイルを取得し、自分の環境に合わせてプロジェクト 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 cm-da-mikami-yuki-258308 with your project ID
machineType: https://www.googleapis.com/compute/v1/projects/cm-da-mikami-yuki-258308/zones/us-central1-f/machineTypes/f1-micro
disks:
(省略)
構成ファイルが準備できたら、gcloud deployment-manager
コマンドで実行します。
(test_bq) [ec2-user@ip-10-0-43-239 ~]$ gcloud deployment-manager deployments create quickstart-deployment --config vm.yaml
The fingerprint of the deployment is Gfj6V1hhIO2oBAkr3DnrAQ==
Waiting for create [operation-1590135844028-5a6385a20bf0c-9b597444-38ccef70]...done.
Create operation operation-1590135844028-5a6385a20bf0c-9b597444-38ccef70 completed successfully.
NAME TYPE STATE ERRORS INTENT
quickstart-deployment-vm compute.v1.instance COMPLETED []
実行結果を確認します。
(test_bq) [ec2-user@ip-10-0-43-239 ~]$ gcloud deployment-manager deployments describe quickstart-deployment
---
fingerprint: XXXXXXXX
id: '3343659212053557963'
insertTime: '2020-05-22T01:24:04.056-07:00'
manifest: manifest-1590135844067
name: quickstart-deployment
operation:
endTime: '2020-05-22T01:24:35.407-07:00'
name: operation-1590135844028-5a6385a20bf0c-9b597444-38ccef70
operationType: insert
progress: 100
startTime: '2020-05-22T01:24:04.121-07:00'
status: DONE
user: xxxxxxxx@classmethod.jp
NAME TYPE STATE INTENT
quickstart-deployment-vm compute.v1.instance COMPLETED
※一部伏字に変更しています。
GCP 管理コンソールからも、Deployment Manager で GCE が作成されたことが確認できました。
動作確認できたので、作成したリソースを削除します。
(test_bq) [ec2-user@ip-10-0-43-239 ~]$ gcloud deployment-manager deployments delete quickstart-deployment
The following deployments will be deleted:
- quickstart-deployment
Do you want to continue (y/N)? y
Waiting for delete [operation-1590136192835-5a6386eeb218b-b5049752-0ff080a6]...done.
Delete operation operation-1590136192835-5a6386eeb218b-b5049752-0ff080a6 completed successfully.
GCP 管理画面からも、リソース削除されたことが確認できました。
Deployment Manager の構成ファイルの書き方を学ぶ
チュートリアルで Deployment Manager が動くことは確認できたので、あとは構成ファイルの書き方を覚えれば、欲しいリソースを自由に作成できそうです。
構成ファイルは resources:
セクションが必須で、resources:
には name
、type
、properties
の3つの要素が必要だそうです。
name
にはリソース名として任意の文字列を指定し、type
でどのリソースを作成するかを指定します。 type
に指定できるリソースの種類は、gcloud CLI でも確認可能です。
(test_bq) [ec2-user@ip-10-0-43-239 ~]$ gcloud deployment-manager types list
NAME
spanner.v1.instance
compute.beta.image
runtimeconfig.v1beta1.config
compute.alpha.regionBackendService
(省略)
iam.v1.serviceAccount
compute.alpha.instance
composite
properties
要素には作成するリソースが持つプロパティ情報を指定しますが、どんな項目が指定できるかは、API 仕様を参照すれば分かります。 Deployment Manager では API を使用してリソースを作成するため、各リソースの create API でパラメータ指定が必要なものは、構成ファイルでもプロパティとして指定が必要なようです。
- 構成 | Cloud Deployment Manager ドキュメント
- サポートされるリソースタイプ | Cloud Deployment Manager ドキュメント
- 構文リファレンス | Cloud Deployment Manager ドキュメント
- 構成ファイルの構造 | Cloud Deployment Manager ドキュメント
構成ファイルは YAML 形式で定義されますが、テンプレートとして Python または Jinja で別ファイルに記載した定義を import することもできるそうです。リソースタイプやプロパティなど流用の可能性があるものは、テンプレートとして別ファイルで管理しておいた方が便利ですね。
GCS バケットとBigQuery のデータセットとテーブルを Deployment Manager で作成してみる
BigQuery のデータセットとテーブル、GCSバケットを作成する、下記の構成ファイルを準備しました。 各リソースのプロパティ項目は、API 仕様と GitHub のサンプルファイルを参考にしました。
- REST Resource: datasets | BigQuery ドキュメント
- REST Resource: tables | BigQuery ドキュメント
- Buckets | Cloud Storage ドキュメント
- deploymentmanager-samples/google/resource-snippets/bigquery-v2 | GitHub
- deploymentmanager-samples/google/resource-snippets/storage-v1 | GitHub
resources:
- type: bigquery.v2.dataset
name: test_deployment_manager
properties:
datasetReference:
datasetId: test_deployment_manager
location: asia-northeast1
description: Deployment Manager の動作確認用
- type: bigquery.v2.table
name: table_test
properties:
datasetId: test_deployment_manager
tableReference:
tableId: table_test
schema:
fields:
- name: id
type: INTEGER
mode: REQUIRED
- name: value
type: STRING
mode: NULLABLE
metadata:
dependsOn:
- test_deployment_manager
- type: storage.v1.bucket
name: deployment-manager-test
properties:
predefinedAcl: projectPrivate
projection: full
location: asia
locationType: multi-region
storageClass: STANDARD
実行してみます。
(test_bq) [ec2-user@ip-10-0-43-239 ~]$ gcloud deployment-manager deployments create test-deployment --config vm_mikami.yaml
The fingerprint of the deployment is g5QRxJ75hiepx3O78iMUlA==
Waiting for create [operation-1590144532682-5a63a600315e1-b13c4cfd-376e3f6e]...done.
Create operation operation-1590144532682-5a63a600315e1-b13c4cfd-376e3f6e completed successfully.
NAME TYPE STATE ERRORS INTENT
deployment-manager-test storage.v1.bucket COMPLETED []
table_test bigquery.v2.table COMPLETED []
test_deployment_manager bigquery.v2.dataset COMPLETED []
正常に実行できたようなので、確認してみます。
(test_bq) [ec2-user@ip-10-0-43-239 ~]$ gcloud deployment-manager deployments describe test-deployment
---
fingerprint: g5QRxJ75hiepx3O78iMUlA==
id: '2235304293859725563'
insertTime: '2020-05-22T03:48:52.710-07:00'
manifest: manifest-1590144532722
name: test-deployment
operation:
endTime: '2020-05-22T03:49:13.765-07:00'
name: operation-1590144532682-5a63a600315e1-b13c4cfd-376e3f6e
operationType: insert
progress: 100
startTime: '2020-05-22T03:48:52.776-07:00'
status: DONE
user: gcp-da-user@classmethod.jp
NAME TYPE STATE INTENT
deployment-manager-test storage.v1.bucket COMPLETED
table_test bigquery.v2.table COMPLETED
test_deployment_manager bigquery.v2.dataset COMPLETED
GCP 管理コンソールからも、リソースが正常に作成されたことが確認できました。Deployment Manager で作成したリソースには、自動的にデプロイ名がタグ付けされるのですね。(リソース削除時の判別のためでしょうか?
Deployment Manager で作成するリソースの依存関係
データセットとテーブルなど、ひとつの構成ファイルで依存関係のあるリソースを作成する場合、構成ファイルに依存関係を定義しておく必要があります。
はじめ、構成ファイルで依存関係の定義をせずに実行したところ、以下のエラーになりました。
(test_bq) [ec2-user@ip-10-0-43-239 ~]$ gcloud deployment-manager deployments create test-deployment --config vm_mikami.yaml
The fingerprint of the deployment is SeOr5nCanvFwlUebdaKFQw==
Waiting for create [operation-1590144051274-5a63a435164c9-74ac1aeb-e37be9a2]...failed.
ERROR: (gcloud.deployment-manager.deployments.create) Error in Operation [operation-1590144051274-5a63a435164c9-74ac1aeb-e37be9a2]: errors:
- code: RESOURCE_ERROR
location: /deployments/test-deployment/resources/table_test
message: '{"ResourceType":"bigquery.v2.table","ResourceErrorCode":"404","ResourceErrorMessage":{"code":404,"errors":[{"domain":"global","message":"Not
found: Dataset cm-da-mikami-yuki-258308:test_deployment_manager","reason":"notFound"}],"message":"Not
found: Dataset cm-da-mikami-yuki-258308:test_deployment_manager","statusMessage":"Not
Found","requestPath":"https://bigquery.googleapis.com/bigquery/v2/projects/cm-da-mikami-yuki-258308/datasets/test_deployment_manager/tables","httpMethod":"POST"}}'
なお、エラー内容は GCP 管理コンソールからも確認できます。
構成ファイルの BigQuery テーブルの部分に、以下の依存関係定義を追加して解決しました。
(省略)
- type: bigquery.v2.table
name: table_test
properties:
(省略)
metadata:
dependsOn:
- test_deployment_manager
(省略)
まとめ(所感)
AWS CloudFormation 同様、GCP の Deployment Manager も簡単に実行できて非常に便利なことが確認できました。
テンプレートとして別ファイルに記載した定義の import もできるので、メンテナンス性も上がりそうです。
慣れないうちはプロパティの指定項目など戸惑う部分はありますが、GitHub にサンプルの構成ファイルがあるので、初めてでもすんなり用途に合わせたリソースが作成できました。
開発作業時などに複数のリソースを手動で作成すると、どうしても消し忘れなどでいらないリソースが残ってしまうことがありますが、Deployment Manager でリソースを作成しておけば、delete
コマンドで一括削除することができて便利です。今後も使っていこうと思います。
参考
- AWS プロフェッショナルのための Google Cloud Platform: インフラストラクチャ デプロイツール | AWS プロフェッショナル向け Google Cloud Platform
- Deployment Manager スタートガイド | Cloud Deployment Manager ドキュメント
- Deployment Manager の基礎知識 | Cloud Deployment Manager ドキュメント
- 構文リファレンス | Cloud Deployment Manager ドキュメント
- 基本構成の作成 | Cloud Deployment Manager ドキュメント
- サポートされるリソースタイプ | Cloud Deployment Manager ドキュメント
- GoogleCloudPlatform/deploymentmanager-samples | GitHub