Home > database >  AWS SAM - How to override generated resources
AWS SAM - How to override generated resources

Time:12-30

I'm trying to build a REST API with SAM. My YAML file looks like this:

AWSTemplateFormatVersion: "2010-09-09"
Description: >-
  example-rest-api

Transform:
- AWS::Serverless-2016-10-31

Resources:
  allEquipmentsFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: src/handlers/myModel.getAll
      Runtime: nodejs18.x
      Architectures:
      - x86_64
      MemorySize: 128
      Timeout: 100
      Description: example description
      Events:
        ApiEvent:
          Type: Api
          Properties:
            Path: /
            Method: GET

  saveEquipmentFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: src/handlers/myModel.save
      Runtime: nodejs18.x
      Architectures:
      - x86_64
      MemorySize: 128
      Timeout: 100
      Description: example description
      Events:
        Api:
          Type: Api
          Properties:
            Path: /
            Method: POST

  ApplicationResourceGroup:
    Type: AWS::ResourceGroups::Group
    Properties:
      Name:
        Fn::Join:
        - ''
        - - ApplicationInsights-SAM-
          - Ref: AWS::StackName
      ResourceQuery:
        Type: CLOUDFORMATION_STACK_1_0
  ApplicationInsightsMonitoring:
    Type: AWS::ApplicationInsights::Application
    Properties:
      ResourceGroupName:
        Fn::Join:
        - ''
        - - ApplicationInsights-SAM-
          - Ref: AWS::StackName
      AutoConfigurationEnabled: 'true'
    DependsOn: ApplicationResourceGroup
Outputs:
  WebEndpoint:
    Description: API Gateway endpoint URL for Prod stage
    Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/{Stage}"

As I understand it, SAM creates some resources for me in the background. For example:

"ServerlessRestApi": {
      "Type": "AWS::ApiGateway::RestApi"
      ...

How can I override these generated resources? I want to add API Gateway validation model. For this I need to override background generated resources. AWS Resources is not clean enough. What approach should I take if I can't override?

CodePudding user response:

You cannot "override" properties per se, but you can directly create resources if you need greater control.

When you specify an Event: ApiEvent on your function, SAM creates a AWS::ApiGateway::RestApi resource for you. As the docs say, you can reference the RestApi its Logical ID ServerlessRestApi. This is helpful for passing the RestApi to another resource, but not configuring the RestApi itself.

If you need greater control over the Api properties, you should instead explicily create a AWS::Serverless::Api resource. Configure it as required. Then pass the Api reference to your functions event source configuration as the RestApiId.

SAM is a superset of CloudFormation. You can also include AWS::ApiGateway:: resources directly in your SAM template if SAM's abstractions don't fit your use case. This gives you the greatest level of control.

  • Related