首页 > 解决方案 > serverless.yml 未部署到正确的 api 网关

问题描述

我有一组部署到预先创建的 API 网关的无服务器功能。api 网关在 provider 选项下指定,在以下文件中定义:

service: gargoyle
useDotenv: true

plugins:
  - serverless-plugin-typescript
  - serverless-offline

provider:
  name: aws
  runtime: nodejs12.x
  lambdaHashingVersion: '20201221'

  stage: ${opt:stage, 'development'}
  region: ${opt:region, 'us-east-1'}

  environment:
    NODE_ENV: ${opt:stage, 'development'}
    TOKEN_KEY_ALGORITHM: ${env:TOKEN_KEY_ALGORITHM}
    TOKEN_EXPIRES_IN: ${env:TOKEN_EXPIRES_IN}
    SLITHE_HOST: ${env:SLITHE_HOST}
    CORS: ${env:CORS}
    RECAPTCHA_SECRET: ${env:RECAPTCHA_SECRET}
    LOG_LEVEL: ${env:LOG_LEVEL}
    PRE_LOGGED_FLOW_ENABLED: ${env:PRE_LOGGED_FLOW_ENABLED}
    SLITHE_SECURE_HOST: ${env:SLITHE_SECURE_HOST}

  iamRoleStatements:
    - Action:
        - 'secretsmanager:GetSecretValue'
        - 'lambda:InvokeFunction'
        - 'ec2:CreateNetworkInterface'
        - 'ec2:DescribeNetworkInterfaces'
        - 'ec2:DetachNetworkInterface'
        - 'ec2:DeleteNetworkInterface'
      Effect: 'Allow'
      Resource: '*'

  vpc:
    securityGroupIds:
      - ${env:SG_ID_A}
    subnetIds:
      - ${env:SUBNET_A}
      - ${env:SUBNET_B}

  apiGateway:
    restApiId: ${env:REST_API_ID}
    restApiRootResourceId: ${env:REST_API_ROOT_ID}
    restApiResources:
      api: ${env:REST_API_PATH_ID}

package:
  exclude:
    - __mocks__/**/*.*
    - __tests__/**/*.*
    - scripts/**/*.*
    - src/**/*.js.map
    - .*
    - '*.js'
    - '*.md'
    - '*.ts'
    - '*.yml'
    - stryker.conf.json
    - tsconfig.json
  excludeDevDependencies: true

functions:
  accessCode:
    handler: src/functions/access-code/index.handler
    timeout: 10
    events:
      - http:
          path: api/security/access-code
          method: post
          connectionType: vpc-link
          connectionId: ${env:VPC_LINK_ID}
          cors: true
  deleteRecipient:
    handler: src/functions/delete-recipient/index.handler
    timeout: 10
    events:
      - http:
          path: api/security/delete-recipient
          method: post
          cors: true
  decrypt:
    handler: src/functions/decrypt/index.handler
    timeout: 10
    events:
      - http:
          path: api/security/decrypt
          method: post
          connectionType: vpc-link
          connectionId: ${env:VPC_LINK_ID}
          cors: true
  auth:
    handler: src/functions/auth/index.handler
    events:
      - http:
          path: api/security/auth
          method: post
          connectionType: vpc-link
          connectionId: ${env:VPC_LINK_ID}
          cors: true

该项目始终按照预期的方式工作,并使用 id === REST_API_ID 部署到 api 网关,直到意外部署时没有 api 网关规范,这导致创建了一个新的 api 网关。

新的 api 网关是意外创建的,因此被删除。但是在创建之后,每次进行新部署时,无服务器都会向我返回一条成功消息,说明我的函数已正确部署,并向我显示每个函数的 url。

从 api 网关部署返回的 URL

问题是它显示了意外创建(和删除)的 api gateway 的 url,在我的 api gateway 的 api 中找不到它。

我的部署管道也不再更新我原来的rest api。

有人知道如何让我的无服务器管道再次部署到预期的 api 网关吗?

标签: amazon-web-servicesserverless-framework

解决方案


推荐阅读