이제 aws-sdk를 이용해서 s3에 파일을 업로드 다운로드 리스트를 받아오는 작업을 수행하였다. 이제 serverless framework를 통해 koa앱을 배포해보자. 이미 테스트 배포는 이전에 해놨기 때문에.. serverless framework 특히 aws에 대한 컨셉을 스터디해보자.
출처: serveless docs - provider cli references - aws -user guide- intro
serverless framework는 aws lambda functions을 개발, 배포를 도와주는 라이브러리입니다. 거기에 aws 인프라 resources가 뭔지는 모르겠는데 그것까지 함께 도와준답니다.
크게 functions, events, resources, services, plugins 다섯가지 있습니다.
aws lambda function을 말해요. 마이크로서비스 같이 독립적인 배포 단위에요.
단순히 코드만 있고, 클라우드에 배포 되어있고, ( 외부 머신에 동작해요 )
보통 하는 일은
aws lambda function을 실행시키는 모든 것을 말합니다.
다음 과 같은 것들이 있습니다.
An AWS API Gateway HTTP endpoint request (e.g., for a REST API)
An AWS S3 bucket upload (e.g., for an image)
A CloudWatch timer (e.g., run every 5 minutes)
An AWS SNS topic (e.g., a message)
A CloudWatch Alert (e.g., something happened)
And more...
Resources are AWS infrastructure components which your Functions use such as:
AWS infrastructure components란 DynamoDB, S3 Bucket, EC2, SNS Topic 같은 것들을 AWS infrastructure componets라고 하는 것 같다.
An AWS DynamoDB Table (e.g., for saving Users/Posts/Comments data)
An AWS S3 Bucket (e.g., for saving images or files)
An AWS SNS Topic (e.g., for sending messages asynchronously)
Anything that can be defined in CloudFormation is supported by the Serverless Framework
프로젝트 단위를 services라고 보시면 됩니다.
Serverless.yml에 functions를 정의해주시면 됍니다.
events, resources 도 여기에 정의합니다.
# serverless.yml
service: users
functions: # Your "Functions"
usersCreate:
events: # The "Events" that trigger this function
- http: post users/create
usersDelete:
events:
- http: delete users/delete
resources: # The "Resources" your "Functions" use. Raw AWS CloudFormation goes in here.
serverless와 관련된 라이브러리를 여기에 추가해주세요.
다음과 같이요~
plugins에 주의할 점은 plugins도 순서가 있어요.
library도 의존성들이 있잖아요. 그래서 중요한 순서를 위에 둬야 합니다.
plugins:
- serverless-plugin-include-dependencies <- 이 친구가 serverless-plugin-typescript 보다 위에있으면 배포가 되지 않습니다.
- serverless-plugin-typescript
- serverless-offline
You can overwrite or extend the functionality of the Framework using Plugins. Every serverless.yml can contain a plugins: property, which features multiple plugins.
데이터베이스 username, password, databases이름, port등
설정값 같은 것을 한 곳에 몰아두고요. 사용해요.
관리 용이하죠. 한 곳에 몰아두고 불러서 사용하기만 하면 되니까요.
.gitignore( github 저장소에 올리지 않을 파일을 저장하는 설정파일 )에 설정파일만 넣어주면 보안상에도 안전하고요.
또는,
if문 쓸때 어떤 조건일때는 어떤 값을 변수에 넣는 코딩많이 하잖아요.
정확히 위와 같은 동작을해요.
nodejs ( javascript를 브라우저가 아닌 다른 환경,
즉, OS 위에 node라는 프로그램 실행되듯이
nodejs 위에서 javascript 코드들이 동작하는 환경 )
nodejs 에서 사용해요.
dotenv는 nodejs 라이브러리에요.
npm 라이브러리는 npm <library name>
을 구글링 치면 npm 사이트가 나올거에요.
그래서 아래 npm 사이트에 가면 설치방법이 나와요.
https://www.npmjs.com/package/dotenv
npm i dotenv
파일 이름을 아무렇게나 만들어주세요. 확장자 없이요.
.env
env
config
아무렇게나요.
전 env
로 만들었습니다.
디렉토리는 다음과 같아요.
잠깐 현재 상황을 얘기하자면...
현재 개발중인 프로젝트는 typescript를 사용하고 있어요.
typescript로 transpile해서 .ts -> .js 로 바뀌는데
tsconfig.json ( transpile 할때 설정을 여기에 적어줘요. ) 에
dist라는 디렉토리에 transpile된 파일들을 넣어달라고 설정 해놨습니다.
그래서 디렉토리는 다음과 같아요.
- dist
- index.js
- src
- index.ts
- env
in index.ts
...
import dotenv from "dotenv";
import path from "path";
...
dotenv.config({ path: path.join(__dirname, "..", "/src", "/env") });
dotenv.config(); 설정 파일을 읽어서 process.env에 추가해줘요.
path는 nodejs 내장 기본 객체고요. 파일경로, 디렉토리경로를 코딩할때 많이 써요.
__dirname
전역으로 선언된 변수인데요. 현재 실행되는 파일의 디렉토리 경로가 문자열로 나와요.
console.log(path.join(__dirname, "..", "/src", "/env")
을 찍어보면
<상위디렉토리>/server/dist/src/env
로 절대경로가 문자열로 나올거에요.
즉, 설정정보들이 저장된 env파일 경로를 path.join이란 함수를 통해 만들었어요.
in env
TEST=DOTENV
TEST2=DOTENVOK
파일은 key=value 형식대로 comma "" 이런거 필요없어요.
현재 저는 dist/index.js 라는 파일을 node로 실행 할거에요.
그리고 console.log("프로세스 env", process.env);
콘솔로 process.env를 찍어보면
이런식으로 process.env에 프로퍼티들이 추가된것을 알 수 있어요.
TEST: 'DOTENV',
TEST2: 'DOTENVOK'
급해서 바로 쓸때는 잘 모르고 썼어요.
정말 제 mac 사용자계정에 환경변수로 설정되는줄 알았어요.
process는 node 객체거든요.. node에서만 쓰이는 환경변수라 이거죠.
nodejs를 실행할때만 쓰이는 환경변수입니다.