[AWS SAM] 템플릿 계층화(스택 중첩)

9957 단어 samCloudFormationAWS

AWS::Serverless::Application을 사용하여 템플릿 계층화



서비스별로 템플릿 파일을 나누어 다음과 같은 구성을 만듭니다.
src/
  ├─ api-gateway/
  │   ├─ template.yaml  # API Gateway定義、API GatewayからコールされるLambda等の定義
  │   ├─ swagger.yaml
  │   ├─ aaa/function.py # Lambda関数
  │   └─ bbb/function.py # Lambda関数
  
  ├─ iot-core/
  │   ├─ template.yaml  # IoT Coreの定義、デバイス間通信時にコールされるLambda定義等
  │   └─ ccc/function.py # Lambda関数
  
  ├─ cognito/
  │   ├─ template.yaml  # Cognitoのユーザプール定義、認証時にコールされるLambda等の定義
  │   └─ ddd/function.py # Lambda関数
  
  
  ├─ s3/
  │   ├─ template.yaml  # S3のバケット定義、バケット操作時にコールされるLambda等の定義
  │   └─ eee/function.py # Lambda関数
      
  └─ template.yaml  # 各サービスのtemplate.yamlをまとめるためのtemplate.yaml

각 서비스 폴더 아래 template.yaml (api-gateway/template.yaml 등)는 평소와 같이 CloudFormation 또는 SAM 형식에 따라 설명합니다.
src/template.yaml에서 각 서비스 폴더 아래의 template.yaml에 정의 된 리소스를 응용 프로그램 (AWS::Serverless::Application)으로 정의
AWS::Serverless::Application 구문은 공식 문서 참조
src/template.yaml는 다음과 같습니다.

src/template.yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31

Resources:

  CognitoStack:
    Type: AWS::Serverless::Application
    Properties:
      Location: cognito/template.yaml # template.yamlのパス
      Parameters:
        StackName: !Ref AWS::StackName

  ApiGatewayStack:
    Type: AWS::Serverless::Application
    Properties:
      Location: api-gateway/template.yaml
      Parameters:
        StackName: !Ref AWS::StackName
        S3BucketName: !GetAtt S3Stack.Outputs.S3BucketName

  IoTCoreStack:
    Type: AWS::Serverless::Application
    Properties:
      Location: iot-core/template.yaml
      Parameters:
        StackName: !Ref AWS::StackName

  S3Stack:
    Type: AWS::Serverless::Application
    Properties:
      Location: s3/template.yaml
      Parameters:
        StackName: !Ref AWS::StackName

Location에 각 template.yaml의 경로를 지정하십시오.Parameters는 각 template.yaml에 전달할 매개 변수를 지정합니다.
Parameters 로 건네받은 값은 이하와 같이 참조한다
Parameters:
  StackName:
    Type: String

Resources:
  testFunction:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: !Sub '${StackName}_testFunction'
      ...

템플릿 간의 매개 변수 전달



예를 들어 s3/template.yaml에서 생성 된 버킷 이름을 api-gateway/template.yaml에서 참조하려는 경우,s3/template.yaml는 다음과 같이 Outputs를 사용하여 버킷 이름을 출력합니다.

s3/template.yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31

Parameters:
  StackName:
    Type: String

Resources:
  InfoS3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub '${StackName}-test-bucket'
      AccessControl: Private
      PublicAccessBlockConfiguration:
        BlockPublicAcls: True
        BlockPublicPolicy: True
        IgnorePublicAcls: True
        RestrictPublicBuckets: True

Outputs:
  S3BucketName:  # バケット名を出力
    Value: !Ref InfoS3Bucket  # 上記InfoS3Bucketで定義したバケットの名前を出力する

출력 된 값은 src/template.yaml에서 다른 template.yamlParameters로 전달합니다.

src/template.yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31

Resources:
  ...

  ApiGatewayStack:
    Type: AWS::Serverless::Application
    Properties:
      Location: api-gateway/template.yaml
      Parameters:
        StackName: !Ref AWS::StackName
        S3BucketName: !GetAtt S3Stack.Outputs.S3BucketName # s3/template.yamlで出力した値を渡す
  ...

  S3Stack:
    Type: AWS::Serverless::Application
    Properties:
      Location: s3/template.yaml
      Parameters:
        StackName: !Ref AWS::StackName

생성되는 스택



스택을 중첩하여 정의하면 출력 결과는 다음과 같이
template.yaml에 대해 "중첩"된 스택이 생성됩니다.


부모가 된 스택을 삭제하면 중첩 된 모든 스택의 모든 리소스가 삭제됩니다.

좋은 웹페이지 즐겨찾기