dockerでterraform環境を構築して、AWSにVPCを作る。

docker terraform


作業手順

  • 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社の出している公式のイメージのバージョンは下記より

https://releases.hashicorp.com/terraform/

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が追加されていれば成功です。