ネストした設定のためのDynamic Block
Dynamic Blockを使ってネストした設定ブロックをプログラムで繰り返し生成し、セキュリティグループルールなどのコピー&ペーストをなくします。
「ネストした設定のためのDynamic Block」はCoddyKit上の無料DevOps Bootcampレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはDevOps Bootcamp学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 DevOps Bootcampコースには全4レッスンが含まれています。
繰り返しの問題
一部のリソースには、複数の ingress ルールを持つセキュリティグループのように、繰り返し現れるネストされたブロックがあります。各ブロックを手作業で記述すると冗長になり、DRY を保つのも困難です。Dynamic ブロックを使うと、コレクションからブロックを生成できます。
まずは静的ブロックから
これが手動で記述した場合の例です。ほぼ同じ ingress ブロックが 3 つあります。これを 12 個も保守する場合を想像してみてください。
resource "aws_security_group" "web" {
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
ingress {
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}Dynamic ブロックの構造
dynamic ブロックには、ネストされたブロック名に一致するラベル、for_each コレクション、そして生成する各インスタンスの内容を定義する content ブロックがあります。
dynamic "ingress" {
for_each = var.rules
content {
from_port = ingress.value.port
to_port = ingress.value.port
protocol = "tcp"
cidr_blocks = ingress.value.cidrs
}
}イテレーターオブジェクト
content の内部では、ブロックラベルに基づく名前のオブジェクトを使って現在の要素を参照します。このオブジェクトには .value(要素)と .key(マップのキーまたはリストのインデックス)が含まれます。
入力変数の定義
型付き変数を使って Dynamic ブロックを動かします。オブジェクトのリストにすると、各ルールの内容を自己説明的に保てます。
variable "rules" {
type = list(object({
port = number
cidrs = list(string)
}))
}組み立て
これで、渡すルールの数に関係なく、リソースを簡潔に保てます。
resource "aws_security_group" "web" {
name = "web-sg"
dynamic "ingress" {
for_each = var.rules
content {
from_port = ingress.value.port
to_port = ingress.value.port
protocol = "tcp"
cidr_blocks = ingress.value.cidrs
}
}
}イテレーターの名前変更
iterator 引数を使うと、反復処理の変数名を変更できます。Dynamic ブロックをネストする場合に、混乱を避けるのに便利です。
dynamic "ingress" {
for_each = var.rules
iterator = rule
content {
from_port = rule.value.port
to_port = rule.value.port
}
}条件付きでブロックを省略する
空のコレクションを渡すと、ブロックは 0 個生成されます。for_each に三項演算子を使うことで、ブロックを任意にできます。
dynamic "logging" {
for_each = var.enable_logging ? [1] : []
content {
target_bucket = var.log_bucket
}
}ネストした Dynamic ブロック
Dynamic ブロックはネストできます。異なるイテレーターを使うと、内側のブロックから両方の階層を曖昧さなく参照できます。
dynamic "setting" {
for_each = var.settings
iterator = s
content {
namespace = s.value.namespace
name = s.value.name
value = s.value.value
}
}Dynamic ブロックを使わない場合
Dynamic ブロックは間接性を増やし、可読性を損なうことがあります。静的ブロックが 1 つか 2 つだけなら、リテラルのまま記述してください。個数がデータによって決まる場合に Dynamic ブロックを使いましょう。
結果の確認
plan を実行して、生成されたブロックが想定どおりか確認します。Terraform はコレクションの各要素を、具体的なネストされたブロックに展開します。
terraform plan理解度チェック
Dynamic ブロックについての知識を確認しましょう。
まとめ: DRY なネスト設定
Dynamic ブロックを使うと、データからネストされた設定を生成できます。
for_eachが反復処理を制御し、contentが各ブロックを定義します。- イテレーターから
.valueと.keyを参照できます。 - 空のコレクションによってブロックを任意にできます。
- 設定の可読性を保つため、必要な場合に限って使います。
よくある質問
「ネストした設定のためのDynamic Block」レッスンは無料ですか?
はい。「ネストした設定のためのDynamic Block」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、DevOps Bootcampコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 DevOps Bootcampコースには全4レッスンが含まれています。
「ネストした設定のためのDynamic Block」で何を学びますか?
Dynamic Blockを使ってネストした設定ブロックをプログラムで繰り返し生成し、セキュリティグループルールなどのコピー&ペーストをなくします。 ブラウザで直接実行するハンズオンコードでDevOps Bootcampを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
DevOps Bootcampを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのDevOps Bootcampは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「ネストした設定のためのDynamic Block」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このDevOps Bootcampレッスンでコードを書いて実行できますか?
はい。すべてのDevOps Bootcampレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- `for_each` と `count` によるループ
- Terraform 組み込み関数
- 条件式と Splat 式
- ネストした設定のためのDynamic Block