この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。
はじめに
皆様こんにちは。株式会社協栄情報システム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」など、他にも種類があります。
ツールによって特徴が様々なので、使用用途や試したいツールを使用するとおもしろいと思います。