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

csvdecode 関数

csvdecode は、CSV形式のデータを含む文字列をデコードし、そのデータを表すマップのリストを生成します。

CSVは *カンマ区切り値* で、表形式データのエンコード形式です。CSVには多くのバリアントがありますが、この関数はRFC 4180で定義された形式を実装しています。

CSVデータの最初の行は「ヘッダー」行として解釈されます。指定された値は、結果のマップのキーとして使用されます。後続の各行は、結果のリスト内の単一のマップになり、ヘッダー行のキーと、インデックスによる指定された値をマッチングさせます。ファイル内のすべての行に同じ数のフィールドが含まれている必要があります。そうでない場合、この関数はエラーを生成します。

コードブロック
> csvdecode("a,b,c\n1,2,3\n4,5,6")
[
{
"a" = "1"
"b" = "2"
"c" = "3"
},
{
"a" = "4"
"b" = "5"
"c" = "6"
}
]

for_each メタ引数での使用

csvdecode の結果をfor_each メタ引数で使用して、指定されたCSVファイルの行で違いが記述されている類似オブジェクトのコレクションを記述できます。

CSVファイルには、各行の一意のIDとして機能できる列が1つ必要です。これは、for_each 式内の個々のインスタンスの追跡キーとして使用できます。たとえば

コードブロック
locals {
# We've included this inline to create a complete example, but in practice
# this is more likely to be loaded from a file using the "file" function.
csv_data = <<-CSV
local_id,instance_type,ami
foo1,t2.micro,ami-54d2a63b
foo2,t2.micro,ami-54d2a63b
foo3,t2.micro,ami-54d2a63b
bar1,m3.large,ami-54d2a63b
CSV

instances = csvdecode(local.csv_data)
}

resource "aws_instance" "example" {
for_each = { for inst in local.instances : inst.local_id => inst }

instance_type = each.value.instance_type
ami = each.value.ami
}

for_each 引数の for 式は、csvdecode によって生成されたリストを、local_id をキーとして使用してマップに変換します。これにより、OpenTofuに、作成する各インスタンスを追跡するために local_id 値を使用するように指示します。OpenTofuは、次のインスタンスアドレスを作成および管理します。

  • aws_instance.example["foo1"]
  • aws_instance.example["foo2"]
  • aws_instance.example["foo3"]
  • aws_instance.example["bar1"]

後続のプランでCSVの行を変更すると、local_id 値が変更されていない限り、OpenTofuはそれを既存のオブジェクトの更新として解釈します。CSVから行を追加または削除すると、OpenTofuは、関連付けられたインスタンスを必要に応じて作成または破棄する計画を立てます。

CSVで一意の識別子として使用できる妥当な値がない場合は、代わりにcountメタ引数を使用して、各CSV行に対してオブジェクトを定義し、各オブジェクトをcsvdecodeによって返されるリストへのインデックスで識別することもできます。ただし、その場合、CSVへの将来の更新により、リスト内の特定のオブジェクトの位置が変更されると、破壊的になる可能性があります。今後の変更で動作をより予測可能にするために、一意のID列を持つ for_each を使用することをお勧めします。