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 ashIAMユーザーを作成する
terafformと言うユーザー名でAdministratorAccessポリシーをアタッチする。

作成したアクセスキーとシークレットアクセスキーを.envに書き込む
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=terraformの基本的なコマンド
terraformのワークスペースの初期化
terraform initterraformの実行計画の確認
terraform plan.tfに記述された情報を元にリソースを作成するコマンド
terraform applyapplyで実行した結果を見る方法
terraform showコードを自動整形してくれる機能
terraform fmtterraformの基本的な構成
*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 showAWSにログインして下記のように表示されているのも確認できます。
※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が追加されていれば成功です。