[AWS] GithubAction + EC2 + S3 + CodeDeploy

yookyungmin·2023년 8월 6일
0

EC2 인스턴스 생성

아마존 웹 서비스(AWS)에서 제공하는 클라우드 컴퓨팅 서비스


탄력적 IP

AWS EC2 인스턴스는 서버를 중지하고 다시 실행시키면 퍼블릭 IP가 변경되기 때문에 클라이언트가 사용할 수 있는 변하지 않는 IP가 필요합니다.

전체적인 배포 과정

Tag 추가

위 과정들을 거치고 태그 추가 과정을 진행을 합니다
CodeDeploy를 생성할 때 어떤 인스턴스에서 수행할지 구분하는 값으로 태그를 사용하기 때문에 추가 필요

IAM 역할 추가

EC2 인스턴스에서 S3에 올려놓은 파일에 접근할수 있도록 권한을 추가해줘야 합니다

codedeploy agent 설치

https://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/codedeploy-agent-operations-install-ubuntu.html

정상 설치 확인

AWS S3 생성

S3 버킷이란 이미지 또는 ZIP 파일을 저장하기 위한 스토리지 서비스입니다.

CodeDeploy 전용 IAM 역할 만들기

CodeDeploy를 사용하기 위해선 IAM 에서 역할을 만들어야 합니다

CodeDeploy 어플리케이션 생성

이제 사용할 CodeDeploy 앱을 생성합니다.


CodeDeploy 배포 그룹 생성


어떤 인스턴스에서 동작할지 선택 합니다.


로드밸런싱을 사용하지 않으니 체크만 해제합니다.

IAM 사용자 메뉴로 이동


ACCESS TOKE만 있으면 되기 때문에 console 엑세스 권한은 없어도 된다고 한다.

  • AWSCodeDeployFullAaccess
  • AmazonS3FullAccess를 선택한다


생성하고 나서 엑세스키도 만들어줘야 한다

Githubaction에서 비밀번호 지정

이렇게 지금까지 서버를 띄울 EC2, 배포할 결과물을 저장할 S3, 배포를 도와줄 CodeDeploy 이렇게 총 세가지 AWS서비스를 만들었습니다.

AppSpec 파일 작성

CodeDeploy에서 배포를 위해 참조할 파일을 작성합니다.
가장 상단에 파일을 만든다

stop.sh
어플리케이션이 실행되어 있으면 좋료하는 스크립트

start.sh
어플리케이션 실행 스크립트

스크립트는 작성 했고 deploy.yml을 작성해보자

deploy.yml

# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-gradle

name: Deploy to Amazon EC2

on:
  pull_request:
    branches:
      - master

# 본인이 설정한 값을 여기서 채워넣습니다.
# 리전, 버킷 이름, CodeDeploy 앱 이름, CodeDeploy 배포 그룹 이름
env:
  AWS_REGION: ap-northeast-2
  S3_BUCKET_NAME: yoo-github-actions-s3-bucket
  CODE_DEPLOY_APPLICATION_NAME: my-codedeploy-app
  CODE_DEPLOY_DEPLOYMENT_GROUP_NAME: my-codedeploy-deployment-group

permissions:
  contents: read

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

    steps:
    # (1) 기본 체크아웃
    - name: Checkout
      uses: actions/checkout@v3

    # (2) JDK 11 세팅
    - name: Set up JDK 11
      uses: actions/setup-java@v3
      with:
        distribution: 'temurin'
        java-version: '11'

    # (3) Gradle build (Test 제외)
    - name: Build with Gradle
      uses: gradle/gradle-build-action@0d13054264b0bb894ded474f08ebb30921341cee
      with:
        arguments: clean build -x test

    # (4) 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 }}

    # (5) 빌드 결과물을 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 .

    # (6) 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

추후에 트러블 슛팅 관련해서 블로그를 작성할 계획이다.

참고
https://wookim789.tistory.com/34
https://bcp0109.tistory.com/356
https://bcp0109.tistory.com/363

0개의 댓글