Serverless Framework의 스테이지
Serverless Framework의 스테이지
Serverless Framework는 프로젝트를 배포할 스테이지를 생성할 수 있게 해줍니다. 스테이지는 테스트와 개발을 위한 환경을 만드는 데 유용합니다. 일반적으로 프로덕션 환경의 독립적인 복제본인 스테이징 환경을 만듭니다. 이를 통해 배포하려는 코드 버전이 문제없는지 테스트하고 확인할 수 있습니다.
이번 장에서는 Serverless에서 스테이지를 구성하는 방법을 살펴보겠습니다. 먼저 스테이지를 구현하는 방법부터 알아보겠습니다.
스테이징 구현 방법
프로젝트에 스테이지를 설정하는 방법은 여러 가지가 있습니다:
-
API Gateway 내장 스테이지 사용
하나의 API Gateway 프로젝트 내에서 여러 스테이지를 생성할 수 있습니다. 같은 프로젝트 내의 스테이지는 동일한 엔드포인트 호스트를 공유하지만, 경로가 다릅니다. 예를 들어,
prod
라는 스테이지가 있고 엔드포인트가 다음과 같다고 가정해 보겠습니다:https://abc12345.execute-api.us-east-1.amazonaws.com/prod
같은 API Gateway API에
dev
라는 스테이지를 추가하면, 새로운 스테이지의 엔드포인트는 다음과 같습니다:https://abc12345.execute-api.us-east-1.amazonaws.com/dev
단점은 두 스테이지가 같은 프로젝트에 속한다는 것입니다. 서로 다른 API를 튜닝할 때와 비교하여, 같은 API의 스테이지에 대해 IAM 정책을 세밀하게 조정할 수 있는 유연성이 떨어집니다. 이는 다음 설정으로 이어집니다. 각 스테이지를 별도의 API로 만드는 방법입니다.
-
각 스테이지에 대해 별도의 API 생성
각 스테이지에 대해 별도의 API Gateway 프로젝트를 생성합니다. 같은 예를 들어,
prod
스테이지의 엔드포인트는 다음과 같습니다:https://abc12345.execute-api.us-east-1.amazonaws.com/prod
dev
스테이지를 생성하려면, 새로운 API Gateway 프로젝트를 만들고 새로운 프로젝트에dev
스테이지를 추가합니다. 새로운 엔드포인트는 다음과 같습니다:https://xyz67890.execute-api.us-east-1.amazonaws.com/dev
dev
스테이지는 다른 프로젝트에 속하므로 다른 엔드포인트 호스트를 가집니다. 이는 Serverless Framework가 Serverless 프로젝트의 스테이지를 구성할 때 사용하는 접근 방식입니다. 이에 대해 아래에서 자세히 살펴보겠습니다. -
각 스테이지에 대해 별도의 AWS 계정 사용
각 스테이지를 별도의 API로 만드는 것이 IAM 정책을 세밀하게 조정할 수 있는 유연성을 제공하는 것처럼, 한 단계 더 나아가 API 프로젝트를 다른 AWS 계정에 생성할 수도 있습니다. 대부분의 회사는 프로덕션 인프라를 개발 인프라와 같은 계정에 두지 않습니다. 이는 개발자가 실수로 프로덕션 리소스를 수정하거나 삭제하는 경우를 줄이는 데 도움이 됩니다. 여러 AWS 프로필을 사용하여 여러 AWS 계정에 배포하는 방법에 대한 자세한 내용은 Configure Multiple AWS Profiles 챕터에서 다룹니다.
스테이지에 배포하기
Serverless Framework가 스테이지 작업을 어떻게 도와주는지 살펴보겠습니다. 앞서 언급했듯이, 새로운 스테이지는 새로운 API Gateway 프로젝트입니다. 특정 스테이지에 배포하려면 serverless.yml
파일에서 스테이지를 지정할 수 있습니다.
service: service-name
provider:
name: aws
stage: dev
또는 serverless deploy
명령어에 --stage
옵션을 전달하여 스테이지를 지정할 수도 있습니다.
$ serverless deploy --stage dev
Serverless Framework에서 스테이지 변수 사용하기
스테이지에 배포하는 것은 꽤 간단할 수 있지만, 이제 다양한 스테이지에서 작동하도록 환경 변수를 구성하는 방법을 살펴보겠습니다. Serverless 환경 변수 챕터에서 환경 변수 개념을 다뤘습니다. 이를 확장하여 배포하는 스테이지에 따라 변수를 지정해 보겠습니다.
아래 예제 serverless.yml
을 살펴보겠습니다.
service: service-name
custom:
myStage: ${opt:stage, self:provider.stage}
myEnvironment:
MESSAGE:
prod: "This is production environment"
dev: "This is development environment"
provider:
name: aws
stage: dev
environment:
MESSAGE: ${self:custom.myEnvironment.MESSAGE.${self:custom.myStage}}
여기서 몇 가지 일이 벌어지고 있습니다. 먼저 custom.myStage
변수를 ${opt:stage, self:provider.stage}
로 정의했습니다. 이는 Serverless Framework에게 --stage
CLI 옵션이 존재하면 그것을 사용하도록 지시합니다. 만약 옵션이 없다면 provider.stage
에 지정된 기본 스테이지를 사용합니다. 또한 custom.myEnvironment
섹션을 정의했습니다. 이 섹션은 각 스테이지에 대해 정의된 MESSAGE
값을 포함합니다. 마지막으로, 환경 변수 MESSAGE
를 ${self:custom.myEnvironment.MESSAGE.${self:custom.myStage}}
로 설정했습니다. 이는 custom.myStage
에 정의된 현재 스테이지에 따라 self:custom.myEnvironment
의 값을 선택하도록 합니다.
이 형식을 쉽게 확장하여 배포하는 스테이지에 대해 별도의 환경 변수 세트를 만들 수 있습니다.
그리고 Lambda 함수에서 process.env
객체를 통해 MESSAGE
에 접근할 수 있습니다.
export function main(event, context, callback) {
callback(null, { body: process.env.MESSAGE });
}
이 챕터가 여러분의 Serverless 프로젝트에서 스테이지를 설정하는 방법에 대한 빠른 아이디어를 제공하기를 바랍니다.
For help and discussion
Comments on this chapter