종강하고 작성하러 온 마지막 글... 아래는 이전에 작성한 EC2, CodeDeploy, S3 생성 및 세팅 글입니다.
GithubActions 연동에 들어가기 전 준비물!!!!!
- 첫 번째 글에서 발급받은 사용자 액세스 키와 시크릿 키
- 프로젝트 데이터베이스 스키마의 권한을 얻은 계정의 아이디와 비밀번호
- AWS S3 버킷 이름
- AWS CodeDeploy 애플리케이션 이름
- AWS CodeDeploy 애플리케이션 그룹 이름
- AWS EC2 인스턴스 이름
위에 있는 것들을 미리 준비해 두면 스크립트를 작성할 때 수월합니다.
1. 프로젝트에 deploy.yml 파일 생성
우선 프로젝트 최상단에 .github 폴더를 만들고 그 안에 workflows 폴더를 만들고 그 안에 deploy.yml 파일을 만들어 줍니다.
2. deploy.yml 작성
name: Build and Deploy to EC2
on:
push:
branches: [ "dev_backend" ]
pull_request:
branches: [ "dev_backend" ]
defaults:
run:
shell: bash
env:
AWS_S3_BUCKET: myproject-bucket
AWS_CODE_DEPLOY_APPLICATION: MyProject-CD
AWS_CODE_DEPLOY_GROUP: MyProject-CD-Group
jobs:
deploy:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v2
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'corretto'
- name: Grant execute permission for gradlew
working-directory: ./backend
run: chmod +x ./gradlew
shell: bash
- name: Build Project and Test
working-directory: ./backend
run: ./gradlew build test
- name: Setup MySQL
uses: mirromutth/mysql-action@v1.1
with:
mysql database: ${DB_SCHEMA}
mysql user: ${DB_USERNAME}
mysql password: ${DB_PASSWORD}
- name: Configure AWS credential
uses: aws-actions/configure-aws-credentials@v1
with:
aws-region: ap-northeast-2
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
- name: Upload to S3
working-directory: ./backend
run: aws deploy push --application-name ${{ env.AWS_CODE_DEPLOY_APPLICATION }} --ignore-hidden-files --s3-location s3://${{ env.AWS_S3_BUCKET }}/MyProject-EC2/$GITHUB_SHA.zip --source .
- name: Code Deploy to EC2
working-directory: ./backend
run: aws deploy create-deployment --application-name ${{ env.AWS_CODE_DEPLOY_APPLICATION }} --deployment-config-name CodeDeployDefault.AllAtOnce --deployment-group-name ${{ env.AWS_CODE_DEPLOY_GROUP }} --s3-location bucket=${{ env.AWS_S3_BUCKET }},key=MyProject-EC2/$GITHUB_SHA.zip,bundleType=zip
우선 전체 스크립트는 위와 같습니다. 이제 하나하나 뜯어보겠습니다.
2-1. 브랜치 설정
on:
push:
branches: [ "dev_backend" ]
pull_request:
branches: [ "dev_backend" ]
push 또는 pull request 이벤트를 사용할 때, dev_backend 브랜치에 대해서만 workflow를 실행하도록 설정하였습니다. 저희는 main으로 코드를 바로 올리지 않기 때문에 dev_backend로 설저하였는데, 다른 브랜치로 바꾸고 싶다면 수정하시면 됩니다.
2-2. 셸 및 환경변수 설정
defaults:
run:
shell: bash
env:
AWS_S3_BUCKET: myproject-bucket
AWS_CODE_DEPLOY_APPLICATION: MyProject-CD
AWS_CODE_DEPLOY_GROUP: MyProject-CD-Group
bash 셸로 실행되게 할 거고, 환경변수를 설정했습니다.
myproject로 작성되어 있는 부분을 미리 만들어둔 S3 버킷, CodeDeploy 애플리케이션과 배포 그룹으로 수정해 줍니다.
이때 인스턴스에도 추가적인 환경변수 등록을 해주어야 하는데 이는 아래에서 설명하겠습니다.
2-3. 실행될 작업들
jobs:
deploy:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v2
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'corretto'
먼저 운영체제가 우분투 22.04라는 것을 명시합니다. 보통 20.04로 하는 경우도 많은데 20.04로 하셨다면 꼭 수정해 주셔야 합니다.
두 번째는 JDK를 설정입니다. 저는 17 버전을 사용했기 때문에 JDK 17로 명시했습니다. 만약 다른 버전을 사용하셨다면 수정해 주셔야 합니다.
- name: Grant execute permission for gradlew
working-directory: ./backend
run: chmod +x ./gradlew
shell: bash
- name: Build Project and Test
working-directory: ./backend
run: ./gradlew build test
해당 명령어에서 주의할 점은 working-directory입니다. 저희 프로젝트는 모노 레포이기 때문에 하나의 레포 안에 android 코드와 backend가 함께 있습니다. 그래서 working-directory로 backend 폴더를 지정해 주었는데, 만약 저희와 같은 경우가 아니라면 working-direcoty를 지워주시면 됩니다.
- 빌드 권한을 얻기 위해 chmod 명령어로 권한을 줍니다.
- 그리고 빌드 및 테스트를 진행합니다.
- name: Setup MySQL
uses: mirromutth/mysql-action@v1.1
with:
mysql database: 'trip'
mysql user: ${DB_USERNAME}
mysql password: ${DB_PASSWORD}
다음은 DB 설정입니다. 저희는 'trip'이라는 스키마를 사용했는데, 프로젝트에서 사용하는 스키마로 반드시 바꿔주셔야 합니다. 그리고 해당 스키마에 대한 접근 권한을 가지고 있는 계정은 환경변수로 넣어줄 겁니다. 노출되면 안 되기 때문입니다.
- name: Configure AWS credential
uses: aws-actions/configure-aws-credentials@v1
with:
aws-region: ap-northeast-2
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS에 대한 자격 증명 과정입니다. 지역을 서울로 설정해 주고, 미리 만들어두었던 AWS 사용자의 액세스 키와 비밀 키를 환경변수로 설정해 줍니다. 위 환경변수 설정 방식은 github의 secrets를 이용한 방법입니다. 절대 노출되면 안 되는 키이기 때문에 환경변수로 꼭 설정해 줍니다.
- name: Upload to S3
working-directory: ./backend
run: aws deploy push --application-name ${{ env.AWS_CODE_DEPLOY_APPLICATION }} --ignore-hidden-files --s3-location s3://${{ env.AWS_S3_BUCKET }}/MyProject-EC2/$GITHUB_SHA.zip --source .
- name: Code Deploy to EC2
working-directory: ./backend
run: aws deploy create-deployment --application-name ${{ env.AWS_CODE_DEPLOY_APPLICATION }} --deployment-config-name CodeDeployDefault.AllAtOnce --deployment-group-name ${{ env.AWS_CODE_DEPLOY_GROUP }} --s3-location bucket=${{ env.AWS_S3_BUCKET }},key=MyProject-EC2/$GITHUB_SHA.zip,bundleType=zip
이 작업은 AWS S3 버킷에 소스 코드를 업로드하고 해당 코드를 가져와서 EC2로 배포하는 과정입니다.
- aws deploy push 명령어를 사용하여 $GITHUB_SHA로 압축된 소스 코드를 S3 버킷의 특정 위치에 업로드합니다.
- aws deploy create-deployment 명령어를 사용하여 AWS CodeDeploy를 통해 EC2 인스턴스에 배포를 생성합니다.
스크립트에 대한 설명은 끝났습니다. 이제 환경변수 설정 방식에 대해 설명하겠습니다.
3. 환경변수 설정
3-1. 로컬 환경변수 설정
이 방식이 로컬 설정입니다. 저 같은 경우 인텔리제이 환경변수 설정 방식으로 계정 정보를 저장하였습니다.
Edit Configurations > Environments variables > 환경변수 추가
이렇게 인텔리제이 안에 설정할 수 있습니다.
3-2. github secrets 환경변수 설정
프로젝트 레포지토리로 가서 setting > Secrets and variables > Actions로 들어갑니다.
그럼 이렇게 환경변수를 설정할 수 있습니다.
위 방식으로 AWS 사용자의 액세스 키와 시크릿 키를 등록했습니다.
3-3. 스크립트 내 환경변수 설정
GithubActions 배포를 위해 작성한 deploy.yml에 작성하는 방식입니다.
이렇게 작성하고
필요할 때 사용하면 됩니다. 사실상 환경변수가 아니라 일반 변수 설정이라고 보는 게 맞습니다. 노출되면 안 되는 정보의 경우 절대 이렇게 설정하시면 안 됩니다.
3-4. EC2 서버 환경변수 설정
이게 가장 중요합니다. 저희 서비스를 클라우드 서버에 배포하면 로컬이나 깃허브에 설정한 환경변수는 의미가 없어집니다. 배포 서버에서는 환경변수를 인식하지 못하기 때문입니다. 따라서 배포 서버에도 환경변수를 등록해 주어야 합니다.
만들어둔 EC2 서버로 접속해서, 파일 편집 명령어를 입력합니다.
sudo nano /etc/environment
위 방식은 전체 시스템에 환경변수를 적용하는 방식이기 때문에, 개인 프로필로 환경변수를 등록하고 싶으면 ~/.profile에 작성하면 된다.
그러면 처음에는 PATH 정보만 있을 텐데, 그 아래에 환경변수를 입력해 주면 됩니다. 이때 반드시 큰 따옴표 안에 작성해주어야 합니다.
여기까지 하면 자동화배포 설정은 끝납니다. 스크립트에서 설정한 브랜치로 코드가 올라가면 자동으로 actions이 실행됩니다. 수고하셨습니당.
'Dev > AWS' 카테고리의 다른 글
[AWS] EC2 + CodeDeploy + S3 + GithubActions 조합으로 자동화배포 구축하기 - (2) CodeDeploy 및 S3 세팅 (0) | 2024.04.15 |
---|---|
[AWS] EC2 + CodeDeploy + S3 + GithubActions 조합으로 자동화배포 구축하기 - (1) EC2 인스턴스 생성 및 세팅 (0) | 2024.04.12 |
[AWS] io.awspring 라이브러리를 활용하여 SpringBoot & Amazon S3 연동하기 (0) | 2024.03.12 |
[AWS] CodeDeploy의 scripts/deploy.sh를 제대로 작성해보자 (1) | 2024.01.29 |
[AWS] EC2 배포 일주일 삽질 스토리 (feat. 환경변수) (1) | 2024.01.27 |