2

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

1 Answer 1

4

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

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

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.