Deployment Manager を使って GCS バケットと BigQuery のデータセットとテーブルを作成してみた

2020.05.22

こんにちは、みかみです。

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: には nametypeproperties の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 でパラメータ指定が必要なものは、構成ファイルでもプロパティとして指定が必要なようです。

構成ファイルは YAML 形式で定義されますが、テンプレートとして Python または Jinja で別ファイルに記載した定義を import することもできるそうです。リソースタイプやプロパティなど流用の可能性があるものは、テンプレートとして別ファイルで管理しておいた方が便利ですね。

GCS バケットとBigQuery のデータセットとテーブルを Deployment Manager で作成してみる

BigQuery のデータセットとテーブル、GCSバケットを作成する、下記の構成ファイルを準備しました。 各リソースのプロパティ項目は、API 仕様と 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 コマンドで一括削除することができて便利です。今後も使っていこうと思います。

参考