はじめに

皆様こんにちは。株式会社協栄情報システム3部所属の比嘉です。
Terraformに触れる機会に恵まれましたので、概要と使用方法について記事を作成しました。

IaCとは

IaCとは Infrastructure as Codeの略称で、インフラのコード化、自動化のことを言います。
IaCには下記のメリットがあります。

  • 人の手によるミスを防止
  • 設計書の管理コストを削減
  • クラウドの設計コストを削減

Terraformとは

Terraformとは、IaCツールの1つで、HashiCorp社により開発されているオープンソースのインフラ自動構築ツールです。Terraformには下記の特徴があります。

  • マルチクラウドに対応している
  • HCL(HashiCorp Configuration Language)という独自の構成言語を使用
  • リソースの集まりのコードをモジュール化することができる(一度使ったものを再利用できる)
  • Terraform Registryというサービスでは、他の開発者が公開したモジュールを使うことができる
  • 開発が活発に行われており、バージョンアップが頻繁にある

料金

利用については無料です。Terraform Cloudというサービスではチーム以上のプランを選ぶ場合は課金されます。

使用方法

開発環境を構築する

本記事では、実際にTerraformを用いてAWS上にリソースを作成することを目指していきます。
Cloud9を利用して、Terraformを実行するための開発環境を構築します。
AWS Cloud9はブラウザ上で操作が出来る統合開発環境で、環境の作成が非常に簡単です。
また、Cloud9には最初からTerraformがインストールされているため、いきなりコードを書き始めることが出来ます。

Name(環境名)、Description(説明)を入力し、Next Stepをクリックします。

Configure settingsは特に何も変更せずにNext Stepをクリックし、設定内容を確認後、Create environmentをクリックします。

Cloud9が立ち上がるまで待機します。下記のような画面がブラウザ上に表示されます。

Cloud9上に$ terraform -vコマンドを実行し、インストールされているTerraformのバージョンを確認します。

コードを作成する

今回はVPCサービス(VPC、サブネット、インターネットゲートウェイ、ルートテーブル、セキュリティグループ)をTerraformで構築することをゴールとします。

Terraformでは、拡張子が.tfのファイルにリソース定義をしていきます。
ファイル名は自由に付けることが可能で、1つの巨大なファイルに全てのリソースを記載した場合と、細かく分割したtfファイルにリソースを分割して記載した場合で実行結果に差異はありません。
ファイル構成はAWSサービス毎に分割する方が管理しやすくなります。

コードを作成していきます。$ mkdir terraform && cd terraformコマンドでCloud9上に作業用のディレクトリを作成し、そこに移動します。
次に下記コマンドを実行して、「aws_higa_test_vpc.tf」「provider.tf」ファイルを作成します。

$ touch provider.tf
$ touch aws_higa_test_vpc.tf

provider.tf

provider.tfに下記のコード記述します。

provider "aws" {
  region = "ap-southeast-1"
}

provider.tfには、構築するリソースのプロバイダー情報を記述します。今回はAWSのリソースを作成するためprovider "aws"を定義しています。
regionには、リソース構築先のAWSリージョンを指定します。今回はシンガポールリージョン(ap-southeast-1)を指定しています。

aws_higa_test_vpc.tf

aws_higa_test_vpcには、VPCのコードを記述します。リソースを記述する場合、下記のようなコードを記述します。

resource "リソースの種類" "リソース名" {
    設定項目1 = 設定値
    設定項目2 = 設定値
    設定項目3 = 設定値
}

「リソースの種類」に記述する内容は、Terraformで事前定義されているものを指定する必要があります。例えばVPCを定義したい場合は「aws_vpc」を記述します。

リソースの種類については、下記の公式ドキュメントで確認が可能です。
https://registry.terraform.io/providers/hashicorp/aws/latest/docs

実際にTerraformでVPC、サブネット、インターネットゲートウェイ、ルートテーブル、セキュリティグループを作成していきます。

#----------------------------------------
# VPCの作成
#----------------------------------------
resource "aws_vpc" "higa_test_vpc" {
  cidr_block           = "10.0.0.0/16"
  enable_dns_hostnames = true

  tags = {
      Name = "higa_test_vpc"
  }
}

#----------------------------------------
# サブネットの作成
#----------------------------------------

# パブリックサブネットの作成
resource "aws_subnet" "higa_test_Public-subnet-1" {
  vpc_id                  = aws_vpc.higa_test_vpc.id
  cidr_block              = "10.0.1.0/24"
  availability_zone       = "ap-southeast-1a"
  #パブリック IPv4 アドレスの自動割り当て
  map_public_ip_on_launch = true

    tags = {
      Name = "higa_test_Public-subnet-1"
  }
}

# プライベートサブネットの作成
resource "aws_subnet" "higa_test_Private-subnet-2" {
  vpc_id                  = aws_vpc.higa_test_vpc.id
  cidr_block              = "10.0.2.0/24"
  availability_zone       = "ap-southeast-1a"

  tags = {
      Name = "higa_test_Private-subnet-2"
  }
}

#----------------------------------------
# インターネットゲートウェイの作成
#----------------------------------------
resource "aws_internet_gateway" "higa_test_internet-gateway" {
  vpc_id = aws_vpc.higa_test_vpc.id

  tags = {
      Name = "higa_test_internet-gateway"
  }
}
#----------------------------------------
# ルートテーブルの作成
#----------------------------------------

#  パブリックサブネットのルートテーブルの作成
resource "aws_route_table" "higa_test_Public-rtb" {
  vpc_id = aws_vpc.higa_test_vpc.id
  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_internet_gateway.higa_test_internet-gateway.id
  }

  tags = {
      Name = "higa_test_Public-rtb"
  }
}

#----------------------------------------
# サブネットにルートテーブルを紐づけ
#----------------------------------------

# Publicサブネットにルートテーブルを紐づけ
resource "aws_route_table_association" "higa_test_Public-rtb" {
  subnet_id      = aws_subnet.higa_test_Public-subnet-1.id
  route_table_id = aws_route_table.higa_test_Public-rtb.id
}

#--------------------------------------
# セキュリティグループの作成
#----------------------------------------
resource "aws_security_group" "higa_test_sg" {
  name   = "higa_test_sg"
  vpc_id = aws_vpc.higa_test_vpc.id
  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
  egress {
    from_port   = 0
    to_port     = 0
    #protocol    = "-1" は "all" と同等
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }

  tags = {
      Name = "higa_test_sg"
  }
}

上記コードでは、設定値がハードコーディングされている部分と、他のリソースを参照している部分に分かれています。
サブネットのcidr_blockは10.0.1.0/24という値がハードコーディングされていますが、サブネットのvpc_idは、VPC作成後でないと値がわかりません。
このような場合は、aws_vpc.higa_test_vpc.idといった値を設定します。

リソースを作成する

コードの作成が完了したので、いよいよAWS環境上にリソースを構築していきます。
リソース作成の実行はterraformコマンドを利用します。
terraformコマンドを実行するためには、コマンドを実行する環境からインターネットへのアクセスが可能である必要があります。また、リソースを作成するためのAWSの権限設定も必要です。

まず、下記のコマンドを実行し、初期化を行います。

$ terraform init


このコマンドでTerraformの実行に必要なプラグインをインターネットから取得します。
実行結果にTerraform has been successfully initialized!と表示されていれば成功です。

次に下記のコマンドを実行し、変更内容を確認します。

$ terraform plan


現在のコードの状態と今管理されているtfstateの内容を比較して、差分内容を出力します。
今回は既存リソースの設定変更ではなく、全て新規リソースの作成となるため、表示されている内容が全て+ createとなっています。

下記のコマンドでコードのインデントを自動で整形することができます。

$ terraform fmt

下記コマンドを実行します。

$ terraform apply


先に$ terraform planで確認した内容が実行されます。

構築内容に問題が無いことを確認後、Enter a value:にyesと入力します。(yes以外を入力するとapplyがキャンセルされます。)


Apply complete! Resources: 7 added, 0 changed, 0 destroyed.と出力されましたので、applyは成功しました。

AWS マネジメントコンソールの確認

マネジメントコンソール画面からVPCサービスが作成されているか確認します。
下記からVPCが作成されていることが確認できます。

同様に、サブネット、インターネットゲートウェイ、ルートテーブル、セキュリティグループも作成できていました。

最後に

今回の記事は下記の記事参考にしました。
https://blog.dcs.co.jp/aws/20210401-terraformaws.html

記事ではTerraformの紹介をしましたが、他のIaCツールとして、「AWS CloudFormation」「AWS CDK」「Pulumi」など、他にも種類があります。
ツールによって特徴が様々なので、使用用途や試したいツールを使用するとおもしろいと思います。

Last modified: 2022-05-20

Author