메뉴

문서정보

목차

AWS CodePipeline

AWS CodePipeline는 애플리케이션 릴리즈 파이프라인의 자동화를 위해서 사용하는 완전관리형 CICD 서비스다. 사용자는 CodePipeline를 GitHub, GitLab, BitBucket, CodeCommit 등과 연결해서 릴리즈 파이프라인을 구성 할 수 있다. 나는 ECS 애플리케이션을 CodePipeline를 통해서 개발&배포 하는 환경을 구성 할 계획이다.

준비

몇 몇 부분은 AWS 웹 콘솔로 작업을 하겠으나 AWS CLI 위주로 작업을 할 것이다. 이유는 웹 콘솔 스크린샷 찍기 귀찮아서 이다.

Sample 애플리케이션

CodePipeline을 테스트하기 위한 Sample 애플리케이션을 만들었다.
package main

import (
    "fmt"
    "net/http"
)

func main() {
    fmt.Println("vim-go")
    http.HandleFunc("/v1/hello", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprint(w, "Hello world Version 1")
    })                                
    err := http.ListenAndServe(":8088", nil)
    if err != nil {                   
        fmt.Println(err.Error())
    }
}

이 코드를 AWS Codepipeline를 이용해서 배포 할 것이다.

CodePipeline에 대해서

AWS는 CICD를 위해서 아래의 서비스들을 제공한다.
  1. CodeCommit : Git 레포지토리
  2. CodeBuild : Jenkins와 같은 빌드 시스템이다. CI 서비스에 해당한다.
  3. CodeDeploy : 소프트웨어 배포 자동화 시스템이다. CD 서비스에 해당한다. Jenkins는 보통 Ci/CD 기능을 모두 포함하게 구성한다.
기본적으로 이들은 분리된 서비스들이며, 수동으로 이들을 연결해서 완전한 CICD 파이프라인을 구성 할 수 있다. 하지만 이 작업은 꽤나 귀찮기 때문에, 이들을 통합해서 관리하기 위한 서비스가 만들어졌다. 이 서비스가 CodePipeline다. CodePipeline는 아래와 같이 구성된다.

 CodePipeline 구성

CodePipe는 AWS에서 제공하는 CICD 서비스들을 유기적으로 엮기위한 서비스라는 것을 알 수 있다.
  1. 개발자가 CodeCommit에 코드를 Commit 한다. CodeCommit 대신 GitHub, BitBucket등을 사용 할 수 있다. 특히 GitHub의 경우 웹 UI로 간단하게 연동 할 수 있다.
  2. 코드가 Commit되면 이벤트가 트리거 되고 CodeBuild 가 빌드를 수행한다.
  3. 고드 빌드가 성공하면 빌드 결과물을 S3로 올린다. 도커이미지로 빌드 할 경우 ECR에 등록한다.
  4. Codeploy가 호출된다. S3 혹은 ECR에 있는 빌드 결과물을 이용해서 애플리케이션을 배포한다. EC2, ECS, EKS, Labmda 등 다양하게 배포 할 수 있다.

CodeCommit으로 git 저장소 만들기

CodePipeline는 Git 저장소로 부터(S3, ECR로 부터 시작 할 수 있지만 여기에서는 고려하지 않는다) 시작한다. 따라서 git 저장소를 먼저 만들기로 했다. Git 저장소로는 codecommit를 선택했다. CodeCommit를 사용하기 위해서는 아래의 것들을 준비해야 한다.
  1. IAM 생성 : CodeCommit 저장소에 대한 권한을 가진 IAM을 만든다.
  2. SSH Key 생성 : CodeCommit 저장소에 SSH로 접근하기 위한 SSH Key를 만든다.
  3. CodeCommit : AWS CLI 혹은 AWS 웹 콘솔로 CodeCommit 저장소를 만든다.
  4. Git 저장소가 잘 작동하는지 테스트 하기 위해서 git 툴을 준비한다.

IAM 및 SSH Key 생성

Root 계정으로 CodeCommit 작업을 하지 않도록 한다. 나는 yundream 이라는 IAM 계정을 만들었다. AWS IAM 문서를 참고해서 IAM을 만들자.

CodeCommit에 대한 SSH Key는 IAM 대시보드에 SSH Public Key를 등록하면 된다. 로컬 PC에서 ssh-keygen을 이용 SSH Key 쌍을 만든다.
# ssh-keygen -t rsa
키 파일의 이름은 codecommit로 했다. 명령을 실행하면 $HOME/.ssh 디렉토리에 codecommit_rsa, codecommit_rsa.pub 파일이 만들어진다. id_rsa.pub 파일의 내용을 등록하자.

 CodeCommit ssh key 등록

등록하면 아래와 같이 SSH key ID가 만들어진다.  SSH Key ID

SSH Key ID는 ssh 인증을 위한 User ID로 사용한다. 이제 ~/.ssh 디렉토리에 config에 User ID를 등록하자.
Host git-codecommit.*.amazonaws.com
  User APKAQHTXDU7EJ5V3SVO6 
  IdentityFile ~/.ssh/codecommit_rsa

CodeCommit git 저장소에 연결되는지 테스트 해보자. 아래와 같이 연결된다면 성공한 것이다.
# ssh git-codecommit.ap-northeast-2.amazonaws.com
You have successfully authenticated over SSH. You can use Git to interact with AWS CodeCommit. \
Interactive shells are not supported.Connection to git-codecommit.ap-northeast-2.amazonaws.com closed by remote host.
Connection to git-codecommit.ap-northeast-2.amazonaws.com closed.

CodeCommit git 저장소의 endpoint는 리전마다 다르다. 서울 리전의 endpoint는 git-codecommit.ap-northeast-2.amazonaws.com다. 이 것으로 Codecommit Git 저장소에 연결하기 위한 git 설정을 끝냈다.

CodeCommit git 저장소 생성

create-repository 명령으로 CodeCommit git 저장소를 만들었다.
# aws codecommit create-repository --repository-name helloworld --repository-description "CICD Sample repository"                 
{
    "repositoryMetadata": {
        "repositoryName": "helloworld", 
        "cloneUrlSsh": "ssh://git-codecommit.ap-northeast-2.amazonaws.com/v1/repos/helloworld", 
        "lastModifiedDate": 1582123285.691, 
        "repositoryDescription": "CICD Sample repository", 
        "cloneUrlHttp": "https://git-codecommit.ap-northeast-2.amazonaws.com/v1/repos/helloworld", 
        "creationDate": 1582123285.691, 
        "repositoryId": "c4ed1110-26a0-43ce-8635-255517c633a0", 
        "Arn": "arn:aws:codecommit:ap-northeast-2:0163559xxxxx:helloworld", 
        "accountId": "01635592xxxxxx"
    }
}
Git 저장소를 확인하자.
# aws codecommit list-repositories
{
    "repositories": [
        {
            "repositoryName": "helloworld", 
            "repositoryId": "c4ed1110-26a0-43ce-8635-255517c633a0"
        }
    ]
}

이제 helloworld 프로젝트를 clone 해보자.
# git clone ssh://git-codecommit.ap-northeast-2.amazonaws.com/v1/repos/helloworld helloworld
'helloworld'에 복제합니다...
warning: 빈 저장소를 복제한 것처럼 보입니다.

앞서 만든 main.go 파일을 commit해보자.
# git commit main.go
[master (최상위-커밋) 5455422] Hello world app
 1 file changed, 17 insertions(+)
 create mode 100644 main.go

# git push
Warning: Permanently added the RSA host key for IP address '52.95.194.97' to the list of known hosts.
오브젝트 나열하는 중: 3, 완료.
오브젝트 개수 세는 중: 100% (3/3), 완료.
Delta compression using up to 16 threads
오브젝트 압축하는 중: 100% (2/2), 완료.
오브젝트 쓰는 중: 100% (3/3), 426 bytes | 426.00 KiB/s, 완료.
Total 3 (delta 0), reused 0 (delta 0)
To ssh://git-codecommit.ap-northeast-2.amazonaws.com/v1/repos/helloworld
 * [new branch]      master -> master

ECS Cluster 생성

배포할 ECS Cluster를 만든다. Code Deploy는 여기에서 만든 ECS Cluster에 애플리케이션을 배포한다. ... 계속

Pipelines 만들기

 CodePipeline 만들기

CodePipeline 대시보드에서 Create pipeline를 클릭하면 CodePipeline 설정화면으로 넘어간다.

 Codepipeline 설정

  1. Pipeline name : CodePipeline 이름. HelloWorld로 설정했다.
  2. Service role : CodePipeline의 IAM Service role이다. 처음 Pipeline 이라서 새로 만들기로 했다. Codepipeline이 자동으로 만들어주니, 나중에 role를 수정하면 된다.
  3. Advanced Settings / Artifact store : Artifact를 저장하기 위한 공간, 암호화를 위한 Encrypt Key를 설정한다. Artifact는 빌드 중에 나오는 결과물들이다. S3를 저장소로 사용한다. Default location 과 Custom location이 있다. Custom location을 이용해서 s3 bucket을 직접 설정 할 수 있다. 나는 Default location(자동 설정)을 사용했다.
  4. Advanced Settings / Encryption key : Artifact에 있는 데이터는 암호화 된다. 암호화에 사용할 Key를 관리하는 방식을 설정한다. Default AWS Managed Key를 선택했다.
 Add source stage