aws cli 命令输出作为 cloudformation 模板中的值

问题描述 投票:0回答:2

我有一个独立的 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命令作为值

amazon-web-services aws-cloudformation serverless aws-lambda-layers
2个回答
4
投票

这是不可能的,因为您无法在 CloudFormation 模板中计算此类表达式。

最简单的解决方案是将已计算的表达式作为参数传递。

或者,如果您必须使用 CloudFormation 解决方案,则可以利用 CloudFormation 宏来调用执行自定义代码的 lambda 函数(在这种情况下,代码将具有与 AWS CLI 命令等效的开发工具包)。


有关 CloudFormation 宏的更多信息: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-macros.html

宏示例:https://stackoverflow.com/a/70475459/3390419


0
投票

看起来这应该可以使用

AWSUtility::CloudFormation::CommandRunner
实现,如 readmeaws 知识中心中所述。

来自文档

AWSUtility::CloudFormation::CommandRunner
资源允许用户在任何 CloudFormation 堆栈中运行 Bash 命令。

这允许无限自定义,例如执行 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

(我的重点)

© www.soinside.com 2019 - 2024. All rights reserved.