外部データとテンプレートの利用
externalデータソースで動的な値をTerraformに取り込み、templatefile関数で設定ファイルを生成します。
「外部データとテンプレートの利用」はCoddyKit上の無料Terraform Infrastructure as Codeレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはTerraform Infrastructure as Code学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Terraform Infrastructure as Codeコースには全4レッスンが含まれています。
組み込みデータソースの先へ
すでにデータソースを使って AWS に問い合わせています。しかし、必要なデータがどのプロバイダーにも存在しない場合があります。たとえば、シェルスクリプトの出力や社内 API のレスポンスなどです。この不足を補うのが external データソースと template 関数です。
external データソース
external データソースはプログラムを実行し、標準出力から JSON を読み取ります。Terraform がネイティブに表現できないロジックを扱うための最後の手段です。
data "external" "git_sha" {
program = ["bash", "./scripts/git_sha.sh"]
}プログラムの契約
外部プログラムは標準入力から JSON オブジェクトを受け取り、文字列値だけで構成されたフラットな JSON オブジェクトを標準出力に出力する必要があります。それ以外はエラーになります。
#!/bin/bash
echo '{"sha": "abc123"}'外部結果の読み取り
返された値には result マップからアクセスします。すべての値は文字列なので、別の型が必要な場合は型変換してください。
resource "aws_instance" "app" {
ami = "ami-0abcd1234"
instance_type = "t3.micro"
tags = {
GitSha = data.external.git_sha.result.sha
}
}external を避ける場合
external ソースはすべての plan で実行されるため、スクリプトが非決定的だと再現性が損なわれます。対応するプロバイダーのデータソースがある場合はそちらを優先し、external は本当に不足している場合だけ使ってください。
templatefile によるファイルの生成
templatefile 関数はテンプレートを読み込み、変数を置換して文字列を返します。cloud-init のユーザーデータや設定ファイルに最適です。
resource "aws_instance" "web" {
ami = "ami-0abcd1234"
instance_type = "t3.micro"
user_data = templatefile("init.tftpl", {
hostname = "web-01"
})
}テンプレート構文
.tftpl ファイル内では、ドル記号と波括弧を使う構文で値を埋め込みます。Terraform が渡された変数を置換します。
#!/bin/bash
hostnamectl set-hostname ${hostname}
echo 'Provisioned by Terraform'テンプレート内のループ
テンプレートは反復処理用のディレクティブをサポートしています。for ディレクティブを使うと行を繰り返し生成でき、ホスト一覧の作成などに便利です。
%{ for ip in ips ~}
server ${ip}:8080
%{ endfor ~}templatestring によるインラインテンプレート
短い断片であれば、ファイルを使わずに templatestring(または古い format)を使って、設定内で直接動的な文字列を作成できます。
locals {
greeting = templatestring("Hello, $${name}!", { name = "Ops" })
}2 つの機能の組み合わせ
よくあるパターンは、external ソースで動的な値を取得し、それを templatefile でユーザーデータとして生成する設定ファイルに埋め込む方法です。
user_data = templatefile("app.tftpl", {
version = data.external.git_sha.result.sha
})生成結果の冪等性を保つ
user_data の変更はインスタンスの置換を引き起こすため、テンプレートへの入力は安定させてください。タイムスタンプのように常に変化する値を渡すと、apply のたびにインスタンスが再作成されます。
理解度チェック
external データソースについての理解度を確認しましょう。
まとめ: 動的な入力とテンプレート
Terraform のデータ処理機能を拡張しました。
externalソースは JSON を返すスクリプトを実行します。templatefileは設定ファイルやユーザーデータファイルを生成します。- テンプレートディレクティブはループと値の埋め込みをサポートします。
- 不要な置換を避けるため、入力値は安定させます。
よくある質問
「外部データとテンプレートの利用」レッスンは無料ですか?
はい。「外部データとテンプレートの利用」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Terraform Infrastructure as Codeコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Terraform Infrastructure as Codeコースには全4レッスンが含まれています。
「外部データとテンプレートの利用」で何を学びますか?
externalデータソースで動的な値をTerraformに取り込み、templatefile関数で設定ファイルを生成します。 ブラウザで直接実行するハンズオンコードでTerraform Infrastructure as Codeを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Terraform Infrastructure as Codeを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのTerraform Infrastructure as Codeは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「外部データとテンプレートの利用」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このTerraform Infrastructure as Codeレッスンでコードを書いて実行できますか?
はい。すべてのTerraform Infrastructure as Codeレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。