多くの年月を経て、クラウド開発は大きなパラダイムの転換を遂げてきました。より新しく複雑なアプリケーションがクラウドに迅速に展開され、ダウンタイムを最小限に抑えています。そして、その中で、インフラストラクチャ・コードの概念やさまざまなツールが登場し、アプリケーション開発プロセスを簡素化するために活用されています。

おそらく疑問に思っているかもしれませんが、「インフラストラクチャ・コードとは何か? どのように開発プロセスやエクスペリエンスを向上させるのか、そしてTerraformはどこに関連してくるのか?」。このガイドでこれら全てを探求していきます。しかし、始める前に、以下の前提条件が必要です:

  • クラウドとクラウド用語の基本知識

  • コード例を実装するためのPCへのアクセス権

  • GCPアカウント

それでは、始めましょう。

以下は、カバーする内容です:

  1. インフラストラクチャ・コードの概要

  2. Terraformとは?

  3. Terraformの利点

  4. Terraformで使用される一般的な用語

  5. デモプロジェクト:Terraform構成の書き方

  6. 結論

インフラストラクチャのコード(IaC)の概要

インフラストラクチャのコードとは、コードベースの構成文書でクラウドインフラストラクチャツールやアプリケーションを生成することを指します。このプロセスを実行すると、データベース、仮想マシン、サーバーの作成シーケンスとプロセスが自動化されます。これにより、複数の同一サービスに特に手動クラウドサービスの展開頻度が低下し、ユーザーエクスペリエンスが向上します。

インフラストラクチャのコードには、「命令型」アプローチと「宣言型」アプローチの2つの異なるアプローチがあります。

インフラストラクチャ生成にデクラレーティブなアプローチを使用する場合、生成されるインフラストラクチャの予想される/希望される出力を単に詳細に記述し、その出力を生成する方法をIaCツールが把握します。

一方、インペラティブなアプローチは、望ましいインフラストラクチャの状態を達成するために必要な正確な手順を指定することを含みます。インペラティブなアプローチは複雑なインフラセットアップに適しているように思えますが、デクラレーティブなアプローチも同様に機能します。

一部のツールは両方のアプローチの両方に対応していますが、他のツールは片方のみに適しています。グローバルで使用されている人気のあるIaCツールの例には、Terraform IaCAWS Cloud FormationAnsiblePulumiChefなどがあります。

その名前が示すように、インフラストラクチャとしてのcode – インフラストラクチャを作成するコードは、IaCスペース内のさまざまなテンプレート言語で書かれています。人気のあるテンプレート言語には、JSON、YAML、ARMテンプレート、HCL、Heat Scriptsなどがあります。

クラウドインフラストラクチャを実行するためにスクリプトツールを使用することもできます。一部の人気のあるものにはBashやPowerShellがあります。これらはほとんどの個人用コンピュータに事前インストールされていることがあります。

これらのツールの中で、Terraformはさまざまな理由で独特です-そして、この記事で調査するものです。

Terraformとは何ですか?

Terraformは2014年にHashiCorpによって開発されたオープンソースツールです。これは年月を経て進化し、複数のクラウドサービスプロバイダーを横断してインフラストラクチャを作成できるクラウドアグノスティックインフラストラクチャツールとして機能します。

Terraformはまた、クラウドベースのソフトウェアサービスツールであるTerraform Cloudも提供しています。これにより、旧来のTerraform CLIツールで使用していたローカルベースの手法の代わりに、クラウドツールのクラウドベース展開が可能となります。

また、他のIaCツールと同様に、テンプレート言語を利用するTerraformのインフラストラクチャ作成に使用されるテンプレートフレームワークはHashiCorpテンプレート言語(HCL)です。

Terraformの利点

ここでは、クラウドエンジニアとしてTerraformを使用する際の利点と、そのツールがクラウドエコシステムで果たす主要な役割について紹介します。

1. 宣言的アプローチ

このクラウドインフラストラクチャ自動化アプローチは、展開する必要のあるすべてのインフラストラクチャ(データベース、サーバーなど)が明示的に記述され、それに応じて実行されることを保証します。これにより、競合を回避できます。

2. 競合の処理

効率的なクラウドツールの自動化機能に加えて、Terraformには堅牢な競合検出および処理のプロパティがあります。競合を処理する方法の1つは、Terraform plan機能を介して行われます。この機能は、インフラストラクチャのオーケストレーションにおける認識された競合や潜在的な競合を強調し、デプロイメント前に簡単に修正を行うことができます。後続のセクションでさらに詳しく説明します。

3. クラウドに依存しない

Terraformは、主要なクラウドサービスプロバイダ(AWS、GCP、Azure)全体で効果的なインフラストラクチャの自動化機能を備えた多目的のマルチクラウド自動化サービスプロバイダです。また、ハイブリッドおよびインタープロバイダーの自動化も可能です。

4. ユーザーフレンドリー

Terraformは、最大のユーザーコミュニティを持つ最大級のクラウド自動化ツールの1つです。初心者向けの包括的なチュートリアルが豊富に用意されており、ツールの使い方をすぐに理解するのに役立ちます。以下は、より詳細に学ぶためのドキュメンテーションへのリンクです。

5. ファイル管理機能

Terraformは、ローカルコンピュータ上に自動的にオートメーション状態のローカルバックアップを作成し、何か問題が発生した場合にすぐにリコールとファイルの処理を確保します。必要に応じてリモートクラウドサービスプロバイダへのリモートバックアップオプションも提供しています。

6. バージョン管理

Gitのバージョン管理システムと同様に、TerraformにはTerraformファイルの変更履歴を追跡できる組み込みのバージョン管理システムがあります。現在のバージョンにエラーがある場合、以前のバージョンに戻ることもできます。

7. コードの再利用

Terraformは、開発者向けのドキュメントページで簡単に再利用できるさまざまなコードテンプレートを提供しています。

Terraformの利点を強調したので、Terraformで使用される一般的な用語とその意味を学びましょう。

Terraformで使用される一般的な用語

Terraformの使用を開始する前に、よく出てくるいくつかのキーワードに慣れておく必要があります。以下に知っておくべきことが示されています:

  1. プロバイダ:Terraformでは、プロバイダはさまざまなAPIやクラウドサービスとのやり取りを可能にするプログラミングインターフェースです。たとえば、GCPやAzureのようなクラウドサービスプロバイダとやり取りするためにプロバイダを使用します。

  2. モジュール: モジュールはTerraformフレームワーク内で特に作成され、再利用可能なコンポーネントとして機能し、クラウドサービスを簡単にオーケストレーションできます。モジュールにクラウドサービスに関する重要な情報を保存し、モジュール変数を使用して一意性を確保できます。

  3. リソース: Terraformのリソースとは、作成するクラウドインフラストラクチャコンポーネントを指します。クラウドネットワーク、仮想マシン、可用性ゾーン、その他のインフラストラクチャなどが含まれます。

  4. 状態: Terraformにおける状態の概念は、その効率性の基盤を形成します。状態は、インフラストラクチャリソースの現在の構成を追跡し、Terraformが作成、変更、削除したすべてのリソースの詳細を含んでいます。Terraformのバージョン管理システムは、コードファイルに加えた変更を追跡し、その情報を使用して必要に応じてインフラストラクチャを破棄およびプロビジョニングします。

  5. ワークスペース: ワークスペースは、作業ファイルを取り巻く種類の制約を作成する点でバージョン管理システムと同様に機能します。ワークスペースを使用すると、同じバックエンド内でクリーンで分離された方法で単一のインフラストラクチャ構成の複数のインスタンスを管理できます。同じTerraform構成を使用しながら、開発、ステージング、本番などの環境を分離するためにワークスペースを使用できます。

デモプロジェクト: Terraform構成の書き方

このセクションでは、Google Cloudプログラムの仮想マシンをいくつかのコード行でオーケストレートする最初のTerraformファイルの作成について詳しく説明します。しかし、始める前に、デモプロジェクトを実装する前に理解しておく必要があるさまざまなコマンドについて説明します。

一般的なTerraformコマンド

  • Terraform init: このコマンドは、Terraformツールを初期化し、必要なクラウドプロバイダー固有のファイルをダウンロードします。また、Terraformと問題のクラウドプロバイダーとの間に接続を確立します。私たちの場合、GCPとTerraformプロバイダーとの間です。

  • Terraform fmt: このコマンドは自動的に最適なコードフォーマットとインデントを確保します。コードの整然な実行を保証し、エラーを最小限に抑えます。

  • Terraform plan: このコマンドはTerraformコードの実行手順を概説し、実行中に発生する可能性のあるエラーを検出します。また、実行を妨げる可能性のあるTerraformコードのエラーを強調します。最後に、Terraform状態管理と連携して、状態の変更を検出し、必要に応じてサービスの削除や追加を行います。

  • Terraform apply:このコマンドは、Terraform planコマンドで計画されたTerraform状態を実行します。

  • Terraform destroy:このコマンドは、Terraform applyコマンドを使用して作成されたすべてのクラウドサービスを無効化または破壊するためのTerraformスキーム内の最終コマンドです。上記のコマンドを順番に実行して、インフラストラクチャが適切に作成されることを確認する必要があります。

IaC対応のGCP仮想マシンの作成

これらの重要なコマンドを学んだので、最初のIaC対応のGCP仮想マシンを作成して、それらすべてをテストしてみましょう。

コードエディタで、次のコードを入力してください:

provider "google" {
  project = "your-gcp-project-id"  # Replace with your GCP Project ID
  region  = "us-central1"          
  zone    = "us-central1-a"        
}

このコードは、必要なクラウドリソースを生成するために使用しているクラウドプロバイダを示しています。今回はGoogle Cloudプログラムを使用しています。それに割り当てられた名前は単に「google」です。他のクラウドプロバイダであるAWSやAzureはそれぞれ「aws」や「azure」です。

2行目は、GCPサブスクリプション識別子を特定し、それは各GCPアカウントごとに一意である(そして正確な統合を容易にする)。提供されたスペースにご自身のものを使用してください。

また、適切なリソースリージョンとリソース利用可能ゾーンを含める必要があります。これは、仮想マシンを実行するための物理的な基盤として機能します。このシナリオでは、それぞれUSA中央リージョンと1-a利用可能ゾーンを選択しました。クラウドリージョンと利用可能ゾーンについては、こちらで詳細を確認できます。

resource "google_compute_instance" "vm_instance" {
  name         = "example-vm"      
  machine_type = "e2-medium"          

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-11" 
    }
  }

上記のコードスニペットは、私たちがオーケストレーションする具体的な計算リソースを指定しており、この場合は「vm_instance」としてコーディングされた仮想マシンインスタンスです。'example-vm’は、このプロジェクトで作成する仮想マシンに割り当てたい名前です。仮想マシンの名前も一意である必要があることに注意することが重要です。選択した仮想マシンのタイプは、E2(汎用)-mediumタイプのVMです。仮想マシンのタイプに関する詳細情報は、こちらで確認できます。

さらに、期待される起動オペレーティングシステム(「boot_disk」)も指定しており、私の場合はDebian Linuxオペレーティングシステムのバージョン11のイメージです。

  network_interface {
    network = "default"  # Attach to the default VPC network
    access_config {

    }
  }

output "instance_ip" {
  value = google_compute_instance.vm_instance.network_interface[0].access_config[0].nat_ip
}

仮想マシンの作成を完了するには、VMへのリモートアクセスを許可するために仮想ネットワークをセットアップする必要があります。ネットワークインターフェースブロックは、GCPによって提供されるデフォルトのVPC(Virtual Private Cloud)ネットワークに仮想マシンを接続します。VPCネットワークがなければ、仮想マシンとインターフェイスすることはできません。出力ブロックには、端末に表示されるデフォルトのアクセスIPアドレスも表示され、これを使用して仮想マシンに接続できます。

以下は最終的に期待されるコードです:


provider "google" {
  project = "your-gcp-project-id"  # Replace with your GCP Project ID
  region  = "us-central1"          
  zone    = "us-central1-a"       
}

resource "google_compute_instance" "vm_instance" {
  name         = "example-vm"         
  machine_type = "e2-medium"          

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-11"  
    }
  }

  network_interface {
    network = "default"  # Attach to the default VPC network
    access_config {

    }
  }

output "instance_ip" {
  value = google_compute_instance.vm_instance.network_interface[0].access_config[0].nat_ip
}

それ以降、以下の画像に示されているコマンドを使用してこのコードを実行します:

terraform -vコマンドを実行すると、Terraformが正常に端末にインストールされていることが確認されます。期待される出力は、インストールされたTerraformツールのバージョンです。

次に実行されるコマンドは、terraform init関数であり、クラウドサービスプロバイダー(今回はGCP)との通信を初期化します。必要な依存関係もインストールされます。

terraform fmtコマンドも実行され、適切なコードのフォーマットとインデントが確認されます。その後、terraform planコマンドが順次実行されます。

上記の画像から、Terraformが期待される仮想マシンを生成するために使用する手順が確認できます。

Terraform planが正常に実行されると、次にterraform apply関数を実行して、Terraform planで概説された手順を実行します。

これにより、上記に表示されているようにTerraformの実行の確認を求めるプロンプトが生成されます。”Yes”と入力すると、操作がスムーズに進行します。

正常に実行された場合、上記のように成功メッセージが表示されます。これにより、われわれはただコードだけでクラウドインフラストラクチャを作成しました。次に、terraform destroyコマンドを呼び出して作成した仮想マシンを削除できます。

結論

この記事では、インフラストラクチャとしてのコードについて基本を学びました。Terraform、その利点、およびいくつかの主要な機能とコマンドについて説明しました。また、デモプロジェクトでの使用例を示しました。

知識をさらに向上させるために、さらなるコード例については、Terraformのドキュメントを参照してください。また、新しく得た知識を活用して、実生活で使えるプロジェクトを自動化することをお勧めします。

コメントや質問がある場合は、お気軽にメッセージを送ってください。他の記事もこちらで確認できます。次回もコーディングを続けましょう!