aws / serverless-application-model

The AWS Serverless Application Model (AWS SAM) transform is a AWS CloudFormation macro that transforms SAM templates into CloudFormation templates.
https://aws.amazon.com/serverless/sam
Apache License 2.0
9.32k stars 2.38k forks source link

Models Validation doesn't check the implicitly created AWS::Serverless::Api resource #2209

Open stevehogdahl opened 2 years ago

stevehogdahl commented 2 years ago

Description:

The Models Validation doesn't check the implicitly created AWS::Serverless::Api resource. When creating a new model there's no way to set it to the implicitly AWS::Serverless::Api resource without sam validate failing. Models isn't a valid global parameter so it can't be set there. Creating a AWS::ApiGateway::Model resource setting RestApiId to ServerlessRestApi the following validation error is thrown ...the related API does not define any Models. This means the only way to add a Model is to explicitly create the Api resource, add the Models to it, and then set RestApiId on the other resources. This is a pain point for us because we have 75 Function resources in the template that now need to explicitly set RestApiId.

Steps to reproduce:

Account:
  Type: 'AWS::ApiGateway::Model'
  Properties:
    RestApiId: !Ref ServerlessRestApi
    ContentType: application/json
    Name: Account
    Schema:
      $schema: 'http://json-schema.org/draft-04/schema#'
      title: Account
      type: array
      items:
        type: object
        properties:
          name:
            type: string
          status:
            type: string
CreateAccountFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: controllers/accounts.create
      Events:
        CreateAccount:
          Type: Api
          Properties:
            Path: /accounts
            Method: post
            RequestModel:
              Model: Account
              Required: true
              ValidateBody: true
      Role: !GetAtt LambdaRole.Arn

Observed result:

Error: [InvalidResourceException('CreateAccountFunction', 'Event with id [CreateAccount] is invalid. Unable to set RequestModel [CreateAccountsModel] on API method [post] for path [/accounts] because the related API does not define any Models.')] ('CreateAccountFunction', 'Event with id [CreateAccount] is invalid. Unable to set RequestModel [CreateAccountsModel] on API method [post] for path [/accounts] because the related API does not define any Models.')

Expected result:

I would expect the validation to check if any models exist on the implicitly created Api resource.

qingchm commented 2 years ago

Thanks for reporting this in! Please allow us some time to investigate the feasibility of the request! Again thanks for the input!

nirajmchauhan commented 2 years ago

Facing the same issue

thimmareddykovvuri commented 1 year ago

Facing Same Issue, Any update on above request.

GavinZZ commented 11 months ago

Marking this as type/bug as users are having issues with defining API models for implicit API resource generated by SAM Function.

GavinZZ commented 10 months ago

I took a deep dive into this problem. Unfortunately I believe this is expected behaviour and we've clearly documented this behaviour here.

The workaround would have to define an explicit AWS::Serverless::Api resource that specifies the Models property. Explicitly set the RestApiId field. We apologize for any inconvenience. Leaving this issue open as a feature request.