如何用yq为AWS Serverless函数批量设置对应Handler环境变量
问题描述
原始YAML资源定义:
myFunction: Type: AWS::Serverless::Function Properties: FunctionName: myFunction Handler: myFunction.lambda_handler myOtherFunction: Type: AWS::Serverless::Function Properties: FunctionName: myOtherFunction Handler: myOtherFunction.lambda_handler
需求:通过yq命令,为所有Type为AWS::Serverless::Function的资源,在其Properties下新增Environment.Variables.HANDLER属性,值设为该资源自身Properties.Handler的内容。
当前使用的命令:
yq '(.Resources.[] | select(.Type=="AWS::Serverless::Function") | .Properties.Environment.Variables.HANDLER) += (.Resources.[].Properties.Handler)' test.yaml
执行后错误结果:
myFunction: Type: AWS::Serverless::Function Properties: FunctionName: myFunction Handler: myFunction.lambda_handler Environment: Variables: HANDLER: myOtherFunction.lambda_handler # 此处取值错误 myOtherFunction: Type: AWS::Serverless::Function Properties: FunctionName: myOtherFunction Handler: myOtherFunction.lambda_handler Environment: Variables: HANDLER: myOtherFunction.lambda_handler
问题:所有目标资源的HANDLER变量都被设置为最后一个资源的Handler值,如何修改命令让每个资源的HANDLER对应自身的Handler值?
解决方案
你的命令错误原因是:(.Resources.[].Properties.Handler)会遍历所有资源的Handler值,最终取到的是最后一个资源的结果,导致所有目标资源都被赋值为该值。
正确的命令需要在单个资源的上下文中引用自身的Handler,无需再次遍历整个Resources集合,修改后的命令如下:
yq '(.Resources.[] | select(.Type=="AWS::Serverless::Function")) |= (.Properties.Environment.Variables.HANDLER = .Properties.Handler)' test.yaml
命令说明:
(.Resources.[] | select(.Type=="AWS::Serverless::Function")):筛选出所有类型匹配的Lambda资源|=:对每个筛选出的资源执行后续的赋值操作(保持单个资源的上下文).Properties.Environment.Variables.HANDLER = .Properties.Handler:在当前资源的上下文里,将自身的Handler值赋值给新增的HANDLER环境变量
执行后正确结果:
myFunction: Type: AWS::Serverless::Function Properties: FunctionName: myFunction Handler: myFunction.lambda_handler Environment: Variables: HANDLER: myFunction.lambda_handler myOtherFunction: Type: AWS::Serverless::Function Properties: FunctionName: myOtherFunction Handler: myOtherFunction.lambda_handler Environment: Variables: HANDLER: myOtherFunction.lambda_handler
内容的提问来源于stack exchange,提问作者q_kim
相关产品推荐
相关产品推荐

