出力とは
出力は、プログラミング言語における戻り値のようなものです。出力を使用すると、terraform apply の実行後にインフラストラクチャの属性を公開できます。これにより、属性を検査したり、モジュール間で受け渡したり、他のツールへ入力したりできます。
主なユースケースは次のとおりです:
リソース属性の表示 —
terraform applyの実行後に、算出された値 (ECS インスタンス ID や IP アドレスなど) を CLI に表示します。リソース間でのデータ受け渡し — あるリソースから属性を抽出し、別のリソースで参照します。たとえば、セキュリティグループのルールで VPC の IP アドレスを使用する場合などです。
モジュール間でのデータ共有 — 子モジュールから値を公開し、親モジュールが参照できるようにします。
外部ツールとの連携 —
terraform outputを使用して、出力値をスクリプトや CI/CD パイプラインに渡します。
出力の構文
出力は output ブロックで宣言します。output ブロックは Terraform 設定ファイルのどこにでも配置できますが、設定の可読性を高めるために、outputs.tf という名前の専用ファイルに配置することを推奨します。
出力は output キーワードの後のラベルは出力名です。出力名はモジュール内で一意である必要があります。output ブロックは、次の引数を受け取ります:
-
value
(必須) モジュールのユーザーに返す値です。
-
description
(任意) 出力の目的について人間が判読できる説明です。Terraform はこの説明を使用して、モジュールに関するドキュメントを生成します。
-
sensitive
(任意) 出力が機密であるかどうかを示すブール値です。
trueの場合、Terraform はパスワードや AccessKey Secret などの機密データの漏洩を防ぐために、CLI の出力から値を編集します。
次の例では、my-vpc という名前のリソースに対して vpc_id という名前の出力を宣言します:
# VPC を作成
resource "alicloud_vpc" "my-vpc" {
vpc_name = "tf-vpc"
cidr_block = "10.0.0.0/16"
}
output "vpc_id" {
value = alicloud_vpc.my-vpc.id
}
terraform apply が成功すると、VPC ID が CLI の出力に表示されます:
alicloud_vpc.my-vpc: Creating...
alicloud_vpc.my-vpc: Creation complete after 7s [id=vpc-bp1gcq59rsakmwx1apmhn]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Outputs:
vpc_id = "vpc-bp1gcq59rsakmwx1apmhn"
terraform output コマンドによる出力のクエリ
作成済みのリソースについては、いつでも terraform output を実行して、すべての出力値を表示できます:
$ terraform output
vpc_id = "vpc-bp1gcq59rsakmwx1apmhn"
単一の値を raw 文字列として取得する (シェルスクリプトに適しています) には、次のようにします:
$ terraform output -raw vpc_id
vpc-bp1gcq59rsakmwx1apmhn
すべての出力を JSON として取得する (プログラムでの使用に適しています) には、次のようにします:
$ terraform output -json
{
"vpc_id": {
"sensitive": false,
"type": "string",
"value": "vpc-bp1gcq59rsakmwx1apmhn"
}
}
-raw および -json フラグは、機密出力のプレーンテキスト値を表示します。出力がログに記録されたり、キャプチャされたりする状況では、これらのフラグを使用しないでください。
子モジュールからの出力へのアクセス
親モジュールは、module.<MODULE_NAME>.<OUTPUT_NAME> を使用して子モジュールの出力にアクセスします:
module "network" {
source = "./modules/network"
}
resource "alicloud_security_group_rule" "allow_vpc" {
cidr_ip = module.network.vpc_cidr_block
}
子モジュール (./modules/network) は、出力を宣言する必要があります:
output "vpc_cidr_block" {
description = "VPC の CIDR ブロック"
value = alicloud_vpc.main.cidr_block
}
出力のベストプラクティス
-
有用な情報のみを出力する
変数の値をそのまま返す静的な値ではなく、算出された属性をエクスポートします。ネットワークリソースの場合、有用な出力には次のものが含まれます:
id:リソースの識別子。router_id:VPC に自動的に作成されるルーターの識別子。route_table_id:VPC に自動的に作成されるルートテーブルの識別子。
意味のある名前と説明を使用する — 変数名と同じ規則に従い、
description引数を指定して出力の意図を文書化します。すべての出力を
outputs.tfに配置する — 専用ファイルにまとめることで、設定が公開する内容を簡単に確認できます。-
機密出力にマークを付ける
値を手動で暗号化する代わりに、Terraform の組み込みの
sensitive = trueを使用します。出力が機密としてマークされると、Terraform はterraform planとterraform applyの出力からその値を編集します。