서버리스에서의 크로스 스택 참조
서버리스에서의 크로스 스택 참조
이전 장에서는 서버리스 애플리케이션을 구성하는 가장 일반적인 패턴을 살펴보았습니다. 이제 서버리스 애플리케이션에서 여러 서비스를 다루는 방법을 알아보겠습니다.
서버리스 프레임워크 서비스는 단일 serverless.yml
파일을 사용해 프로젝트를 정의하는 곳입니다. 그리고 serverless.yml
파일은 서버리스 프레임워크를 통해 CloudFormation 템플릿으로 변환됩니다. 이는 여러 서비스가 있을 때 다른 서비스에서 사용 가능한 리소스를 참조해야 할 수 있음을 의미합니다.
또한 여러분은 AWS CDK를 사용해 AWS 인프라를 정의할 수도 있습니다. 그리고 서버리스 API가 해당 리소스에 연결되도록 해야 합니다.
예를 들어, CDK에서 DynamoDB 테이블을 생성하고 API(서버리스 프레임워크 서비스)가 이를 참조해야 하는 경우가 있습니다. 물론 이를 하드 코딩하고 싶지는 않을 것입니다. 이를 위해 크로스 스택 참조를 사용할 것입니다.
크로스 스택 참조는 하나의 CloudFormation 템플릿이 다른 CloudFormation 템플릿의 리소스를 참조하는 방법입니다.
- 크로스 스택 참조는 이름과 값을 가집니다.
- 크로스 스택 참조는 동일한 리전 내에서만 적용됩니다.
- 이름은 AWS 계정 내 특정 리전에서 고유해야 합니다.
참조는 한 스택이 CloudFormation 내보내기를 생성하고 다른 스택이 이를 가져올 때 생성됩니다. 예를 들어, DynamoDBStack.js
가 DynamoDB 테이블의 이름을 내보내고, notes-api
서비스가 이를 가져옵니다. 참조가 생성되면, 참조하는 스택(notes-api
)을 먼저 제거하지 않고는 DynamoDB 스택을 제거할 수 없습니다.
위의 두 스택 간의 관계는 특정 순서로 배포 및 제거되어야 함을 의미합니다. 이에 대해서는 나중에 살펴보겠습니다.
CDK에서 CloudFormation Export 사용하기
크로스 스택 참조를 생성하려면 먼저 CloudFormation export를 만들어야 합니다.
new CfnOutput(this, "TableName", {
value: table.tableName,
exportName: app.logicalPrefixedName("ExtTableName"),
});
위 코드는 DynamoDBStack.js
에서 가져온 CDK 예제입니다.
여기서 exportName
은 CloudFormation export의 이름입니다. SST에서 제공하는 편의 메서드인 app.logicalPrefixedName
을 사용하여 export 이름에 배포하는 스테이지 이름과 SST 앱 이름을 접두사로 붙입니다. 이렇게 하면 여러 환경에 스택을 배포할 때 export 이름이 고유하게 유지됩니다.
Serverless Framework에서 CloudFormation Export 사용하기
마찬가지로, Serverless Framework에서 CloudFormation export를 생성할 수 있습니다. 아래와 같이 serverless.yml
에 추가하면 됩니다.
resources:
Outputs:
NotePurchasedTopicArn:
Value:
Ref: NotePurchasedTopic
Export:
Name: ${self:custom.stage}-ExtNotePurchasedTopicArn
위 예제는 billing-api
의 serverless.yml
에서 가져온 것입니다. serverless.yml
에 resources:
섹션을 추가하고, Outputs:
를 통해 CloudFormation export를 정의할 수 있습니다.
위 예제에서와 같이 CloudFormation export에 이름을 지정해야 합니다. Name:
속성을 사용하여 이름을 지정하며, 여기서는 환경별로 고유한 이름을 만들기 위해 스테이지 이름(${self:custom.stage}
)을 접두사로 사용했습니다.
${self:custom.stage}
는 serverless.yml
상단에 정의한 커스텀 변수입니다.
# 스테이지는 serverless 명령어 실행 시 전달된 값에 따라 결정됩니다.
# 또는 provider 섹션에 설정된 값으로 대체됩니다.
stage: ${opt:stage, self:provider.stage}
CloudFormation Export 가져오기
CloudFormation Export를 생성한 후, serverless.yml
에서 이를 가져와야 합니다. 이를 위해 Fn::ImportValue
CloudFormation 함수를 사용합니다.
예를 들어, notes-api/serverless.yml
에서 다음과 같이 작성할 수 있습니다.
provider:
environment:
tableName: !ImportValue ${self:custom.sstApp}-ExtTableName
여기서는 DynamoDBStack.js
에서 생성하고 내보낸 DynamoDB 테이블의 이름을 가져옵니다.
크로스 스택 참조의 장점
애플리케이션이 커질수록 서비스 간의 의존성을 추적하기 어려워질 수 있습니다. 크로스 스택 참조는 이 문제를 해결하는 데 도움을 줍니다. 이는 서비스 간에 강력한 연결을 생성합니다. 비교해 보면, 하드 코딩된 값으로 연결된 리소스를 참조하는 경우 애플리케이션이 커질수록 이를 추적하기 어려워집니다.
또 다른 장점은 전체 애플리케이션을 쉽게 재생성할 수 있다는 점입니다(예: 테스트 목적). 이는 애플리케이션의 서비스가 서로 정적으로 연결되어 있지 않기 때문입니다.
다음 장에서는 서비스 간에 코드를 공유하는 방법을 살펴보겠습니다.
For help and discussion
Comments on this chapter