😸
terraform使ってみた!
terraformを利用してEC2の最小構成を作ってみるメモ
詳しい用語の意味は割愛します。
目次
- Terraformのインストール
- プロジェクトのセットアップ
- Terraformコードの作成
- Terraformの実行
- 動作確認
- 変更する方法
- クリーンアップ(削除)
前提
- AWS CLIでプロファイル認証が済んでいること(CLIからAWSに接続します。)
Terraformのインストール
- TerraformをDL(今回はWindows64bit環境のため、AMD64を選択)
- 環境変数pathに「c:\terraform\」を追加
- 「c:\terraform\」配下にexeファイルを配置
確認
$ terraform --version
Terraformコードの作成
- 今回はVPC、サブネット、EC2を作成する
- 「c:\terraform\」配下に「terraform-deploy」のフォルダを作成し「tf」ファイルを作成
コード
[mai.tf]# プロバイダーの設定 provider "aws" { region = "ap-northeast-1" # 東京リージョン } # VPCの作成 resource "aws_vpc" "main_vpc" { cidr_block = "10.0.0.0/16" tags = { Name = "terraform1" } } # サブネットの作成 resource "aws_subnet" "main_subnet" { vpc_id = aws_vpc.main_vpc.id cidr_block = "10.0.1.0/24" tags = { Name = "terraform1" } } # 最安のEC2インスタンスの作成 resource "aws_instance" "cheap_instance" { ami = "ami-0c3fd0f5d33134a76" # 東京リージョンのAmazon Linux 2のAMI (具体的には最新のAMI IDを確認すること) # instance_type = "t2.micro" # 最安のインスタンス(フリーティア対 応) instance_type = "t3.micro" subnet_id = aws_subnet.main_subnet.id tags = { Name = "terraform1" } }
タグとは?
お時間ある方はどうぞ。
確認
$ aws resourcegroupstaggingapi get-resources --tag-filters Key=Name,Values=terraform1
{
"ResourceTagMappingList": [
{
"ResourceARN": "arn:aws:resource-groups:ap-northeast-1:990606419933:group/terraform1-resource-group",
"Tags": [
{
"Key": "Name",
"Value": "terraform1"
}
]
},
{
"ResourceARN": "arn:aws:ec2:ap-northeast-1:990606419933:subnet/subnet-0f8c372dfdc08dbe9",
"Tags": [
{
"Key": "Name",
"Value": "terraform1"
}
]
},
{
"ResourceARN": "arn:aws:ec2:ap-northeast-1:990606419933:vpc/vpc-048fcedd3b326b341",
"Tags": [
{
"Key": "Name",
"Value": "terraform1"
}
]
}
]
}
Terraformの実行
- 影響の確認(tfファイルとAWS上のリソース作成状況を比較し、差分を表示)
terraform plan
- Terraformの適用
terraform apply ※yesを押下
動作確認
- AWSコンソール上で確認
確認
図: リソースが作成されている - コマンドで確認
確認
$ aws resourcegroupstaggingapi get-resources --tag-filters Key=Name,Values=terraform1 { "ResourceTagMappingList": [ { "ResourceARN": "arn:aws:resource-groups:ap-northeast-1:xxxxxxxxxx:group/terraform1-resource-group", "Tags": [ { "Key": "Name", "Value": "terraform1" } ] }, { "ResourceARN": "arn:aws:ec2:ap-northeast-1:xxxxxxxxxxxxxx:subnet/subnet-0f8c372dfdc08dbe9", "Tags": [ { "Key": "Name", "Value": "terraform1" } ] }, { "ResourceARN": "arn:aws:ec2:ap-northeast-1:xxxxxxxxxx:vpc/vpc-048fcedd3b326b341", "Tags": [ { "Key": "Name", "Value": "terraform1" } ] } ] }
変更する方法
- リソースの変更(tfファイルを一部変更)
- インスタンスのスペックを変更してみる
変更コード
# instance_type = "t2.micro" # 最安のインスタンス(フリーティア対応) instance_type = "t3.micro"
- 影響の確認(tfファイルとAWS上のリソース作成状況を比較し、差分を表示)
terraform plan instance_type = "t2.micro" -> "t3.micro"
- Terraformの適用
terraform apply ※yesを押下
クリーンアップ(削除)
- 削除する方法は主に3つ
- tfファイルからリソースを削除orコメントアウトする方法
- CLIで指定したリソースを削除するコマンドを打つ方法
※IaC利用してるのに個別のコマンドは打つメリットないので割愛 - CLIですべてのリソースを削除するコマンドを打つ方法
- 運用を考えると「1. tfファイルからリソースを削除orコメントアウトする方法」が主だろう
- やってみる
- 「tfファイルからリソースを削除orコメントアウトする方法」
- インスタンスを削除
変更コード
# 例えば、このインスタンス定義を削除 # resource "aws_instance" "cheap_instance" { # ami = "ami-0c3fd0f5d33134a76" # instance_type = "t2.micro" # subnet_id = aws_subnet.main_subnet.id # tags = { # Name = "terraform101-instance" # } # }
- 「CLIですべてのリソースを削除するコマンドを打つ方法」
- インスタンスを削除
$ terraform destroy
- 「tfファイルからリソースを削除orコメントアウトする方法」
Discussion