[Project] AWS ECS 서비스 생성 및 GitHub Action을 활용한 배포 자동화

프로젝트 개요

Github Repository

🧠Devops-04-S2-Team9

Day01 MileStone 1~3

image

Day02 MileStone 4~5

image

Day03 MileStone 6~9

image

Day04 MileStone 10

  • 코딩 후 완료

프로젝트 목표

WAS를 Docker image로 빌드하여 컨테이너화 (Docker, Yaml,AWS, 지속적통합)

  • was를 도커 이미지로 빌드하여 컨테이너 화 합니다.
  • 빌드한 이미지를 레지스트리로 푸시 합니다.
  • 깃헙 액션을 통해서 레지스트리 푸시를 자동화 합니다.

컨테이너화 한 이미지를 AWS에 배포(Docker, AWS)

  • aws ECR 서비스를 이용하는 방법을 배웁니다.
  • was 및 mongoDB 이미지를 AWS ECS를 통해 배포합니다.

AWS 배포 자동화(AWS, 배포자동화)

  • WAS의 이미지 배포 자동화를 구현합니다.
  • 프론트엔드의 배포 자동화를 구현합니다.

CDN을 통한 캐싱 및 HTTPS 적용(네트워크)

  • CDN을 통해 프론트엔드를 캐싱하고, HTTPS를 적용해야 합니다.
  • 프론트엔드와 WAS를 연결해야 합니다.
  • 프론트엔드가 잘 작동하기 위해 WAS를 구현해야 합니다.

프로젝트 진행

Milestone_01

  • WAS 구축
  • (Local)Node.js 기반 Fastify 프레임워크를 이용
npm -i global fastify-cli  # fastify 설치
fastify generate helloworld-was # helloword-was 프로젝트 생성
cd helloworld-was
helloworld-was$ tree
├── plugins
├── routes
│   └── example
├── test
├── app.js
├── package.json
└── README.md
helloworld-was$ npm install
helloworld-was$ npm run start # Fastify 동작
helloworld-was$ curl http://localhost:3000 # Fastify 정상 동작 확인
{"root":true}%    # root.js 파일안의 코드에서 리턴
helloworld-was$ 
  • Was Docker Container화
#/DockerFile
FROM node:18-alpine
WORKDIR /app
COPY ["package.json", "package-lock.json*", "./"]
RUN npm install
COPY . .
EXPOSE 3000
CMD npm run start
  • 위와 같이 DockerFile 작성후 sudo docker build --tag backend:1.0 . 도커 빌드 진행 후 AWS CLI 로그인 후 ECR 이미지 push
aws configure
AWS Access Key ID [****************V552]:
AWS Secret Access Key [****************jvqK]:
Default region name [ap-northeast-2]:
Default output format [none]:
aws ecr get-login-password --region ap-northeast-2 | 
sudo docker login --username AWS --password-stdin 123456789.dkr.ecr.ap-northeast-2.amazonaws.com/[image]

Milestone_02

  • Database 구성
sudo docker run --name mongodb -e MONGO_INITDB_ROOT_USERNAME=root -e MONGO_INITDB_ROOT_PASSWORD=***** mongo:4.4.21

Milestone_03

  • Github Action 자동화
name: Push Docker image to ECR

on:
  push:
    branches:
      - chankyu

jobs:
  build-and-push:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v2

      - 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: ${{ secrets.AWS_REGION }}

      - name: Login to Amazon ECR
        id: login-ecr
        run: echo $(aws ecr get-login-password --region ${{ secrets.AWS_REGION }}) | docker login --username AWS --password-stdin ${{ secrets.AWS_ECR_REGISTRY }}

      - name: Build and push Docker image
        env:
          ECR_REGISTRY: ${{ secrets.AWS_ECR_REGISTRY }}
          IMAGE_TAG: ${{ github.sha }}
        run: |
          docker build -t $ECR_REGISTRY/pck:$IMAGE_TAG ./helloworld-was
          docker push $ECR_REGISTRY/pck:$IMAGE_TAG

Milestone_04

ECS Task Definition

서비스 생성

  • 배포 완료 후 해당 ALB DNS로 접속하여 정상동작을 확인
  • 동일한 방법으로 MongoDB 배포 후 접속하여 정상동작 확인

Milestone_05

  • Fastify(WAS) → MongoDB 접속
  • WAS 서버 프로젝트 폴더에서 npm i @fastify/mongodb 명령을 통해 mongoDB 플러그인 설치
// /plugins/mongodb.js 파일 생성 후 아래 코드 생성
'use strict'

const fp = require('fastify-plugin')

const { MONGO_HOSTNAME, MONGO_USERNAME, MONGO_PASSWORD } = process.env

module.exports = fp(async function (fastify, opts) {
  const URL = `mongodb://${MONGO_USERNAME}:${MONGO_PASSWORD}@${MONGO_HOSTNAME}:27017/?authMechanism=DEFAULT`
  console.log(URL)

  fastify.register(require('@fastify/mongodb'), {
    forceClose: true,
    URL: URL
  })
})
  • Fastify(WAS) → MongoDB 접속 시 접속 정보를 암호화 하여 보안을 강화 필요 SecretManager로 키/값을 암호화

Milestone_06

서버 애플리케이션의 HTTPS 적용

리스너 수정 (HTTP → HTTPS)

  • WAS의 부하분산을 해주는 ALB에서 SSL/TLS 인증서를 추가하여 설정

Milestone_07

  • FrontEnd 배포 자동화
  • 실습용 Frontend Repository master branch 에 push시 npm run build → S3 자동배포(GitHub Action)
name: Node.js CI, AWS S3 CD

on:
  push:
    branches: [ "master" ]

jobs:
  build:

    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [18.x]
        # See supported Node.js release schedule at https://nodejs.org/en/about/releases/

    steps:
    - uses: actions/checkout@v3
    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v3
      with:
        node-version: ${{ matrix.node-version }}
        cache: 'npm'
    - run: npm install
    - run: npm run build || exit 0


    - name: Configure AWS Credentials
      uses: aws-actions/configure-aws-credentials@v2
      with:
        aws-access-key-id: ${{ secrets.PCK_AWS_ACCESS_KEY_ID }}
        aws-secret-access-key: ${{ secrets.PCK_AWS_SECRET_ACCESS_KEY }}
        aws-region: ap-northeast-2
    - name: Copy files to the production website with the AWS CLI
      run: |
        aws s3 sync ./build s3://bigheadck-front

Milestone_08

  • CloudFront에서 아래와 같이 배포 생성
  • 생성이 완료 되면 CNAME 레코드로 해당 Cloudfront 주소로 레코드 추가

Milestone_09

  • FrontEnd → Fastify(WAS) 연결시 CORS 에러 해결
// /plugins/cors.js 파일 추가하여 아래 코드 삽입

'use strict'

const fp = require('fastify-plugin')

module.exports = fp(async function (fastify, opts) {
  fastify.register(require('@fastify/cors'), {
    origin: "www.domain.click", methods: ['GET', 'POST']
  })
})

Leave a Comment