Terraformを使うための環境構築手順をまとめてみた(AWS編)~Windows
私のPCには古いバージョンのTerraform実行構築が済みなのですが、あらためて環境構築しようと思いたったので、備忘録的に環境構築手順をまとめてみます。
当時の記憶を掘り起こしながらやってみたのですが、最近のベストプラクティスと違う部分などあれば教えていただけるとありがたいです。
前提条件
- デプロイするためのAWSアカウントがあること
- AdministratorロールをアタッチしたIAMユーザーを作成済みであること
- 2のアクセスキー、シークレットアクセスキーをPCに設定済みであること
※Powershellなどでaws s3 ls
を実行して1のAWSアカウントのS3バケットリストが表示されればとりあえずOKです
Terraformインストール
- 公式サイトからダウンロード
https://developer.hashicorp.com/terraform/install
私の場合は下記をダウンロードします。
- ファイルを任意の場所に配置
Downloadフォルダにterraform_1.9.1_windows_amd64.zipというファイルがダウンロードされましたので、これを任意の場所に移動します。
私の場合はC:\tool\terraform
というフォルダを作成して、ここにコピーしました
zip解凍すると、terraform.exeとLICENSE.txtが展開されます。
- terraform.exeにPATHを通す
C:\tool\terraform\terraform.exe
にPATHを通しておきます。
ちなみに私は環境変数設定がどこにあったかよく忘れてしまうのですが、タスクバーの検索窓(またはWindowsキーを押して表示される検索窓)にenv
と入力すると一発で辿り着くことを最近知りました。
環境変数にC:\tool\terraform
を設定します。
これでterraformの実行ファイルにPATHが通ったはずなので、さっそくPowershellやコマンドプロンプトでterraform -version
と実行してみます。
バージョンが表示されれば成功です。
※Terraformバージョン管理をするためのtfenvというツールもありますが今回は割愛します
VS Code拡張機能追加
今回はエディタとしてVS Codeを使いますので、tfファイルを書く際にフォーマットなどを自動的にしてくれるVS Code拡張機能を追加しておきます。
以前はIntelliJにtf-lintを入れていたのですが、どうもVS Codeにtf-lint対応していない?らしいのでPrettierとHasicorp Terraformを使います。
Prettier - Code formatter
Hashicorp Terraform
{
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnPaste": true,
"editor.formatOnSave": true,
"editor.formatOnType": true,
"[terraform]": {
"editor.defaultFormatter": "hashicorp.terraform"
}
}
これでtfファイルを保存する際に自動で整形してくれます。
※下記サイトを参考にさせていただきました
バックエンド(tfstate)設定
Terraformはtfstateというファイルで状態を管理していますが、このtfstateをローカルPCではなく、S3で管理することも可能です。
S3で管理することで、1つのtfstateをもとに複数人で作業することが可能となります。
自分一人で使う分にはローカルPCで管理しても問題ないのですが、今後Github Actionsとの連携もしたいと思うので、S3で管理するよう公式ドキュメントも参照しながら設定します。
今回はkiku-terraform-backend
という名前でtfstateを格納するS3バケットを東京リージョンに作成します。
※S3バケット名は一意である必要があります
また、競合回避のためのDynamoDBテーブルもterraform-state-lock-table
という名前で作成して設定しようと思います。
- S3バケット作成
AWSマネージメントコンソールにアクセスし、Amazon S3画面を開く
※リージョンが東京(ap-northeast-1)になっていることを確認
「バケットを作成」をクリック
バケット名にkiku-terraform-backend
と入力し、他はほぼデフォルト設定とします。
「バケットのバージョニング」は忘れずに有効にします。
暗号化はAmazon S3マネージドキーでサーバーサイド暗号化としておきます。
「バケットを作成」でバケットを作成します。
-
DynamoDBテーブル作成
DynamoDB画面を開く
※リージョンが東京(ap-northeast-1)になっていることを確認
「テーブルの作成」をクリック
テーブル名にterraform-state-lock-table
と入力し、パーティションキーは公式ドキュメントの記載に沿ってLockID
として、型は文字列とします。
他はデフォルト設定で「テーブルの作成」をクリックします。
これでDynamoDBテーブル作成も完了です。 -
provider.tf作成
terraform実行時に必要な情報を記載したprovider.tfを作成します。
仮でterraform-env-testというフォルダを作成します。その中にVS Codeでprovider.tfというファイルを作成します。
terraform {
#terraformバージョンを指定
required_version = ">=1.9.1"
#tfstateの設定
backend "s3" {
bucket = "kiku-terraform-backend"
key = "terraform/terraform.tfstate"
region = "ap-northeast-1"
dynamodb_table = "terraform-state-lock-table"
encrypt = true
}
#providerを指定
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
provider "aws" {
region = "ap-northeast-1"
}
1,2で設定したバックエンドをbackend "s3"
という箇所で設定しています。
また、required_version
でterraformバージョンを指定しています。今回はv1.9.1をインストールしたので、v1.9.1以上としています。
Providerは、AWSなどのクラウドベンダーのAPIとやりとりするためのプラグインです。
※公式の説明
今回はAWSを使うのでAWSを指定して、バージョンは一旦5.0以上を指定しています。
※Providerのメジャーバージョンアップは破壊的な変更が含まれることがあるので注意が必要です
これでprovider.tfの作成は完了です。
main.tfの作成
バックエンドのテストのために、terraformで何かリソースを作ってみることにします。
Hashicorp公式を参照しながら、とりあえずVPCを作ってみます。
main.tfを先に作成したprovider.tfと同じterraform-env-testフォルダ内に作成して、公式のBasic usage with tagsと記載してあるコードをコピーします。
※私の環境だとすでに10.0.0.0/16
のVPCが存在するので、10.1.0.0/16
に変更しています。
resource "aws_vpc" "main" {
cidr_block = "10.1.0.0/16"
instance_tenancy = "default"
tags = {
Name = "main"
}
}
これで準備は完了です。
terraformを実行してみましょう。
terraformの実行
terraform-env-testフォルダでターミナル(Powershell、Git Bashなど)を開き、terraform init
を実行します。
下記のようにterraformを使うためのバックエンド設定などを実施してくれます。少し時間がかかります。
次にterraform plan
を実行します。これにより、terraform実行により作成・変更・削除される(はずの)リソースを表示します(この段階ではまだリソースは変更されません)。
aws_vpc.main will be created
と表示され、作成されるVPCの情報が記載されています。
左側の緑の+
は新規作成・設定される値です。
先ほどmain.tfで書いたとおりの設定になっていると思います。
(known after apply)
はplan時点では決まっていない値という意味になります(あってますよね...?)。
今回はVPCだけなのでそこまで複雑ではありませんが、たくさんリソースがある場合は1個1個見るのは大変です。
下のほうのPlan: 1 to add, 0 to change, 0 to destroy.
という記載がサマリになっていて、作成(add)、変更(change)、削除(destroy)されるリソースの数がわかるようになっています。
削除するつもりがないのにdestroyされるリソースがある場合もあるので、plan時に想定通りの変更になっているか確認する必要があります。
それではterraform apply
してリソースを作成します。
Enter a value:
にyes
と入力して実行すればリソースが作成されます。
ちなみにterraform apply -auto-approve
と実行すれば、確認無しでapplyが実行されます。
VPC1個作成するだけなので、一瞬で終わりました。
AWSマネージメントコンソールでVPCを確認すると、たしかにmainというVPCが作成されており、CIDRも10.1.0.0/16となっています。
S3のkiku-terraform-backendバケットを見ると、tfstateファイルが作成されています。
想定通りVPCが作成されたので、次はVPCのタグを変更してみます。
main.tfを下記のように変更してみます。
resource "aws_vpc" "main" {
cidr_block = "10.1.0.0/16"
instance_tenancy = "default"
tags = {
Name = "tf-test-vpc"
}
}
terraform plan
を実行してみると下記のようにchangeとしてタグの値が変更されるとなります。
※terraform init
は初回のみ実行が必要ですが、2回目以降は実行しなくて大丈夫です
terraform apply -auto-approve
実行します。
問題なく成功しました。
AWSマネージメントコンソールでVPCを確認すると、名前が変更されています。
まとめ
terraformのインストールから、設定~実行までやってみました。
Discussion