我在弄清楚这一点时遇到了一点麻烦。我想在serverless.yml中定义一个API网关资源,然后我用http事件创建的任何lamdba函数都将使用该API资源。
我这样做的原因是,我有单独定义的服务器服务,我想将其分组在一个API下,但在我的主要API中,包括与我的应用程序数据交互的lambda函数。虽然这些服务将在应用程序中使用,但这些服务执行几种不同类型的操作,将它们分开是有意义的。
我的serverless.yml非常直接,但每次部署它时,都会创建2个API。一个是空白的,是我在资源下定义的,第二个是AWS因为我的lamdba函数而创建的。
# NOTE: update this with your service name
frameworkVersion: '^2.28.7'
service: web-api
# Create an optimized package for our functions
package:
individually: true
plugins:
- serverless-bundle # Package our functions with Webpack
- serverless-offline
custom:
stage: ${opt:stage, self:provider.stage}
provider:
name: aws
runtime: nodejs12.x
stage: ${opt:stage, 'dev'}
region: ${opt:region, 'us-east-2'}
apiGateway:
restApiId: xxxxxxxxxx # <--- there is where I am having trouble
restApiRootResourceId: xxxxxxxxxx # <--- there is where I am having trouble
environment:
VERSION: 'v1'
functions:
getAbout:
handler: src/api/about/get.main
events:
- http:
path: /about
method: get
cors: true
resources:
Resources:
WebApiGW:
Type: AWS::ApiGateway::RestApi
Properties:
Name: '${self:provider.stage}-${self:service}'
Outputs:
apiGatewayRestApiId:
Value:
Ref: WebApiGW
Export:
Name: WebApiGateway-restApiId
apiGatewayRestApiRootResourceId:
Value:
Fn::GetAtt:
- WebApiGW
- RootResourceId
Export:
Name: WebApiGateway-rootResourceId
从Serverless Framework的角度来看,不可能引用Resources
部分中的动态值,因为它们仍有待生成。provider
部分将首先加载,以定义如何创建其他资源。这就是为什么您只能在provider
中设置静态值或从环境变量加载的值。
默认情况下,如果未为provider.apiGateway.restApiId
设置值,则无服务器框架将为您生成一个新的API。
为了解决您描述的问题,您需要首先在不同的堆栈中生成一个API网关,并在serverless.yaml
中使用该堆栈生成的ID。
在Serverless Framework文档中有一个很好的演练,展示了如何将API分解为小模块(或您所说的组(的示例。
在GitHub:
- https://github.com/serverless/serverless/blob/master/docs/providers/aws/events/apigateway.md#share-api网关和api资源
或者在网站上:
- https://www.serverless.com/framework/docs/providers/aws/events/apigateway/#share-api网关和api资源
他们创建一个serverless-base.yaml
来定义一个API网关并导出IDS,然后定义两个服务,serverless-a.yaml
用于服务a,serverless-b.yaml
用于服务B,在那里他们将使用serverless-base.yaml
生成的API网关。
您应该尝试添加api资源,并在下面提到的函数中使用它们。
绑定api资源的示例
我不确定我们是否需要将API网关放在资源下,因为事件http已经为您创建了它。