Terraform出力を使用してインフラストラクチャデータを管理する方法
序章
Terraform 出力は、プロジェクトの状態からインフラストラクチャリソースに関する情報を抽出するために使用されます。 Terraformが使用するHashicorp構成言語(HCL)の他の機能を使用して、リソース情報を照会し、リストやマップなどのより複雑なデータ構造に変換できます。 出力は、作成されたインフラストラクチャリソースで動作できる外部ソフトウェアに情報を提供するのに役立ちます。
このチュートリアルでは、Dropletsをデプロイする単純なインフラストラクチャを作成することにより、Terraformの出力構文とそのパラメーターについて学習します。 また、出力をJSONに変換することにより、プログラムで出力を解析します。
前提条件
- DigitalOceanパーソナルアクセストークン。DigitalOceanコントロールパネルから作成できます。 手順については、DigitalOcean製品ドキュメントパーソナルアクセストークンの作成方法を参照してください。
- ローカルマシンにインストールされたTerraformと、DigitalOceanプロバイダーでセットアップされたプロジェクト。 DigitalOcean チュートリアルでTerraformを使用する方法のステップ1およびステップ2を完了し、プロジェクトフォルダーに名前を付けてください
terraform-outputs
、 それ以外のloadbalance
. ステップ2の間に、pvt_key
変数とSSHキーリソース。 - HCLデータ型とループに精通していること。 詳細については、 Terraform変数、依存関係、および条件を使用して柔軟性を向上させる方法チュートリアルを参照してください。
注:このチュートリアルはTerraformで特別にテストされています 1.0.2
.
出力の定義
このセクションでは、ドロップレットを宣言してクラウドにデプロイし、ドロップレットのIPアドレスを表示するものを定義して出力について学習します。
から terraform-outputs
前提条件として作成したディレクトリを作成して開きます droplets.tf
編集用ファイル:
- nano droplets.tf
次のDropletリソースと出力定義を追加します。
resource "digitalocean_droplet" "web" {
image = "ubuntu-20-04-x64"
name = "test-droplet"
region = "fra1"
size = "s-1vcpu-1gb"
}
output "droplet_ip_address" {
value = digitalocean_droplet.web.ipv4_address
}
まず、Dropletリソースを宣言します。 web
. クラウドでの実際の名前は test-droplet
、 地域の fra1
、Ubuntu20.04を実行しています。
次に、という出力を宣言します droplet_ip_address
. Terraformでは、出力は、リソースに関する内部値と計算値、および情報をエクスポートして表示するために使用されます。 ここでは、 value
宣言されたドロップレットのIPアドレスに出力するデータを受け入れるパラメーター。 宣言時は不明ですが、Dropletが展開されると利用可能になります。 出力が表示され、各展開後にアクセスできます。
ファイルを保存して閉じてから、次のコマンドを実行してプロジェクトをデプロイします。
- terraform apply -var "do_token=${DO_PAT}"
入る yes
プロンプトが表示されたら適用します。 出力の終わりは次のようになります。
Output...
digitalocean_droplet.web: Creating...
...
digitalocean_droplet.web: Creation complete after 32s [id=207631771]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Outputs:
droplet_ip_address = ip_address
強調表示されたIPアドレスは、新しくデプロイされたドロップレットに属しています。 プロジェクトを適用すると、リソースがクラウドにデプロイされ、すべてのリソース属性が使用可能になると、最後に出力が表示されます。 なし droplet_ip_address
出力の場合、Terraformは、展開されていることを除いて、ドロップレットに関するそれ以上の情報を表示しません。
出力は、を使用して表示することもできます output
指図:
- terraform output
出力にはすべてが一覧表示されます outputs
プロジェクトで:
Outputdroplet_ip_address = ip_address
特定の出力を引数として指定することにより、名前でクエリすることもできます。
- terraform output output_name
為に droplet_ip_address
、出力はIPアドレスのみで構成されます。
Outputip_address
必須を指定することを除いて value
、出力にはいくつかのオプションのパラメーターがあります。
description
:出力の内容を詳しく説明した短いドキュメントを埋め込みます。depends_on
:各リソースで使用可能なメタパラメータ。これにより、出力が依存するリソースを明示的に指定でき、Terraformは計画中に自動的に推測できません。sensitive
:ブール値を受け入れます。これは、に設定されている場合、デプロイ後に出力のコンテンツが表示されないようにします。true
.
The sensitive
このパラメーターは、Terraformデプロイメントのログが公開される場合に役立ちますが、出力内容は非表示にしておく必要があります。 これをDropletリソース定義に追加します。
開ける droplets.tf
編集して強調表示された行を追加するには:
resource "digitalocean_droplet" "web" {
image = "ubuntu-20-04-x64"
name = "test-droplet"
region = "fra1"
size = "s-1vcpu-1gb"
}
output "droplet_ip_address" {
value = digitalocean_droplet.web.ipv4_address
sensitive = true
}
完了したら、ファイルを保存して閉じます。 次のコマンドを実行して、プロジェクトを再度デプロイします。
- terraform apply -var "do_token=${DO_PAT}"
入る yes
プロンプトが表示されたら。 出力が編集されていることがわかります。
Output...
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
Outputs:
droplet_ip_address = <sensitive>
とマークされていても sensitive
、出力とそのコンテンツは、Terraformの状態の表示や出力の直接クエリなど、他のチャネルを通じて引き続き利用できます。
次のステップでは、別のドロップレットと出力構造を作成するので、次を実行して現在デプロイされているものを破棄します。
- terraform destroy -var "do_token=${DO_PAT}"
最後の出力は次のようになります。
Output...
Destroy complete! Resources: 1 destroyed.
ドロップレットを宣言してデプロイし、そのIPアドレスを示す出力を作成しました。 ここでは、出力を使用してリストやマップなどのより複雑な構造を表示する方法について学習します。
複雑な構造の出力
このセクションでは、を使用して同じ定義から複数のドロップレットをデプロイします count
キーワードを入力し、IPアドレスをさまざまな形式で出力します。
を使用して for
ループ
ドロップレットリソース定義を変更する必要があるため、編集のために開きます。
- nano droplets.tf
次のように変更します。
resource "digitalocean_droplet" "web" {
count = 3
image = "ubuntu-20-04-x64"
name = "test-droplet-${count.index}"
region = "fra1"
size = "s-1vcpu-1gb"
}
を使用して3つのドロップレットを作成するように指定しました count
キーを押して、現在のインデックスをドロップレット名に追加しました。これにより、後でそれらを識別できるようになります。 以下の既存の出力を削除します。 完了したら、ファイルを保存して閉じます。
次のコマンドを実行してコードを適用します。
- terraform apply -var "do_token=${DO_PAT}"
Terraformは、3つの番号付きドロップレットの作成を計画します。 test-droplet-0
, test-droplet-1
、 と test-droplet-2
. 入る yes
プロセスを終了するように求められたとき。 最後に次の出力が表示されます。
Output...
Apply complete! Resources: 3 added, 0 changed, 0 destroyed.
これは、3つのドロップレットすべてが正常にデプロイされ、それらに関するすべての情報がプロジェクト状態で保存されることを意味します。
リソース属性にアクセスする最も簡単な方法は出力を使用することですが、ドロップレットごとに出力を作成することはスケーラブルではありません。 解決策は、 for
ループしてドロップレットのリストをトラバースして属性を収集するか、スプラット式(このステップの後半で学習します)を使用します。
最初に、3つのドロップレットのIPアドレスをそれらの名前と組み合わせて出力する出力を定義します。 開ける droplets.tf
編集用:
- nano droplets.tf
次の行を追加します。
resource "digitalocean_droplet" "web" {
count = 3
image = "ubuntu-20-04-x64"
name = "test-droplet-${count.index}"
region = "fra1"
size = "s-1vcpu-1gb"
}
output "droplet_ip_addresses" {
value = {
for droplet in digitalocean_droplet.web:
droplet.name => droplet.ipv4_address
}
}
の出力値 droplet_ip_addresses
を使用して構築されます for
ループ。 中かっこで囲まれているため、結果のタイプはマップになります。 ループはドロップレットのリストをトラバースし、インスタンスごとに、その名前とIPアドレスをペアにして、結果のマップに追加します。
ファイルを保存して閉じてから、プロジェクトを再度適用します。
- terraform apply -var "do_token=${DO_PAT}"
入る yes
プロンプトが表示されたら、最後に出力コンテンツを受け取ります。
OutputApply complete! Resources: 0 added, 0 changed, 0 destroyed.
Outputs:
droplet_ip_addresses = {
"test-droplet-0" = "ip_address"
"test-droplet-1" = "ip_address"
"test-droplet-2" = "ip_address"
}
The droplet_ip_addresses
出力は、展開された3つのドロップレットのIPアドレスの詳細を示します。
テラフォームの使用 output
コマンドの場合、コマンド引数を使用して出力の内容をJSONとして取得できます。
- terraform output -json droplet_ip_addresses
結果は次のようになります。
Output{"test-droplet-0":"ip_address","test-droplet-1":"ip_address","test-droplet-2":"ip_address"}
JSON解析は広く使用されており、多くのプログラミング言語でサポートされています。 このようにして、デプロイされたDropletリソースに関する情報をプログラムで解析できます。
Splat式の使用
Splat式は、リストのすべての要素を反復処理し、各要素から属性の内容を収集してリストを作成するコンパクトな方法を提供します。 デプロイされた3つのドロップレットのIPアドレスを抽出するsplat式は、次の構文になります。
digitalocean_droplet.web[*].ipv4_address
The [*]
シンボルは左側のリストをトラバースし、要素ごとに、右側で指定された属性の内容を取得します。 左側の参照自体がリストでない場合は、それが唯一の要素となるリストに変換されます。
開くことができます droplets.tf
これを実装するために次の行を編集および変更します。
resource "digitalocean_droplet" "web" {
count = 3
image = "ubuntu-20-04-x64"
name = "test-droplet-${count.index}"
region = "fra1"
size = "s-1vcpu-1gb"
}
output "droplet_ip_addresses" {
value = digitalocean_droplet.web[*].ipv4_address
}
ファイルを保存した後、次のコマンドを実行してプロジェクトを適用します。
- terraform apply -var "do_token=${DO_PAT}"
リストになり、ドロップレットのIPアドレスのみを含む出力が表示されます。
Output...
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
Outputs:
droplet_ip_addresses = [
"ip_address",
"ip_address",
"ip_address",
]
出力をJSONとして受け取るには、次のコマンドを実行します。
- terraform output -json droplet_ip_addresses
出力は単一の配列になります。
Output["ip_address","ip_address","ip_address"]
スプラット式と一緒に出力を使用し、 for
デプロイされたドロップレットのIPアドレスをエクスポートするためのループ。 また、出力コンテンツをJSONとして受け取ったので、これから使用します jq
—指定された式に従ってJSONを動的にフィルタリングするためのツール—それらを解析します。
を使用した出力の解析 jq
このステップでは、の基本をインストールして学習します jq
、JSONドキュメントを操作するためのツール。 これを使用して、Terraformプロジェクトの出力を解析します。
Ubuntuを使用している場合は、次のコマンドを実行してインストールします jq
:
- sudo snap install jq
macOSでは、Homebrewを使用してインストールできます。
- brew install jq
jq
指定された入力に提供された処理式を適用します。これはパイプで渡すことができます。 で最も簡単なタスク jq
入力をきれいに印刷することです:
- terraform output -json droplet_ip_addresses | jq '.'
恒等演算子を渡す(.
)は、入力から解析されたJSONドキュメント全体を変更せずに出力する必要があることを意味します。
Output[
"first_ip_address",
"second_ip_address",
"third_ip_address"
]
ゼロから数えて、配列ブラケット表記を使用して2番目のIPアドレスだけを要求できます。
- terraform output -json droplet_ip_addresses | jq '.[1]'
出力は次のようになります。
Output"second_ip_address"
処理の結果を配列にするには、式を括弧で囲みます。
- terraform output -json droplet_ip_addresses | jq '[.[1]]'
きれいに印刷されたJSON配列が得られます。
Output[
"second_ip_address"
]
角かっこ内にインデックスの範囲を指定することにより、単一の要素の代わりに配列の一部を取得できます。
- terraform output -json droplet_ip_addresses | jq '.[0:2]'
出力は次のようになります。
Output[
"first_ip_address",
"second_ip_address"
]
範囲 0:2
最初の2つの要素(範囲の上部)を返します(2
)は包括的ではないため、位置にある要素のみ 0
と 1
フェッチされます。
これで、以下を実行して、デプロイされたリソースを破棄できます。
- terraform destroy -var "do_token=${DO_PAT}"
このステップでは、インストールしました jq
これを使用して、3つのドロップレットをデプロイするTerraformプロジェクトの出力を解析および操作しました。
結論
Terraformの出力について学習しました。これらを使用して、デプロイされたリソースの詳細を表示し、後で外部処理するためにデータ構造をエクスポートします。 また、出力を使用して、単一のリソースの属性を表示したり、作成されたマップやリソース属性を含むリストを表示したりしました。
の機能の詳細については jq
、公式ドキュメントにアクセスしてください。
このチュートリアルは、Terraformシリーズでインフラストラクチャを管理する方法の一部です。 このシリーズでは、Terraformの初めてのインストールから複雑なプロジェクトの管理まで、Terraformの多くのトピックを取り上げています。