

# 중첩 스택을 사용하여 템플릿을 재사용 가능한 조각으로 분할
<a name="using-cfn-nested-stacks"></a>

인프라가 증가함에 따라 여러 템플릿에서 동일한 리소스 구성을 반복적으로 생성할 수 있습니다. 이러한 중복성을 방지하려면 이러한 공통 구성을 전용 템플릿으로 분리할 수 있습니다. 그런 다음 다른 템플릿의 [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html) 리소스를 사용하여 이러한 전용 템플릿을 참조하여 중첩 스택을 생성할 수 있습니다.

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

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

![\[다른 스택의 일부로 생성된 중첩 스택에는 직속 상위 스택과 최상위 루트 스택이 있습니다.\]](http://docs.aws.amazon.com/ko_kr/AWSCloudFormation/latest/UserGuide/images/cfn-console-nested-stacks.png)


**Topics**
+ [템플릿 분할 이전 및 이후 예](#create-nested-stack-template)
+ [중첩 스택 아키텍처의 예](#nested-stack-examples)
+ [중첩 스택에서 스택 작업 수행](#perform-stack-operations-on-nested-stacks)
+ [관련 정보](#nested-stacks-related-information)

## 템플릿 분할 이전 및 이후 예
<a name="create-nested-stack-template"></a>

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


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

## 중첩 스택 아키텍처의 예
<a name="nested-stack-examples"></a>

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

**Topics**
+ [1단계: 로컬 시스템의 중첩 스택에 대한 템플릿 생성](#create-a-nested-stack-template)
+ [2단계: 로컬 시스템의 최상위 스택에 대한 템플릿 생성](#create-a-nested-stack-parent-template)
+ [3단계: 템플릿 패키징 및 배포](#create-a-nested-stack-parent-template)

### 1단계: 로컬 시스템의 중첩 스택에 대한 템플릿 생성
<a name="create-a-nested-stack-template"></a>

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

#### YAML
<a name="nested-stack-child-example.yaml"></a>

```
 1. AWSTemplateFormatVersion: 2010-09-09
 2. Description: Nested stack template for Lambda function deployment
 3. Parameters:
 4.   MemorySize:
 5.     Type: Number
 6.     Default: 128
 7.     MinValue: 128
 8.     MaxValue: 10240
 9.     Description: Lambda function memory allocation (128-10240 MB)
10. Resources:
11.   LambdaFunction:
12.     Type: AWS::Lambda::Function
13.     Properties:
14.       FunctionName: !Sub "${AWS::StackName}-Function"
15.       Runtime: nodejs18.x
16.       Handler: index.handler
17.       Role: !GetAtt LambdaExecutionRole.Arn
18.       Code:
19.         ZipFile: |
20.           exports.handler = async (event) => {
21.             return {
22.               statusCode: 200,
23.               body: JSON.stringify('Hello from Lambda!')
24.             };
25.           };
26.       MemorySize: !Ref MemorySize
27.   LambdaExecutionRole:
28.     Type: AWS::IAM::Role
29.     Properties:
30.       AssumeRolePolicyDocument:
31.         Version: '2012-10-17'
32.         Statement:
33.           - Effect: Allow
34.             Principal:
35.               Service: lambda.amazonaws.com
36.             Action: sts:AssumeRole
37.       ManagedPolicyArns:
38.         - 'arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole'
39. Outputs:
40.   LambdaArn:
41.     Description: ARN of the created Lambda function
42.     Value: !GetAtt LambdaFunction.Arn
```

### 2단계: 로컬 시스템의 최상위 스택에 대한 템플릿 생성
<a name="create-a-nested-stack-parent-template"></a>

다음 예제에서는 최상위 스택 템플릿의 형식과 이전 단계에서 생성한 스택을 참조하는 [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html) 리소스를 보여줍니다.

#### YAML
<a name="nested-stack-parent-example.yaml"></a>

```
 1. AWSTemplateFormatVersion: 2010-09-09
 2. Description: Top-level stack template that deploys a nested stack
 3. Resources:
 4.   NestedStack:
 5.     Type: AWS::CloudFormation::Stack
 6.     Properties:
 7.       TemplateURL: /path_to_template/nested-template.yaml
 8.       Parameters:
 9.         MemorySize: 256
10. Outputs:
11.   NestedStackLambdaArn:
12.     Description: ARN of the Lambda function from nested stack
13.     Value: !GetAtt NestedStack.Outputs.LambdaArn
```

### 3단계: 템플릿 패키징 및 배포
<a name="create-a-nested-stack-parent-template"></a>

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

그런 다음 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/package.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/package.html) 명령을 사용하여 중첩된 템플릿을 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** 명령을 실행한 후 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/deploy/](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/deploy/) 명령을 사용하여 처리된 템플릿을 배포할 수 있습니다. IAM 리소스를 포함하는 중첩 스택의 경우 `--capabilities` 옵션을 포함하여 IAM 기능을 승인해야 합니다.

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

## 중첩 스택에서 스택 작업 수행
<a name="perform-stack-operations-on-nested-stacks"></a>

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

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

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

**중첩 스택의 루트 스택을 보려면**

1. AWS Management Console에 로그인하여 [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)에서 CloudFormation 콘솔을 엽니다.

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

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

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

**루트 스택에 속한 중첩 스택을 보려면**

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

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

## 관련 정보
<a name="nested-stacks-related-information"></a>
+ [기존 스택 중첩](resource-import-nested-stacks.md)
+ [스택 리소스의 업데이트 동작 이해](using-cfn-updating-stacks-update-behaviors.md)
+ [실패한 중첩 스택 업데이트에서 계속 롤백](using-cfn-updating-stacks-continueupdaterollback.md#nested-stacks)
+ [중첩 스택 롤백 실패](troubleshooting.md#troubleshooting-errors-nested-stacks-are-stuck)