Terraformを使ってクラウドインフラ構築

カバー

目次

  • はじめに
  • Terraformとは
  • IaCを導入するメリット
  • Terraformの優れた特徴
  • Terraformのインストール
  • コードを作成する
    • 初期化処理(terraform init)
    • デプロイによる構成変更内容を確認する(terraform plan)
    • デプロイ(terraform apply)
  • リソースを変更してみる
  • まとめ
  • 参考リンク

はじめに

クラウドインフラを活用したシステム構築は普及が進んでいると思いますが、それでもインフラの構築・運用をいまだにコンソールで手動実行しているケースも少なくないのではないでしょうか。
私が現在従事しているプロジェクトでは、インフラ構築はすべてIaCツールであるTerraformコードで管理しています。
当プロジェクトでは様々な業務部門システムのインフラを刷新・最適化する目的のため、類似した構成の環境を複数作成する必要があります。
こういった場合、手動での構築は骨が折れます。そのため、コードの再利用と環境の再現性といった面でTerraformは有効です。

この記事ではTerraformの導入についてご説明していきます。
Terraformの便利なところや、簡単に導入できることを知っていただき、Terraform導入のきっかけになればと思います。

Terraformとは

HashiCorp社によって提供されているオープンソースのIaCツールです。

【Terraform】

Terraformを使えばAWSをはじめとしたクラウドインフラを自動で構築・管理することができます。

IaCを導入するメリット

  • ヒューマンエラーの回避
    手動操作ではヒューマンエラーが発生するリスクが高く、リソースの設定ミスや環境構築の手順漏れがシステム全体の信頼性を損なう原因となる可能性があります。しかし、インフラをコード化することで、これらのリスクを軽減することができます。

  • 運用コストの削減
    ブラウザの管理コンソール上から手動でリソースを選択して設定を行う場合、大量のリソースを迅速にデプロイすることは難しいですが、 IaCであれば数コマンドで簡単に行えます。

  • 環境の再現性
    例えば既にある環境から類似した構成の環境を作る場合、手動では同じ構成を再現するとしても一から環境を作成するのと変わらない労力がかかります。
    また、手動では設定のばらつきやミスが生じやすく、同じ構成を正確に再現することは難しいです。
    IaCであればコードを共有したり、一部を流用して同様の環境やリソースを再現することができます。

  • 構成、設定の可視化
    IaCであれば構成や設定はテキストベースの管理となるため、Gitなどと連携することで変更差分も簡単に追跡できます。

Terraformの優れた特徴

  • Terraformはマルチプラットフォームに対応しています。異なるプロバイダーでも同じ言語で管理できます。
    以下のようなプラットフォームに対応しています。
    • AWS
    • Microsoft Azure
    • Google Cloud Platform
    • VMWare
    • Kubernetes
    • 各種SaaS/PaaS

terraformのイメージ
※出所:What is Infrastructure as Code with Terraform? (HashiCorp)

  • Terraformを使用すると、デプロイメント全体にわたってリソースの変更を追跡できます。

  • 構成をバージョン管理にコミットして、安全に共同作業を行うことができます。

Terraformのインストール

ここからは実際にTerraformを使ってAWSにリソースを構築してみます。
Terraformをインストール、コードの作成、Terraformのコマンド実行の順に作業を行っていきます。
早速ですが、Terraformをインストールしてみましょう。 tfenv 1 を使ってWindows端末にTerraformをインストールしていきます。

Terminal window
$ git clone --depth=1 https://github.com/tfutils/tfenv.git ~/.tfenv
$ echo 'export PATH=$PATH:$HOME/.tfenv/bin' >> ~/.bashrc
$ source ~/.bashrc

Terraformのバージョンを指定してインストールします。

Terminal window
$ tfenv install 1.6.3 # ver 1.6.3 をインストールする場合
$ tfenv install latest # 最新バージョン をインストールする場合

使用するバージョンを指定します。

Terminal window
$ tfenv use 1.6.3 # ver 1.6.3 を使用する場合
$ tfenv use latest # 最新バージョン を使用する場合

Terraformのバージョンが確認できればインストール完了です。

Terminal window
$ terraform -- version

コードを作成する

コードを作成してみましょう。
TerraformではHCL(HashiCorp Configuration Language)という言語でコーディングしていきます。

コードはシンプルで、

resource "AWSリソース名" "任意の名前" {
"プロパティ名"""
}

といった形で簡単にリソースの定義が行えます。

以下は公式が公開しているサンプルです。
ここでは任意のフォルダにファイル名「test.tf」で作成しましょう。

terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 3.27"
}
}
required_version = ">= 0.14.9"
}
provider "aws" {
profile = "default"
region = "us-west-2"
}
resource "aws_instance" "app_server" {
ami = "ami-830c94e3"
instance_type = "t2.micro"
tags = {
Name = "ExampleAppServerInstance"
}
}

初期化処理(terraform init)

同フォルダで以下のコマンドを実行し、Terraform実行前の初期化を行います。

Terminal window
$ terraform init

デプロイによる構成変更内容を確認する(terraform plan)

terraform planコマンドを実行して、今回の構成変更内容を確認します。

Terminal window
$ terraform plan

terraform plan は、現在の状態から目的の状態への変更内容を確認するコマンドです。
実際のインフラには変更を加えず、どのような変更が行われるかをプレビューできます。
個人的にはこれが強力で便利な機能だと思います。デプロイの前に実際のインフラ変更を加えず、変更後の設定確認を促し、設定の不足やリソース間に矛盾などがあればエラーとして指摘もしてくれます。

Terminal window
Terraform used the selected providers to generate the following execution plan.
Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# aws_instance.app_server will be created
+ resource "aws_instance" "app_server" {
+ ami = "ami-xxxx"
+ arn = (known after apply)
+ associate_public_ip_address = (known after apply)
+ availability_zone = (known after apply)
+ cpu_core_count = (known after apply)
+ cpu_threads_per_core = (known after apply)
+ disable_api_stop = (known after apply)
+ disable_api_termination = (known after apply)
+ ebs_optimized = (known after apply)
+ get_password_data = false
+ host_id = (known after apply)
+ host_resource_group_arn = (known after apply)
+ iam_instance_profile = (known after apply)
+ id = (known after apply)
+ instance_initiated_shutdown_behavior = (known after apply)
+ instance_lifecycle = (known after apply)
+ instance_state = (known after apply)
+ instance_type = "t2.micro"
+ ipv6_address_count = (known after apply)
+ ipv6_addresses = (known after apply)
+ key_name = (known after apply)
・・・
Plan: 1 to add, 0 to change, 0 to destroy.

今回はEC2をデプロイするだけなので add(追加)のリソースが1、change(変更)が0、destroy(削除)が0と出力されることがわかります。

Plan: 1 to add, 0 to change, 0 to destroy.

ここでまず追加、変更のリソース数といったデプロイの概要を確認しつつ、詳細はリソース毎の差分を確認し、問題がなければデプロイを行います。

デプロイ(terraform apply)

それではデプロイしてみましょう。 terraform applyコマンドでデプロイします。

Terminal window
$ terraform apply
aws_instance.app_server: Creating...
aws_instance.app_server: Still creating... [10s elapsed]
aws_instance.app_server: Creation complete after 13s [id=i-xxxx]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

AWSコンソールを見てみるとEC2インスタンスが作成されていることがわかります。
terraform apply

このように、ちょっとしたコードを書くだけで簡単にリソースが構築できます。
同様のリソースを作る場合は、このコードを共有したり流用することで構築実績のあるリソースを安全に再現できます。

リソースを変更してみる

今度は作成したEC2インスタンスのインスタンスタイプを変更してみましょう。

instance_type = "t2.small" # t2.micro → t2.small へ変更

terraform planを実行してみます。

Terminal window
Terraform will perform the following actions:
# aws_instance.app_server will be updated in-place
~ resource "aws_instance" "app_server" {
id = "i-080d2acee00cf2569"
~ instance_type = "t2.micro" -> "t2.small"
tags = {
"Name" = "ExampleAppServerInstance"
}
# (30 unchanged attributes hidden)
# (8 unchanged blocks hidden)
}
Plan: 0 to add, 1 to change, 0 to destroy.

Planがadd から change に代わり

Plan: 0 to add, 1 to change, 0 to destroy.

インスタンスタイプの変更が明示されています。

~ instance_type = "t2.micro" -> "t2.small"

デプロイするとすぐにリソース変更が適用されていることがわかります。

Terminal window
$ terraform apply
・・・
Apply complete! Resources: 0 added, 1 changed, 0 destroyed.

terraform apply

今回はEC2のインスタンスタイプのみの変更でしたが、TerraformではAWSマネジメントコンソールで設定可能なパラメータやコンソール上では見えない細かな設定も変更できます。
詳細は公式リファレンスをご覧ください。

まとめ

如何でしたでしょうか。
今回は単一リソースを構築する例でしたが、Terraformのインストールからリソースのデプロイまでが容易に実行できることをお伝えできたかと思います。
次回は一般的なシステム構成を踏まえた、より実践的な例をご紹介します。

参考リンク

【Terraform】
【Terraform でIaC】
【Terraformリファレンス(AWS)】

Footnotes

  1. Terraformのバージョン管理ツール


TOP
アルファロゴ 株式会社アルファシステムズは、ITサービス事業を展開しています。このブログでは、技術的な取り組みを紹介しています。X(旧Twitter)で更新通知をしています。