我正在使用无服务器和 AWS。
我试图仅在生产和登台环境中运行我的函数 main ,这可能吗?
我尝试添加启用(请参阅:https://stackoverflow.com/a/68646306/5426690),但我得到“无法识别的属性‘启用’
functions:
main:
handler: dist/main.handler
events:
- http:
enabled: false
method: ANY
path: /
authorizer:
type: COGNITO_USER_POOLS
[....]
- http:
enabled: false
path: '{proxy+}'
method: ANY
authorizer:
type: COGNITO_USER_POOLS
[....]
要在生产和登台等特定环境中运行无服务器功能,您不能直接使用事件配置中的
enabled
属性,因为无服务器框架无法识别它。相反,您应该根据无服务器配置中的环境条件来管理功能的部署,通常使用环境变量或自定义变量。
这里有一个基于stage实现条件功能部署的方法:
使用环境变量:使用环境变量检查当前阶段并有条件地包含事件。
Serverless 环境语法:使用 Serverless Framework 对变量和条件的支持来控制是否添加事件。
以下是如何调整
serverless.yml
以根据部署阶段有条件地设置事件的示例:
service: conditional-function
provider:
name: aws
runtime: nodejs12.x
stage: ${opt:stage, 'dev'} # Default to 'dev' if no stage is provided
functions:
main:
handler: dist/main.handler
events: ${self:custom.events.${self:provider.stage}, []}
custom:
events:
production:
- http:
method: ANY
path: /
authorizer:
type: COGNITO_USER_POOLS
# additional settings...
- http:
path: '{proxy+}'
method: ANY
authorizer:
type: COGNITO_USER_POOLS
# additional settings...
staging:
- http:
method: ANY
path: /
authorizer:
type: COGNITO_USER_POOLS
# additional settings...
- http:
path: '{proxy+}'
method: ANY
authorizer:
type: COGNITO_USER_POOLS
# additional settings...
在此设置中:
events
函数的main
属性会根据当前阶段从custom.events
对象动态加载。production
和 staging
,它加载定义的 HTTP 事件。对于其他阶段,例如 dev
,它默认为空数组 []
,这意味着不会创建任何事件。--stage
选项设置阶段,例如 serverless deploy --stage production
。此方法使您可以灵活地定义每个环境中可用的事件,并且它可以干净地集成到无服务器配置框架中,而无需在应用程序代码中使用外部脚本或条件逻辑。