🎢

TerraformでAWSにWebサーバを作成する【02. 初期セットアップ編】

5 min read

こんにちは、Masuyama です。

本記事は Terraform で AWS を操作する第一歩となる「TerraformでAWSにWebサーバを作成する【01. インストール編】」シリーズの一つです。

前回の記事 - 01. インストール編では Terraform のインストールだけ行いました。
これからやることでは AWS リソースを Terraform で作成する、つまり自分の AWS アカウントを Terraform が操作することになるので、そのための初期セットアップを行います。

前提条件 (事前準備)

AWS アカウントで以下のリソースを扱える IAM ユーザのアクセスキーとシークレットキーを用意しましょう。
これらは、本シリーズで作成予定のリソース群です。

  • VPC
  • サブネット
  • セキュリティグループ
  • インターネットゲートウェイ
  • EC2

フォルダ作成

本シリーズで使用するファイルを配置するフォルダを作成します。
名前は任意です。ここでは例として tf-web としておきます。

$ mkdir tf-web
$ cd tf-web

Terraform での変数の扱い方について

Terraform に IAM アクセスキーのような情報を渡す場合、以下の3つの方式があります。

(1) コマンドオプションで渡す方法

terraform コマンドのオプションで以下のように -var オプションを使うことで、一時的に変数を渡せます。

$ terraform apply \
-var 'aws_access_key=xxxxxxxxxxxxxxxxxxxxxxxxxx' \
-var 'aws_secret_key=xxxxxxxxxxxxxxxxxxxxxxxxxx'

(2) 環境変数を渡す方法

terraform を実行する環境に設定されている環境変数を使う方法です。
環境変数の名前を TF_VAR_<変数名> という形式にして設定しておくと、terraform コマンド実行時に自動的に読み込まれます。
オプションとして指定する必要がないので (1) よりは少し楽になります。

(3) 変数ファイルで渡す方法

terraform.tfvars というファイルを作成し、その中に以下のような形式でアクセスキー等の変数を記入しておきます。

aws_access_key = "xxxxxxxxxxxxxxxxxxxxxxxxxx"
aws_secret_key = "xxxxxxxxxxxxxxxxxxxxxxxxxx"

terraform コマンドを実行するフォルダ (今回でいえば tf-web 内) に terraform.tfvars を置いておくと、自動でファイル内に記入されている変数が読み込まれます。

こちらの方法が公式では推奨している方法となるため、この方式を採用していきます。

terraform.tfvars 作成

それでは上述の通り、tf-web 内で terraform.tfvars を作成していきましょう。

$ touch terraform.tfvars

作成したら、中身は上述の例の通り、用意した AWS アクセスキーとシークレットキーを記載します。

terraform.tfvars

aws_access_key = "xxxxxxxxxxxxxxxxxxxxxxxxxx"
aws_secret_key = "xxxxxxxxxxxxxxxxxxxxxxxxxx"

また、デフォルトで使用するリージョンもここに記載しておくと便利です。
ap-northeast-1 など、任意のリージョンを記載します。

terraform.tfvars (追記)

aws_access_key = "xxxxxxxxxxxxxxxxxxxxxxxxxx"
aws_secret_key = "xxxxxxxxxxxxxxxxxxxxxxxxxx"
aws_region        = "ap-northeast-1"

これで、他の Terraform ファイル (.tf ファイル) からは access_key = "${var.aws_access_key}" という形式で変数を読み込めるようになりました。

変数定義用ファイル作成

続いて variables.tf といった変数定義用のファイルを作成し、terraform.tfvars で指定した変数を .tf ファイルが読み込めるようにします。

variables.tf

variable "aws_access_key" {}
variable "aws_secret_key" {}
variable "aws_region" {}

また、今回作成するリソースであることを識別する Name タグを付けていくため、プレフィックスもこのファイル内で指定しておきます。

variables.tf (追記)

...
variable "r_prefix" {
  default = "tfweb"
}

terraform 実行準備

プロバイダ指定ファイル

Terraform の設定では、Terraform がインストールして使用できるように、どのプロバイダ (AWS, Azure etc...) を必要としているかを宣言する必要があります。
また、プロバイダによっては、使用する前に設定(エンドポイントURLやクラウドの地域など)が必要なものもあります。

provider.tf というファイルを作成し、以下のようにプロバイダとして AWS を指定しつつ、terraform.tfvars で定義した変数を読み込ませます。

provider "aws" {
  access_key = "${var.aws_access_key}"
  secret_key = "${var.aws_secret_key}"
  region  = "${var.aws_region}"
}

作業ディレクトリの初期化

terraform init コマンドを使って、Terraform の設定ファイルを含む作業ディレクトリを初期化します。
新しいTerraform設定を書いたり、git 等で既存の設定をクローンしたりした後に最初に実行するコマンドです。
※初期化とは言っていますが、このコマンドは複数回実行しても問題ありません。

$ terraform init

Initializing the backend...

Initializing provider plugins...
- Reusing previous version of hashicorp/aws from the dependency lock file
- Using previously-installed hashicorp/aws v3.57.0

Terraform has been successfully initialized!

これで実行する準備が完了した状態となります。

実行計画 (execution plan) 作成

Terraform の大きな特徴としては、Dry-Run による事前確認が簡単ということです。
コマンドは terraform plan となります。

terraform plan コマンドでは、実行計画を作成することができます。
デフォルトでは、プランの作成は以下のように構成されています。

  • 既に存在するリモートオブジェクトの現在の状態を読み込み、Terraformの状態が最新であることを確認
  • 現在の設定を以前の状態と比較し、差分を抽出
  • 変更アクションを提案し、それを適用することでリモートオブジェクトを設定に一致(更新)

terraform plan コマンド単体では実行計画を作成するだけなので、変更が実際に実行されません。
そのため、変更を適用する前に、変更が期待したものと一致しているかどうかを確認したり、変更内容をチームで共有してより広い範囲で確認するためにこのコマンドを使用します。

※実際にリモートオブジェクト (AWS リソース) を作成する際に説明しますが、変更を実際に適用する時は terraform apply コマンドを使用します。

現時点ではまだ Terraform の事前設定をしただけですので、事前計画においても何も変更プランは作成されないはずです。
このような場合、Terraform はリソースインスタンスやルートモジュールの出力値に変更の必要がないことを検出し、terraform plan は何も変更が必要がない旨を返します。
試しに実行してみましょう。

$ terraform plan

No changes. Your infrastructure matches the configuration.

Terraform has compared your real infrastructure against your configuration and found no
differences, so no changes are needed.

このように、何も変更が無いので "No changes"" と出力されていることが分かります。

次回は実際にリソースを作成するための Terraform ファイルを作成し、それを用いて AWS リソースを作成してみます。

Discussion

ログインするとコメントできます