Terraformとは
Terraformは、HashiCorp社によって開発された、インフラをコードによって管理するIacを支援するオープンソースのプロビジョニングツールです。
Terraformによってクラウドやオンプレミスなどのプラットフォームを問わず、インフラをコード化することで設定の矛盾やミスを排除し、素早いインフラの構築や複製が容易になります。
【参考】:Terraform公式
IaCとは
IaCとは「Infrastructure as Code」の略で、「コードとしてのインフラ」という意味を持つ言葉です。IaCにはリソースを構築する手順を記述していく手続き型と、リソースの状態を記述する宣言型の2つの型があり、Terraformは宣言型のIaCツールです。
インフラ管理手法の変遷
従来は、オンプレミスと呼ばれるデータセンター内に物理的なインフラを構築する方式が主流で、インフラの構築や設定は手順書に従って手動で実施していました。
スクリプトによる自動化の試みもされていましたが、自動化の範囲が限定されてしまうことや、スクリプトの管理やメンテナンスを怠ると予期せぬ障害の原因になったり、業務の属人化によりスクリプトがブラックボックス化したりといった難点がありました。
現在はAWSをはじめとしたクラウドプラットフォームがシェアを伸ばしており、複数のパブリッククラウドを併用するマルチクラウド環境も珍しくはなくなってきました。
クラウド上のリソースは、オンプレミスと比較して調達・廃棄・拡張・縮小が容易なため、需要予測をせずにスモールスタートできるなどサービス提供のスピードが大幅に加速します。
そのため、従来の手動操作やスクリプトによる部分的な自動化といった手法では大量の作業を素早く行うことを要求するクラウドのスピード感についていけなくなっているのです。
それらの課題を解決したのがIaCです。インフラをコード化することで、コマンド1つで大規模なデプロイや変更を正確に、短時間で自動的に実行できます。
Terraform以外のIacツールとの比較
IaCを実現するツールはTerraformだけではありません。有名なところではChef・Puppet・Ansibleなどがありますし、AWSのCloudformationなど、クラウドベンダでも独自のIaCサービスを展開しています。
では、それらの競合ツールと比較した場合、Terraformの強みとはなんでしょうか。ここでは、AnsibleやAWS Cloudformationと比較してTerraformのメリットを解説します。
Ansibleとの違い
TerraformとAnsibleは同じIaCを提供するツールですが、何が違うのでしょうか。結論から言えば、2つは競合するツールではなく、お互いに補完しあう関係にあります。
Ansibleは手続き型のアプローチを取る構成管理ツールで、1つ1つのリソースの設定作業や、ソフトウェアのインストールといった設定手順を自動化するのが得意分野です。
これに対して、Terraformは宣言型のアプローチを取るオーケストレーションツールです。全体のアーキテクチャを定義する機能に優れており、Ansibleが得意とする個別の設定手順の自動化は苦手です。
このように、TerraformとAnsibleでは得意とする範囲が違うため、Terraformでインフラを定義し、Ansibleで設定を管理するというように併用するのがベターです。
【参考】:Ansible
AWS Cloudformationとの違い
各クラウドベンダでも独自のIaCサービスを開発しており、AWSではCloudformationが提供されています。Cloudformationは言うまでもなくAWSリソースを扱うことに最適化されており、AWSリソースのみを扱う場合はCloudformationに軍配が上がります。
これに対して、Terraformはマルチプラットフォームに特化しており、複数のクラウドプラットフォームやオンプレミスといった異なる環境が混在する場合でも、Terraform1つで管理できるという強みがあります。
現在はAWSのみでも、将来的にマルチプラットフォームを見据えているという場合も、コードを流用しやすいTerraformを選択するメリットがあります。
また、Terraform自体はGo言語で開発されているオープンソースソフトウェアであるため、OSを問わず利用できます。
【参考】:Cloudformation
Terraformの機能
Terraformには、IaCをより便利にするための機能がいくつも備わっています。代表的なものに絞って解説します。
Terraform独自の言語、HCLとは
Terraformでは、HashiCorp Config Languageという独自の言語を用いてコードを記述します。HCLはHashiCorp社が独自に開発した言語ですが、JSONと互換性があるため、JSONの知識があれば理解しやすいでしょう。
なお、必ずしもHCLを使わなければいけないわけではなく、JSONにコンバートすることも可能です。
【参考】Terraform公式-Terraform Language Documentation
Terraformのモジュールとは
Terraformで作成したコードは、モジュールというテンプレートにすることができます。例えば、サーバを作成するコードをモジュールにしておけば、同じサーバを1つのソースコードから複数作成することが可能になります。
また、モジュールにはパラメータの指定ができるため、同じモジュールから起動したサーバの設定をパラメータで少し変更する、といったことも可能です。
Terraformのインポートとは
Terraformではインフラをコードで定義できると説明しましたが、既存のリソースをインポートしてコード化することもできます。例えば、AWS環境上に存在する仮想サーバをimport機能によってTerraformの管理下に置くことが可能です。
ただし、import機能ではリソースの状態をコードとして保存しますが、構成までは反映されません。そのため、全く同じ状態にはならないので差分を吸収する作業が必要です。
Terraformのワークスペースとは
Terraformでインフラを作成したり変更を加えたりする際に、いきなり本番環境に適用するのではなく、一旦テストをしたいということがあると思います。ワークスペースを利用すれば、同じコンフィグファイルを使ってテスト用の環境に適用して影響を確認することが可能になります。
Terraformのプロバイダーとは
Terraformにおけるプロバイダーとは、TerraformとクラウドやSaaSサービス、その他のAPIとを繋ぐプラグインのことを指します。Terraformでは、まず必要となるプロバイダーを宣言します。プロバイダーの役割は、Terraformが管理できるリソースタイプやデータソースを追加することです。
現在は、AWSをはじめとした殆どのクラウドプラットフォーム用プロバイダーが存在する他、現時点ではプロバイダーが存在しないプラットフォームに関しては独自に作成することもできるため、Terraformは実質的にあらゆるインフラを管理することができると言えます。
AWSとの連携方法
Terraformの活用例として、AWSのリソースをTerraformで管理する方法について解説します。AWSには、ブラウザベースの統合開発環境であるAWS Cloud9というサービスがあります。
Cloud9は、コードエディター・デバッガー・ターミナルなどの機能が備わっている上、Terraformも使用可能であり、Terraformの学習にも最適です。
【参考】AWS公式-AWS Cloud9
AWS Cloud9でTerraformを利用する方法
まずは、お持ちのAWSアカウントにログインして、AWS Cloud9で作業環境を作成します。AWSでは最小権限の原則を推奨しているため、AWSCloud9Administratorの権限のみを付与したIAMユーザーを作成して使用することをおすすめします。
ログインできたら、AWSマネジメントコンソールからCloud9を検索してCloud9の管理画面にアクセスします。管理画面でCreate environmentをクリックして、ウィザードに従って必要な情報を入力し、環境を作成します。
テスト目的の利用であれば、設定する項目はNameのみで構いません。
tfファイルを作成する
Cloud9が起動したら、Terraformのリソース定義ファイルであるtfファイルを作成します。今回は、例としてAWSの最も基本的なネットワークリソースであるVPCを作成します。
Cloud9のターミナルで以下のコマンドを実行して、ファイルを作成します。
vi aws_vpc.tf
ファイル内に、以下のコードを入力して保存します。
provider "aws" {
region = "ap-northeast-1"
}`
resource "aws_vpc" "test_vpc" {
cidr_block = "10.0.0.0/16"
enable_dns_hostnames = true
}
「provider」ではプロバイダーとしてawsを定義しています。そして、「resource」でどのようなリソースを作成するかを定義します。AWSプロバイダーで作成が可能なAWSリソースは以下のURLを参照してください。
なお、他のリソースも作成したい場合は、すべてのリソースを1つのファイルに記述することもできますが、管理のしやすさを意識してサービス単位など複数ファイルに分けて作成することをおすすめします。
Terraformコマンドを実行してリソースを作成する
それでは、実際にTerraformコマンドを実行してリソースを作成してみましょう。まずは、ターミナル上で以下のコマンドを実行します。
terraform init
このコマンドは、Terraformの実行に必要なコマンドをインターネットから取得します。実行結果が「Terraform has been successfully initialized!」と表示されれば成功です。
続いて、以下のコマンドを実行してtfファイルの構文に問題がないことを確認します。構文エラーが出力される場合はエラーメッセージに従って修正し、再度実行してください。実行結果に「Success! The configuration is valid.」と表示されれば構文チェックは完了です。
terraform validate
なお、以下のコマンドを実行するとコードのインデントを自動的に修正してくれます。構文チェックの前に実行しておくことをおすすめします。
terraform fmt
構文に問題ないことを確認したら、以下のコマンドを実行します。
terraform apply
このコマンドを実行すると、まずTerraformによって作成・変更されるリソースの一覧が表示されます。
新規リソースが追加される場合は「+ create」、既存のリソースに変更が加わる場合は「~ update in-place」、既存のリソースが削除される場合は「- destroy」、リソースの再作成が発生するものは「-/+ destroy and then create replacement」で表現されます。
内容に問題がないことを確認したら、「Enter a value:」の欄にyesと入力し、エンターを押下して実行します。
実行結果に「Apply complete!」と表示されていればコマンドは成功です。実際に作成されたリソースをAWSマネジメントコンソールにログインして確認しましょう。
リソースの削除
Terraformで作成したリソースを削除するには、以下のコマンドを実行します。
terraform destroy
実行結果に「Destroy complete!」と表示されていればコマンドは成功です。実際に削除されたリソースをAWSマネジメントコンソールにログインして確認しましょう。
以上で、AWSとTerraformの連携方法についての解説は終了です。Terraformを用いてAWS上にリソースを構築する方法や、削除する方法が分かれば、クラウド環境のIaCを学ぶ上で初めの一歩を踏み出せたことになります。
Terraformの勉強法
Terraformの知識や技術を身に付けるには、まずTerraformで管理したいプラットフォームの知識を身に付けることが大事です。例えば、AWSのリソースを管理したいなら、まずはAWSの知識を学ぶ必要があります。
また、分からないことがある場合は公式ドキュメントをチェックしましょう。Terraformは現在進行形で開発が進められているオープンソースソフトウェアなので、常に最新の情報に更新されている公式ドキュメントが最も信頼性が高いです。
日本語へのローカライズはされていませんが、ブラウザ翻訳でもある程度読めると思いますので、是非チェックしてみてください。
Terraformを学んであらゆるプラットフォームのIaCを担える人材に
今後もオンプレミスとクラウドのハイブリッド環境や、複数のクラウドプラットフォームのそれぞれの強みを活かしたマルチクラウド環境が増えていく可能性があります。
Terraformを学べば、どのような環境にもIaCを実現できるため、学習コスト対効果は非常に高いと言えます。積極的に活用して、プラットフォームを選ばないマルチな人材を目指しましょう。
編集部オススメコンテンツ
アンドエンジニアへの取材依頼、情報提供などはこちらから