매번 소스를 build해서 jar를 추출, 각 개발계 서버로 배포하고 수동으로 application kill/start를 하는 것 처럼 비효율적인것이 있을까?
우선 손가락이 아프다.
신입 개발자일 때는 그래도 이럴 때 리눅스 명령어를 한 번이라도 더 쳐보자! 하는 생각이었지만 워낙 단순한 명령어들이기 때문에 (대표적으로 ls -al, ll, cd) 조금만 반복하면 금새 숙달된다.
이런 반복 작업을 편리하게 해주는 것이 Pipeline이다.
우리 회사에서 사용중인 Bitbucket은 Pipeline을 쉽게 구축할 수 있도록 도와주는데 훗날 유용하게 써먹기 위해 본격적으로 기록을 시작한다...
Bitbucket > S3 bucket > CodeDeploy > EC2 Instance
기본 개념
- Bitbucket Repository
기본적인 소스 저장소이고, 해당 Repository 내의 일부 또는 모든 Branch에 Pipeline을 연결할 수 있다.
- Bitbucket Pipeline
Repository > S3 > CodeDeploy의 Application까지 연결할 수 있다.
bitbucket-pipelines.yml을 작성하여 구축한다.
- Atlassian에서 제공하는 Docker image에서 소스파일을 test&build
- 소스 파일을 zip으로 압축 후 S3 bucket에 upload
- CodeDeploy를 통해 각 Instance로 배포
- Amazon S3
AWS에서 제공하는 클라우드 스토리지로 쉬운 예로 구글 드라이브와 같다고 할 수 있고, 유저들이 업로드하는 파일들을 저장하기 위해 주로 사용하지만 여기서는 zip으로 압축된 소스파일을 보관하는 저장소로 사용한다.
개발자가 지정한 S3 bucket에 올라온 zip파일을 CodeDeploy를 통해 각 EC2 Instance로 배포한다.
- AWS CodeDeploy
각 프로젝트 내의 bitbucket-pipeline.yml에 지정한 Application과 이하 배포 그룹을 설정할 수 있고, 여기서 배포 대상 Instance들을 배포 그룹 하나로 관리할 수 있다(=여러 인스턴스에 한 번에 배포할 수 있다.).
각 인스턴스에서 S3로부터 받은 소스는 개발자가 appspec.yml에 지정한 *.sh 파일을 통해 배포된다(After/Before install, Application stop/start 등..).
- EC2 Instance
가상 컴퓨터. 서버 소스는 해당 컴퓨터에 있고, 소스가 배포되는 대상이다.
AWS 계정에 CodeDeploy 정책 권한 추가하기
각 개발자는 본인의 AWS 계정에 CodeDeployRole을 추가해야한다(IAM).
CodeDeploy 정책 추가
CodeDeploy 어플리케이션 설정
CodeDeploy를 사용하기 위해 우선 Application을 생성해야 한다.
Application 생성
Application 생성 과정
- 적당한 Application 이름을 지정한 뒤, 컴퓨팅 플랫폼에서 EC2/온프레미스를 선택하고 애플리케이션을 생성한다.
- 배포 그룹을 생성한다.
환경 구성 시 Amazon EC2 인스턴스에 여러대의 인스턴스를 등록할 수 있다.
EC2 instance 및 기타 설정
- aws cli 설정하기
EC2 instance에 aws cli가 설치되어 있지 않다면 설치하고 aws cli에 aws 계정 정보를 입력해야 한다. (aws cli configure 를 입력했을 때 어떤 정보가 나오지 않는다면 aws cli에 aws 계정 정보가 설정되지 않은 상태...)
aws cli에 필요한 정보는 [IAM → 사용자 → 계정 선택 → 보안 자격 증명 → 액세스 키 ID]에 있다.
이미 알 수 없는 경우에는 액세스 키 중 사용하지 않는 키를 비활성화 한 후에 다시 발급받으면 다운받은 csv 파일에 AWS Access Key ID 와 AWS Secret Access Key ID가 나와 있다!
aws cli configure 입력 후 AWS Access Key ID, AWS Secret Access Key ID, region(region이 변경되지 않는 한 ap-northeast-2), json을 입력한다.
입력을 마친 후에 aws cli configure 를 입력하면 입력한 정보들이 *로 가려진 채 출력이 됩니다.
- codedeploy-agent 설치하기
자동으로 설치되었다면 현재 codedeploy-agent 가 작동중인지 확인한다.
sudo service codedeploy-agent status
- EC2 instance 권한 설정하기
CodeDeploy는 S3 에서 파일을 다운받기 때문에 EC2 instance에서 S3 bucket에 접근해 파일을 다운받을 수 있는 권한이 있어야 한다.
EC2 콘솔에서 배포 대상 Instance를 선택하여 IAM 역할에서 미리 생성해둔 CodeDeployRole을 추가한다.
- appspec.yml 작성하기
appspec.yml은 CodeDeploy를 통해서 소스가 배포되었을 때 동작을 정의하는 파일이다.
appspec.yml 예제
appspec.yml permission에 대한 설명
아래 예제와 같이 각 동작별로 개발자가 작성한 *.sh 파일이 실행되게 할 수 있다.
hooks:
ApplicationStop:
- location: scripts/stop.sh
timeout: 300
runas: root
BeforeInstall:
- location: scripts/backup.sh
timeout: 300
runas: root
AfterInstall:
- location: scripts/deploy.sh
timeout: 300
runas: root
ApplicationStart:
- location: scripts/start.sh
timeout: 300
runas: root
Bitbucket repository 설정하기
- Bitbucket repository settings → PIPELINES Settings → Enable Pipelinse 설정
- Bitbucket repository settings → PIPELINES Repoistory variables에서 bitbucket-pipelines.yml에 쓸 변수를 미리 설정
AWS Access Key ID
AWS Secret Access Key
AWS Default Region
Application Name
S3 Bucket
S3 Key 등
민감정보는 반드시 암호화하여 저장해둔다.
- bitbucket-pipelines.yml 파일 작성
해당 파일 없이는 pipeline이 작동하지 않는다.
Bitbucket pipeline 에 대한 자세한 설명