記事の目的
- Terraformについての学習備忘録用
- TerraformでAWS環境構築までのフローの振り返り用
前提条件
TerraformでAWS環境を構築するには最低でも以下の前提条件があります
- Terraform CLIをインストールしていること
- AWS CLIをインストールしていること
- AWS accountと関連する認証情報でリソースが作成できる状態にあること
記事の概要
- S3バケット作成(
.tfsatate
ファイル保存用) - S3バケット参照設定
-
terraform init
(初期化) - VPC構築をコードで記載
- サブネット構築をコードで記載
-
terraform plan
(実行内容確認) -
terraform apply
(リソース構築実行) -
terraform destroy
(リソース破棄)
Terraformとは何かなどの基本的な部分やインストールについてはTerraform基本的な説明でまとめているので、こちらみてみて下さい
Terraform公式ドキュメント
S3バケット作成(.tfsatate
ファイル保存用)
Terraformで管理しているインフラソースをすべて記録している.tfsatate
ファイルを保存しておくために、まずはS3バケットを先に作成していく必要があります
AWS S3サービス画面に遷移しバケット作成を選択
上部の検索欄にS3と入力するとS3選択できS3画面に行けます
今回はテストように.tfsatate
ファイルを保存したいだけなので、「バケット名」を入力したら他は特に変更せず「作成」を選択して作成しています
「作成」選択後下の画像のようにバケットが作成できているかと思います
これでTerraformで管理しているインフラソースをすべて記録している.tfsatate
ファイルを保存するバケットの作成は完了になります
S3バケット参照設定
作成したS3バケットを.tfsatate
ファイルの保存場所に指定しますよ!という設定を行なっていきます。
AWSプロバイダー情報を記載する.tf
ファイルを作成
まずは、「作成したS3バケットを.tfsatate
ファイルの保存場所に指定しますよ!」だったり、AWSプロバイダー情報などのインフラの構成記載するファイルを作成します。
ファイルを作成する場所については、好きなディレクトリを作成しその配下に好きな名前で.tf
ファイルを作成していきます
今回は下記のような構成でディレクトリをファイルを構成しています。
terra
┗ backend.tf ←追加
S3バケットの設定
Terraform公式ドキュメント(Amazon S3)の「Example Configuration」部分をコピーして一旦backend.tf
に貼り付けます
貼り付けた後、先ほど作成したバケット情報を設定していきます
-
required_version
: Terraformのバージョン指定 -
bucket
: バケット名 -
key
: バケットのどこに保存するかの指定(今回はバケット直下にファイルを直接おくためファイル名記載しています) -
region
: AWS リージョン指定
※required_version
については使用しているTerraformのバージョンを設定して下さい
terraform {
required_version = "1.4.6"
backend "s3" {
bucket = "terraform-tfstate-pikimarutest"
key = "terraform.tfstate"
region = "ap-northeast-1"
}
}
これでどこにtfstate
を置くかの設定が完了しました
プロバイダーの設定
terra
┗ backend.tf
┗ provider.tf ←追加
プロバイダーにはMicrosoft Azure
、Amazon Web Services(AWS)
、Google Cloud Platform(GCP)
等ありますが今回はAWSであるのでbackend.tf
と同じ階層にprovider.tf
を作成し、provider.tf
内に下記を記載していきます
Terraform公式ドキュメント(Provider Configuration)
-
region
: AWS リージョン指定
provider "aws" {
region = "ap-northeast-1"
}
terraform init
(初期化)
ターミナルでbackend.tf
が存在する階層で下記コマンドを実行
terraform init
初期化に成功するとしたの画像のように出てくるかと思います
また、backend.tf
と同じ階層に'.terraform'といディレクトリが作成されるかと思います
これで初期化が完了となります!!
【補足】エラーが出た場合
このようなエラーが出た場合、AWSアクセスキーIDとシークレットアクセスキーを設定する必要用があるので、下記のコマンドを実行しアクセスキーIDとシークレットアクセスキーを設定していきます
aws configure
上記コマンド実行すると下記が順番に表示されるかと思うのでそれぞれ入力していきます
AWS Access Key ID [None]: YOUR_ACCESS_KEY
AWS Access Key ID [None]: YOUR_SECRET_KEY
Default region name [None]: ap-northeast-1
Default output format [None]: json
-
AWS Access Key ID
: アクセスキーを入力 -
AWS Access Key ID
: シークレットアクセスキーを入力 -
Default region name
:ap-northeast-1
と入力 -
Default output format
:json
と入力
※アクセスキーとシークレットアクセスキーについてはAWSのIAMから「アクセスキーを作成」にて作成した際に表示されるものを使用して下さい
VPC構築をコードで記載
初期化ができたのでここから構築するサービスをコードで記載していきます
まずはVPCの構築内容を記載するのでvpc.tf
ファイルを作成します
terra
┗ terraform ←初期化時に作成されています
┗ backend.tf
┗ provider.tf
┗ vpc.tf ←追加
Terraform公式ドキュメント(VPC)を参考に設定していきます
-
aws_vpc
: 作成するサービスを指定している -
pre
: 名前の設定(好きな名前で良い) -
cidr_block
: IPv4 CIDR ブロックの設定 -
pre-vpc
: タグの設定(好きな名前で良い)
resource "aws_vpc" "pre" {
cidr_block = "10.0.0.0/16"
tags = {
Name = "pre-vpc"
}
}
サブネット構築をコードで記載
初期化ができたのでここから構築するサービスをコードで記載していきます
まずはVPCの構築内容を記載するのでvpc.tf
ファイルを作成します
terra
┗ terraform ←初期化時に作成されています
┗ backend.tf
┗ provider.tf
┗ vpc.tf
┗ subnet.tf ←追加
Terraform公式ドキュメント(subnet)を参考に設定していきます
-
aws_subnet
: 作成するサービスを指定している -
pre_1a
: 名前の設定(好きな名前で良いが、アベイラビリティーゾーンが分かるような名前が良い) -
vpc_id
: サブネットを作成するVPCの指定(先ほど作成したVPCの名前をaws_vpc.名前.id
というふうに設定) -
cidr_block
: IPv4 CIDR ブロックの設定 -
availability_zone
: アベイラビリティーゾーンの設定 -
pre-subnet
: タグの設定(好きな名前で良い)
resource "aws_subnet" "pre_1a" {
vpc_id = aws_vpc.pre.id
cidr_block = "10.0.1.0/24"
availability_zone = "ap-northeast-1a"
tags = {
Name = "pre-subnet"
}
}
terraform plan
(実行内容確認)
terraform plan
はterraformで記載したコードの内容と管理されているtfstate
の内容を比較して差分(変更内容)を出してくれます。
実行した際に構築する内容を確認する際に使用し、必ず下記コマンドを実行して内容確認を行います!
terraform plan
管理されているtfstate
はまだないはずなので、ここまで記載したVPCとサブネットの2つを追加しますといったPlan: 2 to add, 0 to change, 0 to destroy.
という文言が出ているかと思います
【補足】構文チェックterraform validate
これは補足なので実行しなくても良いですが、下記のコマンドを実行することで
これまで書いたコードの記載方法等に間違えがないかを確認できます
terraform validate
問題なければ下のように表示されます。また問題があれば該当箇所を表示してくれるので修正します
terraform plan
でもエラーは出してくれるので念の為実行する感じで問題なさそう、、
terraform apply
(リソース構築実行)
下記のコマンドで実際にこれまで記載したリソースの構築を実行します
terraform apply
コマンドを実行するとterraform plan
同様変更内容が表示されるので、問題なければ「Enter a value:」の部分にyes
を記載して実行します
下のように表示されれば実行成功です!!
AWS画面で確認
AWSコンソールに移動してVPCとサブネットを確認すると実際に作成されているかと思います
最初の方で.tfsatate
ファイルの保存先のS3バケット設定をしたバケットに行き「ダウンロード」を実行するとjsonファイルで構築した内容(terraformの全て)を確認することができます
【補足】この状態でterraform plan
terraform plan
これは補足なので実行しなくても良いですが、現在の状態で再度上記のコマンドを実行すると
下のように表示され何も変更がなく管理ができていることを確認することができます!
terraform destroy
(リソース破棄)
ここまでで、TerraformでAWS環境構築までを行なってきたのでここからはお片付けになります。
単純にこれまでTerraform記載したものを全て削除しterraform plan
を実行すると削除できますが、
コードを残しておいてコマンドで削除する方法を行っていきます
下記のコマンドを実行することで、コード上にあるTerraformで管理している全てのリソースを削除することができます
terraform destroy`
コマンドを実行後、問題なければ「Enter a value:」の部分にyes
を記載して実行します
当たり前ですが本当に削除されるので、削除時は確認を行なった上で削除するようにして下さい
下のように表示されれば削除完了になります。
コマンド一つで全て削除されるのは怖いですが、逆にコマンド一つで全て削除できるのはめっちゃ便利だなとも思います。
削除し忘れとかでコストが発生したりするするので
AWS画面で確認
AWSコンソールに移動してVPCとサブネットを確認すると実際に削除されているかと思います
【補足】terraform destroy -target=リソース.名前
全てではなくて指定したものだけ削除したい場合はterraform destroy -target=リソース.名前
コマンドを実行することで指定したリソースのみ削除することができます。
例として指定のサブネットのみ削除するコマンドを下記に記載しています
terraform destroy -target=aws_subnet.pre_1a