728x90
반응형
SMALL

AWS CodeDeploy & AWS EC2 연동하기

배포 시스템인 codedeploy를 통해 ec2 instance에 배포를 가능하게 하는 작업을 설정한다.

EC2 설정

둘 사이의 접근을 가능하게 위해서는 AWS IAM에서 ‘역할 만들기’를 한다. 사용자 등록이 AWS 외부에서부터의 접근을 허가하는 것이라면, 역할은 AWS 내에서의 접근 권한이라고 볼 수 있으며 등록 예시는 다음과 같다.

  • 다른 계정의 IAM 사용자
  • AWS 리소스에서 작업을 수행해야 하는 EC2 인스턴스에서 실행 중인 애플리케이션 코드
  • 계정 내 리소스에서 작업을 수행하여 기능을 제공해야 하는 AWS 서비스
  • SAML을 통해 인증 연동을 사용하는 사내 디렉토리의 사용자

 

 

 

역할을 등록하고 나서는 EC2에서 해당 역할을 사용하도록 저장한다.

역할을 수정하고 인스턴스를 재부팅해준다.(인스턴스 상태 > 재부팅)

재부팅이 완료되면 EC2 Instance에서 다음 명령어를 통해 codedeploy를 설치한다.

**Codedeploy agent 설치
**1. ruby 설치:** Codedeploy agent는 ruby로 작성되었으므로 이를 설치한다.

$ sudo apt-get install ruby  // (ubuntu 16.04)

**2. wget 설치** (agent 설치파일을 들고오기 위해 쓰인다)

$ sudo apt-get install wget

**3. Codedeploy Agent 설치**

*#* ubuntu 계정을 사용한다면 /home/ubuntu로 가면 된다.*

$ cd /home/jane

***#* 설치파일 **다운로드 *(Seoul region)***

$ wget [<https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install>](<https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install>)

**# 실행권한 추가 및 설치**

$ chmod +x ./install

$ sudo ./install auto

하다가 막힌다면 아래 aws docs를 참고한다.

[<https://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/codedeploy-agent-operations-install-ubuntu.html>](<https://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/codedeploy-agent-operations-install-ubuntu.html>)**

 

아래 메시지가 출력된다.

The AWS CodeDeploy agent is running as PID ****

CodeDeploy 설정

EC2와 마찬가지로, CodeDeploy에서도 역할을 생성하고 설정해야한다.

codedeploy는 권한 종류가 AWSCodeDeployRole 한 가지이니 그냥 선택해서 만들면 된다.

 

이제 codedeploy 서비스에서 애플리케이션 생성을 한다.

애플리케이션을 생성하고, 배포 그룹 생성을 이어 진행한다.


한 대의 서버이기 때문에 해당 옵션을 선택한다.

 

이제 프로젝트 폴더에 appspec.yml 파일을 생성한다. 이 파일은 codedeploy가 서버 환경에 설치를 할 수 있도록 동작을 정의한 내용이다.

version: 0.0
os: linux
files:
  - source: /
    destination: /home/ec2-user/app/deploy

그리고, 위치할 디렉토리를 생성한다.

mkdir /home/ec2-user/app/deploy

Github Action 설정

env:
  AWS_REGION: ap-northeast-2 (지역)
  S3_BUCKET_NAME: 설정한 버킷 이름
  CODE_DEPLOY_APPLICATION_NAME: 설정한 codedeploy 어플리케이션 이름
  CODE_DEPLOY_DEPLOYMENT_GROUP_NAME: 설정한 codedeploy 그룹 이름
  ZIP_NAME: zip -r ./프로젝트명.zip .
  APPLICATION: ./src/main/resources/application.yml
# (7) S3 버킷에 있는 파일을 대상으로 CodeDeploy 실행
    - name: Deploy to AWS EC2 from S3
      run: |
        aws deploy create-deployment \\
          --application-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }} \\
          --deployment-config-name CodeDeployDefault.AllAtOnce \\
          --deployment-group-name ${{ env.CODE_DEPLOY_DEPLOYMENT_GROUP_NAME }} \\
          --s3-location bucket=$S3_BUCKET_NAME,key=$GITHUB_SHA.zip,bundleType=zip

 

 

name: Deploy to Amazon EC2

on:
  push:
    branches: [ "main" ]
#   pull_request:
#     branches: [ "feature" ]

env:
  AWS_REGION: ap-northeast-2
  S3_BUCKET_NAME: ddal-ggak-codedeploy-app
  CODE_DEPLOY_APPLICATION_NAME: codedeploy
  CODE_DEPLOY_DEPLOYMENT_GROUP_NAME: codedeploy_g
  ZIP_NAME: zip -r ./finalproject.zip .
  APPLICATION: ./src/main/resources/application.yml

permissions:
  contents: read

jobs:
  deploy:
    name: Deploy
    runs-on: ubuntu-latest
    environment: production

    steps:
    # (1) 기본 체크아웃
    - name: Checkout
      uses: actions/checkout@v2
      
    # (2) application.yml 추가
    - run: touch ./src/main/resources/application.yml
    - run: echo "${{ secrets.APPLICATION }}" > ./src/main/resources/application.yml
    - run: cat ./src/main/resources/application.yml
    
    # (3) JDK 11 세팅
    - name: Set up JDK 11
      uses: actions/setup-java@v1
      with:
        java-version: '11'
        distribution: 'temurin'
        
    # (4) Gradle build (Test 제외)
    - name: Build with Gradle
      uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1
      with:
        arguments: clean build -x test
    # (5) 디렉토리 생성
    - name: Make Directory
      run: mkdir -p deploy
    # (6) Jar 파일 복사
    - name: Copy Jar
      run: cp ./build/libs/*.jar ./deploy
#     # (7) clean build ( test를 사용하지 않아서 제외 시켰습니다.)
#     - name: Build with Gradle
#       run: ./gradlew clean build
#       shell: bash
   # (8) zip file 
    - name: Make zip file
      run: zip -r ./$finalproject.zip .
      shell: bash    
    
    # (5) AWS 인증 (IAM 사용자 Access Key, Secret Key 활용)
    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        aws-region: ${{ env.AWS_REGION }}

    # (6) 빌드 결과물을 S3 버킷에 업로드
    - name: Upload to AWS S3
      run: |
        aws deploy push \\
          --application-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }} \\
          --ignore-hidden-files \\
          --s3-location s3://$S3_BUCKET_NAME/$GITHUB_SHA.zip \\
          --source .
    # (7) S3 버킷에 있는 파일을 대상으로 CodeDeploy 실행
    - name: Deploy to AWS EC2 from S3
      run: |
        aws deploy create-deployment \\
          --application-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }} \\
          --deployment-config-name CodeDeployDefault.AllAtOnce \\
          --deployment-group-name ${{ env.CODE_DEPLOY_DEPLOYMENT_GROUP_NAME }} \\
          --s3-location bucket=$S3_BUCKET_NAME,key=$GITHUB_SHA.zip,bundleType=zip

긴 시간 끝에.. 드디어..!! 완성했습니다!!

다른 분들은 저처럼 고생하지 않길 바랍니다.

728x90
반응형
LIST

'개발 > sw' 카테고리의 다른 글

인스턴스IP 도메인 연결  (0) 2023.03.31
Codedeploy SQL 오류  (0) 2023.03.30
CodeDeploy  (0) 2023.03.30
CI/CD 구축 github action (2)  (0) 2023.03.28
CI/CD 구축 github action (1)  (0) 2023.03.28

+ Recent posts