리브어트

AWS Codepipeline을 이용해서 서버 배포 자동화(Codecommit, Codebuild, Codedeploy, ECR, ECS) - 1 본문

Tech/Others

AWS Codepipeline을 이용해서 서버 배포 자동화(Codecommit, Codebuild, Codedeploy, ECR, ECS) - 1

Yunhoo_kim 2019. 4. 24. 16:44
728x90

Codepipeline은 왜 사용하는가?

devops는 개발자가 배포 및 운영까지 하는 용어를 일컫습니다.

CI/CD(Continuous Integration, Continuous Delivery)을 구축을 하는 목표에 있으며 지속적으로 개발과 배포가 될 수 있도록 서비스를 구축하는 것입니다.

개발팀이 개발물을 생성하고 배포팀이 배포를하고, 운영팀이 배포된 서버를 운영하고.

정말 좋은 것 같습니다.

하지만 전 초기 스타트업을 만들고 있는 개발자입니다.

초기 스타트업에서 서버 개발자는 많으면 3명 혹은 1명입니다. 우리에게는 devops라는 말이 무의미합니다. 배포팀과 운영팀이 결국 개발팀이기 때문입니다.

하지만 혼자 배포, 운영, 개발을 처리하기가 만만치 않기 때문에 좀 더 유지없이 배포와 운영을 할 수 없을까 공부를 했습니다.

그러던중 AWS의 codepipeline과 ECS, Docker를 만나게 되었습니다.

Codepipleline은 내가 작성한 코드가 릴리즈가 되면 새로운 Docker 이미지를 빌드해줍니다.

새로이 빌드된 이미지는 ECR에 저장되어서 현재 우리가 유지하고 있는 ECS 클러스터 서버에 배포가 됩니다.

저는 소스코드 저장소에 push만 하게 되면 빌드 - 테스트 - 배포가 AWS에 의해서 진행됩니다.

Codepipeline을 사용하면 AWS를 우리 회사의 배포, 운영팀으로 사용할 수 있습니다.

 

1. Codebuild 생성 (codecommit 소스를 통해서 Docker 이미지 생성)

codebuild에 대한 설명은 AWS에서 잠깐 보고 오실게요.

https://aws.amazon.com/ko/codebuild/

 

AWS CodeBuild – 완전관리형 빌드 서비스

AWS CodeBuild는 기업이 자체적으로 서버 및 소프트웨어를 설정, 패치, 업데이트 및 관리할 필요성을 제거합니다. 설치 또는 관리가 필요한 소프트웨어가 없습니다.

aws.amazon.com

운동닥터 API 서버 소스코드는 Codecommit에서 관리되고 있으며, Codebuild를 통해서 소스를 Dcoker 이미지로 생성하고 있습니다.

 

1-1. ECR(Elastic Container Repository) 생성

Codebuild를 통해서 생성된 이미지를 저장할 저장소를 생성합니다.

<aws_id>.dkr***.com/repository_name으로 이미지 저장소가 생성됩니다.

 

1-2. Codebuild 시작하기

프로젝트를 만듭니다.

프로젝트 만들기를 시작합니다.

1-3. Codebuild Project Configuration, Source

프로젝트 이름과 소스코드 저장소 리포지토리를 선택합니다.

 

1-3. Codebuild Environment 설정

 

1-4. 추가 구성 Environment variables 추가

추후 buildspec.yml에서 사용될 예정이므로 각 필드에 맞게 추가합니다.

1-5. Buildspec 사용 선택

 

1-6. Artifacts 생성

빌드 후 나오는 artifact가 저장될 저장소를 선택합니다. (S3로 선택)

1-7. 빌드 프로젝트 생성

1-8. buildspec.yml와 Dockerfile을 프로젝트 최상단에 생성합니다.

/** buildspec.yml **/
version: 0.2

phases:
    pre_build:
        commands:
            - echo Logging in to Amazon ECR...
            - $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION)
    build:
        commands:
            - echo Build started on `date`
            - echo Building the Docker image...
            - docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG .
            - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
    post_build:
        commands:
            - echo Build completed on `date`
            - echo Pushing the Docker image...
            - docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
            - printf '[{"name":"%s","imageUri":"%s"}]' $IMAGE_REPO_NAME $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG  > imagedefinitions.json
artifacts:
    files: imagedefinitions.json

1-4 에서 입력한 환경변수들은 buildspec.yml에서 사용합니다. 환경변수를 사용하지 않고 buildspec.yml에 직접 추가할 수도 있습니다.

/** Dockerfile **/
FROM ubuntu:18.04
MAINTAINER maintain

ENV AWS_ACCESS_KEY_ID ACCESS_KEY_ID
ENV AWS_SECRET_ACCESS_KEY SECRET_ACCESS_KEY
ENV AWS_DEFAULT_REGION REGION

 

1-9. 빌드를 해보자! Start build 클릭

 

1-10. 에러가 발생할 것입니다.

에러의 이유는 우리가 만든 role이 ecr에 접근할 수 있는 권한이 없기 때문입니다.

IAM으로 이동해서 ECR에 대한 권한을 추가해줄게요.

정책을 생성하는 방법은 2가지가 있습니다.

1. 직접 정책을 생성하는 방법

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ecr:BatchCheckLayerAvailability",
        "ecr:CompleteLayerUpload",
        "ecr:GetAuthorizationToken",
        "ecr:InitiateLayerUpload",
        "ecr:PutImage",
        "ecr:UploadLayerPart"
      ],
      "Resource": "*"
    }
  ]
}

정책 생성 버튼을 클릭 후 json으로 새로운 정책을 생성합니다.

2. 이미 만들어져있는 정책과 연결 시키는 방법

ContainerRegistry로 검색후 PowerUser 정책을 연결합니다.

정책 연결 후 retry build를 선택합니다.

빌드가 정상적으로 되면 ECR Repository에 latest 이미지가 push 된걸 확인할 수 있습니다.