😄
TerraformでAWSのVPCとその他もろもろを作ってみる
TerraformでAWSのVPCとその他もろもろを作ってみる
awsコンソールでVPCを作成するとき、"VPCのみ"と"VPCなど"の2種類のオプションがある。"VPCなど"をクリックすると表示されるデフォルト値をそのままterraformにコードとして落とし込んでいく。セキュリティのことは今回は何も考えずにやっていこうと思う
メモ
- vscodeの拡張機能を入れておくと便利
- 今回はmain.tfにまとめて書くが、モジュール分割して環境ごとにコードを書くと便利らしい
- あらかじめAWS CLIのシークレットを取得しておく
ルートテーブルの記述
aws_route_table
- 経路情報の格納
aws_route
- ルートテーブルへ経路情報を追加
- Internet Gatewayの使用もここで設定する
- コンソール上ではルートテーブルを選択したページのルートというタブと思われる
aws_route_table_association
- ルートテーブルとサブネットの関連付け
- コンソール上ではルートテーブルを選択したページのサブネットの関連付けというタブと思われる
プロバイダーの指定
/**
* プロバイダーの指定
*/
provider "aws" {
region = "ap-northeast-1"
}
VPCの作成
/**
* VPCの作成
*/
resource "aws_vpc" "aws_provider_tutorial_vpc" {
cidr_block = "10.0.0.0/16"
// コンソール上のDNSホスト名を有効化
enable_dns_hostnames = true
// コンソール上のDNS解決を有効化
enable_dns_support = true
tags = {
Name = "aws_provider_tutorial_vpc1"
// タグ名 = 値とすることで追加のタグが設定することができる
// 例) env = dev
}
}
サブネットの作成
パブリックサブネットの作成
locals {
subnets = {
"subnet-1" = {
availability_zone = "ap-northeast-1a",
cidr_block = "10.0.0.0/20",
tag_name = "aws_provider_tutorial_public1-1a"
},
"subnet-2" = {
availability_zone = "ap-northeast-1c"
cidr_block = "10.0.16.0/20",
tag_name = "aws_provider_tutorial_public2-1c"
}
}
}
resource "aws_subnet" "public_subnets" {
for_each = local.subnets
cidr_block = each.value.cidr_block
vpc_id = aws_vpc.aws_provider_tutorial_vpc.id
availability_zone = each.value.availability_zone
tags = {
Name = each.value.tag_name
}
}
プライベートサブネットの作成
/**
* サブネットの作成
*/
resource "aws_subnet" "aws_provider_tutorial_private1-1a" {
// 作成したVPC内にサブネットを作成する
vpc_id = aws_vpc.aws_provider_tutorial_vpc.id
// サブネットを作成するAZ
availability_zone = "ap-northeast-1a"
// IPv4 CIDRブロック
cidr_block = "10.0.128.0/20"
tags = {
Name = "aws_provider_tutorial_private1-1a"
}
}
resource "aws_subnet" "aws_provider_tutorial_private2-1c" {
vpc_id = aws_vpc.aws_provider_tutorial_vpc.id
availability_zone = "ap-northeast-1c"
cidr_block = "10.0.144.0/20"
tags = {
Name = "aws_provider_tutorial_private2-1c"
}
}
インターネットゲートウェイの作成
resource "aws_internet_gateway" "aws_provider_tutorial_internet_gateway" {
vpc_id = aws_vpc.aws_provider_tutorial_vpc.id
tags = {
Name = "aws_provider_tutorial_internet_gateway"
}
}
VPCエンドポイントの作成(S3ゲートウェイ)
ルートテーブルの作成
パブリック
resource "aws_route_table" "aws_provider_tutorial_public-rt" {
vpc_id = aws_vpc.aws_provider_tutorial_vpc.id
tags = {
Name = "aws_provider_tutorial_rtb_public-rt"
}
}
resource "aws_route" "public" {
destination_cidr_block = "0.0.0.0/0"
route_table_id = aws_route_table.aws_provider_tutorial_public-rt.id
gateway_id = aws_internet_gateway.aws_provider_tutorial_internet_gateway.id
}
resource "aws_route_table_association" "aws_provider_tutorial_association-public_rt" {
for_each = aws_subnet.public_subnets
subnet_id = each.value.id
route_table_id = aws_route_table.aws_provider_tutorial_public-rt.id
}
プライベート
resource "aws_route_table" "aws_provider_tutorial_private1a_rtb" {
vpc_id = aws_vpc.aws_provider_tutorial_vpc.id
tags = {
Name = "aws_provider_tutorial_private1a_rtb"
}
}
resource "aws_route_table" "aws_provider_tutorial_private1c_rtb" {
vpc_id = aws_vpc.aws_provider_tutorial_vpc.id
tags = {
Name = "aws_provider_tutorial_private1c_rtb"
}
}
resource "aws_route_table_association" "aws_provider_tutorial_private1a_rta" {
subnet_id = aws_subnet.aws_provider_tutorial_private1-1a.id
route_table_id = aws_route_table.aws_provider_tutorial_private1a_rtb.id
}
resource "aws_route_table_association" "aws_provider_tutorial_private2c_rta" {
subnet_id = aws_subnet.aws_provider_tutorial_private2-1c.id
route_table_id = aws_route_table.aws_provider_tutorial_private1c_rtb.id
}
resource "aws_vpc_endpoint_route_table_association" "private_s3_1a" {
vpc_endpoint_id = aws_vpc_endpoint.s3_endpoint.id
route_table_id = aws_route_table.aws_provider_tutorial_private1a_rtb.id
}
resource "aws_vpc_endpoint_route_table_association" "private_s3_1c" {
vpc_endpoint_id = aws_vpc_endpoint.s3_endpoint.id
route_table_id = aws_route_table.aws_provider_tutorial_private1c_rtb.id
}
これでデフォルトのVPCなどの作成ができると思います。GUIコンソールを見ながらコードを書くと、そのコードがGUIのどの部分のことかがわかりやすく理解が進みやすいかもしれない
参考
最後に
間違っていることがあればコメントに書いていただけると幸いです。
よろしくお願いいたします。
Discussion