반응형

서버 구축을 하면서 인증서를 Let's Encrypt SSL 인증서를 발급받아서 사용하고 있었는데

이 인증서가 3개월 후에 만료가 되면서 서버가 먹통이 되었습니다.

 

 

지금은 다시 재발급 받아서 인증서가 유효하다고 뜨는데

원래는 "인증서가 만료됨" 이렇게 떴었습니다.

 

인증서 발급

1. certbot 설치

sudo dnf install -y certbot python3-certbot-nginx

 

 

2. 원하는 도메인에 대한 인증서 발급

sudo certbot --nginx -d api.test.com -d www.api.test.com

 

 

3. nginx 재실행

sudo systemctl reload nginx

 

 

인증서 자동갱신

1. crontab 설치

# Ubuntu
sudo apt update
sudo apt install cron -y

# CentOS / RHEL / Amazon Linux
sudo yum install cronie -y

 

2. crontab 등록

// sudo crontab -e

0 0 1 * * sudo certbot renew && sudo systemctl restart nginx

 

 

참고로 sudo certbot renew 명령어가 실행될 때 만료일이 30일 이전이 아니면 재발급은 실패합니다.

반응형

'Backend' 카테고리의 다른 글

[CI/CD] 개발자를 위한 CI/CD 도구의 종류  (0) 2024.04.17
반응형

CI/CD 에는 다양한 도구가 있지만 요즘 저는 github actions을 제일 많이 사용하는 것 같습니다.

러닝커브도 높지 않고, 보통 개발에 git을 많이 사용하니 세팅하기 위해 다른 관리 포인트를 두지 않아도 되기 때문에 좋은 것 같습니다.

 

장단점은 간단하게 정리해두었습니다.

 

[CI/CD] 개발자를 위한 CI/CD 도구의 종류

CI/CD 란? CI(Continuous Integration)는 소프트웨어 구축, 테스트 및 게시 프로세스의 자동화를 의미합니다. CD(Continuous Deployment or Continuous Delivery)는 배포 자동화를 의미합니다. 즉, CI/CD는 코드 변경에 대

zsunn.tistory.com

 

기본적인 세팅 플로우는 동일하지만, 사용할 서버에 따라서 세부내용이 달라집니다! (참고만 해주세요)

 

저는 github actions와 함께 AWS S3 + EC2를 사용해서 배포해보도록 하겠습니다.

(AWS ECR + Lambda로도 배포했었는데 그건 다음에 정리해서 올릴게요~)

 

CI/CD 플로우를 정리하자면 이렇게 순서대로 진행이 됩니다

1. github에서 branch에 push
2. actions에서 workflows 파일 read
3. AWS S3 프로젝트 zip 파일 업로드
4. AWS EC2에 접근
5. EC2 서버 내부에서 deploy shell 파일 실행

 

1. AWS ACCESS KEY 발급

AWS IAM 들어가서 내가 사용할 사용자를 선택합니다.

그럼 다음과 같이 나오는데 여기서 액세스 키 만들기를 선택합니다.

 

AWS 애플리케이션에 연결시킬 거라서 선택 후 생성해 주면 아래 두 개의 키가 생성이 됩니다.

AWS_ACCESS_KEY_ID

AWS_SECRET_ACCESS_KEY

 

다시 확인할 수 없으니 바로 다운로드하고 저장해 놓으시고

 

2. github 레포지토리의 Settings > Secrets and variables > Actions

발급받은 키들을 저장합니다.

 

3. S3 버킷 만들기

AWS S3 들어가서 버킷 만들기 해주면 끝입니다.

 

4. CodeDeploy 그룹 만들기

애플리케이션 생성 > 배포 그룹 생성

 

5. workflows 파일 생성

프로젝트 디렉토리에서

.github > workflows > deploy.yml

name: Deploy to Dev EC2 server

on:
  push:
    branches: [ develop ]

env:
  AWS_REGION: ap-northeast-2
  APP_NAME: APP_NAME
  DEPLOY_KEY: DEPLOY_KEY
  DEPLOY_GROUP: DEPLOY_GROUP

permissions:
  contents: read

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

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - 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 }}

      - name: Upload to S3
        run: aws deploy push --application-name ${{ env.APP_NAME }} --ignore-hidden-files --s3-location s3://${{ env.APP_NAME }}/${{ env.DEPLOY_KEY }}/$GITHUB_SHA.zip --source .

      - name: Deploy to EC2
        run: aws deploy create-deployment --application-name ${{ env.APP_NAME }} --file-exists-behavior OVERWRITE --deployment-config-name CodeDeployDefault.AllAtOnce --deployment-group-name ${{ env.DEPLOY_GROUP }} --s3-location bucket=${{ env.APP_NAME }},bundleType=zip,key=${{ env.DEPLOY_KEY }}/$GITHUB_SHA.zip

 

6. deploy.sh 파일 생성

scripts > deploy.sh (위치는 자유)

#!/bin/bash

APP_NAME={프로젝트 이름}
REPOSITORY=/home/ec2-user/{프로젝트 폴더 이름}
cd $REPOSITORY

APP_LOG=$REPOSITORY/logs/application.log

source /home/ec2-user/.bash_profile
echo "현재 환경: $NODE_ENV" >> $APP_LOG

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion

# 캐시 정리
echo "Cleaning cache..." >> $APP_LOG
sudo rm -rf dist/ node_modules/ package-lock.json

# 의존성 패키지 설치
echo "Installing dependencies..." >> $APP_LOG
npm install

# 애플리케이션 빌드
echo "Building application..." >> $APP_LOG
npm run build

# 이전 PM2 프로세스 종료
echo "Stopping previous application instance..." >> $APP_LOG
pm2 stop $APP_NAME || true
pm2 delete $APP_NAME || true

# 새로운 프로세스 시작
echo "Starting application..." >> $APP_LOG
pm2 start ecosystem.config.js

# PM2 프로세스 저장
pm2 save

 

저는 pm2를 사용해서 서버를 띄우고 있어서 npm으로 재시작 후 pm2 도 다시 재시작하는 명령이 필요해요.

 

7. appspec.yml 파일 생성

version: 0.0
os: linux

files:
  - source: /
    destination: /home/ec2-user/{프로젝트 폴더 이름}
    overwrite: yes

permissions:
  - object: /
    owner: ec2-user
    group: ec2-user

hooks:
  ApplicationStart:
    - location: scripts/deploy.sh
      timeout: 600
      runas: ec2-user

 

appspec 파일까지 만들었으면 이제 끝인데요

 


자 이제 push를 하고 진행이 완료되는지 확인해 볼게요!

github actions는 완료 됐습니다!

만약 오류 나서 실패했다면 메시지 보고 수정하시면 돼요

 

그런 다음 CodeDeploy에 배포를 확인해 보면 하나가 떠있을 거예요!

 

여기서 View events를 눌러보시면 자세히 볼 수 있어요

 

이렇게 각 이벤트별 성공 여부를 알 수 있고 어디서 실패했는지 알 수 있어요

대신 실패 했을 경우 에러 메시지가 친절하진 않아서 헤맬 수 있습니다 ㅠㅠ

(제가 그랬거든요..)

 

모두 배포 성공하세요~

 

반응형
반응형

CI/CD 란?

CI(Continuous Integration)는 소프트웨어 구축, 테스트 및 게시 프로세스의 자동화를 의미합니다.

CD(Continuous Deployment or Continuous Delivery)는 배포 자동화를 의미합니다.

 

즉, CI/CD는 코드 변경에 대해서 신속하게 코드 품질을 개선하는 데에 도움을 주는 DevOps 방식입니다.

만약 팀에 좋은 CI/CD 프로세스가 구축이 되어 있다면 더 신속하고 정확하게 릴리즈를 할 수 있을 것입니다.

 

옛날에 비해 CI/CD에 대한 중요성과 관심도가 급증함에 따라 도구들도 많아져서 선택에 어려움이 생기는 경우도 종종 발생하고 있습니다.

서비스에 따라 어떤 플랫폼을 선택을 하는 게 좋을지 고민할 텐데 우선 어떤 선택지가 있는지 살펴보겠습니다.

 

출처: 2023년 개발자 생태계 보고서

 

역시 아직까지 Jenkins 사용자가 많은데, 그 뒤를 Github Action이 바짝 따라잡고 있습니다.

 

 

GitHub Actions

Git을 많이 사용하기 때문에 가장 인기있는 도구가 아닐까 싶습니다.

Git과 직접 연동이 되기 때문에 workflow 작성 및 관리가 쉽습니다.

다양한 플러그인을 제공해줍니다.

초기에는 러닝커브가 있을 수 있습니다.

public repository는 무료로 제공되며, private이라면 500MB 2000분이 무료로 제공됩니다.

https://docs.github.com/ko/actions

 

Jenkins

아직까지도 제일 많이 사용하는 도구이며, 커뮤니티가 활발합니다.

오픈소스이고 무료입니다.

서버를 직접 호스팅 하고 관리해야 하기 때문에 서버 비용은 별도입니다.

마찬가지로 다양한 플러그인을 제공해 줍니다.

초기 설정에 시간이 걸릴 수 있으며, 지속적인 관리가 필요합니다.

https://jenkins.io/

 

GitLab CI

GitLab 플랫폼에서 자동화 빌드, 테스트 및 배포 파이프라인을 제공합니다.

사용이 간편하고 배포 설정이 쉽습니다.

다른 플랫폼에 비해 플러그인이 적습니다.

https://about.gitlab.com/

 

반응형

'Backend' 카테고리의 다른 글

[Let's Encrypt] SSL 인증서 발급 및 자동갱신 처리하기  (0) 2025.08.18
반응형

사용하고 있는 서버 중 small, medium 서버에서 메모리가 너무 빨리 차서 메모리릭 현상이 발생하는 이슈가 있었습니다.

 

매일 scheduler로 메모리 청소를 해주지만 이것도 한계가 있고,

비용문제로 큰 서버로 늘리는 것은 부담되므로 가상 메모리를 확보하는 방식으로 사용하기로 했습니다 !!

 

Swap file을 사용해서 해결하기로 결정

 

swap file 이 뭔데 ?

메모리가 부족할 때 디스크 공간을 가상 메모리로 사용하는 방법입니다.

대체하여 사용하는 방식이기 때문에 실제 메모리에 비해 속도도 느리고 성능이 저하될 수 있지만 메모리가 부족해서 서버가 다운되는 이슈를 방지하는 면에서 swap을 사용하는 것도 좋은 방법입니다.

 

 

1. 기존 메모리 사용량 확인

 

현재 total 메모리 1.9G 이기 때문에 1.5 ~ 2배 정도 확보 해준다. (4G 정도면 적당하겠지 . . . ?)

 

2. 메모리 할당

sudo fallocate -l 4G /swapfile
ls /swapfile

 

3. 접근 권한 설정

sudo chmod 600 /swapfile

 

4. 메모리 파티션 설정

sudo mkswap /swapfile
sudo swapon /swapfile

 

5. 마운트 추가

sudo vi /etc/fstab
// 파일에 아래 한 줄 추가
/swapfile swap swap defaults 0 0

 

6. 가상 메모리 확보 완료

 

free -h 명령어로 현재 메모리 사용량을 알 수 있습니다.

 

Swap도 4G 설정 완료 끝입니다 :)

반응형
반응형

AWS Lambda와 SQS를 사용해서 카카오 메시지 전송하는 기능을 만들었는데 

 

1. [AWS SQS] Nestjs로 SQS 전송, 수신 구현하기

 

[AWS SQS] Nestjs로 SQS 전송, 수신 구현하기

AWS SQS가 뭐지?Amazon Simple Queue Service(SQS)는 쉽게 말해서 Queue입니다. 마이크로서비스, 분산 시스템 등에서 메시지 손실 걱정 없이 어떤 볼륨의 메시지든 전송, 저장 및 수신이 가능한 메시지 대기열

zsunn.tistory.com

2. [AWS] Lambda + SQS로 카카오 알림톡 서비스 구현하기

 

[AWS] Lambda + SQS로 카카오 알림톡 서비스 구현하기

저번에는 SQS 송수신하는 코드를 구현해 보았는데요! 이번에는 이어서 SQS로 전송한 데이터를 Lambda로 받아서 알림톡으로 전송하는 서비스를 구현해 보겠습니다! 이전 글 참고 해주세요! [AWS SQS] Ne

zsunn.tistory.com

 

이전 게시글에서 SQS 송수신 구현하고 Lambda 설정까지 끝냈습니다.

다음 lambda 코드 소스를 짜보겠습니다.

 

저는 Node로 코드 구성을 했고, 하단에 런타임 설정에서 언어 설정 가능합니다.

 

 

코드 소스

환경변수 가지고 와서 카카오 API로 메시지 전송하는 부분까지 코드를 간단하게 작성했습니다.

const request = require('request');

exports.handler = function (event) {
    console.log('consume sqs message event', JSON.stringify(event.Records[0].body));
    
    try {
        const headers = {
            'Content-type': 'application/json',
            'userid' : process.env.BIZMSG_USER_ID,
          };
        
        const options = {
            uri: process.env.BIZMSG_API_HOST,
            method: 'POST',
            headers: headers,
            body: event.Records[0].body
        };
    
        request.post(options, function (error, response, body) {
            if (error) {
                console.error(error);
            }
            console.log(body);
        });
    } catch (error) {
        console.error(error);
    }
    
};

 

 

하지만 이렇게 끝내면 오류가 발생합니다!!

이유는 request 라는 라이브러리를 가지고 올 수 없기 때문이죠

 

Lambda 에서 사용하고 싶은 라이브러리는 직접 layer로 생성을 해서 부여해주셔야 합니다

 

Layers 추가

1. 새로운 폴더를 만들어줍니다.

mkdir nodejs && cd nodejs

 

 

2. 원하는 라이브러리를 다운로드합니다.

npm init
npm install --save request

 

3. zip 파일로 변경해 줍니다.

cd ..
zip -r layer.zip nodejs

 

4. awscli 다운로드해줍니다.

brew install awscli

 

5. lambda layer로 올려줍니다.

aws lambda publish-layer-version --layer-name request-layer --description "add request library" --zip-file fileb://layer.zip --compatible-runtimes nodejs14.x nodejs16.x nodejs18.x\n

 

6. 계층 > [Add a layer]

사용자 지정 계층을 보면 이제까지 올렸던 layer들의 목록이 보입니다.

 

원하는 layer를 선택 후 추가하면 아래와 같이 목록이 생성됩니다!

 

 

layer 목록에서 삭제하는 방법은 다음과 같습니다.

aws lambda delete-layer-version --layer-name request-layer --version-number

 

 

테스트도 해볼 수 있습니다.

 

반응형

+ Recent posts