前回まで「CloudFormation」を使用したIaCを学んできましたが、今回からは別のIaCツールである「Terraform」を学習していきます。
Terraform基礎
Terraformは、HashiCorp社によって開発されたオープンソースのIaCツールです。大きな特徴として、AWSに限らず、Azure、GCP、Azureなど、マルチクラウドで使用できることが挙げられます。このことから、AWS専用のIaCである CloudFormationに比べて汎用性があります。
また記述言語は「HCL2(HashiCorp Language 2)」という独自言語となっています。JSONに似て非なるものであり、コメント文や、制御処理等の記述も行えます。
現時点でAWSに対するIaCツールといえば、CloudFormationか、Terraformの二択が代表的なものとなっています。
環境構築
tfenv + Terraform インストール
Terraformはバージョンによって挙動が異なるため、Terraformの仮想実行環境である tfenv
をインストールし、その上にTerraformをインストールしていきます。
具体的なインストール手順は割愛しますので、後述のサイトを参照してください。
なお、Windowsの場合、tfenvがLinuxしかサポートしていないため、WSL2の実行環境を構築し、その上でtfenv、Terraformをインストールする手順となります。
<インストール参考(Windowsの場合)>
<インストール参考(Macの場合)>
なお、実行環境が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にアクセスします。
詳細な説明は割愛しますが、次の作業を進めてください。
-
- 公式サイトに従ってインストールを行なってください。
IAMユーザの作成
- AWSマネージメントコンソールから、IAMユーザを新規に作成します。
- このユーザには、AdministratorAccessポリシーを適用します。
アクセスキー、シークレットアクセスキーの払い出し
CLI環境へのキー設定、profile作成
- 以下のコマンドで、CLIのプロファイルを作成します。なお、profile名の
terra-user
は任意の名前で良いですが、後で使用しますので控えておいてください。
- 以下のコマンドで、CLIのプロファイルを作成します。なお、profile名の
$ 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を追加しておくと、リソース名などをリストアップしてくれるので記述が楽になります。