Kimuksung
Kimuksung 안녕하세요. 분산처리에 관심이 많은 생각하는 주니어 Data Enginner입니다.

AWS EC2 CI/CD 구성하기

AWS EC2 CI/CD 구성하기

AWS EC2 CI/CD 환경 구성 관련하여 애기하려고 합니다.

EC2 Jenkins를 구성하면서 CI/CD까지 도입하여 간편하기 쓰기 위함입니다.

Git → S3 → Codedeploy → EC2 반영하는 과정입니다.

Github


  • Repository 생성
  • AWS Credentials → Action Secret 값 설정

  • Action fileappspec.yml 파일을 생성해주어야 한다.
  • appspec.yml = codedeploy(S3→ EC2) 어떻게 처리해야 할지 처리하는 설정 값
  • 주의 = aws deploy 설정 시 key 값은 ./라는 값 없이 바로 시작하면 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
name: CI

on:
  push:
    branches: [ main ] 

  workflow_dispatch:

jobs:
  build:
    runs-on: ubuntu-latest
    
    steps:
    - name: checkout release
      uses: actions/checkout@v3

    - name: file -> zip
      run: tar cvfz ./baro-jenkins.tar.gz *
       
    - name: AWS configure credentials
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-access-key-id: $
        aws-secret-access-key: $
        aws-region: ap-northeast-2
        
    - name: upload to S3
      run: aws s3 cp --region ap-northeast-2 ./baro-jenkins.tar.gz s3://baro-jenkins-git/
      
    - name: deploy with AWS codeDeploy
      run: aws deploy create-deployment
        --application-name github-action-baro-jenkins
        --deployment-config-name CodeDeployDefault.OneAtATime
        --deployment-group-name github-acion-baro-jenkins
        --s3-location bucket=baro-jenkins-git,bundleType=tgz,key=baro-jenkins.tar.gz

1
2
3
4
5
6
7
8
9
10
11
12
#appspec.yml
version: 0.0
os: linux

files:
  - source: /
    destination: /home/ubuntu/jenkins
permissions:
  - object: /home/ubuntu/jenkins
    owner: ubuntu
    group: ubuntu
    mode: 755

S3 버킷 설정


  • AWS → S3 → Bucket → Create

IAM Role 설정


  • IAM → ROLE → Crate role
instance role

codedeploy role

codedeploy


  • 연동할 EC2의 Security의 IAM설정을 위에서 해준바와 같이 설정하여 줍니다.

  • codedeploy→ getting started → create application
  • application name을 원하는대로 설정하여 주고, EC2에 연동할 예정이니 EC2/On-premises를 적용합니다.
  • deployment group울 추가하여 줍니다.
    • Deployment group name = 원하는 이름
    • Service role = 위에서 설정한 Codedeploy Role 설정
    • Environment configuration
      • EC2 instance 설정
      • 별도로 EC2 instance의 Tag을 변경하지 않았다면, Key = Name , Value = EC2 instance name 으로 설정하여 줍니다.
    • deployment settings = codedeploydefault.allatone
    • loadbalancer = 사용 시 체크

EC2 codedeploy agent 설치


1
2
3
4
5
6
7
8
$ sudo apt update
$ sudo apt install ruby-full
$ sudo apt install wget
$ cd ~ 
$ wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install
$ chmod +x ./install
$ sudo ./install auto
$ sudo service codedeploy-agent status

오류 발생 추적 과정 및 원인


  • Error : The CodeDeploy agent did not find an AppSpec file within the unpacked revision directory at revision-relative path \\\"appspec.yml
  • 검색 결과
    • yaml으로 하면 인식못하여 yml로 설정
  • Error : The specified key does not exist
  • 검색 결과 S3 Key가 잘못되거나 yml 파일 설정 값이 오타가 있을것이다라고 하여 찾아보았다.
  • S3 Key가 시작되는 값을 ./test 으로 설정하였는데 그것이 아닌 test로 설정해야 한다.
1
$ tail -f /var/log/aws/codedeploy-agent/codedeploy-agent.log
1
INFO  [codedeploy-agent(2612)]: [Aws::CodeDeployCommand::Client 200 0.022738 0 retries] put_host_command_complete(command_status:"Failed",diagnostics:{format:"JSON",payload:"{\"error_code\":5,\"script_name\":\"\",\"message\":\"The specified key does not exist.\",\"log\":\"\"}"},host_command_identifier:"12312==")


  • Error : InstanceAgent::Plugins::CodeDeployPlugin::CommandPoller: Missing credentials - please check if this instance was started with an IAM instance profile
  • 해결 방안
    • 참조 - https://sarc.io/index.php/aws/1327-tip-codedeploy-missing-credentials
    1
    
      $ sudo service codedeploy-agent restart
    
결과

참조

https://blog.bespinglobal.com/post/github-action-으로-ec2-에-배포하기/ https://velog.io/@dnwlsrla40/AWS-CodeDeploy-AWS-CodeDeploy를-이용해-자동화-배포-중-Error-발생