CloudFormation에서 스택을 만들려고 하면 "Encountered unsupported property"가 됩니다.

사건



lambda.yml
Resources:
  DemoFunction:
    Type: AWS::Lambda::Function
    Properties:
      FunctionName: demo_func
      Code:
        ZipFile: |
          import json
          def lambda_handler(event, context):
              jsn_str = json.dumps(event, ensure_ascii=False)
              print(jsn_str)
      Handler: lambda_function.lambda_handler
      MemorySize: 128
      Timeout: 30
      Role: !Sub arn:aws:iam::${AWS::AccountId}:role/Lambda_Basic_Role
      Runtime: python3.7
      Events:
        Stream:
          Type: DynamoDB
          Properties:
            Stream:
              Fn::ImportValue: demoTableStream
            StartingPosition: LATEST
            BatchSize: 1

AWS CLI에서 create-stack 명령을 사용하여 위의 템플릿 lambda.yml를 기반으로 DynamoDB Stream을 트리거하는 Lambda Function을 만들려고했습니다.
$ aws cloudformation create-stack \
    --stack-name demo-lambda \
    --template-body file://lambda.yml

그러나 아래와 같이 Encountered unsupported property Events 라는 에러가 되어 스택의 작성이 실패한다.



해결



CloudFormation 템플릿에서는 Type: AWS::Lambda::Function 에서는 Events 라는 속성을 사용할 수 없었습니다. Lambda의 DynamoDB Stream 트리거를 템플릿으로 정의하는 경우는 아래와 같이 AWS::Lambda::EventSourceMapping 리소스를 사용할 필요가 있었다.

lambda.yml
Resources:
  DemoFunction:
    Type: AWS::Lambda::Function
    Properties:
      FunctionName: demo_func
      Code:
        ZipFile: |
          import json
          def lambda_handler(event, context):
              jsn_str = json.dumps(event, ensure_ascii=False)
              print(jsn_str)
      Handler: index.lambda_handler
      MemorySize: 128
      Timeout: 30
      Role: !Sub arn:aws:iam::${AWS::AccountId}:role/Lambda_Basic_Role
      Runtime: python3.7

  EventMapping:
    Type: AWS::Lambda::EventSourceMapping
    Properties:
      EventSourceArn: !ImportValue demoTableStream
      FunctionName: !Ref DemoFunction
      StartingPosition: LATEST



결론



AWS SAM의 yml 템플릿을 일반 CloudFormation 템플릿에 유용했기 때문에 사용할 수 없는 속성이 혼란스러웠던 것이 근본 원인이었다.

이상

좋은 웹페이지 즐겨찾기