반응형
DockerFile 수정
최적화와 가독성 향상, 이미지 사이즈 축소 등 다양한 이점을 고려하여 멀티스테이지 빌드 접근법을 dockerfile
에 도입하였다.
####################
# Build Stage
####################
# Node.js 기반 이미지 선택
FROM --platform=linux/amd64 node:20.11.0 as build
# 애플리케이션 디렉토리 생성
WORKDIR /usr/src/app
# 애플리케이션 의존성 파일 복사
COPY package*.json ./
# package-lock*.json 대신 package*.json 사용으로 수정
# 패키지 설치
RUN npm install --verbose
# 애플리케이션 소스 복사 (src 폴더와 나머지 필요한 파일만 복사)
COPY src ./src
COPY tsconfig*.json ./
COPY nest-cli.json ./
# 애플리케이션 빌드
RUN npm run build --verbose
####################
# Production Stage
####################
FROM --platform=linux/amd64 node:20.11.0 as production
# 애플리케이션 디렉토리 생성
WORKDIR /usr/src/app
# 빌드 결과물과 패키지 파일 복사
COPY --from=build /usr/src/app/dist ./dist
COPY --from=build /usr/src/app/package*.json ./
# 프로덕션 의존성 설치 전에 CI 환경 변수 설정
ENV CI=true
# 프로덕션 의존성 설치
RUN npm install --only=production
# 애플리케이션 시작
CMD ["node", "dist/main"]
기존에 통으로 빌드만 하던 도커파일을 프로덕션과 빌드 단계로 분리하였다. 이 단계에서 몇 가지 에러가 났는데, husky 관련 명령어를 다음과 같이 수정하였다.
# package.json
// 기존
"prepare": "husky"
//수정후
"prepare": "if [ -z \"$CI\" ]; then husky install; fi"
husky, 개발 의존성 중 하나가 프로덕션 설치 과정에서 실행되려고 하지만, --only=production
옵션으로 인해 개발 의존성이 설치되지 않아서 발생하는 문제였다. 프로덕션 빌드에 포함시키기에는 husky라는 모듈이 적합하지 않기 때문에(코드 개선을 위한... 의존성이다.) prepare 스크립트 수정으로 해결하였음. 이를 위해서 dockerfile에 환경 변수 CI를 지정해 줌.
docker build -t potato-app .
docker run -it -p 3000:3000 --env-file .env potato-app
Cloud Security
VPC : Virtual Private Network
가상 프라이빗 네트워크. 완전 독립된 서버 환경을 만들어 주는 것. (분리)
availablity zone
VPC(같은 지역) 안의 zone. 이 안에 여러 Subnet들이 작은 네트워크로 쪼개져 있다.
Subnets?
작은 VPC...
로드 밸런서(Load Balancer)
네트워크 트래픽이나 애플리케이션 요청을 여러 서버 간에 분산시켜 처리하는 기능을 가진 시스템이나 소프트웨어. 이를 통해 단일 서버에 가해지는 부하를 줄이고, 전체 시스템의 처리 능력을 향상시킨다.
- Listener Rules
- HTTP -> PORT (HTTP redirect to 443)
- Target Groups
- 여러 서버에 분산해서 요청을 보내는 로드 밸런서... (Private IP로) 그래서 리다이렉트할 IP를 알고 있어야 함
- 그 IP들을 모아놓은 게 target groups
- 서버를 생성하고 추가하고 삭제할 때마다 타깃 그룹을 업데이트 해줘야 함.
Security Groups
-> 방화벽!
-> 필요 이상으로 오픈하면 외부에 노출되는 취약점이 생길 수 있음.
AWS에서는 EC2 같은 서버들에 다 적용할 수 있다. 보안 그룹은 하나 만들어서 여러 서버에 부착할 수 있음.
규칙이 크게 두 가지로 나뉜다.
- 인바운드
- Allow all from same SG
- 외부에서 요청해서 들어올 때
- 아웃바운드
- Allow all
- 내부에서 외부로 서드파티 API 요청 같은 거 보내기
로드 밸런서에도 적용...그러나 같은 시큐리티 그룹을 설정해줘야 내부 안에서 문제 없이 VPC끼리 통신을 핼 수 있다. 보안 그룹이 다르면 같은 VPC임에도 불구하고 요청을 보낼 수 없음.
근데 반대로 퍼블릭 아이피를 쓰고, 같은 시큐리트 그룹을 쓴다면 HTTPS 적용 없이 들어올 수 있는 위험이 생김
- 내부에서 외부로 서드파티 API 요청 같은 거 보내기
반응형
'TIL' 카테고리의 다른 글
[PHP] session을 사용하여 비밀번호 입력 시에만 오픈되는 상점 만들기 (0) | 2024.07.19 |
---|---|
[PHP] isset 함수와 $_SERVER['PHP_SELF'] : 학년별로 데이터 불러오기 (0) | 2024.07.06 |
[cloudfront] 이미지 CDN과 리사이징 (0) | 2024.04.04 |
[Websocket] 알람 및 채팅 기능 구현 (0) | 2024.03.19 |
[TypeORM] Entity metadata for Show#dates was not found (0) | 2024.03.12 |