중첩 스택을 사용하여 템플릿을 재사용 가능한 조각으로 분할 - AWS CloudFormation

중첩 스택을 사용하여 템플릿을 재사용 가능한 조각으로 분할

인프라가 증가함에 따라 여러 템플릿에서 동일한 리소스 구성을 반복적으로 생성할 수 있습니다. 이러한 중복성을 방지하려면 이러한 공통 구성을 전용 템플릿으로 분리할 수 있습니다. 그런 다음 다른 템플릿의 AWS::CloudFormation::Stack 리소스를 사용하여 이러한 전용 템플릿을 참조하여 중첩 스택을 생성할 수 있습니다.

예를 들어 대부분의 스택에 사용하는 로드 밸런서 구성이 있다고 가정합니다. 동일한 구성을 복사하여 템플릿에 붙여 넣는 대신 로드 밸런서 전용 템플릿을 생성할 수 있습니다. 그런 다음 동일한 로드 밸런서 구성이 필요한 다른 템플릿 내에서 이 템플릿을 참조할 수 있습니다.

중첩 스택에는 다른 중첩 스택이 포함될 수 있으며 아래 다이어그램에서와 같이 스택 계층 구조가 생성됩니다. 루트 스택은 모든 중첩 스택이 궁극적으로 속하는 최상위 스택입니다. 각 중첩 스택에는 직속 상위 스택이 있습니다. 중첩 스택의 첫 레벨의 경우 루트 스택이 상위 스택이기도 합니다.

  • 스택 A는 계층 구조에 있는 다른 모든 중첩 스택의 루트 스택입니다.

  • 스택 B의 경우에는 스택 A가 상위 스택이자 루트 스택입니다.

  • 스택 C의 경우 스택 B가 상위 스택이고 스택 D의 상위 스택은 스택 C입니다.

다른 스택의 일부로 생성된 중첩 스택에는 직속 상위 스택과 최상위 루트 스택이 있습니다.

템플릿 분할 이전 및 이후 예

이 예제에서는 어떻게 큰 CloudFormation 템플릿 하나를 가져와서 중첩 템플릿을 사용하여 더 정형화되고 재사용 가능한 설계로 재구성할 수 있는지 보여줍니다. 처음에 "스택 중첩 전" 템플릿에는 파일 하나에 정의된 모든 리소스가 표시됩니다. 리소스 수가 늘어날수록 이 과정이 복잡해지고 관리하기 어려워질 수 있습니다. '스택 중첩 후' 템플릿에서는 리소스를 더 작은 별도의 템플릿으로 분할합니다. 각 중첩 스택에서는 특정 관련 리소스 세트를 처리하므로 전체 구조가 더 체계적으로 구성되고 유지 관리가 더 쉬워집니다.

스택 중첩 전

스택 중첩 후

AWSTemplateFormatVersion: 2010-09-09 Parameters: InstanceType: Type: String Default: t2.micro Description: The EC2 instance type Environment: Type: String Default: Production Description: The deployment environment Resources: MyEC2Instance: Type: AWS::EC2::Instance Properties: ImageId: ami-1234567890abcdef0 InstanceType: !Ref InstanceType MyS3Bucket: Type: AWS::S3::Bucket
AWSTemplateFormatVersion: 2010-09-09 Resources: MyFirstNestedStack: Type: AWS::CloudFormation::Stack Properties: TemplateURL: https://s3.amazonaws.com/amzn-s3-demo-bucket/first-nested-stack.yaml Parameters: # Pass parameters to the nested stack if needed InstanceType: t3.micro MySecondNestedStack: Type: AWS::CloudFormation::Stack Properties: TemplateURL: https://s3.amazonaws.com/amzn-s3-demo-bucket/second-nested-stack.yaml Parameters: # Pass parameters to the nested stack if needed Environment: Testing DependsOn: MyFirstNestedStack

중첩 스택 아키텍처의 예

이 섹션에서는 중첩 스택을 참조하는 최상위 스택으로 구성된 중첩 스택 아키텍처를 보여줍니다. 중첩 스택은 Node.js Lambda 함수를 배포하고, 최상위 스택에서 파라미터 값을 수신하며, 최상위 스택을 통해 노출된 출력을 반환합니다.

1단계: 로컬 시스템의 중첩 스택에 대한 템플릿 생성

다음 예제에서는 중첩 스택 템플릿의 형식을 보여줍니다.

YAML

AWSTemplateFormatVersion: 2010-09-09 Description: Nested stack template for Lambda function deployment Parameters: MemorySize: Type: Number Default: 128 MinValue: 128 MaxValue: 10240 Description: Lambda function memory allocation (128-10240 MB) Resources: LambdaFunction: Type: AWS::Lambda::Function Properties: FunctionName: !Sub "${AWS::StackName}-Function" Runtime: nodejs18.x Handler: index.handler Role: !GetAtt LambdaExecutionRole.Arn Code: ZipFile: | exports.handler = async (event) => { return { statusCode: 200, body: JSON.stringify('Hello from Lambda!') }; }; MemorySize: !Ref MemorySize LambdaExecutionRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: lambda.amazonaws.com Action: sts:AssumeRole ManagedPolicyArns: - 'arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole' Outputs: LambdaArn: Description: ARN of the created Lambda function Value: !GetAtt LambdaFunction.Arn

2단계: 로컬 시스템의 최상위 스택에 대한 템플릿 생성

다음 예제에서는 최상위 스택 템플릿의 형식과 이전 단계에서 생성한 스택을 참조하는 AWS::CloudFormation::Stack 리소스를 보여줍니다.

YAML

AWSTemplateFormatVersion: 2010-09-09 Description: Top-level stack template that deploys a nested stack Resources: NestedStack: Type: AWS::CloudFormation::Stack Properties: TemplateURL: /path_to_template/nested-template.yaml Parameters: MemorySize: 256 Outputs: NestedStackLambdaArn: Description: ARN of the Lambda function from nested stack Value: !GetAtt NestedStack.Outputs.LambdaArn

3단계: 템플릿 패키징 및 배포

참고

로컬에서 템플릿으로 작업할 때 AWS CLI package 명령을 사용하면 배포를 위한 템플릿을 준비하는 데 도움이 될 수 있습니다. 이는 Amazon S3(TemplateURL 포함)에 대한 로컬 아티팩트 업로드를 자동으로 처리하고 이러한 S3 위치에 대한 업데이트된 참조가 있는 새 템플릿 파일을 생성합니다. 자세한 내용은 AWS CLI를 사용하여 S3 버킷에 로컬 아티팩트 업로드 섹션을 참조하세요.

그런 다음 package 명령을 사용하여 중첩된 템플릿을 Amazon S3 버킷에 업로드할 수 있습니다.

aws cloudformation package \ --s3-bucket amzn-s3-demo-bucket \ --template /path_to_template/top-level-template.yaml \ --output-template-file packaged-template.yaml \ --output json

명령은 --output-template-file에 지정된 경로에서 새 템플릿을 생성합니다. 이는 아래와 같이 TemplateURL 참조를 Amazon S3 위치로 바꿉니다.

결과 템플릿

AWSTemplateFormatVersion: 2010-09-09 Description: Top-level stack template that deploys a nested stack Resources: NestedStack: Type: AWS::CloudFormation::Stack Properties: TemplateURL: https://s3.us-west-2.amazonaws.com/amzn-s3-demo-bucket/8b3bb7aa7abfc6e37e2d06b869484bed.template Parameters: MemorySize: 256 Outputs: NestedStackLambdaArn: Description: ARN of the Lambda function from nested stack Value: Fn::GetAtt: - NestedStack - Outputs.LambdaArn

package 명령을 실행한 후 deploy 명령을 사용하여 처리된 템플릿을 배포할 수 있습니다. IAM 리소스를 포함하는 중첩 스택의 경우 --capabilities 옵션을 포함하여 IAM 기능을 승인해야 합니다.

aws cloudformation deploy \ --template-file packaged-template.yaml \ --stack-name stack-name \ --capabilities CAPABILITY_NAMED_IAM

중첩 스택에서 스택 작업 수행

중첩 스택으로 작업할 때는 작업 중에 신중하게 처리해야 합니다. 스택 업데이트와 같은 특정 스택 작업은 중첩 스택에서 직접 수행하는 것이 아니라 루트 스택에서 시작해야 합니다. 루트 스택을 업데이트하면 템플릿 변경 사항이 있는 중첩 스택만 업데이트됩니다.

추가로 중첩 스택의 존재가 루트 스택의 작업에 영향을 미칠 수 있습니다. 예를 들어 중첩 스택 하나가 UPDATE_ROLLBACK_IN_PROGRESS 상태로 멈춘 경우 루트 스택은 해당 중첩 스택이 롤백을 완료할 때까지 기다렸다가 계속 진행합니다. 업데이트 작업을 진행하기 전에 롤백 시 스택 업데이트를 취소할 수 있는 IAM 권한이 있는지 확인합니다. 자세한 내용은 AWS Identity and Access Management를 사용하여 CloudFormation 액세스 제어 섹션을 참조하세요.

다음 절차를 사용하여 루트 스택과 중첩 스택을 찾습니다.

중첩 스택의 루트 스택을 보려면
  1. AWS Management Console에 로그인하여 https://console.aws.amazon.com/cloudformation에서 AWS CloudFormation 콘솔을 엽니다.

  2. 스택 페이지에서 루트 스택을 확인하고자 하는 중첩 스택의 이름을 선택합니다.

    중첩 스택은 스택 이름 위에 NESTED가 표시됩니다.

  3. 스택 정보 탭에서 개요 섹션의 루트 스택으로 나열된 스택 이름을 선택합니다.

루트 스택에 속한 중첩 스택을 보려면
  1. 중첩 스택을 보려는 루트 스택에서 리소스 탭을 선택합니다.

  2. 유형 열에 AWS::CloudFormation::Stack 유형의 리소스를 찾습니다.