Google Cloud Platform

ゲスト投稿 : GCP インフラストラクチャをコードとして管理する Terraform

インフラストラクチャの管理は通常、ウェブ インターフェースを使用したり、端末でコマンドを実行したりして行われます。個人や小規模なチームならこれでうまくいきますが、複雑な要件を抱える大きなチームの場合は、この方法でインフラストラクチャを管理するのは大変です。

クラウドに移行する企業が増える中、CIO はハイブリッドなマルチクラウド ソリューションを求めています。コードとしてのインフラストラクチャは、こうした複雑さを管理する 1 つの方法です。

HashiCorp が開発した Terraform は、安全かつ予測可能な形で、大規模インフラストラクチャの構築、変更、アップグレードを行うのに特に役立つオープンソース ツールです。API の設定を宣言型のファイルにまとめることができ、ソフトウェア開発者がアプリケーション コードについて行っているのと同様の方法で、チーム メンバー間での共有、編集、レビュー、バージョン管理が可能です。

Google Cloud Platform(GCP)でインスタンスを作成するための Terraform の設定サンプルを以下に示します。

  resource "google_compute_instance" "blog" {
  name         = "default"
  machine_type = "n1-standard-1"
  zone         = "us-central1-a"
  disk {
    image = "debian-cloud/debian-8"
  }
  disk {
    type    = "local-ssd"
    scratch = true
  }
  network_interface {
    network = "default"
  }
}

これはテキスト ファイルであり、アプリケーション コードと同じように扱うことが可能です。開発者が長年利用してきたのと同じ技法を使って操作できるわけです。

こうした技法にはlint、テスト、継続的インテグレーション、継続的デプロイ、コラボレーション、コード レビュー、変更要求、変更追跡、自動化などがあります。これは、Wiki とシェル スクリプトを使ったインフラストラクチャ管理と比べて大きな進歩です。

Terraform はインフラストラクチャの計画フェーズと実行フェーズを分けています。前者に対応するterraform plan コマンドは、何が行われるかを示すドライランを実行します。一方、後者のterraform apply コマンドが実際のインフラストラクチャにそれらの変更を加えます。

  $ terraform plan
+ google_compute_instance.default
    can_ip_forward:                    "false"
    create_timeout:                    "4"
    disk.#:                            "2"
    disk.0.auto_delete:                "true"
    disk.0.disk_encryption_key_sha256: ""
    disk.0.image:                      "debian-cloud/debian-8"
    disk.1.auto_delete:                "true"
    disk.1.disk_encryption_key_sha256: ""
    disk.1.scratch:                    "true"
    disk.1.type:                       "local-ssd"
    machine_type:                      "n1-standard-1"
    metadata_fingerprint:              ""
    name:                              "default"
    self_link:                         ""
    tags_fingerprint:                  ""
    zone:                              "us-central1-a"
$ terraform apply
google_compute_instance.default: Creating...
  can_ip_forward:                    "" => "false"
  create_timeout:                    "" => "4"
  disk.#:                            "" => "2"
  disk.0.auto_delete:                "" => "true"
  disk.0.disk_encryption_key_sha256: "" => ""
  disk.0.image:                      "" => "debian-cloud/debian-8"
  disk.1.auto_delete:                "" => "true"
  disk.1.disk_encryption_key_sha256: "" => ""
  disk.1.scratch:                    "" => "true"
  disk.1.type:                       "" => "local-ssd"
  machine_type:                      "" => "n1-standard-1"
  metadata_fingerprint:              "" => ""
  name:                              "" => "default"
  network_interface.#:               "" => "1"
  network_interface.0.address:       "" => ""
  network_interface.0.name:          "" => ""
  network_interface.0.network:       "" => "default"
  self_link:                         "" => ""
  tags_fingerprint:                  "" => ""
  zone:                              "" => "us-central1-a"
google_compute_instance.default: Still creating... (10s elapsed)
google_compute_instance.default: Still creating... (20s elapsed)
google_compute_instance.default: Creation complete (ID: default)
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

これで、このインスタンスが Google Cloud で稼働を開始しました。

Y9kZ3X4oZoYZ7VEp2dSwRuYw4-_xyAIbV1pF2GqtOjH_PsKfhObbNLXDh5M3Z-HCVabwbEjw5CUUgoiyAE_8R4xEOgJSN7vDdr5yJt-bb8sRxF31OWehdVvPLPWBJ5KFG7GWgG76tf56.PNG

Terraform が管理できるのはコンピュート インスタンスだけではありません。私たち HashiCorp は Google Cloud Next '17 において、プロジェクトやフォルダ、および課金を管理する API のサポートを発表しました。こうした新しい API により、Terraform はプロジェクト全体やそのリソースの多くを管理します。

上の設定サンプルに数行のコードを追加するだけで、自組織および請求先アカウントと関連づけられたプロジェクトを作成し、そのプロジェクトで構成可能な多くの API とサービスを有効にし、この新しく作成したプロジェクト内でインスタンスを起動できます。

  resource "google_project" "blog" {
  name            = "blog-demo"
  project_id      = "blog-demo-491834"
  billing_account = "${var.billing_id}"
  org_id          = "${var.org_id}"
}
resource "google_project_services" "blog" {
  project = "${google_project.blog.project_id}"
  services = [
    "iam.googleapis.com",
    "cloudresourcemanager.googleapis.com",
    "cloudapis.googleapis.com",
    "compute-component.googleapis.com",
  ]
}
resource "google_compute_instance" "blog" {
  # ... 
  project = "${google_project.blog.project_id}" # <-- ...="" code="" new="" option="">--

Terraform は設定の変更を検出し、変更の差分だけを適用します。

  $ terraform apply
google_compute_instance.default: Refreshing state... (ID: default)
google_project.my_project: Creating...
  name:        "" => "blog-demo"
  number:      "" => ""
  org_id:      "" => "1012963984278"
  policy_data: "" => ""
  policy_etag: "" => ""
  project_id:  "" => "blog-demo-491834"
  skip_delete: "" => ""
google_project.my_project: Still creating... (10s elapsed)
google_project.my_project: Creation complete (ID: blog-demo-491835)
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

適切な API を有効にしてプロジェクトが作成されていることを確認します。

d1xpoZ0d_h-hjBgsXQf6cRgIl5PYOYaeqHkEpkfjQVlQtC2lvpnImjqEScWC5nEG4cAIySNERAGj3fd-CizIWoj4HKsQ8uQN6qKsw3fBpgGqB-SPbq7VjtfbtgWoLlq3buv0P4c8d315.PNG

インスタンスはこのプロジェクト内に存在しています。

x3GZfLVeaQ9mNX9YKGWZAspE7TMvXDKy6IY-4cRKrT6Dp-pmfwUULXEu8cWYDOHPgpDtIN0Pt-W69UHNMAKAWiTFgKm1xdBtYbGamiRTet78hrbXPK6rY9-geTeXF20LCxKx6aaZjf5k.PNG

このコードを使えば、このプロジェクトとインスタンスを何回でも簡単に作成できます。また Terraform は、こうしたプロジェクトの IAM 資格情報とサービス アカウントの作成およびエクスポートもサポートしています。

GCP の新しいリソース管理および課金 API と Terraform を組み合わせることで、組織のリソースを効率的かつ効果的に管理することが可能になります。プロジェクトで隔離性が保証され、Terraform で再現性が確保できるので、環境全体を高速かつ簡単に構築できるのです。

Terraform は可能な限り多くのオペレーションを並列化するため、新しい環境をほんの数分で立ち上げられるようになります。企業が社内の複数部門における GCP の利用料金を一括して支払う場合は、Terraform を使用することで、1 つの請求先組織に関連づけられた構成済みの環境を必要に応じて簡単に構築できます。

ユース ケース

コードとしてのインフラストラクチャというアプローチによるリソース管理は、さまざまな課題の解決に役立ちます。以下にいくつかの例を示します。

一時的な環境

Terraform でインフラストラクチャをコードとして記述すると、開発や QA(品質保証)、ステージング、テスト用の環境構築が容易になります。多くの企業が毎月、ステージング専用の環境に数千ドルも費用をかけていますが、オペレーションを並列化する Terraform を使用すれば、飲み物で一息つくくらいの時間で本番インフラストラクチャのコピーを用意できます。そうすれば、開発者は本番コピーに変更をデプロイし、バグの早期発見に役立てることが可能です。

プロジェクトの迅速な作成

Terraform の新しい google_project API は、プロジェクトの迅速な作成を可能にします。企業はトレーニングやフィールド デモ、新入社員、コーディング インタビュー、ディザスタ リカバリのために同一プロジェクトを簡単に作成できます。GCP 料金の支払いを一本化している企業では、Terraform を使用して、1 つの請求先組織に関連づけられた構成済みの環境を容易に構築できます。

オンデマンドの継続的インテグレーション

Terraform を使えば、継続的インテグレーションやビルドの環境をオンデマンドで常にクリーンに構築することが可能です。これらの環境は、毎回同じ構成が使用され、必要なときにだけ実行されるので、コストが抑えられ、一貫性が向上します。

どのようなユースケースでも、Terraform と GCP の新しいリソース管理 API の組み合わせにより、クラウド ベースの環境を管理する新しい強力な方法を適用できます。詳しくは、Terraform のウェブ サイトGitHub でコードをご覧ください。

* この投稿は米国時間 4 月 18 日、HashiCorp の Director of Technical Advocacy である Seth Vargo によって投稿されたもの(投稿はこちら)の抄訳です。

- By Seth Vargo, Director of Technical Advocacy, HashiCorp