GiitHubActions와 Terraformer를 이용하여 Terraform을 이용하여 기존의 AWS 환경을 관리하다

개시하다


이미 운용된 AWS 환경에서 로트 53의 도메인 일람과 보안 그룹의 IP 일람 등을 조사하려다 구성 관리가 되지 않으면 일이 힘들 때도 있다.
이 때 Google에서 제공하는 Terraformer 를 사용하면 Terraform 정의 파일을 생성할 수 있으며, 명령선에 따라 조사할 수 있어 매우 편리합니다.
예를 들어 Route 53의 도메인 일람 등은 생성된 파일에서 다음 명령을 실행하면 일람표를 쉽게 얻을 수 있습니다.
grep name ./generated/aws/route53/route53_record.tf | awk '{print $3}' | sort -u
그러나 관리가 구성되지 않은 조직에서는 AWS 콘솔에서 자원을 임의로 제작, 변경, 삭제할 수 있기 때문에 매번 조사할 때마다Terraformer를 집행하여 최신 정보를 얻는다.
이때GiitHubActions를 이용하여 창고에서Terraformer가 생성한 정의 파일을 자동으로 관리할 수 있습니다.

GitHubActions


name: 'Terraformer'

on:
  schedule:
    - cron:  '0 0 * * *'
  workflow_dispatch:
  
jobs:
  terraform:
    name: 'Terraformer'
    runs-on: ubuntu-latest

    steps:
    - name: Checkout
      uses: actions/checkout@v2

    - name: Setup Terraform
      uses: hashicorp/setup-terraform@v1

    - name: Configure AWS Credentials
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        aws-region: us-east-1

    - name: Install terraformer
      env:
        PROVIDER: aws
      run: |
        curl -LO https://github.com/GoogleCloudPlatform/terraformer/releases/download/$(curl -s https://api.github.com/repos/GoogleCloudPlatform/terraformer/releases/latest | grep tag_name | cut -d '"' -f 4)/terraformer-${PROVIDER}-linux-amd64
        chmod +x terraformer-${PROVIDER}-linux-amd64
        sudo mv terraformer-${PROVIDER}-linux-amd64 /usr/local/bin/terraformer
        terraformer -v

    - name: terraformer import
      run: |
        echo 'provider "aws" {}' > init.tf
        terraform init
        export resources=`terraformer import aws list`
        set +e
        for resource in ${resources} ; do terraformer import aws --resources=${resource} --regions=us-east-1 ; done
        ls -lR

    - name: Install tfsec
      run: |
        curl -LO https://github.com/tfsec/tfsec/releases/download/$(curl -s https://api.github.com/repos/tfsec/tfsec/releases/latest | grep tag_name | cut -d '"' -f 4)/tfsec-linux-amd64
        chmod +x tfsec-linux-amd64
        sudo mv tfsec-linux-amd64 /usr/local/bin/tfsec
        tfsec -v

    - name: tfsec check
      run: |
        tfsec ./generated/aws --out tfsec.json --format json -s
        
    - name: git push files
      run: |
        git config --local user.email "[email protected]"
        git config --local user.name "GitHub Action"
        git add .
        git commit -m "Add changes"
        git push

실행 시기


on:
  schedule:
    - cron:  '0 0 * * *'
  workflow_dispatch:
workflow의 실행 조건은 시간표 실행과 수동 실행을 정의합니다.
UTC 시간이므로 위의 경우AM09:00/日次에서 정기적으로 수행됩니다.
또한 임의의 시간에 실행할 수 있음workflow_dispatch도 정의했다.
이를 통해 GiitHubAction 화면에서 워크플로우를 수동으로 실행할 수 있습니다.

Terraform 설치 및 설치


    - name: Setup Terraform
      uses: hashicorp/setup-terraform@v1

    - name: Configure AWS Credentials
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        aws-region: us-east-1
Terraformer를 실행하기 위해서는 Terraform 명령을 실행해야 하기 때문에 Terraform의 공식 Actions를 통해 설치하고 AWS 공식 Credentials가 설정한 Actions를 실행한다.
AWS의 액세스 키 값은 GiitHubSecrets에서 얻었기 때문에 사전 로그인GitHubSecrets이 필요합니다.

Terraformer 설치


    - name: Install terraformer
      env:
        PROVIDER: aws
      run: |
        curl -LO https://github.com/GoogleCloudPlatform/terraformer/releases/download/$(curl -s https://api.github.com/repos/GoogleCloudPlatform/terraformer/releases/latest | grep tag_name | cut -d '"' -f 4)/terraformer-${PROVIDER}-linux-amd64
        chmod +x terraformer-${PROVIDER}-linux-amd64
        sudo mv terraformer-${PROVIDER}-linux-amd64 /usr/local/bin/terraformer
        terraformer -v
Terraformer의 설치 단계에 따라 설치합니다.
이번에는 AWSPROVIDER에만 지정aws됐다.환경에 따라 설정하십시오.

Terraformer import의 실행


    - name: terraformer import
      run: |
        echo 'provider "aws" {}' > init.tf
        terraform init
        export resources=`terraformer import aws list`
        set +e
        for resource in ${resources} ; do terraformer import aws --resources=${resource} --regions=us-east-1 ; done
        ls -lR
Terraform의 AWS Provider를 가져온 후 실행import합니다.
사용 상황에 따라 import에 필요한 자원을 지정할 수 있지만 자신은help의 결과에서 대응하는 자원을 얻어 대응하는 자원을 모두 얻을 수 있다.
환경과 실행된 IAM 사용자의 역할에 따라 실패한 자원이 존재하기 때문에 실행 전set +e에 명령을 무시하는 status.(이렇게 하지 않으면 얻을 수 없는 자원이 있을 때workflow가 이상하게 끝납니다.)

tfsec 설치


    - name: Install tfsec
      run: |
        curl -LO https://github.com/tfsec/tfsec/releases/download/$(curl -s https://api.github.com/repos/tfsec/tfsec/releases/latest | grep tag_name | cut -d '"' -f 4)/tfsec-linux-amd64
        chmod +x tfsec-linux-amd64
        sudo mv tfsec-linux-amd64 /usr/local/bin/tfsec
        tfsec -v
tfsecTerraform의 정적 분석 도구로 잠재적인 안전 문제를 검사할 수 있다.
테라form의 구성관리 운용이 시작되면 CI를 사용하는 것이 좋으므로 사전에 현재의 위험을 식별할 수 있도록 추가했다.
GiitHubActionsterraform-security-scan가 있는데 이것은 Actions가 Livelic에 대한 검사 결과를 발표한 논평으로 이번 사용 장면과 일치하지 않기 때문에 설치하여 사용한다.

tfsec의 실행


    - name: tfsec check
      run: |
        tfsec ./generated/aws --out tfsec.json --format json -s
창고에서도 tfsec의 실행 결과를 볼 수 있도록 파일 출력을 지정합니다.
출력 형식은 몇 가지가 있는데 사용 방법에 따라 지정할 수 있다.
Select output format: default, json, csv, checkstyle, junit, sarif
안전 검사 결과에 문제가 있으면 명령이 이상하게 종료되므로workflow는 실패하지 않음-s으로 설정됩니다.
Github Security Alerts로 알리는 GiitHubActions도 있지만 Code scanning alerts 기능을 효율화해야 하고 개인 창고에서 사용할 때Enterprise는 계약서에서 구매GitHub Advanced Security를 선택해야 하기 때문에 포기했다.

git push


    - name: git push files
      run: |
        git config --local user.email "[email protected]"
        git config --local user.name "GitHub Action"
        git add .
        git commit -m "Add changes"
        git push
GiitHubAction 내 Push가terraformer를 통해 생성된terraform 정의 파일과 tfsec의 결과입니다.

.gitignore


terraform에 대한 디렉터리와 tfstate 파일은 창고 관리가 필요하지 않기 때문에 제외합니다.
.terraform
*.tfstate

주의점


GTHubAction 무료


AWS 자원이 여러 개 있으면workflow의 실행 시간이 길어지기 때문에 GiitHubAction의 사용 시간이 많이 소모됩니다.
GiitHub의 계약계획무료 사용 시간에 따라 Organization 내 GiitHubAction 사용 현황을 파악하면서 수행 빈도 등을 조정해 주십시오.

좋은 웹페이지 즐겨찾기