✏️ Beanstalk 선택 이유 :
기존 pm2를 github actions을 통해 스크립트로 배포를 더 쉽게 구현하려고 하였으나, 배포시에 git pull을 제대로 받지 못하는 등의 에러가 있더라도 success 를 띄워줘서 배포 오류를 파악하기 힘들었다.
1. 하고 있던 프로젝트의 규모가 점점 커져서 로드밸런서 도입
2. 팀원 누구나 할 수 있는 쉬운 배포
3. 배포 / 배포 이후 에러 모니터링 용이
의 요구 사항으로 인해 AWS의 완전 관리형 서비스인 Elastic Beanstalk을 사용해보기로 하였다.
✏️ 배포 방법 :
이번 배포 방식은 beanstalk에서 loadbalancer를 추가하여 롤링 배포를 진행하는 방식으로 구성하였다.
모니터링 되는 로그도 S3에 저장되는 과정까지 다뤄볼 것이다.
1. beanstalk 환경 구성
AWS - Elastic beanstalk에서 Create Application 을 눌러 웹 앱을 생성한다.
Node.js 를 배포할 것 이기 때문에 플랫폼을 노드로 구성해주었다.
애플리케이션 태그 : 식별하기 위한 태그이므로 생략 가능
여기서 추가 옵션 구성 을 눌러서 옵션을 선택한다. (여기서부터 설정을 순서대로 따라오는 것이 좋다.)
고가용성 선택
네트워크 설정부터 바로 한다.
필자는 prod 환경과 test 환경을 구분 지어 rds 등 서비스 망을 구성하고 싶어서 vpc를 직접 만들어 줬다.
- VPC 직접 설정하기
1. AWS 서비스 > VPC에 들어가 VPC 생성 버튼을 누른다.
2. VPC 등을 선택 한 후, 가용 영역 수만 3개로 바꿔주었다. (후에 인스턴스 설정을 할 때 t2.micro는 가용영역 a,c에서만 설정이 가능하다고 한다. 기본이 a,b이기 때문에 늘려준 것이다.)
3. 여기서도 추가 태그를 통해 환경 식별자를 설정해 줄 수 있다.

VPC를 고른뒤에 로드밸런서 서브넷은 공개로 설정 후, public의 가용영역 A와 C를 선택해주었다.
퍼블릭 IP 주소에 할당하기 위해서는 반드시 public 서브넷을 사용하여야한다.
앞서 말했듯, 인스턴스 타입마다 가용영역이 다를 수 있으므로 기본 구성인 t2.micro를 사용한다면 가용영역 A와 C를 설정해주자.
빈스톡 내에서 데이터베이스 설정을 하면 자동으로 데이터베이스까지 생성해준다.
데이터베이스를 여기서 만들지 않더라도 서브넷은 설정해주어야한다.
인스턴스 설정 - 특별한 수정 없이 보안그룹만 설정해주었다.
용량 설정 - 인스턴스 용량을 설정할 수 있다. (필자는 별도의 수정은 하지 않았다.)
보안 설정 - 기존의 키페어나 새로운 키페어를 설정한다.
로드밸런서 설정 - 여기서는 프로세스를 설정해주어야하는데, 빈스톡은 해당 프로세스를 통해 health check를 하고, 빈스톡 상태를 red,yellow, green으로 나누어 에러를 띄운다.
때문에, 정상 작동하는 api url로 설정을 해주는 것이 좋다.
필자는 노드 기본 포트인 3000포트에서 /health 를 통해 상태 검사를 수행하도록 설정해주었다.
롤링 업데이트 및 배포 설정 - 롤링 배포 방식, 상태 기반으로 설정하였다.
이제 생성버튼을 누르면 몇 분뒤에 beanstalk이 생성된다! (설정을 잘못했을 경우엔, 시작하자마자 red를 띄운다..)
제거를 하는데에도 시간이 꽤 걸리기 때문에, 설정에 신중하도록 하자.
2. IAM 권한 만들기
AWS > IAM 서비스에 들어가서 사용자 추가를 한다.
기존 정책 직접 연결 > EC2ContainerRegistryFullAccess, AdminstratorAccess-Beanstalk 선택
여기서 나오는 Access key Id 와 secret access Key는 github actions를 작성할 때 사용하여야하므로 꼭 기억한다. (잊어버렸다면 재발급 받을 수 있다.)
3. github actions 스크립트 설정하기
github에서 .github/workflows 경로에 스크립트를 작성한다.
이 부분은 프로젝트의 구성에 따라 조금씩 달라질 것 같다.
flow 설명
1. checkout을 받은 뒤, git에 올라가지 않은 .env 파일과 config 파일을 설정한다.
2. 내부의 dependenie설치한다.
3. aws client를 설치한다.
4. AWS에 로그인한다.
3. 파일들을 zip 파일로 압축하여 beanstalk을 통해 S3로 업로드한다.
name: Bbangmap-node-prod # gitactions 스크립트 이름
on:
workflow_dispatch: # 수동 트리거
env:
AWS_REGION: ap-northeast-2
jobs:
deploy:
name: Pipeline
runs-on: ubuntu-18.04
strategy:
matrix:
node-version: ['16.x']
steps:
- uses: actions/checkout@v2
# 프로젝트 내부 환경 파일들 추가 설정
- name: Create env file
run: |
touch .env
echo NODE_ENV=${{ secrets.NODE_ENV }} >> .env
cat .env
- name : Create config file
run : |
mkdir config
cd config
touch kakao.js
echo "${{secrets.KAKAO }}" > kakao.js
touch secretJwtKey.js
echo "${{secrets.SECRETJWTKEY}}" > secretJwtKey.js
touch slack.js
echo "${{secrets.SLACK}}" > slack.js
- name: create-config-json
id: create-config-json
uses: jsdaniell/create-json@1.1.2
with:
name: "config/config.json"
json: ${{ secrets.CONFIG }}
- name: create-s3-json
id: create-s3-json
uses: jsdaniell/create-json@1.1.2
with:
name: "config/s3.json"
json: ${{ secrets.S3 }}
# Node 및 dependencies 설정
# Initialize Node.js
- name: Install Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node-version }}
# Install project dependencies and build
- name: Install dependencies
run: npm install
# aws client 설치
# Install AWS CLI 2
- name: Install AWS CLI 2
run: |
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
which aws
sudo ./aws/install --bin-dir /usr/local/bin --install-dir /usr/local/aws-cli --update
# AWS 로그인
# Configure AWS credentials
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID_DEPLOY }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY_DEPLOY }}
aws-region: ${{ env.AWS_REGION }}
# -x는 제외, zip파일로 압축
- name: Generate deployment package
run: |
zip -r deploy.zip . -x '*.git*' './aws/*' awscliv2.zip
# 빈스톡 배포
# Deploy to Elastic Beanstalk
- name: Deploy to EB
uses: einaregilsson/beanstalk-deploy@v14
with:
aws_access_key: ${{ secrets.AWS_ACCESS_KEY_ID_DEPLOY }} # IAM 권한 설정시 키
aws_secret_key: ${{ secrets.AWS_SECRET_ACCESS_KEY_DEPLOY }} # IAM 권한 설정시 시크릿 키
application_name: bbangmap-prod # 이 부분을 빈스톡 설정시 어플리케이션 이름
environment_name: Bbangmapprod-env # 이 부분을 빈스톡 설정시 환경 이름
region: ${{ env.AWS_REGION }}
version_label: ${{github.run_number}}
deployment_package: deploy.zip
secrets.~~로 되어있는 변수는 github의 settings > secrets > actions 에서 키-값으로 설정할 수 있다.
특히, json파일의 경우에는 기존의 touch / echo 방식으로 파일을 생성하게 되면 "가 빠지고 들어가게 된다. 라이브러리를 통해 json 파일을 올려주자. (github 권장 방식은 아님)
여기까지 되었다면, Actions > Run workflow를 통해 실행시켜주자.
❗️❗️여기서 작동이 정상적으로 되지 않는다면,
1. S3로 들어가 압축된 파일 확인해보기
: 파일을 넣을때의 경로가 잘못되었을 수도 있다. 압축파일을 풀어서 경로를 확인하면서 스크립트를 수정한다.
2. beanstalk에서 만들어 준 ec2에 직접 연결해 들어가서 직접 서버를 실행시켜본다.
: beanstalk은 앞서 설정해준 health check 정상 작동이 안되면 계속 오류를 띄우게 된다. 설정에 문제가 없는지 확인한다.
필자 기준 ec2의 /var/app/current 경로에서 beanstalk으로 업로드된 소스파일들이 들어있었다.
3. beanstalk에서 오류 로그를 파악한다.
: 필자의 경우 대부분은 보안그룹이나 설정 오류였다. 스크립트 문제인지, 빈스톡 설정 문제인지 잘 파악하여야한다.
추가로, 환경 변수는 beanstalk 환경 > 구성 > 소프트웨어 편집 을 통해 키-값으로 설정할 수 있다.
4. S3 버킷 설정으로 에러 로그 저장하기
여기까지 왔다면, beanstalk을 야무지게 뽕뽑기 위해 로드밸런서에서 발생한 에러 로그들을 S3 버킷에 설정을 할 것이다.
ec2 > 로드밸런서 > 설명 > 속성 편집 에서 액세스 로그를 활성화 시키고, 로그를 저장할 S3 위치를 설정한 후, 내 대신 이 위치를 생성에 체크한다. (체크를 안하고, 기존에 있는 버킷을 사용하여도 무관하다.)
이후 다시 beanstalk에서 구성 > 로드밸런서 편집 에서 같은 버킷을 입력하고, 저장한다.
이후 설정이 자동으로 업데이트 되는데, 에러가 나지 않는다면 정상적으로 적용이 된 것이다.
✏️ 9시간 59분의 대장정 이후...
지인의 9분 59초만에 배포 후기를 보고 작업을 시작하였지만, 로드밸런서 이슈로 정말 많은 삽질을 거듭했다...
부디 다들 나보다는 쉽게 배포된다면 좋겠다🙏
Reference )
9분 59초 만에 Github Action + AWS Elastic Beanstalk로 TS 프로젝트 CI/CD 파이프라인 구축하기 - https://hack-jam.tistory.com/m/46
9분 59초 만에 Github Action + AWS Elastic Beanstalk로 TS 프로젝트 CI/CD 파이프라인 구축하기
서론 AWS는 가끔 버전에 따른 이슈가 발생하기 때문에 참고만 해주세요! 필자는 대부분의 프로젝트에서 Github Action을 CI/CD 툴로 이용하고 있다. 그 이유는 "매우 간편"하게 사용할 수 있기 때문이
hack-jam.tistory.com
[Hands On] Elastic Beanstalk를 사용한 웹 애플리케이션 배포 - AWS Console
Elastic Beanstalk에서는 .NET, Docker, Go, Java, Node js, PHP. Python, Ruby, Tomcat, GlassFish 와 같은 플랫폼을 지원합니다. 이번 Hands On에서는 Node.js 와 Python(Django)를 사용하여 웹 애플리케이션을 배포해 보도록 하
tech.cloud.nongshim.co.kr
https://dev.classmethod.jp/articles/load-balancer-log-setting-error-resolution/
“Access Denied for bucket: Please check S3bucket permission” Load Balancer 로그 설정 에러 해결 | DevelopersIO
Load Balancer에서 액세스 로그를 설정할 때 나타나는 "Access Denied for bucket: Please check S3bucket permission" 에러를 해결하는 방법에 대해 정리해 봤습니다.
dev.classmethod.jp
'AWS' 카테고리의 다른 글
AWS 주요 서비스 찍먹하기 (0) | 2022.02.13 |
---|