티스토리 뷰

개발도구/aws

Jenkins to AWS ECR

jin-park 2022. 3. 12. 17:33

1. Code Commit 생성 및 소스 업로드

1.1. Code Commit 저장소 생성

1.2. iam 유저에 CodeCommit 권한 부여

  • AWSCodeCommitPowerUser 권한을 부여한다.

1.3. 소스 업로드 (HTTPS GRC)

1.3.1. git-remote-codecommit 설치

pip3 install git-remote-codecommit

1.3.2. git 초기화 및 설정

git init
git remote add codecommit::[[리젼]]://[[저장소명]]

1.3.3. 소스 원격 저장소로 푸시

git push --set-upstream origin master


2. Jenkins, Docker, Aws Cli 설치 및 설정

  • Jenkins를 설치할 서버에 아래 모두를 설치해준다.

2.1. Jenkins 설치

2.2. Docker 설치

sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
sudo apt update
apt-cache policy docker-ce

sudo apt install docker-ce​
  • docker 설치 후 /var/run/docker.sock의 permission denied 발생하는 경우
sudo chmod 666 /var/run/docker.sock

2.3. AWS CLI 설치

sudo apt install awscli

2.4. 서버에 jenkins sudo 권한 추가

sudo vi /etc/sudoers

# 아래 라인 추가
jenkins ALL=(ALL) NOPASSWD: ALL

3. Jenkins 설정

3.1. Jenkins Plugin 설치

  • Docker Pipeline
  • Pipeline: AWS Steps

3.2. jenkins code commit 자격증명 정보 환경변수 등록

3.2.1. git 자격 증명 생성

  • iam -> 상용자 -> git 권한을 가지고 있는 사용자 정보 페이지 -> 보안자격증명 탭 클릭 -> 하단 git 자격 증명 생성

3.2.2. git 자격 증명 등록

  • Jenkins 관리 -> Manange Credentials -> Jenkins -> Global credentials (unrestricted)
  • 위에서 만든 git 자격증명 정보를 저장한다.
    • USERNAME - 위에서 만든 ACCESS KEY, PASSWORD - 위에서 만든 SECRET KEY

3.3. Jenkins ECR 자격증명 정보 저장

  • Jenkins 관리 -> Manange Credentials -> Jenkins -> Global credentials (unrestricted)
  • AWS ecr권한이 있는 iam 사용자의 access key, secret key를 환경변수로 저장한다.


4. 프로젝트 추가

  • DashBoard -> New Item 으로 Pipeline 프로젝트 추가

4.1. pipeline script 추가

  • 프로젝트 -> 구성 페이지 내에 있는 pipeline 스크립트에 아래내용을 추가한다.
pipeline {
    agent any
    stages {
        stage('Git Clone') {
            steps {
                script {
                     try {
                        git url: "[[CODE COMMIT 주소]]", branch: "master", credentialsId: "[[Jenkins에 등록한 git 접속 정보 환경변수 아이디 입력]]"
                        sh "sudo rm -rf ./.git"
                        env.cloneResult=true
                    } catch (error) {
                        print(error)
                        env.cloneResult=false
                        currentBuild.result = 'FAILURE'
                    }
                }
            }
        }
        
        stage('ECR Upload') {
            steps{
                script{
                    try {                       
                        withAWS(credentials: '[[Jenkins에 등록한 ECR 유저 접속 정보 환경변수 아이디 입력]]') {
                            sh 'aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin [[Docker를 push할 AWS ECR 주소]]'
                            app = docker.build("[[Docker를 push할 AWS ECR 주소]]:latest")
                            app.push()
                        }
                    } catch (error) {
                        print(error)
                        echo 'Remove Deploy Files'
                        sh "sudo rm -rf /var/lib/jenkins/workspace/${env.JOB_NAME}/*"
                        currentBuild.result = 'FAILURE'
                    }
                }
            }
            post {
                success {
                    echo "The ECR Upload stage successfully."
                }
                failure {
                    echo "The ECR Upload stage failed."
                }
            }
        }
        
        stage('Deploy'){
            steps {
                script{
                    try {
                        withAWS(credentials: '[[Jenkins에 등록한 ECR 유저 접속 정보 환경변수 아이디 입력]]') {
                            sh"""
                                aws ecs update-service --region ap-northeast-2 --cluster [[ECS 클러스터명]] --service [[ECS 서비스명]] --force-new-deployment
                            """
                        }
                        
                    } catch (error) {
                        print(error)
                        echo 'Remove Deploy Files'
                        sh "sudo rm -rf /var/lib/jenkins/workspace/${env.JOB_NAME}/*"
                        currentBuild.result = 'FAILURE'
                    }
                }
            }
            post {
                success {
                    echo "The deploy stage successfully."
                }
                failure {
                    echo "The deploy stage failed."
                }
            }
        }
        
    }
}

5. AWS 유저 권한 추가

  • ECR, ECS 배포시 사용할 유저에 아래 권한을 추가해준다.
  • 아래 권한들은 iam 페이지의 정책을 추가하여 권한 부여해준다.

5.1. sample-cluster-service-update-policy 정책 추가

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "application-autoscaling:Describe*",
                "application-autoscaling:PutScalingPolicy",
                "application-autoscaling:DeleteScalingPolicy",
                "application-autoscaling:RegisterScalableTarget",
                "cloudwatch:DescribeAlarms",
                "cloudwatch:PutMetricAlarm",
                "ecs:List*",
                "ecs:ExecuteCommand",
                "ecs:Describe*",
                "ecs:UpdateService",
                "iam:PassRole",
                "iam:AttachRolePolicy",
                "iam:CreateRole",
                "iam:GetPolicy",
                "iam:GetPolicyVersion",
                "iam:GetRole",
                "iam:ListAttachedRolePolicies",
                "iam:ListRoles",
                "iam:ListGroups",
                "iam:ListUsers"
            ],
            "Resource": [
                "[[ECS 서비스 ARN 주소]]"
            ]
        }
    ]
}

5.2. 권한 부여


6. 배포 및 확인

'개발도구 > aws' 카테고리의 다른 글

Ubuntu 18버전에서 Jenkins 설치  (0) 2022.03.14
EC2 Instance Connect 설정  (0) 2022.03.12
AWS ECR - Docker Image Push  (0) 2022.03.11
댓글