반응형

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
반응형

1. 테마정보

장르 : ?

추천인원 : 3인 이상

난이도 : ⭐️⭐️⭐️⭐️

시간 : 70분

 

테마 소개

이혜정 : 우리 어디서 만날까?

 

2. 플레이 인원 정보

인원수 : 3인 (40+, 20+, 10+)

 

나의 인생테마는

fl[ae]sh [황금열쇠 건대점]

어제, 그리고 오늘 [넥스트에디션 건대 2호점]

여행 [머더파커 건대점]

MAYDAY [비트포비아 강남던전 2]

METRO [룸엘이스케이프 신림점]

 

3. 후기

탈출여부 : 실패

남은 시간 : -

사용한 힌트 수 : 2개

공포도 : -

체감 난이도 : ⭐️⭐️⭐️⭐️ (4.5)

 

난이도가 정말 미쳤음

이게 처음에 들어가는 순간부터 신기함

다른 테마랑은 정말 느낌부터가 달랐고 분리구간이 있는데 공포테마의 그런 분리 느낌은 아님..

한 명이 도태되는 순간 게임 끝임..

모든 사람들이 잘 풀어야 하는 테마

너무 재밌는데 너무 어렵고

문제수가 정말 많고 복잡해서 시간이 너무 부족함

문제 푸는 게 중요하지 스토리 따위 알바 아님

이런 문제방 다른 카페에서도 해봤는데 차원이 다름

훨씬 재밌었음

 

우린 똑똑해라고 자만하고 들어갔지만 당당히 실패 ^^..

우리 방린이들 좀 더 분발하자 ^^!

반응형

+ Recent posts