dockerでterraform環境を構築して、AWSにVPCを作る。
作業手順
- dockerでterraform環境を構築する
- AWSでIAMを取得する。
- 接続してVPCを作成する。
- (今回はなし)AWSでS3を作成する。(tfstageファイル用)
この三ステップでいこうと思います。
環境構築について
現在開発環境がWSL2で開発しているのですが、バージョン管理ソフトを入れる必要があります。
有名なのが、tfenv等です。
その場合、windowとmacで環境構築の方法が変わる為、dockerで環境構築するのが、便利という考えです。
下記の通りdocker-compose.ymlを作成します。
version: '3'
services:
terraform:
container_name: terraform
image: hashicorp/terraform:1.1.3
env_file:
- .env
volumes:
- .:/terraform
working_dir: /terraform/terraform
entrypoint: ash
tty: true
その他、terraformフォルダと、空の.envファイルも配置しておきます。
hashicorp社の出している公式のイメージのバージョンは下記より
latestで環境を作るとバージョンでのエラーがでるので今回は1.1.3で固定して環境構築します。
下記コマンドでdockerを立ち上げます。
docker-compose up -d
下記コマンドでコンテナに入ります
docker-compose exec terraform ash
IAMユーザーを作成する
terafformと言うユーザー名でAdministratorAccessポリシーをアタッチする。
作成したアクセスキーとシークレットアクセスキーを.envに書き込む
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
terraformの基本的なコマンド
terraformのワークスペースの初期化
terraform init
terraformの実行計画の確認
terraform plan
.tfに記述された情報を元にリソースを作成するコマンド
terraform apply
applyで実行した結果を見る方法
terraform show
コードを自動整形してくれる機能
terraform fmt
terraformの基本的な構成
*tfファイルは全て読み込む どこに何を書いても全て読み込む(main.tfはよく見るがなくても良いし、ここから実行される訳でもない)
*.tfファイルの中身
resourceで書くことにより、インスタンス等を作成できる。
awsのS3を作成する場合下記のようになる。
resource aws_s3 {
}
dataで書くことにより、作成したインスタンス情報を取得できる。
awsのS3の情報を取得する場合
data aws_s3{
}
variableで変数を定義できます。
variable "vpc_cidr" {
default = "10.0.0.0/16"
}
定義した変数はver.vpc_cidr等、ver.○○で呼び出せます。
tfstateファイル
terraformで管理しているインフラリソースを全て記載したjsonファイル。
このファイルはAWSの場合はS3バケットで保存します。
terraformでVPCを作成する
main.tfを作成します。
# VPCを作成する。
#AWSを今回は使いますと言う宣言
provider "aws" {
region = "ap-northeast-1"
}
#VPCのCIDERを記載します。
variable "vpc_cidr" {
default = "10.0.0.0/16"
}
#下記のresourceで使うタグ用の変数を定義
variable "app_name" {
default = "terraform-created"
}
#resourceでVPCを作成します。
resource "aws_vpc" "main" {
cidr_block = var.vpc_cidr
tags = {
Name = var.app_name
}
}
ファイルふがそろったら下記の手順通り、実行する。
#dokcerを起動する。この際.envを読み込むので変更したら再読み込み
docker-compose up -d
#コンテナ内に入る
docker-compose exec terraform ash
#コンテナ内で下記を実行してエラーが発生しないか確認
terraform init
terraform plan
#問題なければapplyを実行
terraform apply
#実行結果の確認
terraform show
AWSにログインして下記のように表示されているのも確認できます。
※terraform管理のソースは基本terraformで削除も含めて実行します。
コンソールからいじると整合性がとれなくなるので注意です。
また、作成後terraform.tfstateファイルが作成されているのも確認できます。
こちらに構成情報が入ってます。
この構成情報はS3に保存できるようにできます。(今回は設定してません。)
さらにVPCにサブネットを追加します。
# VPCを作成する。
#AWSを今回は使いますと言う宣言
provider "aws" {
region = "ap-northeast-1"
}
#VPCのCIDERを記載します。
variable "vpc_cidr" {
default = "10.0.0.0/16"
}
#下記のresourceで使うタグ用の変数を定義
variable "app_name" {
default = "terraform-created"
}
#resourceでVPCを作成します。
resource "aws_vpc" "main" {
cidr_block = var.vpc_cidr
tags = {
Name = var.app_name
}
}
#上記のVPCにサブネットを追加します。
resource "aws_subnet" "public_1a" {
# 上記で作成したVPCを参照し、そのVPC内にSubnetを作成します。
vpc_id = "${aws_vpc.main.id}"
# Subnetを作成するAZ
availability_zone = "ap-northeast-1a"
cidr_block = "10.0.1.0/24"
tags = {
Name = "terraform-created-public-1a"
}
}
再度コンテナ内でterraform applyを実行し、subnetが追加されていれば成功です。