문제상황
람다 함수에서 API Key같은 외부로 노출되면 안되는 민감한 데이터들을 다루는 일이 종종 있다.
이런 값들을 환경변수로 다루려면 serverless.yml에 환경변수를 작성하고 주입해주는 방법이 있다.
하지만 이런 방법은 결국 민감한 정보가 외부로 노출되는 건 똑같다.(아니면 AWS console에서 직접 환경변수를 주입해줘야 한다. 이 경우 테스트 하려면 매번 배포해야 하는 단점이 있다.)
serverless.yml
provider:
name: aws
runtime: nodejs18.x
environment:
APP_NAME: myfo
S3_BUCKET: my_bucket
handler.ts
process.env
를 통해 환경변수에 접근할 수 있다.
...
const key = `${process.env.APP_NAME}/${year}/${month}/${uuidv4()}_${formData.image[0].filename}`;
const command = new PutObjectCommand({
Bucket: process.env.S3_BUCKET,
Key: key,
Body: formData.image[1]
});
...
serverless-dotenv-plugin
serverless-dotenv-plugin을 사용하면 위의 걱정을 해소해준다. .env
로 환경변수를 설정해주고, serverless.yml을 조금만 수정해주면 된다.
.env
S3_BUCKET=<버킷_이름>
REGION=<AWS_리전>
BUCKET_LOCATION=<버킷>
APP_NAME=<앱_이름>
.env
에 환경변수 값을 작성해주고
serverless.yml에 useDotenv: true
로 설정해주면 된다.
그리고 사용할 환경변수 값을 아래와 같이 설정해준다.
seDotenv: true
provider:
name: aws
runtime: nodejs18.x
environment:
APP_NAME: ${env.APP_NAME}
S3_BUCKET: ${env.S3_BUCKET}
REGION: ${env.REGION}
...
plugins:
- serverless-esbuild
- serverless-offline
- serverless-dotenv-plugin
serverless offline start
나 serverless deploy
명령어를 실행해보면 아래와 같이 환경변수가 주입되는 걸 확인할 수 있다.
.env
를 여기저기 활용하고 싶어서 environment 하위가 아닌 다른 속성에도 사용해봤는데 테스트 해보았지만 environment 내에서면 env에 접근하는게 유효한 것 같다.
Tip: serverless print 명령어를 사용하면 serverless.yml이 최종으로 어떻게 반영되는지 확인할 수 있다.
참고
Serverless Dotenv Plugin - Serverless Framework: Plugins
Preload environment variables from `.env` into serverless.
www.serverless.com