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를 사용해 향후 변경 시 동작을 더 예측 가능하게 만드는 것을 권장합니다.