2020년 12월 9일 수요일

Build AWS Golden Image using Packer + Ansible


AWS Golden Image

이미지는 Immutable 특성으로 런-타임 환경 적용에서 환경 변수나 설정 파일 조정 등의 개입이 없습니다. 이는 서비스 환경의 애플리케이션 런-타임 환경의 일관성을 보장 합니다. 또한, 빠른 start-up 구성 하므로 Cloud Native Application 을 구현하는데 중요한 역할을 합니다.


Golden Image 의 강점 

  • 전달 과정에서 CD 와 같이 변경이 발생 하지 않는 Immutable 특성을 가집니다.
  • 보다 빠른 애플리케이션의 개발과 구동 시간 최적화가 가능합니다.
  • QA, PRODUCTION 과 같은 환경에 대응하여 일관되게 애플리케이션 이미지를 제공 합니다.
  • 불필요한 SW 패키지 없이 경량화된 크기로 최적화를 합니다.
  • 가장 안전한 운영 체계(OS) 환경을 (Security & Compliance) 제공 합니다.
  • 사람의 실수가 개입될 요소가 적습니다.
  • 관리 및 CI CD 등에서 자동화가 편리해 집니다.


이미지 유형

  • AMI: EC2 와 같은 OS 레벨의 런-타임을 구성 하는 이미지 입니다.
  • Docker: 컨테이너 레벨의 런-타임을 구성 하는 이미지 입니다.


Packer 소개 

Packer는 여러 플랫폼에 대해 동일한 시스템 이미지를 생성해 주는 오픈 소스 도구입니다.


Packer 의 강점 

  • 가장 안전한 OS 및 런타임 환경을 지속적으로 구성 관리 (Security Update & Patches) 합니다.
  • 버저닝을 통해 관리 될 수 있는 IaC 코드로 대체 되며 모든 구성 이력이 관리 됩니다. 
  • 사람의 실수로 인한 애러를 사전에 방지 합니다.
  • QA, PRODUCTION 과 같은 환경에 대응하여 이미지를 제공 할 수 있습니다.
  • 애플리케이션 런-타임에 필요한 패키지를 선택 하여 빌드가 가능 합니다.


Packer 의 컴포넌트 처리 흐름 


  1. Build: EC2 인스턴스를 생성 합니다.
  2. Provisioning: 애플리케이션 런타임 환경에 필요한 각종 패키지들을 설치 합니다.
  3. Post-Process: AMI 이미지가 생성된 이후 post-process 를 처리 합니다.

Ansible 소개

Ansible은 프로비저닝에 대한 자동화를 제공하는 오픈 소스 입니다. 프로비저닝 환경은 AWS, Azure, GCP 와 같은 CSP 벤더와 Docker, Vagrant, 등에 대해서도 지원 하고 있습니다.
또한 Yaml 표기로 IaC 코드를  쉽게 구성 관리할 수 있습니다.


Ansible 아키텍처 



개발자는 ansible-playbook 을 통해 IaC 에 해당하는 Code 를 작성 하게 됩니다. 
Code 는 모듈을 포함 하며 nginx, java 등의 설치 및 설정이 필요한 패키지 입니다.
CMDB 는 Provisioning 된 형상을 관리 하여 일관성을 유지시켜 줍니다.
Inventory 는 프로비저닝 대상 자원과 환경 정보 등을 관리 하게 됩니다. 


Ansible 프로젝트 레이아웃




패키지 모듈은 roles 폴더 하위에서 관리 됩니다.

그림에선 aws-codedeploy-agent, aws-ssm-agent, common 이렇게  3개의 모듈을 정의 되어 있습니다.


group_vars 는 각 모듈이 동일하게 참조 하는 값들을 관리 합니다. 


Ansible의 패키지 모듈(Role) 의 설명은 playbooks role 을 참고 합니다.










playbook 구성 요소 참고 





Packer + Ansible 의 Build Workflow 흐름  

packer + ansible 을 통해 AWS AMI 이미지를 빌드하는 전체 흐름은 아래와 같습니다.



AWS 관리용 EC2 를 위해 "aws-codedeploy-agent", "aws-ssm-agent" 모듈이 구성 되도록 샘플 프로젝트를 진행해 봅니다.

모듈의 설명은 아래와 같습니다.

모듈 설명
aws-ssm-agent AWS EC2 컴퓨팅 리소스에 대해 체계적인 관리를 지원하는 에이전트 입니다.
aws-codedeploy-agent 애플리케이션의 지속적인 배포를 지원하는 AWS Code 시리즈 제품 입니다.

필요에 따라 JDK, Node 등 애플리케이션에 꼭 필요한 모듈을 선택적으로 추가 할 수 있습니다.


사전 준비

사전 준비 작업으로 다음과 같은 작업을 진행 합니다.

  1. AWS IAM 계정을 생성하고 Access-Key 를 발급 받습니다.
    IAM 계정을 생성 가이드 참고
  2. 발급 받은 Access-Key 를 통해 aws configure profile 을 구성 합니다.
  3. packer 를 설치 합니다.
  4. anible 을 설치 합니다.


AWS 프로파일 환경 구성 

AWS Access-Key(Access Key, Secret Access Key) 정보는 절대 노출되어선 안되는 중요한 보안 정보 입니다.

그러므로 Access-Key 정보를 숨기고, AWS 자원을 액세스 하기 위해서 AWS 프로파일 정보를 설정 하여 진행 하는게 좋습니다.

예제는 'terra' 라는 프로파일을 구성하여 진행 합니다.


aws configure --profile terra

AWS Access Key ID [None]: *********
AWS Secret Access Key [None]: *******
Default region name [None]: ap-northeast-2
Default output format [None]: json


packer 설치

macOS 사용자는 brew 패키지 매지저를 통해 ansible 을 설치 할 수 있습니다.

brew update
brew install packer


ansible 설치 

macOS 사용자는 brew 패키지 매지저를 통해 ansible 을 설치 할 수 있습니다.

brew update
brew install ansible


빌드 

packer + ansible-playbook 을 통해 AMI 이미지를 빌드 합니다.


프로젝트 체크 아웃 

git 을 통해 프로젝트를 checkout 합니다.

mkdir ~/workspace
cd ~/workspace

git clone https://gitlab.com/symplesims/packer-ami-example.git


Packer 템플릿 파일 검증

템플릿 파일이 유효 한지는 packer validate 명령을 통해 확인 할 수 있습니다.

AWS_PROFILE=terra; AWS_REGION=ap-northeast-2; \               
packer validate ./packer/ubuntu/build.json


Packer 템플릿을 통한 빌드

packer build 명령을 통해 AMI 이미지를 빌드 합니다.

cd ~/workspace/packer-ami-example

AWS_PROFILE=terra; AWS_REGION=ap-northeast-2; \               
packer build ./packer/ubuntu/build.json


Packer 빌드 결과 확인

처리 과정은 Provisioning 로그로 확인이 가능 하며, 빌드가 완료 되면 AMI 아이디가 출력 됩니다.

amazon-ebs: AMI: ami-02e085bc686d3ad4b


생성된 AMI 아이디( ami-02e085bc686d3ad4b) 를 AWS Console 화면에서 조회 하면 다음과 같이 자세한 정보를 확인 할 수 있습니다.



소스 코드는 packer-ami-example 프로젝트 소스 코드를  참고 하세요.




댓글 없음:

댓글 쓰기

Build AWS Golden Image using Packer + Ansible

AWS Golden Image 이미지는 Immutable 특성으로 런-타임 환경 적용에서 환경 변수나 설정 파일 조정 등의 개입이 없습니다. 이는 서비스 환경의 애플리케이션 런-타임 환경의 일관성을 보장 합니다. 또한, 빠른 start-up 구성 하므...