Docker 컨테이너에서 변경된 구성 요소의 dir 만 terraform 명령을 돌리는 make 명령을 유지합니다.

소개



안녕하세요! 도내에서 엔지니어를 하고 있는, 지금부터 SRE를 해 가겠다 나르 라고 합니다.
최근 기사를 쓸 수 없었습니다만, 3월부터 새로운 직장이라고 하는 일도 있어, 이번 주는 전직으로 만든 것의 공양에 5개 정도 기사를 써 가고 싶습니다.

무엇을 만들었는가



Terraform에서 인프라를 코드 관리하고 아래 그림과 같이 미세한 구성 요소로 나누어 관리하는 경우,
pullrequest를 치기 전에 로컬에서 각각의 dir에 cd하고 terraform 명령을 치면 좋겠다 (plan-all 명령이 원하는) 케이스가 많이 있다고 생각합니다.


구성 요소를 나누는 이야기 세부 사항 -> Terraform의 구성 요소 분할을 고려하십시오.

이번에는 지금까지 개인 이용의 범위에서는 Bashscript 쓰고 make 명령 (make plan/all)으로 직접 호출했던 것을 팀에 공유 할 때 Windows 사용자도 사용할 수 있도록 docker 컨테이너를 시작하고 거기에서 terraform plan 치도록 변경했으므로, 그 구조를 공유하고 싶습니다.

파일 구성


  • 구성은 Dockerfile, plan_all.sh 및 Makefile을 만듭니다.

    Dockerfile
    FROM hashicorp/terraform:0.12.xx
    
    COPY . .
    #大元のimageのENTRYPOINTを消す
    ENTRYPOINT [] //❶
    

    ❶ : hashicorp/terraform의 이미지는 ENTRYPOINT [ "terraform"]가 설정되어 있으므로 docker run 플래그 (--entrypoint)로 덮어 쓰거나 여기에서 []로 덮어 씁니다 (실행을 COMMAND 측 에 보내는) 것이 좋다고 생각합니다.

    scripts/tf/plan_all.sh
    #!/bin/sh -xe
    
    export EXCLUDE_DIRS='^\.|scripts|modules|config|app|slack_bot_cdk|dockerfiles|event_pattern'
    DIRS=$(git --no-pager diff HEAD --name-only | xargs -I {} dirname {} | egrep -v "$EXCLUDE_DIRS" | uniq) //❶
    if [ -z "$DIRS" ]; then echo "No directories for plan."
        exit 0
    fi
    for dir in $DIRS //❷
    do
        echo $dir
        (cd $dir && terraform init -input=false -no-color)
        (cd $dir && terraform plan -input=false -no-color)
    done
    

    ❶: EXCLUDE_DIRS로 지정한 dir 이외에 HEAD와의 차이가 있는 dir의 이름을 DIRS에 대입하고 있습니다
    ❷ : DIRS 각각으로 terraform plan을 치고 돌아갑니다

    Makefile
    build/tf:
        docker build -f dockerfiles/tf/Dockerfile -t vk-tf:latest .\
            --cache-from vk-tf:latest
    plan/all:
        make build/tf
        docker run -e "AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}" -e "AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}" \
            vk-tf:latest scripts/tf/plan_all.sh //❶
    

    ❶: 정의한 Dockerfile의 image를 build 하고, 그 녀석을 기동해 작성한 scripts/tf/plan_all.sh 를 치고 있습니다. 실제의 조작으로서는, 실행하고 싶은 환경의 AWS의 ENV를 세트 해 make plan/all

    마지막으로



    컴포넌트 나누었다 + terragrunt 등의 툴 넣고 싶지 않은 경우에 상당히 유효할까라고 생각하므로 꼭 사용해 보세요.
  • 좋은 웹페이지 즐겨찾기