본문 바로가기

aws

[AWS] CodeBuild, CodeDeploy, CodePipeline으로 node 배포하기

요즘 자주 CI/CD의 작업을 하게 되었습니다. 나중에 같은 스펙으로 CI/CD를 만들 수 있기 때문에 지금 다시 정리를 해보려고 합니다. 순서대로 따라하면 배포가 자동으로 된다고 생각하시면 됩니다. 어렴풋 기억나는 상태에서 해당글을 읽으면 금방 따라할 수 있는 글이라고 생각해주시면 감사하겠습니다. 

 

 

1. 기본 EC2 세팅


기본적으로 node 환경과 git을 세팅합니다. (node version은 16.x 입니다.)

sudo apt-get install curl
curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash -
sudo apt-get install -y nodejs
sudo apt-get install build-essential
sudo apt-get update
sudo apt-get install git

 

2. EC2 IAM 만들기


IAM -> 역할로 들어갑니다. 새로운 IAM을 만들어서 아래의 스크린샷의 권한을 부여합니다.

- AWSCodeDeployFullAccess

- AWSCodeDeployRole

- CloudWatchLogsFullAccess

- AmazonS3FullAccess

정책

이제 이 IAM 역할을 EC2에 부여합니다. 역할 수정을 눌러 새로 만든 역할을 부여하면 됩니다.

IAM 역할 수정

2. CodeDeploy IAM 만들기


IAM -> 역할로 들어갑니다. 아래의 권한으로 역할을 만듭니다.

- AWSCodeDeployRole

역할

3. CodeDeploy 사용자 추가


CodeDeploy와 EC2 연동을 위하여 CodeDeploy Agent를 설치하고 해당 CodeDeploy를 사용할 group을 만들어줍니다.

먼저 IAM -> 사용자그룹에 들어갑니다.

그룹생성을 누르고 그룹명을 적고 정책 생성을 클릭합니다.

 

정책에 대해서 좀 보안적인 부분도 신경써야하지만 우선 아래의 JSON 데이터를 붙여 넣어 생성합니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "autoscaling:*",
                "codedeploy:*",
                "ec2:*",
                "lambda:*",
                "ecs:*",
                "elasticloadbalancing:*",
                "iam:AddRoleToInstanceProfile",
                "iam:CreateInstanceProfile",
                "iam:CreateRole",
                "iam:DeleteInstanceProfile",
                "iam:DeleteRole",
                "iam:DeleteRolePolicy",
                "iam:GetInstanceProfile",
                "iam:GetRole",
                "iam:GetRolePolicy",
                "iam:ListInstanceProfilesForRole",
                "iam:ListRolePolicies",
                "iam:ListRoles",
                "iam:PassRole",
                "iam:PutRolePolicy",
                "iam:RemoveRoleFromInstanceProfile",
                "cloudwatch:*",
                "logs:*",
                "sns:*",
                "s3:*"
            ],
            "Resource": "*"
        }
    ]
}

해당 정책이 연결된 group을 만들었으니 이제 이 그룹에 포함될 사용자를 만들겠습니다.

IAM -> 사용자를 클릭합니다.

key는 잘 간직합니다!!!!

4. CodeDeploy Agent 설치


먼저 사용자 추가를 위해 awscli 설치를 합니다. EC2에 접속하여 설치합니다.

sudo apt install awscli
sudo aws configure

순서대로 csv를 보며 입력합니다.
AWS Access Key ID : -----
AWS Secret Access KEy : -----
Default region name : ap-northeast-2
Default output format : json

이제 agent 설치를 합니다.

cd /home/ubuntu/
wget https://aws-codedeploy-ap-northeast-2.s3.amazonaws.com/latest/install
chmod +x ./install
sudo apt-get install ruby
sudo ./install auto

이제 상태를 확인합니다.

sudo service codedeploy-agent status

active (running) 이렇게 보인다면 성공입니다.

인스턴스가 부팅할때 자동으로 실행하도록 스크립트를 추가합니다.

sudo vim /etc/init.d/codedeploy-startup.sh

i 누르고 아래 복사하여 붙여넣기

#!/bin
sudo service codedeploy-agent restart

esc 누르고 :wq

마지막으로 실행권한 부여합니다.

sudo chmod +x /etc/init.d/codedeploy-startup.sh

 

5. CodeBuild 추가


CodeBuild는 너무 간단합니다.

이제 여기에서 가장 중요한 buildspec.yml 작성입니다.

사실 루트에 buildspec.yml을 추가해도 좋지만 저는 빌드명령을 삽입해서 사용했습니다. 

다양한 응용도 가능합니다. build전 env 파일을 만들어서 build를 할 수도 있고 빌드가 완료된 dist 폴더만 codedeploy로 넘겨줄 수도 있습니다.

저는 간단하게 buildspec을 작성했습니다.

version: 0.2
 
phases:
  install:
    commands:
      - npm install
  pre_build:
    commands:
      - npm run lint
artifacts:
  files:
    - '**/*'

6. appspec.yml 추가


appspec.yml을 배포할 프로젝트의 루트에 추가합니다.

version: 0.0
os: linux
files:
  - source:  /
    destination: 소스가 추가될 경로
    overwrite: true
file_exists_behavior: OVERWRITE # 기존에 파일이 있으면 에러가 나서 추가해줍니다.

appspec.yml을 추가한 프로젝트를 clone합니다. 

git config --global credential.helper store 
# clone하고 해당 폴더로 들어가서 위 명령어를 작성하면 이제 pull 받을때 계정정보를 묻지 않습니다.

이제 CodeDeploy 배포를 생성해보면 

 

7. CodePipeline 추가


배포 자동화를 위한 CodePipeline을 추가합니다.

 

파이프라인 생성 -> 새 서비스 역할 -> 소스공급자는 Github(Version 2) -> 빌드공급자(Codebuild) -> 배포공급자(CodeDeploy)

 

지금까지 만든걸 순서대로 잘 입력하면 배포가 성공합니다.!