我有一个独立的 lambda 层,使用下面的 CLI 命令检索 arn。
aws lambda list-layer-versions --layer-name my-custom-lambda-layer --region us-east-1 --query 'LayerVersions[0].LayerVersionArn'
如何将此输出引用到我的云形成模板,如下所示,
Resources:
Parameters:
MYLAYERARN: $(aws lambda list-layer-versions --layer-name my-custom-lambda-layer --region us-east-1 --query 'LayerVersions[0].LayerVersionArn')
或者直接在我的任何 lambda 函数中使用它,如下所示,
Resources:
MyLambdaFuntion:
handler: Hello.lambda_handler
timeout: 60
memorySize: 256
layers:
- $(aws lambda list-layer-versions --layer-name my-custom-lambda-layer --region us-east-1 --query 'LayerVersions[0].LayerVersionArn')
当前不是执行AWS CLI命令,而是将CLI命令作为值
这是不可能的,因为您无法在 CloudFormation 模板中计算此类表达式。
最简单的解决方案是将已计算的表达式作为参数传递。
或者,如果您必须使用 CloudFormation 解决方案,则可以利用 CloudFormation 宏来调用执行自定义代码的 lambda 函数(在这种情况下,代码将具有与 AWS CLI 命令等效的开发工具包)。
有关 CloudFormation 宏的更多信息: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-macros.html
看起来这应该可以使用
AWSUtility::CloudFormation::CommandRunner
实现,如 readme 和 aws 知识中心中所述。
来自文档:
资源允许用户在任何 CloudFormation 堆栈中运行 Bash 命令。AWSUtility::CloudFormation::CommandRunner
这允许无限自定义,例如执行 AWS CLI/API 调用、[...] 以及几乎可以在 EC2 实例上使用 shell 完成的任何操作。
以及来自 docs 的简短示例:
使用命令写入保留文件
的任何输出都可以通过使用/command-output.txt
!Fn::GetAtt Command.Output
在模板中的anywhere进行引用,如下所示,其中是Command
资源的逻辑名称。AWSUtility::CloudFormation::CommandRunner
Resources: MyCommand: Type: 'AWSUtility::CloudFormation::CommandRunner' Properties: Command: aws s3 ls | sed -n 1p | cut -d " " -f3 > /command-output.txt # [...] Outputs: Output: Description: The output of the CommandRunner. Value: !GetAtt MyCommand.Output
(我的重点)