이 글은 Golden Image Pipeline 구성 - 1. Packer와 Ansible로 이미지 만들기의 후속이다. 이번에는 golden ami를 정의한 packer 템플릿이나 ansible playbook에 변경 후 branch에 push될 경우 ami를 생성하도록 구성하는 방법을 설명한다.
AMI ID를 콘솔에 접속하지 않고 바로 출력할 수 있도록 packer 템플릿에 manifest file을 생성하는 post-processor를 추가하고, 최신 linux ami를 가져오는 data 블럭을 새로 만들었다.
# base-linux-ami.pkr.hcl
locals {
timestamp = regex_replace(timestamp(), "[- TZ:]", "")
}
data "amazon-ami" "amzn2-lts" {
filters = {
name = "amzn2-ami-hvm-*-x86_64-gp2"
root-device-type = "ebs"
virtualization-type = "hvm"
}
most_recent = true
owners = ["amazon"]
}
source "amazon-ebs" "base-linux-ami" {
region = "ap-northeast-2"
ami_name = "amzn2-base-ami-${local.timestamp}"
source_ami = data.amazon-ami.amzn2-lts.id
vpc_id = "vpc-id"
subnet_id = "subnet-id"
instance_type = "t2.micro"
ssh_username = "ec2-user"
tags = {
Name = "amzn2-base-ami-${local.timestamp}"
Base_AMI_ID = "{{ .SourceAMI }}"
Base_AMI_Name = "{{ .SourceAMIName }}"
}
}
build {
sources = [
"source.amazon-ebs.base-linux-ami"
]
provisioner "ansible" {
playbook_file = "playbook/playbook.yml"
use_proxy = "false"
user = "ec2-user"
}
post-processor "manifest" {
output = "manifest.json"
strip_path = true
}
}
Github Actions이 AWS와 상호 작용하기 위해 자격 증명 구성이 필요하다.
Github Actions는 CI/CD 워크플로에서 중요 데이터나 암호들을 안전하게 사용할 수 있도록 Secrets를 제공하고 있다. 여기에 액세스 키를 저장하면 Github 실행 로그에도 마스킹 처리가 되고, 정의된 컨텍스트 내에서만 사용할 수 있기 때문에 사용 범위 제한이 가능하다. AWS에서 해당 액세스 키의 주체에게 최소 권한만을 부여하고, 자주 액세스키를 교체해주는 등의 작업을 통해 보다 안전하게 사용할 수 있다.
Golden image pipeline을 구성할 리포지토리의 Settings 탭에서 Secrets 메뉴에 접근할 수 있다. 다음 두 key에 대한 값을 저장한다.
위에서 설정한 자격 증명은 이후 workflow 파일에서 AWS 자격증명을 구성하는 데에 사용된다.
workflow 파일 작성 문법에 대한 글은 다음 게시글을 참고 바란다.
다음은 내가 작성한 workflow 정의 파일이다. workflow 파일은 .github/workflows
아래에 위치해야한다.
main branch에 push 작업이 일어날 때마다 jobs 아래에 정의된 작업들이 순차적으로 실행된다.
#build-ami.yml
name: Build Golden Image
on:
push:
branches:
- main
jobs:
packer:
runs-on: ubuntu-latest
name: Run Packer
steps:
- name: Checkout Repository # 현재 리포지토리의 코드를 체크아웃
uses: actions/checkout@v2
- name: Configure AWS Credentials # GitHub Secrets에서 AWS 자격 증명을 구성
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: ap-northeast-2
- name: Initialize Packer Template # Packer 템플릿 초기화
uses: hashicorp/packer-github-actions@master
with:
command: init
- name: Validate Packer template # Packer 템플릿 유효성 검증
run: packer validate base-linux-ami.pkr.hcl
- name: Build AMI # Packer 템플릿 build
run: packer build base-linux-ami.pkr.hcl
env:
PACKER_LOG: 1 # Packer 로그 활성화
workflow 정의파일을 업로드한 다음, ansible playbook 파일을 수정 후 main branch에 push해보겠다.
push 명령어 실행 후 바로 Github Actions이 실행된다. commit message와 함께 작업 내용이 표시되고, 실시간으로 작업 진행 현황을 확인할 수 있다.
작업이 정상적으로 완료되면 Github UI 상에서는 다음과 같이 표시된다.
post-processor가 생성한 manifest 파일에는 ami id와 packer run uuid 정보 등이 표시된다.
다음 스크립트를 실행하여 manifest 파일에서 최신 ami id를 불러와봤다. AMI ID가 잘 출력되는 걸 확인할 수 있다.
# get_ami_id.sh
AMI_ID=$(jq -r '.builds[-1].artifact_id' manifest.json | cut -d ":" -f2)
echo $AMI_ID
Golden Image Pipeline 구성 - 1. Packer와 Ansible로 이미지 만들기 (0) | 2023.06.26 |
---|---|
GitHub Actions Workflow 문법 정리 (0) | 2023.06.22 |
댓글 영역