의존성이 있는 서버리스 앱 배포하기
의존성이 있는 서버리스 앱 배포하기
이제 업스트림 서비스에 배포된 리소스를 참조하는 몇 가지 다운스트림 서비스가 생겼습니다. 이 의존성이 앱 배포 방식에 어떤 영향을 미치는지 살펴보겠습니다.
간단히 말하면:
- 앱에 새로운 의존성을 추가하면 모든 서비스를 동시에 배포할 수 없습니다.
- 하지만 이 서비스들이 한 번 배포된 후에는 동시에 배포할 수 있습니다.
첫 배포
리소스 저장소에서 SST를 사용해 CDK 앱을 배포합니다. CDK는 내부적으로 스택 간의 의존성을 추적합니다.
stacks/index.js
파일은 다음과 같습니다.
export default function main(app) {
new DynamoDBStack(app, "dynamodb");
const s3 = new S3Stack(app, "s3");
new CognitoStack(app, "cognito", { bucketArn: s3.bucket.bucketArn });
}
여기서 CDK는 CognitoStack
이 S3Stack
에 의존한다는 것을 알고 있습니다. 따라서 S3Stack
이 먼저 완료될 때까지 기다려야 합니다.
SST는 CDK 앱의 스택을 동시에 배포하면서도 의존성을 존중합니다.
다음으로 API 저장소를 처음 배포할 때는 다음 순서를 따라야 합니다.
- 먼저
notes-api
를 배포합니다. 이렇게 하면dev-ExtApiGatewayRestApiId
와dev-ExtApiGatewayRestApiRootResourceId
값이 내보내집니다. - 그 다음
billing-api
를 배포합니다. 이렇게 하면dev-ExtNotePurchasedTopicArn
값이 내보내집니다. - 마지막으로
notify-job
을 배포합니다.
여기서는 dev
스테이지에 배포한다고 가정합니다.
만약 billing-api
와 notify-job
을 동시에 배포하려고 하면, notify-job
은 다음과 같은 CloudFormation 오류와 함께 실패합니다.
notify-job - No export named dev-ExtNotePurchasedTopicArn found.
이 오류는 serverless.yml
에서 참조한 ARN이 아직 존재하지 않는다는 것을 의미합니다. 이는 아직 해당 ARN을 생성하지 않았기 때문에 당연한 결과입니다!
이후 배포
모든 서비스가 성공적으로 배포되면, 여러분은 이제 모든 서비스를 동시에 배포할 수 있습니다. 이는 참조된 ARN이 이미 생성되었기 때문입니다.
새로운 의존성 추가하기
billing-api
서비스에 새로운 SNS 토픽을 추가하고, notify-job
서비스가 해당 토픽을 구독하도록 하려는 경우를 생각해 보세요. 변경 후 첫 배포에서 모든 서비스를 동시에 배포하면 다시 실패할 것입니다. billing-api
서비스를 먼저 배포한 다음, notify-job
서비스를 배포해야 합니다.
이제 확장된 노트 앱을 배포할 준비가 거의 완료되었습니다. 하지만 배포하기 전에 환경을 설정해 보겠습니다.
CI를 통한 배포
CI를 사용 중이라면 위 내용을 단계별로 배포해야 합니다. Seed를 사용하면 배포 단계 개념을 통해 이를 처리합니다.
API 단계별 배포 관리
API 리포지토리의 의존성 구조는 다음과 같습니다:
notes-api > billing-api > notify-job
자세히 설명하면:
billing-api
서비스는 API Gateway 내보내기를 위해notes-api
서비스에 의존합니다.notify-job
서비스는 SNS Topic 내보내기를 위해billing-api
서비스에 의존합니다.
이것으로 서버리스 앱 구성에 대한 섹션을 마칩니다. 다음으로 환경 설정을 해보겠습니다.
For help and discussion
Comments on this chapter