AWS Serverless-我可以在Serverless.yml文件中配置我的提供程序或lambda函数,以便在同一y



我在弄清楚这一点时遇到了一点麻烦。我想在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已经为您创建了它。

最新更新