最近、AWSの環境構築に当たって大量の手作業が辛くなってきたのである程度ツールに任せたいなと思い始め、Terraformを触ってみることにしました。0.11.1 を手元にインストールしてます。
2017-01-06
- 想定する環境を決める
- ざっとこんな感じで。Webアプリケーションを動かす環境のイメージ。
- VPC - この中にサブネットをいくつか用意する - パブリックアクセス可能なものとプライベートなものを用意する - DynamoDB - EC2インスタンス - アプリケーションサーバー * 2 - ALB - インターネット - ALb - EC2インスタンス群(App) - 443ポートにエンドポイントを作成 - Appサーバーは8080番ポートにマッピング - セキュリティーグループ - ALB用 - Appサーバー用 - ALBのみインバウンドを許可 - IAMロール - Appサーバーにひもづけるロール - DynamoDBへのread/writeアクセス
- これに基づいてVPC周りから始めてみる
- 参考にした例 terraform-provider-aws/examples/networking at master · terraform-providers/terraform-provider-aws
- AWS: aws_vpc - Terraform by HashiCorp
- AWS: aws_internet_gateway - Terraform by HashiCorp
cidrsubnet
関数 Interpolation Syntax - Terraform by HashiCorpresources
のドキュメント Configuring Resources - Terraform by HashiCorp
- VSCodeの拡張機能をインストール Terraform - Visual Studio Marketplace
- 良い感じにフォーマットできる
- AWSのクレデンシャルを使う Provider: AWS - Terraform by HashiCorp
- planしてapplyする流れ
- applyすると
terraform.tfstate
というファイルが生成される- リソースの設定を変更してapplyするとこのファイルが更新される
- State - Terraform by HashiCorp
- VPCとInternet gatewayを作成した
provider "aws" { region = "us-west-2" # default プロファイルを使用する profile = "default" } resource "aws_vpc" "main" { # 192.168.0.0/20 になる cidr_block = "${cidrsubnet("192.168.0.0/16", 4, 0)}" } resource "aws_internet_gateway" "main" { vpc_id = "${aws_vpc.main.id}" }
2017-01-11
- 今日はサブネットを作ろうと思う
- public * 2 (AZ-A, AZ-B)
- private * 2 (AZ-A, AZ-B)
- その前にルートテーブルにゲートウェイをひもづける
- VPCを作成したときにデフォルトのルートテーブルが作られていた
- 明示的にルートテーブルを作る方がよさそう
- AWS: aws_route_table - Terraform by HashiCorp
- サブネット
- AWS: aws_subnet - Terraform by HashiCorp
- availability zoneの名前は
us-west-2a
us-west-2b
という感じ
cidrsubnet(aws_vpc.main.cidr_block, 4, 0)
を使って3番目の引数を0, 1, 2,... にしていくと- 192.168.0.0/24, 192.168.1.0/24,... とCIDRが設定されていい感じ(これまでは頭の中or書き出してIPアドレス範囲を計算していた)
- 当初はこの関数を使う利点がよく分からなかったが、ここでメリットが出てきた
- とりあえず1ファイルにまとめているが、見にくくなったらファイル分割しようと思う
- ルートテーブルとpublicサブネットを作成した
resource "aws_route_table" "r" { vpc_id = "${aws_vpc.main.id}" route { cidr_block = "0.0.0.0/0" gateway_id = "${aws_internet_gateway.main.id}" } tags { Name = "main" } } resource "aws_subnet" "public-a" { vpc_id = "${aws_vpc.main.id}" cidr_block = "${cidrsubnet(aws_vpc.main.cidr_block, 4, 0)}" # 本当はリージョンも変数化したい availability_zone = "us-west-2a" tags { Name = "public-a" } } resource "aws_subnet" "public-b" { vpc_id = "${aws_vpc.main.id}" cidr_block = "${cidrsubnet(aws_vpc.main.cidr_block, 4, 1)}" availability_zone = "us-west-2b" tags { Name = "public-b" } }
まだまだ作りたいリソースはたくさん残っていますが、(いまのところ)簡潔に書けてパッと実行できるのはいいですね。