- OpenTofu言語
- モジュール
- モジュールの作成
モジュールの作成
モジュールは、一緒に使用される複数のリソースを格納するコンテナです。モジュールを使用すると、軽量な抽象化を作成できるため、物理的なオブジェクトではなく、アーキテクチャという観点からインフラストラクチャを記述できます。
tofu plan
またはtofu apply
を実行するときの作業ディレクトリ内の.tf
および/または.tofu
ファイルは、ルートモジュールを形成します。そのモジュールは他のモジュールを呼び出すことができ、一方の出力値をもう一方の入力値に渡すことで、それらを接続できます。
モジュールの使用方法については、モジュール設定セクションを参照してください。このセクションでは、module
ブロックを使用して他の設定を含めることができる、再利用可能なモジュールの作成方法について説明します。
モジュール構造
再利用可能なモジュールは、ルートモジュールで使用する方法とまったく同じ設定言語の概念を使用して定義されます。一般的に、モジュールは次のものを使用します。
- 入力変数を使用して、呼び出し元モジュールから値を受け取ります。
- 出力値を使用して、呼び出し元モジュールに結果を返し、それを他の引数の設定に使用します。
- リソースを使用して、モジュールが管理する1つ以上のインフラストラクチャオブジェクトを定義します。
モジュールを定義するには、新しいディレクトリを作成し、ルートモジュールの場合と同様に、1つ以上の.tf
ファイルをその中に配置します。OpenTofuは、ローカルの相対パスまたはリモートリポジトリからモジュールを読み込むことができます。多くの設定でモジュールを再利用する場合は、独自のバージョン管理リポジトリに配置することをお勧めします。
モジュールは、module
ブロックを使用して他のモジュールを呼び出すこともできますが、モジュールツリーを比較的フラットに保ち、モジュールの構成を深くネストされたモジュールツリーの代替手段として使用することをお勧めします。これにより、個々のモジュールをさまざまな組み合わせで簡単に再利用できるようになります。
モジュールを作成する場合
原則として、リソースとその他の構成要素の任意の組み合わせをモジュールに分割できますが、モジュールを過剰に使用すると、OpenTofu設定全体の理解と保守が難しくなる可能性があるため、適度な使用をお勧めします。
優れたモジュールは、プロバイダが提供するリソースタイプから構築された、アーキテクチャにおける新しい概念を記述することで、抽象化のレベルを高める必要があります。
たとえば、aws_instance
とaws_elb
はどちらもAWSプロバイダに属するリソースタイプです。これらとその他のAWSプロバイダのリソースから構築される上位概念「AWSで実行されているHashiCorp Consulクラスタ」を表すためにモジュールを使用できます。
単一の他のリソースタイプの薄いラッパーにすぎないモジュールを作成することはお勧めしません。モジュールに、その内部の主要なリソースタイプと同じではない名前を見つけるのに苦労する場合は、モジュールが新しい抽象化を作成しておらず、モジュールが不要な複雑さを追加しているという兆候かもしれません。代わりに、呼び出し元モジュールで直接リソースタイプを使用してください。
モジュールリソースのリファクタリング
リファクタリングブロックを含めて、以前のモジュールバージョンからのリソース名とモジュール構造の変更を記録できます。OpenTofuは、プランニング中にその情報を使用して、既存のオブジェクトを対応する新しいアドレスで作成されたかのように再解釈し、既存のオブジェクトを置き換えるか移行するための個別のワークフローステップを排除します。