【IaC】Terraformでの AWS環境自動構築

技術ブログ
この記事は約10分で読めます。

はじめに

こんにちは。皆さんはIaCInfrastructure as Code)という言葉を聞いたことはありますか?

IaCとは「ITインフラをコードで記述し管理する手法」を示す言葉です。昨今のITシステムはクラウドや仮想技術が広く普及してきたことにより短期間で複数面環境(本番/ステージング/検証/開発など)を作成したり、環境のスクラップ&ビルドなど、ITインフラを短期間で構築、または環境の破棄・構築を繰返さなければならない場面も増えてきました。環境作成の際に作業ミスやドキュメント不備があれば、作成したインフラ環境には差異が出てしまいます。こういった場面でIaCを上手く活用できればインフラ環境の迅速かつミスのない作成ができるというわけです。

そんなIaCを実現する製品としては、TerraformAnsibleが有名です。

この2つは同じIaCを実現する製品として区分されますが、それぞれ得意領域が異なります。Terraformはインフラレイヤーに対する構成管理に優れ、AnsibleOSやミドルウェアのレイヤーに対する構成管理に優れているとされています。その評価の理由はそれぞれの処理アプローチがTerraformは宣言型、Ansibleは手続型である為です。本筋からは少し外れますが、以下に宣言型モデルと、手続き型モデルの違いについて簡単な概要を記載いたします。

処理モデル

概要

宣言型

処理が終わった時の「あるべき状態」をソースコードで表現する。依存関係や処理の流れを意識する必要なし。(インフラ管理に向いていると言われる所以)

手続型

処理の流れや手順をソースコードで表現する。依存関係や処理の流れを意識する必要あり。

今回はAWS上のリソースを対象にIaCを実現させたいため、宣言型のTerraformを利用してAWS環境上にVPCSubnetEC2を構築(最後に削除)するということを実践してみたいと思います。

<イメージ図>

 

準備・前提

AWSアカウントは作成済みであること。

参考( https://aws.amazon.com/jp/register-flow/ )

AWS上にTerraformで利用するアクセスキーの作成が完了していること。

Terraformのインストール

・公式サイト( https://www.terraform.io/ )へアクセスし、「ダウンロード」を選択します。

WindowsAMD64の「 Download 」を選択します。

DLされたzipファイルを展開し、「 terraform.exe 」を任意の場所に移動する

本記事ではC:\terraformとしますので変更する場合は以降の手順のパス等をご自身の環境情報に読み替えて下さい。

cmdプロンプトにて「 setx PATH “%PATH%;C:\terraform」のコマンドを実行します。

cmdプロンプトを開きなおし、「 terraform -version 」のコマンドが正常実行できることを確認します。

terraform.exeへのパスが通っていることを確認します。

AWS CLIのインストール

・公式サイト( https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html ) へアクセスし、Windowsのセクション内にある赤枠を選択しインストーラをDLします。

TerraformAWSを管理するためにはAWS CLIの導入が必要な為、併せて導入します。

DLされたmsiのファイルをダブルクリックしインストールを行います。

インストール時の設定等はすべてデフォルトでかまいません。

 

cmdプロンプトにて「 aws configure –profile terraform 」のコマンドを実行。

・対話形式で入力を求められるため以下をそれぞれ入力しEnterを押下します。

AWS Access key ID [None]: 事前準備のアクセスキーIDを入力

AWS Secret Access Key [None]: 事前準備のシークレットアクセスキーを入力

Default region name[None]: ap-northeast-1

Default output format [None]: (入力なしでそのままEnter)

cmdプロンプトにて「 aws s3 ls –profile terraform 」のコマンドを実行し、エラーが表示されないことを確認します。

AWSのアクセスキー、シークレットキーの設定に問題があればエラーが発生しますので、その場合はご自身のキー情報を確認してください。

Terraform管理構成ファイルの作成

・任意の場所(※)terraform作業用ディレクトリを作成します。

本記事ではデスクトップ上のterraform ディレクトリとします。

・以下4つのファイルを作成し、デスクトップ上のterraformディレクトリに保存します。

main.tf

# ———————————————

# Terraform configuration

# ———————————————

terraform {

  required_version = “>=1.6”

  required_providers {

    aws = {

      source  = “hashicorp/aws”

      version = “~> 5.0”

    }

  }

}

# ———————————————

# Provider

# ———————————————

provider “aws” {

  profile = “terraform”

  region  = “ap-northeast-1”

}

# ———————————————

# Variables

# ———————————————

variable “project” {

  type = string

}

variable “environment” {

  type = string

}

variable “vpc_address” {

  type = string

}

network.tf

# ———————————————

# VPC

# ———————————————

resource “aws_vpc” “vpc” {

  cidr_block                       = var.vpc_address

  instance_tenancy                 = “default”

  enable_dns_support               = true

  enable_dns_hostnames             = true

  assign_generated_ipv6_cidr_block = false

  tags = {

    Name    = “${var.project}-${var.environment}-vpc”

    Project = var.project

    Env     = var.environment

  }

}

# ———————————————

# Subnet

# ———————————————

resource “aws_subnet” “public” {

  vpc_id            = aws_vpc.vpc.id

  cidr_block        = “192.168.1.0/24”

  availability_zone = “ap-northeast-1a”

  tags = {

    Name = “${var.project}-${var.environment}-public-subnet”

  }

}

ec2.tf

# ———————————————

# EC2

# ———————————————

resource “aws_instance” “amazonlinux” {

  ami           = “ami-0b6e7ccaa7b93e898”

  instance_type = “t2.micro”

  subnet_id     = aws_subnet.public.id

  tags = {

    Name = “${var.project}-${var.environment}-ec2”

  }

}

terraform.tfvars

# terraform.tfvars

# 変数定義

project     = “mrp-sample”

environment = “dev”

vpc_address = “192.168.0.0/16”

Terraformでの構成管理(構築)

cmdプロンプトにて「 cd %HOMEDRIVE%%HOMEPATH%\desktop\terraform 」のコマンドを実行しディレクトを移動します。

cmdプロンプトにて「 terraform init 」のコマンドを実行し、「successfully initialized!」の表示を確認します。

カレントディレクトリにプロバイダがDLされ、管理ファイル(.hcl)が作成されます。

プロバイダ= terraformが構成管理するために必要なプラグインのようなものです。

cmdプロンプトにて「 terraform fmt 」のコマンドを実行します。

tfファイルのコード形式を整えるコマンド。修正対象がない場合は何も表示されません。

cmdプロンプトにて「 terraform validate 」のコマンドを実行し、「success! The configuration is valid.」の表示を確認します。

tfファイルのコード内容を検証するコマンド。エラーであれば内容を確認・修正します。

cmdプロンプトにて「 terraform plan 」コマンドを実行し、内容を確認します。

tfファイルの構成ファイルとtfstateファイルの内容を突き合わせて環境差分を表示します。

本記事の流れでは、tfファイル記載のリソースすべてが作成対象として表示されます。

cmdプロンプトにて「 terraform apply -auto-approve 」コマンドを実行し、「Apply complete!」を確認します。

AWSコンソールから画面を見てみましょう。

tfファイルに記載した条件のVPCSubnetEC2が作成されていれば成功です!

 

Terraformでの構成管理(削除)

cmdプロンプトにて「 terraform destroy 」コマンドを実行し、削除対象のリソースが表示され確認待ちとなるため、問題なければ「yes」を入力しEnterを押下します。

yes入力およびEnter押下後に「Destroy complete!」の表示を確認します。

AWSコンソールから画面を見てみましょう。さきほどで存在していたtfファイル記載のVPCSubnetEC2が削除されていれば成功です!

最後に

如何でしたでしょうか?筆者もこの記事執筆にあたって初めて使ってみましたが、作成したい構成のコードだけ作成すれば、インフラ構築の厄介な部分である依存関係・順序性についてはTerraformがよしなに処理してくれるというのは思った以上に便利で久々の感動がありました。規模の大きいインフラ構成をコード化するのには、それなりに工数がかかるであろうということは予想できるものの、一度作ってしまえば記事冒頭に記載した様々なシチュエーションにも対応が可能なため、今後は積極的に活用していきたいと思います。

それでは、また!!