반응형

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/

 

반응형
반응형

사용하고 있는 서버 중 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

 

 

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

 

반응형
반응형

전에 NestJS에서 Guard와 Strategy를 사용을 하려고 공부하다가

Guard가 어떤 방식으로 작동이 되는지 이해가 잘 안 되어서 코드분석을 했었는데

그 내용들을 정리한 내용입니다.

 

 

인증과 인가

  • 인증(Authentication)
    • 요청자가 자신이 누구인지 증명하는 과정
    • 요청마다 jwt 토큰을 함께 보내 토큰으로 요청자가 라우터에 접근 가능한지 확인
    • 보통 미들웨어로 구현
  • 인가(Authorization)
    • 인증을 통과한 유저가 요청한 기능을 사용할 권한이 있는지 판별
    • 퍼미션(permission), 롤(role), ACL(Access Control List)와 같은 개념을 사용하여 유저가 가지고 있는 속성으로 사용을 허용할지 판별
    • 보통 가드로 구현

 

💡 인가를 미들웨어가 아닌 가드로 구현하는 이유는 무엇일까 ?
미들웨어는 실행 콘텍스트에 접근하지 못하고,작업완료 후 next() 호출함으로 다음 어떤 핸들러가 실행되는지 알 수가 없습니다.
하지만 가드는 실행 컨텍스트 인스턴스에 접근할 수 있어 다음 실행될 작업을 알고 있기 때문입니다.

 

 


JwtGuard와 Strategy

Express 메서드로서의 미들웨어는 NestJS에도 존재하는데 즉, Express 미들웨어의 의미에서 일반적인 미들웨어가 아닙니다.

AuthGuard() #canActivate()는 적절한 PassportStrategy를 호출하게 됩니다.

이런 strategy은 특히 passport.use()가 호출되는 40-41행에 등록됩니다.

이것은 Passport.verify()에 사용할 passport strategy 클래스의 validate 메서드를 등록합니다.

 

💡 내부 논리의 대부분은 추상적이고 읽는 동안 콘텍스트가 손실될 수 있으므로 시간을 들여 클래스, 믹스인(mixins : 클래스를 반환하는 함수) 및 상속의 개념을 공부하는 것을 추천드립니다. (mixins에 대한 스터디 필요)

 

AuthGuard의 51행은 원래 passportFn이 생성된 곳이며 이 PassportFn에서는 passport.authenticate가 호출됩니다. (passport.verify을 호출)

(Passport의 코드를 읽는 것은 훨씬 더 혼란스럽기 때문에 원할 때 실행할 수 있습니다.)

canActivate() 메서드에 몇 가지 논리를 추가하려면 super.canActivate(context)를 호출하여 원래의 canActivate() 메서드를 호출할 수 있습니다. 결국 Passport.authenticate()를 호출하여 <Strategy>#validate를 호출할 수 있습니다.

@Injectable()
export class CustomAuthGuard extends AuthGuard('jwt') {

  async canActivate(context: ExecutionContext): Promise<boolean> {
    // custom logic can go here
    const parentCanActivate = (await super.canActivate(context)) as boolean; // this is necessary due to possibly returning `boolean | Promise<boolean> | Observable<boolean>
    // custom logic goes here too
    return parentCanActivate && customCondition;
  }
}

 

참고문헌

https://stackoverflow.com/questions/65557077/passportjs-nestjs-canactivate-method-of-authguardjwt

https://docs.nestjs.kr/guards#guards

https://wikidocs.net/149762

https://velog.io/@sz3728/NestJS-JWT-발행-및-만료처리-기능-권한-제한

https://velog.io/@yiyb0603/Nest.js에서-jwt-토큰-관리하기

반응형

'Backend > Nestjs' 카테고리의 다른 글

[NestJS] NestJS 란?  (0) 2022.06.10
[NestJS] E2E Testing  (0) 2022.02.27
[NestJS] Swagger 생성하기  (0) 2022.02.21
[NestJS] 유닛 테스트(Unit Testing)  (0) 2022.02.16
[NestJS] Docker 304 undefined 에러  (0) 2022.02.14
반응형

오늘은 AWS EC2와 Jenkins를 활용한 CI/CD 구성을 해보려고 합니다!

인프라 관련 일을 할 때마다 어렵지만 재밌고 공부하는 재미가 쏠쏠한데 나중에 DevOps도 해보고 싶네요

 

DNS 설정은 아임웹을 사용했고, 깃허브 웹훅을 Jenkins와 연동해서 자동 빌드 테스트까지 해보겠습니다!

 

 

1. 프로젝트 생성 후 웹훅 설정

 

2. AWS 인스턴스 생성

 

3. 아임웹 추가

 

1) 환경설정 > 도메인

 

 

2) 보안그룹 > 인바운드 규칙

 

보안그룹 생성

 

netstat -tulpn

→ 위의 포트가 사용 안 하고 있는 포트인지 확인 필요

 

4. 대상 그룹 생성

로드 밸런싱 > 대상 그룹 > 대상 그룹 생성

5. 로드밸런서 DNS 연동

아임웹에서 만든 ip 주소 등록
방금 만든 대상그룹 등록

 

 

6. Jenkins 설정

1) Jenkins 관리 > 시스템 설정 > SSH Server 추가

Hostname : 인스턴스 프라이빗 IPv4 주소

 

 

 

2) Jenkins 새로운 Item

 

유의할 점 : 깃허브 주소, 폴더 명

 

 

  • GitHub hook으로 develop 자동 빌드로 세팅
  • Execute shell : 빌드 시 실행할 쉘 스크립트 설정
# jenkins workspace로 이동
cd /var/jenkins_home/workspace
# 빌드 후 생성된 코드파일을 tar 파일로 생성
tar -cvf dev-test-server.tar dev-test-server
# tar 파일 위치 이동
mv dev-test-server.tar dev-test-server/dev-test-server.tar

 

 

 

방금 저장한 젠킨스 SSH Server 등록!

# 개발서버로 이동
cd /home/ec2-user/dev-test-server
# tar 파일 풀기
tar -xvf dev-test-server.tar
# start shell 스크립트 실행
./start.sh

 

 

 

  • 빌드 종료 후 실행할 shell 명령 설정
# tar 파일 삭제
rm /var/jenkins_home/workspace/dev-test-server/dev-test-server.tar

 

 

여기서부터는 젠킨스 서버 - 개발 서버 세팅!

 

 

1. 젠킨스 서버 접속

 

cd /jenkins/workspace/
sudo mkdir dev-test-server
# 여기서 폴더명은 아까 젠킨스에서 만들어줬던 폴더명과 동일하게 !!!!

 

2. 개발 서버 접속

# 소스코드 풀 폴더 생성
sudo mkdir dev-test-server && cd dev-test-server
sudo vi ecosystem.config.js

 

ecosystem.config.js 파일 생성

'use strict';

module.exports = {
    apps: [
        {
            name: "dev-test-server-API", // pm2로 실행한 프로세스 목록에서 이 애플리케이션의 이름으로 지정될 문자열
            namespace: "develop",
            script: "dev-test-server/dist/main.js", // pm2로 실행될 파일 경로
            watch: false, // 파일이 변경되면 자동으로 재실행 (true || false)
            ignore_watch : ["logs"],
            env: {
                "NODE_ENV": "development" // 개발환경시 적용될 설정 지정
            },
            env_production: {
                "NODE_ENV": "production" // 배포환경시 적용될 설정 지정
            }
        }
    ]
};

 

start.sh 쉘 스크립트 파일 생성

sudo vi start.sh
#!/bin/bash
cd /home/ec2-user/dev-test-server/dev-test-server
yarn install
npm run build
cd /home/ec2-user/dev-test-server
pm2 restart ecosystem.config.js

 

💡 너무너무 중요한 권한 설정!!!

 

sudo chown -R ec2-user:ec2-user dev-test-server
sudo chmod 775 dev-test-server
sudo chmod 755 start.sh

 

node, pm2, yarn 설치 (버전에 맞게 설치)

cd ~
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash
. ~/.nvm/nvm.sh
nvm install 16
npm -v
npm install pm2 -g
npm install -g yarn

 

3. 빌드 테스트

코드 → develop 자동 빌드 테스트

 

 

pm2가 떠있으면 성공!

 

jenkins 다루면서 오류도 굉장히 많았는데 어떤 오류를 잡았었는지 다음에 하나씩 올리도록 하겠습니다

 

반응형

+ Recent posts