csvdecode 함수
csvdecode 함수
csvdecode는 CSV 형식의 데이터가 담긴 문자열을 디코딩해서 그 데이터를 나타내는 맵(map) 리스트를 만들어 주는 함수예요. 표 형태의 데이터를 구조화된 값으로 바꿀 때 사용합니다.
출처: Packer 공식 문서
본문
csvdecode는 CSV 형식의 데이터가 담긴 문자열을 디코딩해 그 데이터를 나타내는 맵 리스트를 생성합니다.
CSV는 Comma-separated Values로, 표 형식 데이터를 위한 인코딩 형식이에요. CSV에는 여러 변형이 있지만, 이 함수는 RFC 4180에 정의된 형식을 구현합니다.
CSV 데이터의 첫 번째 줄은 "헤더(header)" 행으로 해석돼요. 여기 주어진 값들이 결과 맵의 키로 사용됩니다. 그 뒤의 각 줄은 결과 리스트에서 하나의 맵이 되며, 헤더 행의 키와 주어진 값을 인덱스별로 매칭해요. 파일의 모든 줄은 같은 수의 필드를 가져야 하며, 그렇지 않으면 이 함수는 오류를 발생시킵니다.
Examples
> 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 파일의 행들로 그 차이가 설명되는 비슷한 객체들의 컬렉션을 표현할 수 있어요.
각 행의 고유 ID 역할을 하는 CSV 열이 하나 있어야 하는데, 이를 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를 키로 사용하는 맵으로 변환해요. 이는 Packer가 생성하는 각 인스턴스를 local_id 값으로 추적하도록 지시합니다. Packer는 다음 인스턴스 주소들을 생성하고 관리할 거예요.
- aws_instance.example["foo1"]
- aws_instance.example["foo2"]
- aws_instance.example["foo3"]
- aws_instance.example["bar1"]
이후 실행 계획(plan)에서 CSV의 행을 수정하면, local_id 값이 바뀌지 않는 한 Packer는 그것을 기존 객체에 대한 업데이트로 해석해요. CSV에서 행을 추가하거나 제거하면 Packer는 그에 맞춰 관련 인스턴스를 생성하거나 파괴할 계획을 세웁니다.
CSV에서 고유 식별자로 쓸 만한 값이 없다면 count 메타 인자를 사용해 각 CSV 행에 대해 객체를 정의하고, csvdecode가 반환한 리스트에서 각 객체를 인덱스로 식별할 수도 있어요. 다만 이 경우 리스트에서 특정 객체의 위치가 바뀌면 CSV를 나중에 업데이트할 때 문제가 생길 수 있어요. 고유 ID 열과 함께 for_each를 사용해 향후 변경 시 동작을 더 예측 가능하게 만드는 것을 권장합니다.