概念
Last updated
Last updated
公式のTerraformドキュメントには、設定のすべての側面が詳細に説明されています。次のセクションを理解するために、注意深くお読みください。 このセクションでは、本書で使用される重要な概念について説明します。
リソースとは、aws_vpc
やaws_db_instance
などを指します。リソースはプロバイダーに属し、引数を受け取り、属性を出力し、ライフサイクルを持っています。リソースは作成、取得、更新、削除が可能です。
リソースモジュールは、相互に接続されたリソースの集まりで、共通のアクションを実行します(例:AWS VPC Terraformモジュールは、VPC、サブネット、NATゲートウェイなどを作成します)。プロバイダー設定に依存し、それはモジュール内またはより上位の構造(例:インフラモジュール)で定義できます。
インフラモジュールは、リソースモジュールの集まりで、論理的には接続されていない場合もありますが、現在の状況やプロジェクト、設定において同じ目的を果たします。プロバイダーの設定を定義し、それが下位のリソースモジュールやリソースに渡されます。通常、論理的な区切りごと(例:AWSリージョン、Googleプロジェクト)に1つのエンティティで機能するよう制限されています。
例えば、 terraform-aws-atlantis モジュールは、 terraform-aws-vpc や terraform-aws-security-group のようなリソースモジュールを使用して、 AWS Fargate上で Atlantis を実行するために必要なインフラを管理します。
もう一つの例は、 terraform-aws-cloudquery モジュールです。ここでは、複数の terraform-aws-modules によるモジュールが一緒に使用され、インフラを管理するとともに、Dockerリソースを使用してDockerイメージをビルド、プッシュ、デプロイします。すべてが一つのセットで実行されます。
コンポジションとは、複数のインフラモジュールの集まりで、複数の論理的に分離された領域(例:AWSリージョン、複数のAWSアカウント)にまたがることができます。コンポジションは、組織全体やプロジェクト全体に必要なインフラを記述するために使用されます。
コンポジションはインフラモジュールで構成され、そのモジュールはリソースモジュールで構成され、リソースモジュールは個々のリソースを実装しています。
データソースは読み取り専用の操作を実行し、プロバイダー設定に依存しています。リソースモジュールやインフラストラクチャモジュールで使用されます。
データソースterraform_remote_state
は、上位レベルのモジュールやコンポジションを結びつける役割を果たします。
外部データソースを使用すると、外部プログラムがデータソースとして機能し、Terraformの設定内で他の場所で使用する任意のデータを提供できます。以下は、terraform-aws-lambdaモジュールの例で、外部のPythonスクリプトを呼び出してファイル名を計算しています。
httpデータソースは、指定されたURLに対してHTTP GETリクエストを行い、レスポンスに関する情報をエクスポートします。これは、ネイティブなTerraformプロバイダーが存在しないエンドポイントから情報を取得する際に便利です。
インフラモジュールやコンポジションは、Terraformの状態(Terraform state)をリモートの場所に保存し、他のユーザーが制御可能な方法で取得できるようにするべきです(例:ACLの指定、バージョニング、ロギングの設定)。
プロバイダーやプロビジョナー、その他いくつかの用語については公式ドキュメントで非常に詳しく説明されており、ここで繰り返す必要はありません。私の意見では、これらは良いTerraformモジュールを書くことにあまり関係がないと考えています。
個々のリソースがインフラの「原子」のようなものである一方、リソースモジュールは「分子」(原子から構成される)に相当します。モジュールは、バージョン管理され共有可能な最小の単位です。特定の引数リストがあり、この単位に必要な機能を実行するための基本的なロジックが実装されています。例えば、terraform-aws-security-groupモジュールは、入力に基づいてaws_security_group
やaws_security_group_rule
リソースを作成します。このリソースモジュール自体は、他のモジュールと組み合わせてインフラストラクチャモジュールを作成するために使用できます。
「分子」(リソースモジュールやインフラモジュール)間でのデータアクセスは、モジュールのアウトプットやデータソースを使って行います。
コンポジション間のアクセスは、リモートステートデータソースを使用することが多いです。設定間でデータを共有する方法は複数あります。
上記の概念を擬似的な関係に当てはめると、次のようになります。