公開日:2022.07.11 更新日:2022.08.24

Terraform を用いたIaC(Infrastructure as Code)入門

 

Terraform を用いたIaC(Infrastructure as Code)入門

Terraformとは

インフラリソースをコードで定義して管理することをInfrastructure as Code(IaC)と呼びます。

Terraformは、HashiCorp社により開発されているオープンソースのIaCツールであり、クラウドを扱うIaCツールとしてデファクトスタンダードの地位を確立しています。
Terraformを使用すると、AWSやGCPなどのクラウドサービス上のインフラ環境(Webサーバーやデータベースなど)をコードで定義し、コードに基づいたインフラ環境を自動構築することができます。また、コードを見るだけでインフラの構成内容を理解できるようになりますし、インフラ環境もGitなどのツールでバージョン管理ができるようになります。
結果として、Terraformを利用することでオペレーションミスが無くなるほか、実体とドキュメントの二重管理から解放され、複数システムでコードを再利用することで効率化を図ることが出来ます。様々なリソースが必要となる場合に、手動で行うよりもアジリティの高いインフラ開発が可能になります。

Ansibleとは

AnsibleもIaCツールとしてはという有名でよく使われます。
Terraformはインフラ構築(サーバ/DB、ネットワーク設定)を得意とするIaCツールであるのに対し、Ansibleはアプリケーション環境の構築(ミドルウェアの導入、アプリデプロイ)を得意とします。
TerraformとAnsibleにはそれぞれ得意とするプロビジョニングレイヤが異なりますので、双方を効果的に使い分けることでIaCの効果を最大化することが出来ます。

その他のIaCツール

Terraformと同様にインフラ構築に強みを持つツールとしてGoogle Cloud Deployment ManagerやAWS CloudFormation、Azure Resource Managerなどが存在します。これらのツールはそれぞれのクラウドベンダーが自社サービスを扱うために開発されたツールですので、マルチクラウド環境においてはコードを統一して管理することが出来ません。その点、Terraformであれば1つのツールで複数のクラウドに対応可能なので、一貫性のある効率的な運用が可能となります。

 

Terraformの基本操作

TerraformのコードはHCL(HashiCorp Configuration Language)という言語で実装します。
(HCLはHashiCorp社が設計した言語)

init

Terraformのコードが格納されるディレクトリで「terraform init」コマンドを実行すると、リソースに必要なバイナリファイル(プロバイダなど)がダウンロードされます。

plan

「terraform plan」コマンドを実行するとどのような変更を実行するかという実行計画が出力されます。このコマンドにより、実際のリソースに変更を加えることなく、一連の変更の実行計画が正しいかどうかを確認することができます。

apply

「terraform apply」コマンドを実行するとplan の結果が表示され、最終確認が行われます。yes と入力するとリソース作成が行われます。

destroy

「terraform destroy」コマンドを実行するとapply と同様にplan の結果が表示され、最終確認が行われます。yes と入力すると作成されたリソースが削除されます。

Terraformのファイル構成

Terraformでは、tfファイル(拡張子が.tf)で定義された情報に従って各種リソースを構築します。
単一ファイルにすべてを定義することも可能ですが、分離することが一般的です。
標準構造に従った最小限の推奨モジュール構成として以下の構成が定められています。
.
├── README.md
├── main.tf
├── variables.tf
├── outputs.tf

(参考)Terraform公式サイト

README.md

tfファイルで定義したリソースについての説明ドキュメントとして用意します。作成されるリソースについての説明等を記述します。

main.tf

リソース定義(ファイル名は任意)を行うファイルです。以下のような項目をブロックを分けて定義します。

 

  • resourceブロック

作成するクラウドリソースを指定します。以下はAWSでEC2リソースを指定する場合の例です。
「resource “<リースの種類>” “<リソース名>” {}」という構文で定義します。
リソースの種類を指定する例として、VPCの場合は「aws_vpc」、セキュリティグループの場合は「aws_security_group」のように指定します。

  1. resource "aws_instance" "web_server" {
  2.     instance_type = "t2.micro"
  3.     ami = "ami-00000000000000000" 
  4. }

 

  • providerブロック

構築するリソースのプロバイダー情報を記載します。
プロバイダはAWS、GCP、AzureなどのAPIの違いを吸収するラッパの役割を果たします。
以下はAWSのリソースを作成する場合の例です。
provider には”aws”を定義し、regionには、リソース構築先のAWSリージョンを指定します。
プロバイダはTerraform本体とは別で管理されており、terraformm init コマンドで、指定したプロバイダのバイナリファイルをダウンロードする必要があります。

  1. provider "aws" {
  2.     region = "ap-northeast-1"
  3. }

 

  • moduleブロック

Terraformコードを分割してモジュール化する仕組みがあり、以下のように定義することができます。
モジュールごとにディレクトリを分ける必要があり、モジュール定義では対象のディレクトリを指定します。

  1. module "network" {
  2.   source = "./network"
  3. }

variables.tf

インプット変数情報を「variable」として定義します。
インプット変数は関数の引数のようなもので、これを使用することで、main.tfなどのモジュールのソースコードを変更せずにカスタマイズが可能です。
type として変数に受け入れられる値の型(string, number, list)を指定します。また、default にはTerraformを実行するときに値が設定されていない場合に使用する値を指定します。

  1. variable "availability_zone_names" {
  2.   type = list(string)
  3.   default = ["us-west-1a"]
  4. }

outputs.tf

アウトプット変数情報を「output」として定義します。
モジュール外から値を取得する場合や、apply時にターミナルに値を出力したい場合に使用します。

tfstateファイル

apply 実行時にTerraformが自動的に.tfstateファイルを生成します。このファイルにはクラウドリソースの現在の状態が記録されます。tfファイルとtfstateファイルの差分を見ることで必要な更新のみが行われるようになります。

 

まとめ

Terraformの概要や基本コマンド/ファイル構成についてご紹介しました。Terraformのより詳細な使い方につきましては公式ページのドキュメントをご確認ください。
IaCツールを使用してインフラをコード管理する場合、アプリケーション開発と似たような観点でファイル構成やモジュール化を検討する必要があります。管理対象のシステムの規模に応じて、再利用性や保守性を考慮した設計とすることで、より高度なインフラ開発が可能になります。

 

システム開発、アプリ開発、新規事業立ち上げ、DX化の推進でお困りではありませんか?

日本全国には開発会社が無数にありますが、Webサービスやアプリサービスのスケール(規模拡大)を実現するビジネス推進力やシステムの堅牢性、可用性を意識した設計力・技術力を合わせ持つ会社は、全国で見ても多くはなく、弊社は数少ないその一つ。お客様のご要望通りに開発することを良しとせず、お客様のビジネス全体にとって最適な解を模索し、ご提案ができるビジネス×テック(技術力)×デザインの三位一体型のシステム開発/アプリ開発会社です。ITやDX全般に関して、何かお困りのことがございましたら下記の「GeNEEへのお問合せ」フォームからお気軽にご連絡いただけたらと思います。

 

GeNEEの会社概要

GeNEEの特徴

GeNEEの提供サービス一覧

GeNEEの開発実績

GeNEEからお知らせ

GeNEE発信コンテンツ

GeNEEへのお問合せ

GeNEE社に関する資料をダウンロード

人気の記事
Related
  • メディア
  • Terraform を用いたIaC(Infrastructure as Code)入門
↑