メインコンテンツにスキップ

出力値

出力値は、インフラストラクチャに関する情報をコマンドラインで利用できるようにし、他のOpenTofu構成が使用できる情報を公開できます。出力値は、プログラミング言語の戻り値に似ています。

出力値にはいくつかの用途があります

  • 子モジュールは出力を利用して、リソース属性のサブセットを親モジュールに公開できます。
  • ルートモジュールは出力を利用して、`tofu apply`の実行後に特定の値をCLI出力に表示できます。
  • リモート状態を使用する場合、ルートモジュールの出力は、`terraform_remote_state`データソースを介して他の構成からアクセスできます。

OpenTofuによって管理されるリソースインスタンスはそれぞれ、構成内の他の場所で値を使用できる属性をエクスポートします。出力値は、その情報の一部をモジュールのユーザーに公開する方法です。

出力値の宣言

モジュールによってエクスポートされる各出力値は、`output`ブロックを使用して宣言する必要があります

コードブロック
output "instance_ip_addr" {
value = aws_instance.server.private_ip
}

`output`キーワードの直後のラベルは名前で、有効な識別子である必要があります。ルートモジュールでは、この名前はユーザーに表示されます。子モジュールでは、出力値にアクセスするために使用できます。

`value`引数は、結果がユーザーに返されるを受け取ります。この例では、式は、このモジュール内の他の場所で定義された(表示されていない)`aws_instance`リソースによって公開される`private_ip`属性を参照しています。有効な式であれば、出力値として使用できます。

子モジュール出力へのアクセス

親モジュールでは、子モジュールの出力は、式で`module.<モジュール名>.<出力名>`として使用できます。たとえば、`web_server`という名前の子モジュールが`instance_ip_addr`という名前の出力を宣言した場合、その値には`module.web_server.instance_ip_addr`としてアクセスできます。

カスタム条件チェック

`precondition`ブロックを使用して、出力データに関する保証を指定できます。次の例では、EC2インスタンスに暗号化されたルートボリュームがあるかどうかをチェックする前提条件を作成します。

コードブロック
output "api_base_url" {
value = "https://${aws_instance.example.private_dns}:8433/"

# The EC2 instance must have an encrypted root volume.
precondition {
condition = data.aws_ebs_volume.example.encrypted
error_message = "The server's root volume is not encrypted."
}
}

カスタム条件は、前提条件を把握するのに役立ち、将来の保守担当者が構成の設計と意図を理解するのに役立ちます。また、エラーに関する有用な情報を早期にコンテキストで返すため、コンシューマーは構成の問題をより簡単に診断できます。

詳細については、カスタム条件チェックを参照してください。

オプションの引数

`output`ブロックには、オプションで`description`、`sensitive`、および`depends_on`引数を含めることができます。これらの引数については、以下のセクションで説明します。

`description` — 出力値のドキュメント

モジュールの出力値はそのユーザーインターフェースの一部であるため、オプションの`description`引数を使用して各値の目的を簡単に説明できます

コードブロック
output "instance_ip_addr" {
value = aws_instance.server.private_ip
description = "The private IP address of the main server instance."
}

説明では、出力の目的と期待される値の種類を簡潔に説明する必要があります。この説明文字列は、モジュールに関するドキュメントに含まれる場合があるため、モジュールの保守担当者ではなく、モジュールのユーザーの観点から記述する必要があります。モジュール保守担当者向けのコメントには、コメントを使用してください。

`sensitive` — CLI出力での値の抑制

オプションの`sensitive`引数を使用して、機密情報を含むものとして出力をマークできます

コードブロック
output "db_password" {
value = aws_db_instance.db.password
description = "The password for logging in to the database."
sensitive = true
}

OpenTofuは、`tofu plan`および`tofu apply`からのメッセージで、機密としてマークされた値を非表示にします。次のシナリオでは、ルートモジュールに機密として宣言された出力と、機密出力を持つモジュール呼び出しがあり、それをリソース属性で使用しています。

コードブロック
# main.tf

module "foo" {
source = "./mod"
}

resource "test_instance" "x" {
some_attribute = module.foo.a # resource attribute references a sensitive output
}

output "out" {
value = "xyz"
sensitive = true
}

# mod/main.tf, our module containing a sensitive output

output "a" {
value = "secret"
sensitive = true
}

プランまたは適用を実行すると、機密値は出力から編集されます。

コードブロック
OpenTofu will perform the following actions:

# test_instance.x will be created
+ resource "test_instance" "x" {
+ some_attribute = (sensitive value)
}

Plan: 1 to add, 0 to change, 0 to destroy.

Changes to Outputs:
+ out = (sensitive value)

OpenTofu は、機密値をステートに記録するため、ステートデータにアクセスできるユーザーは、クリアテキストの機密値にアクセスできます。詳細については、ステート内の機密データを参照してください。

depends_on — 明示的な出力依存関係

出力値はモジュールからデータを渡すための手段に過ぎないため、通常、依存関係グラフ内の他のノードとの関係について心配する必要はありません。

ただし、親モジュールが子モジュールのいずれかによってエクスポートされた出力値にアクセスする場合、その出力値の依存関係により、OpenTofu は異なるモジュールで定義されたリソース間の依存関係を正しく判断できます。

リソースの依存関係と同様に、OpenTofu は出力値の value 式を分析し、依存関係のセットを自動的に決定しますが、あまり一般的ではないケースでは、暗黙的に認識できない依存関係があります。このようなまれなケースでは、depends_on 引数を使用して、追加の明示的な依存関係を作成できます。

コードブロック
output "instance_ip_addr" {
value = aws_instance.server.private_ip
description = "The private IP address of the main server instance."

depends_on = [
# Security group rule must be created before this IP address could
# actually be used, otherwise the services will be unreachable.
aws_security_group_rule.local_access,
]
}

depends_on 引数は、最後の手段としてのみ使用する必要があります。使用する場合、追加の依存関係の目的を将来のメンテナーが理解できるように、常にその理由を説明するコメントを含めてください。