Terraform基礎 #1 - はじめに

Last Edited: 7/1/2025

このブログ記事では、Terraformを始めるために必要な基本的な概念を紹介します。

DevOps

このDevOpsシリーズの前回の記事では、kubeadmやその他のツールを活用して、高いスケーラビリティ、保守性、可用性を持つ本番環境対応のマルチノードクラスターを構築する方法について説明しました。 技術的にはローカルサーバー上でクラスターを構築することも可能ではありますが、多くの場合、AWSやAzureなどのクラウドプロバイダーがAPIを通じて提供する、 より柔軟なリモートサーバーやインフラストラクチャを活用します。これにより、時間とコストのかかるハードウェアへの投資やメンテナンスの必要性がなくなり、 コンテナ化されたアプリケーションのスケーラビリティと可用性を最大限に活用できるようになります。 そこで、この短いサブシリーズでは、様々なクラウドプロバイダーにわたって、リモートサーバーやネットワーク、 つまりインフラストラクチャを簡単にプロビジョニングするためのツールであるTerraformについて説明します。

なぜTerraformなのか?

クラウドプロバイダーは通常、APIとやり取りするためのGUIやCLIを提供していますが、これらは複雑で使用するのが困難な場合が多いです。 複数のリソースを一度に素早く設定したり、リソース設定を簡単に共有したり、リソースが望み通りに設定されていることを保証したりすることができません。 更に重要なことは、これらがクラウド特有のものであり、大きなスイッチングコストを伴うということです。 TerraformはInfrastructure as Code(IaC)ツールとして、 TerraformおよびTerraformが多くのクラウドプロバイダーのAPIとやり取りするためのクラウドに依存しないプログラミング言語であるHashiCorp Configuration Language(HCL)を提供することで、 これらの問題に対処します。Terraformを使用することで、適切なバージョン管理を用いてインフラストラクチャビジョニングの設定を柔軟に適用、整理、共有でき、 比較的簡単にクラウドプロバイダー間を切り替えることができます。

Terraform Architecture

TerraformのHCLは、オーケストレーション用のIaCツールの例であるKubernetesと同様に宣言的でもあります。 これは、ユーザーが望ましい状態を定義(宣言)するだけで、Terraformがその状態を達成するために必要なステップやAPI呼び出しを把握し、 舞台裏でそれらのAPI呼び出しを行うことを意味します。これにより、すべてのリソースが望み通りにプロビジョニングおよび設定されることがほぼ保証され、 チーム間で一貫したリソース設定が確保されます。Terraformは、ユーザーコードと設定を処理して必要なAPI呼び出しを決定するTerraform Coreと、 Terraform Coreが異なるクラウドプロバイダーのAPIにAPI呼び出しを行うためのインターフェースであるTerraformプロバイダーによってこれを実現します。 Terraformは2023年まではオープンソースであり、コミュニティが様々なクラウドプロバイダー向けに多くのTerraformプロバイダーを開発することで、 カバレッジを拡大し、その人気に貢献してきました。現在Terraformはもうオープンソースではなくなってしまいましたが、 TerraformとそのオープンソースフォークであるOpenTofuは、インフラストラクチャプロビジョニング用のIaCツールとしての人気を維持しています。

Terraformデプロイメントワークフロー

Terraformでは、一般的に標準化された初期化、計画、適用を含むデプロイメントワークフローを使用します。まず、HCLでコードを書いて望ましい状態を宣言し、 Terraformを初期化して依存関係を解決します。次に、計画フェーズに移り、Terraform Coreが現在の状態から望ましい状態に到達するためのステップを計画し (現在の状態は状態ファイルに保存され、ローカルまたはTerraform CloudやS3バケットなどの他のリモートストレージサービス上にリモートで保存できます)、 フォーマットと妥当性をチェックします。最後に、Terraformプロバイダーを介してコードを適用し、指定されたリソースをプロビジョニングし、場合によっては設定します。 以下は、Terraformを使用した標準的なデプロイメントワークフローの簡単な視覚化です。

Terraform Workflow

開発およびテスト環境や、未使用リソースへの不要な支払いを防ぐために終了したい本番環境をクリーンアップするために、destroyコマンドを使用してインフラストラクチャを一括で終了できます。 TerraformワークフローはGit/GitHubなどのバージョン管理ツールと組み合わせて使用でき、効果的な管理、コラボレーション、自動化のためにGitHub ActionsなどのCI/CDワークフローと自然に統合できます。 Terraformはサーバー上でbashスクリプトを実行することによってさまざまな設定をリソースに適用できますが、設定やコンテナオーケストレーションのような設定には、AnsibleやKubernetesなどの他のIaCツールの方が適しています。 そのため、Terraformは多くの場合、様々なインフラストラクチャのプロビジョニングと設定のために、AnsibleやKubernetesなどの他のIaCツールと組み合わせて使用されます。

Terraformのインストール

Terraformを始めるには、こちらからアクセスできる公式チュートリアルの指示に従ってTerraformをダウンロードできます。 インストール後、terraform -helpで正常にインストールされたことを確認してください。使用するクラウドプロバイダーによって、適切な権限を持つアカウントと必要なすべての依存関係をインストールする必要があります。 たとえば、AWSを使用する場合、TerraformでプロビジョニングしたいAWSリソースへのフルアクセス権を持つAWSユーザーを設定し、 AWS CLIをインストールし、Terraformコードを管理するリポジトリでaws configureを使用してデフォルトのAWSユーザーとその認証情報を設定する必要があります。

この短いTerraformシリーズでは、主にEC2、S3、DynamoDB、RDS などのAWSリソースを使用してインフラストラクチャをプロビジョニングするため、 これらにある程度精通していることを前提としています。そのため、これらに馴染みがない場合は基本を学習し、 AWSアカウントとAWS CLIを設定して一緒に進めることをお勧めしますが、記事は主にTerraform自体に焦点を当てており、厳密な要件ではありません。 Azure、Google Cloud、またはEKSやGKEなどのマネージドKubernetesサービスなどの他のプロバイダーの使用に興味がある場合は、 公式ウェブサイトとこちらからアクセスできるTerraform Registryの対応するTerraformプロバイダーを確認できます。 (Terraform Plugin SDKを使用して独自のTerraformプロバイダーを構築することもできますが、それはこの記事シリーズの範囲外です。)

結論

この記事では、Terraformとは何か、なぜTerraformを使用したいのか、Terraformがどのように動作するかの基本について説明しました。 また、Terraformのインストール要件と、選択するクラウドプロバイダーによってそれがどのように異なるかについても簡単に説明しました。 次の記事からは、Terraformコードの書き方とAWSを使用した基本的なインフラストラクチャのプロビジョニング方法、 いくつかの重要で有用なTerraform機能の詳細、およびそれらのベストプラクティスについて説明を始めます。 (注:このTerraformシリーズの内容と構成は、DevOps Directive(2022)のチュートリアルコースから着想を得ています。 興味がある場合は、下記に引用されているリンクから確認することをお勧めします。)

リソース