csvdecode 함수

csvdecode 함수

csvdecode 함수는 CSV 형식의 데이터가 담긴 문자열을 디코딩해서 그 데이터를 나타내는 맵(map)의 리스트를 만들어요. 첫 번째 줄은 "헤더" 행으로 해석되어 결과 맵의 키로 사용돼요. 이 함수는 RFC 4180에 정의된 형식을 구현해요.

출처: 문서

본문

csvdecode는 CSV 형식의 데이터가 담긴 문자열을 디코딩해서 그 데이터를 나타내는 맵의 리스트를 만들어요.

CSV는 콤마로 구분된 값(Comma-separated Values)으로, 표 형태의 데이터를 위한 인코딩 형식이에요. 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의 결과를 the for_each meta-argument와 함께 사용하면, 주어진 CSV 파일의 행으로 차이가 설명되는 비슷한 객체들의 컬렉션을 표현할 수 있어요.

CSV 파일에는 각 행의 고유한 id로 사용할 수 있는 열이 하나 있어야 해요. 그래야 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 = tomap({ 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를 키로 사용하는 맵으로 변환해요. 이는 Terraform이 생성하는 각 인스턴스를 추적할 때 local_id 값을 사용하도록 알려줘요. Terraform은 다음 인스턴스 주소들을 생성하고 관리해요:

이후 plan에서 CSV의 행을 수정하면, local_id 값이 바뀌지 않는 한 Terraform은 기존 객체에 대한 업데이트로 해석해요. CSV에서 행을 추가하거나 제거하면 Terraform은 상황에 맞게 관련 인스턴스의 생성이나 삭제를 plan해요.

CSV에서 고유 식별자로 쓸 만한 합리적인 값이 없다면, 대신 the count meta-argument를 사용해 각 CSV 행에 대해 객체를 정의할 수 있어요. 이 경우 각 객체는 csvdecode가 반환한 리스트에서의 인덱스로 식별돼요. 하지만 그런 경우 향후 CSV 업데이트가 리스트에서 특정 객체의 위치를 바꾸면 파괴적일 수 있어요. 고유 id 열과 함께 for_each를 사용해 향후 변경에서 동작을 더 예측 가능하게 만들기를 권장해요.

더 알아보기 (Learn more)