[packer] packer를 사용한 AMI 빌드 파이프라인 with 깃헙 액션
상황
packer를 사용하여 AMI를 빌드 할 수 있게 되었고, 이 이미지를 사용하여 외부 인터넷망을 못타는 프라이빗 서브넷으로 인스턴스를 구성하여도 필요한 구성들을 프로비저닝하여서 만들 수 있게 되었습니다.
하지만 늘 로컬 빌드를 하는것은 불편하다고 생각했습니다. 그래서 깃헙액션을 이용해서 코드를 관리하고 빌드하는 과정을 고도화 하고자 하였습니다.
문제 상황
코드를 푸쉬할 때 마다 ami를 빌드하자니 서브디렉토리의 갯수만큼 빌드할때마다 중복 빌드가 되어서 이미지의 관리가 안되는 문제가 있었습니다.
해결
깃헙 액션의 fetch-depth을 사용해서 이전 커밋들을 가져옵니다. 그리고 현재 커밋을 비교해서 변화가 있는 서브 디렉토리를 감지해서, 이전 단계에서 확인한 CHANGES
값이 1일 경우 (즉, 변경 사항이 있을 경우) AMI를 새로 빌드하는 방식으로 깃헙 액션을 구성했습니다.( matrix를 사용하여 여러 디렉토리에 대한 작업을 동시에 실행했습니다.)
위 사항을 고려해서 구성한 AMI 빌드 github action yaml파일은 밑과 같습니다.
name: Packer AMI Builds
on:
push:
branches:
- mainjobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
directory: ['aws-cli-ami', 'cloudwatch-agent-ubuntu-ami', 'cloudwatch-agent-graviton-ami', 'cms-supporter-backoffice-ami', 'nginx', 'docker-amazon-linux-ami']
steps:
- name: Checkout code
uses: actions/checkout@v2
with:
fetch-depth: 0 - name: Setup `packer`
uses: hashicorp/setup-packer@main
id: setup
with:
version: ${{ env.PRODUCT_VERSION }} - name: Check pushed directory
id: check_changes
run: |
CHANGES=0
for dir in ${{ matrix.directory }}; do
if [[ -n $(git diff --name-only ${{ github.event.before }}..${{ github.sha }} | grep "^$dir/") ]]; then
CHANGES=1
break
fi
done
echo "::set-output name=changes::$CHANGES" - name: Build AMIs with Packer!
if: steps.check_changes.outputs.changes == '1'
env:
AWS_ACCESS_KEY: ${{ secrets.AWS_ACCESS_KEY }}
AWS_SECRET_KEY: ${{ secrets.AWS_SECRET_KEY }}
AWS_REGION: ${{ secrets.AWS_REGION }}
FLAME_PASSWORD: ${{ secrets.FLAME_PASSWORD}}
run: |
for dir in ${{ matrix.directory }}; do
cd $dir
packer init .
packer build .
done
그 결과 이렇게 변화가 있을경우에만 빌드가 되고, 변화가 없을 경우에는 스킵되는 플로우를 만들었습니다.
이것으로 의미없는 AMI의 빌드를 없애는 플로우를 만들 수 있었습니다.