3. 배포 요정의 CI/CD 적응기

AWS IAM, EC2, S3, CodeDeploy 설정

Developer to try
Developer to try
12 min readJun 14, 2020

--

AWS IAM (사용자 설정)

  • Github Actions이 AWS에서 필요로 하는 권한을 최소한으로 가지고 실행할 수 있는 사용자를 설정해야 합니다.
    (※ Root 사용자는 모든 권한을 가지고 있어서 위험합니다.)
  • 바로 이전 포스팅에서 작성한 workflow는 Build만 하고 필요한 추후 작업을 하지 않았습니다. AWS CLI에서 실행 해야할 S3 업로드, Code Deploy를 통한 EC2배포에 대한 권한이 필요합니다.
    그래서 두개의 권한을 가진 사용자를 추가하도록 합니다.
  1. AWS IAM에서 사용자를 누른 후에 사용자 추가를 선택합니다.

2. 사용자의 이름과 액세스 유형을 체크한 후에 다음을 눌러주세요

3. 기존 정책 직접 연결에서 S3FullAccess 검색 후에 체크

4. 마찬가지로 AWSCodeDeployFullAccess 검색 후에 체크

5. 두 개의 권한이 선택 되었는지 확인 후에 사용자 만들기

6. 사용자 추가 후에 .csv 다운로드 버튼을 클릭하여 별도로 액세스키 파일로 보관 (저장하지 않으면 다시 생성후 다운로드 해야합니다)

AWS IAM (역할 설정)

이번에는 사용자를 대신해서 위의 액세스키와 비밀키를 가지고 원하는 기능을 할 수 있는 Role을 만들어보려고 합니다.(EC2와 CodeDeploy에 대한 설정)

  1. IAM에서 역할 탭에서 역할 만들기

2. EC2 선택 후 권한 연결

3. AmazonEC2RoleforAWSCodeDeploy 정책 검색 후 체크

4. EC2RoleforAWSCodeDeploy 역할이 포함되었는지 확인 후 만들기

5. CodeDeploy를 선택 후 역할 설정

6. 다른 새로운 CodeDeploy를 위한 역할 설정

위와 같이 AWSEC2RoleForAWSCodeDeploy, AWSCodeDeployRole 2개의 역할을 만들어 놓는다.

AWS S3 생성

이름과 리전(서울)을 선택한 후 추가 옵션 없이 다음을 누르고 S3버킷 생성

EC2 생성

EC2 생성에 대한 내용은 따로 쓰진 않겠습니다.
저 같은 경우 t2.micro 인스턴스안에 Ubuntu 18.04 버전의 OS를 사용하고 있습니다.

EC2 인스턴스 IAM 연결

  1. 만들어진 인스턴스에서 아래와같이 IAM 역할 연결

2. IAM역할에 아까만든 EC2RoleforAWSCodeDeploy역할을 가진 IAM 선택

EC2에 설치해야 하는 것들

  • JDK (빌드한 파일을 실행하기 위해서)
  • CodeDeploy Agent (Aws의 CodeDelploy를 사용하기 위해서 필요)
  • wget을 통해 install파일을 다운 받아 사용 뒤의 링크의 bucket-name과 region-identifier를 써야하는데 S3의 버킷이름이 아니라 리소스 키트 링크에있는 버킷네임과, 리전 식별자를 참조해서 써야한다.
  • CodeDeploy Agent install Document
  • 리소스 키트 링크

위의 레퍼런스를 참조하여 작성해보자면 이렇게 쓰면 됩니다

wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install

위의 명령어를 통해 Install을 받은 모습

받은 Install에 실행 권한을 주고 실행하여 설치하고 codedeploy-agent가 실행중인지 확인되면 끝

아래 명령어로 실행중인지 확인

sudo service codedeploy-agent status
codedeploy-agent 비활성화

위와 같은 경우 비활성화가 되어있으므로

sudo service codedeploy-agent start

를 입력하여 실행시킨다.

codedeploy-agent 활성화

AWS CodeDeploy 생성 및 설정

1. 애플리케이션 생성
2. 애플리케이션 이름과 컴퓨팅 플랫폼 선택 후 생성
3. 애플리케이션 생성 완료 & 배포 그룹 생성
배포 그룹 생성 작성 (1)
  • 이름과 서비스 역할 선택 (AWSCodeDeployRole)
배포 그룹 작성 (2)
  • 자신의 EC2 인스턴스 이름으로 태그 작성
배포 그룹 작성 (3)
  • 한번에 한개의 인스턴스에만 배포할것이라 OneAtTime 선택
    (배포 구성 방법과 로드 밸런서에 자세하게 알지 못해서 다음번에 공부해보고 정리하려고 합니다!)

workflow에 Step추가

ExampleAwsCodeDeploy_workflow_version1

위의 workflow_version1을 보면 빌드만 하고 다음 step을 정의하지 않았습니다. 그래서 아래와 같이 작업을 추가하려고 합니다. (workflow_version2라 칭함)

ExampleAwsCodeDeploy_workflow_version2

zip 압축하기

zip -r ./build.zip .
  • 먼저, 파일을 1개씩 보내는거 보다 압축해서 효율적으로 전송합니다.
    zip 명령어를 사용하여 압축합니다. (위의 주석에 자세하게 설명을 써놨습니다)

AWS Credential (인증)

# aws 인증서비스
# github repository에서 Setting에서 사용할 암호화된 변수
- 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: ${{ secrets.AWS_REGION}}
  • AWS의 서비스를 이용하기 위해서 인증을 받아야 합니다.
    workflow.yml 파일에 입력하여 인증할 수 있지만, Github repository에서 해당 키가 노출되기 때문에 위험합니다. 그래서 AWS access key와 secret key를 실행하는 시점에 안전하게 꺼낼 수 있게 설정하는 변수가 있습니다.
    Document 참조하여 작성
  1. Settings에서 Secrets탭에서 변수 생성하기

2. 위의 IAM 사용자 설정에서 받은 .csv 파일에 적혀있는 key vlaue들을 아래의 규칙에 맞추어 작성.

IAM 사용자를 설정하면서 받은 .csv 파일을 참조하여 작성
Name : AWS_ACCESS_KEY_ID / Value : access-key
Name : AWS_SECRET_ACCESS_KEY / Value : secret-access-key
Name : AWS_REGION / Value : ap-northeast-2

3. 3개의 Secret 변수 설정 완료

AWS S3 업로드하기

# Upload to S3 stroage 
— name: Upload to S3
run: aws s3 cp build.zip s3://$BUCKET_NAME/deploy/$PROJECT_NAME
.zip --region ap-northeast-2
  • S3에 복사를 하는데 bulid.zip이라는 파일을 S3의 저장소이름/deploy/커밋 ExampleAwsCodeDeploy.zip 이름으로 복사
  • AWS CLI S3 명령어 링크

Codedeploy에 배포 생성하기

# AWS CodeDeploy 실행 
— name: Code Deploy
run: aws deploy create-deployment
— application-name WebserviceCodeDeploy
— deployment-config-name CodeDeployDefault.OneAtATime
— deployment-group-name WebserviceCodeDeployDeployGroup
— s3-location bucket=$BUCKET_NAME, bundleType=zip, key=deploy/$PROJECT_NAME.zip

위의 작업까지 실행하게 되면 S3에 파일을 업로드하고 배포를 생성하는 작업까지 완료하게 됩니다. 그 다음 작업으로 EC에 배포가 되어진 후에 해야할 작업에 대해 설정을 해야합니다.
Codedeploy에서 만들어줬던 애플레케이션이 배포 생성작업을 실행하면 EC2의 CodeDeploy agent에서는 그 프로젝트를 어디에 저장하고, 어떤작업을 실행할지, 어떤 권한을 줄지 등 여러 설정을 진행할 수 있습니다.

AppSpec 설정 하기

  • 설정하기 전 먼저 S3에서 zip파일을 받아올 경로를 생성해줍니다.
mkdir -p applications/ExampleAwsCodeDeploy
저는 위와 같은 경로에 s3에서 zip파일을 받아올 것입니다.
  • appspec 설정파일은 프로젝트의 root에 appspec.yml 의 이름으로 존재해야합니다.
프로젝트 root폴더 바로 아래 appspect.yml의 이름으로 생성

먼저 간단하게

version: 0.0
os: linux
files:
- source: /
destination: /home/ubuntu/applications/ExampleAwsCodeDeploy

위와같이 작성후 push를 하게되면

위와 같이 배포생성이 완료되고 아래와 같이 EC2의 destination으로 설정한 디렉터리에 s3에 저장한 파일이 전송이 됩니다.

잠깐만…. 우리가 원한건 배포인데 파일 옮기기만 된거 아닌가요?

그래서 appspec.yml에 파일을 옮긴 후 실행 해야 할 스크립트를 써줍니다.

hooks 부분에 S3저장소로 부터 받은 파일을 받은 이후 해야할 작업에 대해 정의 합니다. 현재 경로의 deploy.sh라는 파일을 실행하도록 해놓았습니다.
AppSpec File 구조 알아보기

마지막으로 deploy.sh 스크립트 파일에서 배포를 위해 해야할 작업에 대해서 쓰도록 하겠습니다.

배포 했던 파일을 실행중이라면 종료를 해주고, 실행 시켜줄 jar파일의 경로를 찾아 실행시키는 스크립트입니다.

마지막으로 소스코드를 수정후 remote master 브런치에 push를 하면 자동으로 배포가 되는지 확인하겠습니다.

push후 actions 작동
CodeDeploy 배포 생성
모든 Event들이 잘 작동하고 appspec.yml에 정의한 AfterInstall 동작도 잘되는걸 확인.
ip:8080/hello 동작 여부 확인

CI/CD 포스팅을 마치며….

CI/CD Tool(github acition)을 가지고 master브런치에 push만 하면 자동으로 배포를 진행해주는 프로세스에 대해서 직접 경험할 수 있었습니다. CI/CD라는 개념이 왜 나오게 되었는지, 개념을 도입하면 어떤것을 이룰 수 있는지, 또한 CICD Tool에 대한 사용 방법을 얻어가시길 바랍니다! 사용 방법은 시간이 지나면 바뀔 수 있으므로 최대한 공식 사이트의 document를 참조하여 작성하시라고 링크를 달아두었습니다!

--

--