TerraformでAWS IaC実践 第1回 Terraform基礎と環境構築

前回まで「CloudFormation」を使用したIaCを学んできましたが、今回からは別のIaCツールである「Terraform」を学習していきます。

Terraform基礎

Terraformは、HashiCorp社によって開発されたオープンソースのIaCツールです。大きな特徴として、AWSに限らず、Azure、GCP、Azureなど、マルチクラウドで使用できることが挙げられます。このことから、AWS専用のIaCである CloudFormationに比べて汎用性があります。

また記述言語は「HCL2(HashiCorp Language 2)」という独自言語となっています。JSONに似て非なるものであり、コメント文や、制御処理等の記述も行えます。

現時点でAWSに対するIaCツールといえば、CloudFormationか、Terraformの二択が代表的なものとなっています。

registry.terraform.io

環境構築

tfenv + Terraform インストール

Terraformはバージョンによって挙動が異なるため、Terraformの仮想実行環境である tfenvをインストールし、その上にTerraformをインストールしていきます。

具体的なインストール手順は割愛しますので、後述のサイトを参照してください。

なお、Windowsの場合、tfenvがLinuxしかサポートしていないため、WSL2の実行環境を構築し、その上でtfenv、Terraformをインストールする手順となります。

<インストール参考(Windowsの場合)>

kdkwakaba.com

<インストール参考(Macの場合)>

zenn.dev

なお、実行環境がApple silicon Mac(M1等)の場合、tfenv install コマンド実行時にエラーとなる場合があります。

このような場合は、以下のコマンドに振り替えてください。

# m1 mac ではエラーとなるため、以下の通り入力
$ TFENV_ARCH=amd64 tfenv install 1.8.2
Installing Terraform v1.8.2
Downloading release tarball from
: 
:
Installation of terraform v1.8.2 successful. 
To make this your default version, run 'tfenv use 1.8.2'

Terraformのインストールが完了したら、tfenv useコマンドで使用するTerraformのバージョンを指定して、環境を確定させます。

$ tfenv use 1.8.2  # versionは任意 

AWS CLI 環境構築

ローカル環境のTerraformからAWSリソースを操作するには、AWS CLI環境を構築し、AWS IAMユーザのアクセスキーとシークレットアクセスキーを使用して、AWSにアクセスします。

詳細な説明は割愛しますが、次の作業を進めてください。

  1. AWS CLIセットアップ

    • 公式サイトに従ってインストールを行なってください。
  2. IAMユーザの作成

    • AWSマネージメントコンソールから、IAMユーザを新規に作成します。
    • このユーザには、AdministratorAccessポリシーを適用します。
  3. アクセスキー、シークレットアクセスキーの払い出し

    • AWSマネージメントコンソールで、手順2のユーザのキーを作成します。手順はこちらを参考にしてください。
  4. CLI環境へのキー設定、profile作成

    • 以下のコマンドで、CLIのプロファイルを作成します。なお、profile名のterra-userは任意の名前で良いですが、後で使用しますので控えておいてください。
$ aws configure --profile terra-user
AWS Access Key ID [None]: *************     # 手順3のアクセスキーを入力
AWS Secret Access Key [None]: *************     # 手順3のシークレットアクセスキーを入力 
Default region name [None]:  ap-northeast-1
Default output format [None]:  json

Terraformの実行

それでは実際にTerraformを動かして、DefaultVPC上にEC2を一台構築してみます(細かい構文説明は、次回以降で行うたため、今回は省きます)

tfファイルの作成

任意のフォルダに移動して、次のファイルを作成してください。

< main.tf > ※拡張子がtfであれば、ファイル名は任意で構いません

provider "aws" {
  profile = "terra-user"    # 前述 aws configureのprofile名を指定
  region  = "ap-northeast-1"
}

# EC2をリソースに加える
resource "aws_instance" "test-instance" {
  ami           = "ami-0d0150aa305b7226d"
  instance_type = "t2.micro"
}

amiに指定している値は、AWS EC2でAmazon Linux 2として使用できるマシンイメージのイメージIDを指定してください。

Terraformの実行

Terraformには、下表に示すように、いくつかの実行コマンドがあります。

コマンド 概要
terraform init Terraformの初期化とプラグインのインストールを行います。
terraform plan 変更のプレビューを提供します。
terraform apply 定義されたインフラストラクチャを構築または変更します。
terraform destroy Terraformによって管理されるインフラを破壊します。
terraform validate 設定ファイルが正しいかどうかを検証します。
terraform refresh 状態ファイルを実際のリソース状態に同期します。
terraform output 出力変数の値を表示します。
terraform fmt 設定ファイルを適切な形式に整形します。

一つ一つの説明は割愛しますが、ここでは次の手順でTerraformを実行し、AWSに対してmain.tfの内容を反映させます。

<main.tfをデプロイする>

# 初期化とプラグインのインストール
$ terraform init

# デプロイ(ユーザ確認なし)
$ terraform apply -auto-approve

実行した結果を、AWSマネージメントコンソールのEC2画面で確認してください。

以下の画面写真のとおり、EC2が構築されていればOKです。

ところでこの時、コマンドを実行したパスに「.tfstate」というファイルが作られることに注目してください。このファイルには、applyコマンドによってAWSにデプロイされたリソース環境が記されています。

<terraform.tfstate>

Terraformではこのtfstateファイルによって、記述したtfファイルと実際の環境の差分を管理しています。

CloudFormationでは、このステータス管理がAWS内でフルマネージドで行われていたのに対し、Terraformでは外部ファイルで管理されています。このtfstateファイルがTerraform運用の一つの課題であるようです。アンマネージドなため、ファイル維持が必要だったり、複数エンジニア間で競合しないような施策が必要だったり。実際にはS3バケットで管理するといった運用方法もあるようですが、この辺りは今後も勉強していく必要がありそうです。



さて、EC2の確認できたら、以下のコマンドを実行してください。構築したEC2が削除されます。

<構築したEC2を破棄する>

# 構築したリソースの削除
$ terraform destroy -auto-approve

まとめ

今回は、簡単なtfファイルの定義でTerraformを動かし、EC2が構築できるところまで確認しました。言語仕様は違いますが、一度CloudFormationでIaCを実践していたため、それほど理解は難しくありませんでした。

次回から、HCL2の文法基礎を挟み、以前のCloudFormationで構築したのと同様の環境構築を行なっていく予定です。

余談ですが、 vscodeやcursorでtfファイルを記述する際には、Hashicorp TerraformのExtentionを追加しておくと、リソース名などをリストアップしてくれるので記述が楽になります。