🐟

Terraformを使うための環境構築手順をまとめてみた(AWS編)~Windows

2024/07/07に公開

私のPCには古いバージョンのTerraform実行構築が済みなのですが、あらためて環境構築しようと思いたったので、備忘録的に環境構築手順をまとめてみます。
当時の記憶を掘り起こしながらやってみたのですが、最近のベストプラクティスと違う部分などあれば教えていただけるとありがたいです。

前提条件

  1. デプロイするためのAWSアカウントがあること
  2. AdministratorロールをアタッチしたIAMユーザーを作成済みであること
  3. 2のアクセスキー、シークレットアクセスキーをPCに設定済みであること
    ※Powershellなどでaws s3 lsを実行して1のAWSアカウントのS3バケットリストが表示されればとりあえずOKです

Terraformインストール

  1. 公式サイトからダウンロード
    https://developer.hashicorp.com/terraform/install
    私の場合は下記をダウンロードします。
  2. ファイルを任意の場所に配置
    Downloadフォルダにterraform_1.9.1_windows_amd64.zipというファイルがダウンロードされましたので、これを任意の場所に移動します。
    私の場合はC:\tool\terraformというフォルダを作成して、ここにコピーしました
    zip解凍すると、terraform.exeとLICENSE.txtが展開されます。
  3. 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
https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode

Hashicorp Terraform
https://marketplace.visualstudio.com/items?itemName=HashiCorp.terraform

settings.json
{
    "editor.defaultFormatter": "esbenp.prettier-vscode",
    "editor.formatOnPaste": true,
    "editor.formatOnSave": true,
    "editor.formatOnType": true,
    "[terraform]": {
      "editor.defaultFormatter": "hashicorp.terraform"
    }
}

これでtfファイルを保存する際に自動で整形してくれます。

※下記サイトを参考にさせていただきました
https://zenn.dev/teradatky/articles/formatter-vscode-20231030

バックエンド(tfstate)設定

Terraformはtfstateというファイルで状態を管理していますが、このtfstateをローカルPCではなく、S3で管理することも可能です。
S3で管理することで、1つのtfstateをもとに複数人で作業することが可能となります。
自分一人で使う分にはローカルPCで管理しても問題ないのですが、今後Github Actionsとの連携もしたいと思うので、S3で管理するよう公式ドキュメントも参照しながら設定します。
https://developer.hashicorp.com/terraform/language/settings/backends/s3

今回はkiku-terraform-backendという名前でtfstateを格納するS3バケットを東京リージョンに作成します。
※S3バケット名は一意である必要があります
また、競合回避のためのDynamoDBテーブルもterraform-state-lock-tableという名前で作成して設定しようと思います。

  1. S3バケット作成
    AWSマネージメントコンソールにアクセスし、Amazon S3画面を開く
    ※リージョンが東京(ap-northeast-1)になっていることを確認
    「バケットを作成」をクリック

    バケット名にkiku-terraform-backendと入力し、他はほぼデフォルト設定とします。

「バケットのバージョニング」は忘れずに有効にします。
暗号化はAmazon S3マネージドキーでサーバーサイド暗号化としておきます。


「バケットを作成」でバケットを作成します。

  1. DynamoDBテーブル作成
    DynamoDB画面を開く
    ※リージョンが東京(ap-northeast-1)になっていることを確認
    「テーブルの作成」をクリック

    テーブル名にterraform-state-lock-tableと入力し、パーティションキーは公式ドキュメントの記載に沿ってLockIDとして、型は文字列とします。

    他はデフォルト設定で「テーブルの作成」をクリックします。

    これでDynamoDBテーブル作成も完了です。

  2. provider.tf作成
    terraform実行時に必要な情報を記載したprovider.tfを作成します。
    仮でterraform-env-testというフォルダを作成します。その中にVS Codeでprovider.tfというファイルを作成します。

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を作ってみます。
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/vpc

main.tfを先に作成したprovider.tfと同じterraform-env-testフォルダ内に作成して、公式のBasic usage with tagsと記載してあるコードをコピーします。
※私の環境だとすでに10.0.0.0/16のVPCが存在するので、10.1.0.0/16に変更しています。

main.tf
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を下記のように変更してみます。

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