코드스테이츠_Devops_4기/section2) 클라우드 서비스 운영

Section2 실습과제 Day 1

불여우의 길 2023. 4. 27. 22:27

다시 돌아온 실습과제...

다시 해보겠습니다.

전 할 수 있어염

왜냐면 우리팀이 있거들랑요?


Day 1

  • WAS를 Docker Image로 빌드하여 컨테이너화 해야 합니다.
  • 컨테이너화한 WAS를 Registry에 Push해야 합니다.
  • 기존에 배포된 Docker Image를 활용/실행해야 합니다.
  • mongoDB 기준
  • Docker Compose를 이용해, WAS와 DB를 한 번에 실행해야 합니다.
  • WAS 이미지 빌드 및 push 자동화를 구현해야 합니다.
  • ECR 서비스를 이용하는 방법을 배웁니다

결국 Github Action으로 도커 이미지를 빌드해서 ECR에 올리는 것을 자동화하는 것이 오늘의 목표입니당😊

 

 


 

마일스톤1 : 서버 컨테이너화와 레지스트리로 push

  • node.js(fastify)로 작성된 웹 서버를 실행하고, HTTP 요청을 통해 작동함을 확인할 수 있어야 합니다.
  • 도커 이미지/컨테이너/레지스트리의 개념을 이해하고 있어야 합니다.
  • Dockerfile을 통한 이미지 빌드를 할 수 있어야 합니다.

 

1. fastify cli 설치

npm i --global fastify-cli

 

2. fastify로 프로젝트 생성

fastidy generate 프로젝트이름

 

3. npm install

모듈 설치

 

4. 서버 실행 시 모든 주소로부터 수신이 가능하도록 

package.json 실행 명령어에 --address 0.0.0.0 추가

  "scripts": {
    "test": "tap \"test/**/*.test.js\"",
    "start": "fastify start -l info app.js --address 0.0.0.0",
    "dev": "fastify start -w -l info -P app.js"
  }

5. Dockerfile 작성

FROM node:16

WORKDIR /first

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 3000

# 런타임을 정의
CMD ["npm", "start"]

 

이미지 빌드 후 컨테이너가 잘 동작하는 것을 확인했다

AWS의 액세스 키와 시크릿키를 발급받고 ecr 레포지토리를 만들었다.

 

 

레포지포리에 들어가서 '푸시 명령 보기' 버튼을 클릭하면 쉽게 푸시 명령어를 보고 터미널에 작성하면 된당~ 복붙복붙

레퍼런스에도 잘 설명이 되어있다!

 

AWS CLI에서 Amazon ECR 사용 - Amazon ECR

경우에 따라서는 ec2-user가 Docker 데몬에 액세스할 수 있는 권한을 제공하기 위해 인스턴스를 재부팅해야 할 수도 있습니다. 다음 오류가 표시될 경우 인스턴스를 재부팅합니다. Cannot connect to the D

docs.aws.amazon.com

 

 

요러케 이미지가 들어가는 것을 확인했다

 

여기까지 아주 막힘없이 금방 끝~

 

마일스톤2 : 서버와 mongodb를 한꺼번에 docker compose로 실행하기

  • 웹 서버 코드를 변경하여, mongodb와의 접속을 확인합니다.
  • 웹 서버 이미지를 새롭게 빌드합니다. tag는 1.1입니다.
  • 컨테이너화 한 웹 서버 이미지와, mongodb를 한꺼번에 실행하기 위해 docker compose 파일을 작성합니다.

mongodb랑 접속 연동을 시키기 위해서 파일을 만들고 코드 작성을 해주었다.

 

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('mongodb://[몽고디비 url]')

  fastify.register(require('@fastify/mongodb'), {
    forceClose: true,
    url: url
  })
})

 

cors.js

'use strict'

const fp = require('fastify-plugin')

module.exports = fp(async function (fastify, opts) {
  fastify.register(require('@fastify/cors'))
})

 

이렇게 기억을 더듬더듬.. fastify의 디비연동을 위한 js 파일을 작성해주었당~

process.env에 디비 정보도 추가 완료!

 

# Use root/example as user/password credentials
version: '3.1'

services:
  fastify:
    build:
      # context : 빌드할 Dockerfile의 위치
      context: ./helloworld-was
      # dockerfile : 빌드할 dockerfile의 파일명
      dockerfile: Dockerfile
      # 캐쉬 유무
      # no_cache: true
      # 이미지 이름과 태그
    image: 이미지이름:태그
    ports:
      - "3000:3000"
    container_name: "컨테이너이름"

  mongo:
    image: mongo
    restart: always
    ports:
      - "27017:27017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: 비밀~
      MONGO_INITDB_ROOT_PASSWORD: 비밀~

요로코롬 docker-compose.yaml 파일도 만들어주면~

 

실행 후 이쁘게 잘 뜨는 컨데이너ㅎㅎ

디비 연동까지 완료~

 

마일스톤3 : 레지스트리 push 자동화

 

이제 드디어 GithunAction 에서 ecr 자동화를 시작했다

 

Githun Action을 위한 yaml을 작성하면서 오류가 많이 났당ㅎㅎ

 

여기서 만난 오류

 

트러블 슈팅 1. npm cache 문제

Error: buildx failed with: ERROR: failed to solve: executor failed running [/bin/sh -c npm cache clear]: exit code: 1

 

이딴 오류가 계속 나서 dockerfile에 npm 캐쉬를 삭제할 수 있도록 추가해줬다.

FROM node:16

WORKDIR /first

COPY package*.json ./

RUN npm cache clear

RUN npm install

COPY . .

EXPOSE 3000

# 런타임을 정의
CMD ["npm", "start"]

이렇게 하고 도커 이미지 빌드는 완료

 

트러블 슈팅 2. repository 문제

 

팀원 갓서님의 레포에 무슨 문제가 있는지 자꾸 이전 dockerfile을 읽었다.

도커 이미지 캐쉬인지 github action 캐쉬인지

dockerfile 파일과 workflow yaml 파일에 캐쉬란 캐쉬는 삭제하는 구문을 다 작성해줘도 안되는 것이다..!

 

결국 레포에 깃이 잘 안먹히는 것으로 판단하고 레포를 다시 팠다.

 

해결..

 

이 이슈를 해결하기 위해서 셋이서 진짜 온갖 걸 다했는데

결국 레포를 지우고 삭제하는 결과라 좀 아쉽기도 했지만...

그래도 해결~

 

트러블 슈팅  3. ecr repository에 푸시할 때 dockfile을 못찾는다는 문제

 

이런 오류로 GPT한테 이거 경로 설정 어캐해! 하니까 

docker build -f 옵션 붙여서 경로 설정해주면 된다고 한당ㅋㅋㅋ

 

# 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.

# GitHub recommends pinning actions to a commit SHA.
# To get a newer version, you will need to update the SHA.
# You can also reference a tag or branch, but the action may change without warning.

name: Publish Docker image

on:
  release:
    types: [published]

jobs:
  push_to_registry:
    name: Push Docker image to Docker Hub
    runs-on: ubuntu-latest
    steps:
      - name: Check out the repo
        uses: actions/checkout@v3
      
      - name: Log in to Docker Hub
        uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}
      
      - name: Extract metadata (tags, labels) for Docker
        id: meta
        uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
        with:
          images: parknahye/helloworld-was
      
      - name: Build and push Docker image
        uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4
        with:
          context: ./helloworld-was
          Dockerfile: ./helloworld-was/Dockerfile
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}

      - 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: ap-northeast-2

      - name: Login to Amazon ECR
        id: login-ecr
        uses: aws-actions/amazon-ecr-login@v1

      - name: Build image to Amazon ECR
        id: build-image
        env:
          ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
          ECR_REPOSITORY: s2_1
          IMAGE_TAG: 1.2
        run:
          docker build -t ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:${{ env.IMAGE_TAG }} -f ./helloworld-was/Dockerfile .

      - name: Push image to Amazon ECR
        id: push-image
        env:
          ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
          ECR_REPOSITORY: s2_1
          IMAGE_TAG: 1.2
        run:
          docker push ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:${{ env.IMAGE_TAG }}

 

 

 

그래서 완성한 workflow yaml 파일...

 

마지막에 자동화 완료되고 어찌나 행복하던지..ㅎㅎ

이렇게 완성이 되었습니당~


아직 섹션2 이론 정리도 안했지만

트러블슈팅은 정말 지금 안하면 잊을것같아서..

물론 정말 성의가 없는 글이지만...

 

나머지공부를 정규 수업시간 끝나고 세시간 반동안 열심히 만든 결과이기 때문에..ㅎㅎ

그래도 성공했다~!

좋은 팀원들이 계셔서 같이 으쌰으쌰 에러 확인하고 공부하고 있다.

다 살이되고 .. 피가되고 .. 그러겠지

 

내일은 더 열심히 해서 제시간 안에 끝내고 조카를 보러갈 수 있을련지..!

 

'코드스테이츠_Devops_4기 > section2) 클라우드 서비스 운영' 카테고리의 다른 글

Section2 실습과제 Day 3  (2) 2023.05.01
Section2 실습과제 Day 2  (0) 2023.05.01
Section2 AWS -2  (1) 2023.04.25
Section2 AWS  (0) 2023.04.21
Section2 Docker  (1) 2023.04.16