Home > Software design >  AWS Cloudformation Lambda API Gateway V2: Unable to deploy API because no routes exist in this API
AWS Cloudformation Lambda API Gateway V2: Unable to deploy API because no routes exist in this API

Time:10-05

I'm trying to create a API Gateway HTTP API Lambda integration using CloudFormation, but I'm stuck on this error:

Unable to deploy API because no routes exist in this API (Service: AmazonApiGatewayV2; Status Code: 400; Error Code: BadRequestException; Request ID: f606986f-d3e6-4dfd-bc20-77011b15a3f9; Proxy: null)

Here's my CloudFormation template:

AWSTemplateFormatVersion: 2010-09-09

Resources:

  LambdaRole:
    Type: AWS::IAM::Role
    Properties:
      Policies:
        - PolicyName: LambdaPolicy
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Action:
                  - 'logs:CreateLogGroup'
                  - 'logs:CreateLogStream'
                  - 'logs:PutLogEvents'
                Resource:
                  - 'arn:aws:logs:*:*:*'
                Effect: Allow
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Action:
              - sts:AssumeRole
            Effect: Allow
            Principal:
              Service:
                - lambda.amazonaws.com

  Lambda:
    Type: AWS::Lambda::Function
    Properties:
      FunctionName: 'getFruit'
      Role: !GetAtt LambdaRole.Arn
      Handler: index.handler
      Runtime: nodejs16.x
      MemorySize: 128
      Code:
        ZipFile: |
          exports.handler = async (event) => {
            const response = {
              body: JSON.stringify([
                { id: 1, name: 'banana', price: 1 },
                { id: 2, name: 'pineapple', price: 2 },
              ]),
              statusCode: 200
            }
            return response
          }

  LambdaInvokePermission:
    Type: AWS::Lambda::Permission
    Properties:
      FunctionName: !Ref Lambda
      Action: "lambda:InvokeFunction"
      Principal: apigateway.amazonaws.com

  LambdaIntegration:
    Type: AWS::ApiGatewayV2::Integration
    Properties:
      ApiId: !Ref MyApiGateway
      Description: Lambda proxy integration
      IntegrationType: AWS_PROXY
      IntegrationMethod: POST
      PayloadFormatVersion: "2.0"
      IntegrationUri: !Sub 'arn:${AWS::Partition}:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${Lambda.Arn}/invocations'

  MyApiGateway:
    Type: AWS::ApiGatewayV2::Api
    Properties:
      Name: "MyApiGateway"
      ProtocolType: "HTTP"

  MyApiGatewayStage:
    Type: AWS::ApiGatewayV2::Stage
    Properties:
      AutoDeploy: true
      DeploymentId: !Ref MyApiGatewayDeployment
      StageName: '$default'
      ApiId: !Ref MyApiGateway
  
  MyApiGatewayDeployment:
    Type: AWS::ApiGatewayV2::Deployment
    Properties:
      ApiId: !Ref MyApiGateway

  MyApiRoute:
    Type: AWS::ApiGatewayV2::Route
    Properties:
      ApiId: !Ref MyApiGateway
      RouteKey: "GET /"
      AuthorizationType: NONE
      Target: !Join
        - /
        - - integrations
          - !Ref LambdaIntegration

CodePudding user response:

Try adding a DependsOn properties to the deployment for the routes you create.

  MyApiGatewayDeployment:
    Type: AWS::ApiGatewayV2::Deployment
    DependsOn:
      - MyApiRoute
    Properties:
      ApiId: !Ref MyApiGateway

  • Related