의존성이 있는 서버리스 앱 배포하기

이제 업스트림 서비스에 배포된 리소스를 참조하는 몇 가지 다운스트림 서비스가 생겼습니다. 이 의존성이 앱 배포 방식에 어떤 영향을 미치는지 살펴보겠습니다.

간단히 말하면:

  • 앱에 새로운 의존성을 추가하면 모든 서비스를 동시에 배포할 수 없습니다.
  • 하지만 이 서비스들이 한 번 배포된 후에는 동시에 배포할 수 있습니다.

첫 배포

리소스 저장소에서 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는 CognitoStackS3Stack에 의존한다는 것을 알고 있습니다. 따라서 S3Stack이 먼저 완료될 때까지 기다려야 합니다.

SST는 CDK 앱의 스택을 동시에 배포하면서도 의존성을 존중합니다.

다음으로 API 저장소를 처음 배포할 때는 다음 순서를 따라야 합니다.

  • 먼저 notes-api를 배포합니다. 이렇게 하면 dev-ExtApiGatewayRestApiIddev-ExtApiGatewayRestApiRootResourceId 값이 내보내집니다.
  • 그 다음 billing-api를 배포합니다. 이렇게 하면 dev-ExtNotePurchasedTopicArn 값이 내보내집니다.
  • 마지막으로 notify-job을 배포합니다.

여기서는 dev 스테이지에 배포한다고 가정합니다.

만약 billing-apinotify-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 서비스에 의존합니다.

이것으로 서버리스 앱 구성에 대한 섹션을 마칩니다. 다음으로 환경 설정을 해보겠습니다.