• 엑셀(Excel)을 넣으면 자동으로 Terraform(.tf)파일로 변환-3

    2024. 3. 18.

    by. Daramu

    생각을 다시 처음으로 돌렸다.

    count, dynamic, foreach....온갖 방법을 동원했지만 모두 요원치 않았다. 이 미친 랜덤성을 넘을 벽이 도저히 보이지 않았다.

     

    절망에 빠져 담배만 뻑뻑 피우던 와중에, 저 멀리서 수다떠는 소리가 들렸다.

     

    "넌 그걸 노가다로 해결하냐ㅋㅋ"

    "하지만 동작했으면 된거 아임까 ㅋㅋ"

     

    뭐, 대충 하드코딩으로 요상한 코드를 만들었겠거니, 하고 있었는데, 그런 내 머리속에 한줄기 섬광이 스쳐지나갔다.

     

    "노가다!!!!"

     

    내가 왜 이런 방식을 생각하지 못했는지 후회스러울 정도였다.

    그래. "복잡한 구조로 안된다면, 그냥 무식하게 단순 반복 하면 되는거 아닌가?" 단순하다면 에러에 대한 내성도 생긴다. 보기에는 구릴지라도 그냥 수정하면 된다. 으레 그렇듯이 "우아하지 못한" 코드는 보기에는 흉할지라도 너무나도 단순해서 보는사람도, 수정하는 사람도 쉽기 마련이었다.

     

    바로 사무실로 올라와서 기존의 모든 코드를 폐기했다.

    count? 필요없다. forcach? 다시는 안볼 예정이었다.

     

    주제가 잡히자 생각을 회오리처럼 몰아쳤다.

     

    "그래. 단순하게 반복하자. 하지만 사용자가 랜덤한 순서로 랜덤한 갯수만큼 입력할거야. 우선 갯수를 처리하자."

     

    엑셀을 json으로 변환하면 가장 윗열(A)의 값이 key가 된다. key에 대한 값을 채워넣고, 그 밑에 value값이 "들어간다." 그렇다. 랜덤이고 자시고 어쨌든 사용자는 안에 내용물을 채워넣을 것이다.

     

    그렇기에 최종 결론으로,

     

    1. 반복할 템플릿을 만든다.

    2. value값이 채워져있는지를 검사한다.

    3. 값이 채워져있다면 해당하는 순서만큼 템플릿을 만든다.

     

    ....우선 템플릿을 만들었다.

    대충 이런식으로 VPC템플릿을 만든다.

    그리고 사용자가 입력한 갯수만큼 해당 템플릿을 반복하면 되었다.

     

     

    검사는 이런식으로 진행하였다.

    VPC(시트의 이름이다.) 시트 안에는 수많은 key:value의 쌍이 존재할것이다.

    1. 내용이 채워져있다.

    2. 칸(표)는 있지만 안에 내용물은 없다.

    3. 예시(ex)가 존재한다.

     

    우선 가장 앞에 No라는 값을 집어넣었다. 그리고 그것이 int인지를 검사한다. 왜? ex) 라는 이름의 예시가 존재했기 때문이다. 사용자는 자연스럽게 1부터 채워넣을 것이다. 그리고 그 뒤에 vpc_name등이 채워져있는지를 검사한다. 만약 채워져있다면 아래의 코드를 그 순서만큼 반복한다.

     

     

    사전에 terraform_code라는 빈 str값을 만들고 template안에 format을 사용하여 위에서 변수로 선언한 값을 집어넣는다.

    사용자가 vpc_name을 "test". IP 를"1.1.1.1", 2번째로 'test2" "2.2.2.2"로 만들었다면 아래와 같은 코드가 생겼을 것이다.

     

    resource "ncloud_vpc" "test" {{
     ipv4_cidr_block = "test"
     name = "1.1.1.1"
    }}
     
    resource "ncloud_vpc" "test2" {{
     ipv4_cidr_block = "test"
     name = "2.2.2.2"
    }}

     

    ....유레카!

    이걸로 위치의 랜덤과 순서의 랜덤을 무시할 수 있게 되었다!

    어차피 랜덤이어도 "채워넣어야"하니 그 부분을 파고든게 신의 한수가 되었다.

     

    거기에 이 코드의 좋은 점은 "리소스의 이름"을 지정할 수 있는 것이었다.

    기존의 count로 생성을 한다면 subnet에 알맞은 vpc를 넣는것도 일이었다.

     

    count를 통해 순서대로 vpc를 만들었다면, subnet에도 count를 넣는다면 순서대로 만든 vpc가 순서대로 들어간다.

    가령 vpc가 a,b,c를 만들었고, subnet입력란에 b,b,c,a,c 이런식으로 vpc에 소속된 subnet을 만드는 순간 count는 무용지물이 되어버려 한동안 고생을 했었다.

     

    하지만 단순반복은 그럴일이 없다. 그냥 사용자가 입력한 이름으로 리소스를 생성하면 되었다.

     

    이 얼마나 단순한가!

    이 얼마나 무식한가!

    이 얼마나 우아하지 못한가!

    이 얼마나 아름다운가!

     

    하고 자화자찬 하고 있었는데, 문제가 생겼다...ㅠ..

     

    1. 코드가 길어진다.

     

    템플릿을 만들고, 해당하는 템플릿을 검사할 코드를 넣고, 코드의 value값을 변수에 넣고, 해당하는 값을 format한다....

     

     

    이 무식한 길이를 보라.

    모든 리소스가 들어간것도 아니다. vpc subnet vm mysql mongodb nas만 집어넣었는데 코드는 500줄을 돌파했다....

    아마 완성되면 1000줄은 가볍게 넘지 않을까 싶다.....

     

    그래.

    아무튼 이렇게 tf코드는 처리하였다.

     

    뭐, 결과가 main과 variable이 합쳐진 하나의 main.tf 파일로 나온단게 흠이지만, 어차피 그건 그거대로 좋은거라고 생각해 넘어갔다. 다시 말하지만 필자가 받은 퀘스트는 "엑셀을 tf파일로 자동변환 및 실행." 이지 main과 variable의 분리가 아니기에....

     

     

    댓글