You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在CloudFormation中捕获Lambda返回值并用作条件变量?

在CloudFormation中捕获Lambda函数的返回值并使用

要在CloudFormation模板中捕获Lambda的返回JSON并提取值用作条件变量,你需要通过**自定义资源(Custom Resource)**触发Lambda调用,而非仅定义Lambda函数。具体操作步骤如下:

1. 添加自定义资源调用Lambda

在模板中新增Custom::类型的资源,关联你已定义的CheckEc2ConfigsLambda函数,让CloudFormation在栈执行流程中主动调用该Lambda:

CheckEc2ConfigsCustomResource:
  Type: Custom::CheckEc2Configs
  Properties:
    ServiceToken: !GetAtt CheckEc2ConfigsLambda.Arn
    # 可按需传递Lambda所需的输入参数,比如:
    # TargetRegion: !Ref AWS::Region

2. 提取Lambda返回的JSON字段

Lambda返回的JSON会被CloudFormation解析为自定义资源的属性,你可以通过!GetAtt提取具体字段。假设你的Lambda返回的JSON结构如下:

{
  "hasEc2Instances": true,
  "instanceCount": 2
}

则在模板中提取值的写法为:

# 提取是否存在EC2实例的布尔值
HasEc2Instances: !GetAtt CheckEc2ConfigsCustomResource.hasEc2Instances

# 提取EC2实例数量
InstanceCount: !GetAtt CheckEc2ConfigsCustomResource.instanceCount

3. 将提取的值用作条件变量

在模板的Conditions部分,用提取的值定义判断条件,后续资源可根据该条件决定是否创建:

Conditions:
  SkipResourceProvision: !Equals [!GetAtt CheckEc2ConfigsCustomResource.hasEc2Instances, false]

# 示例:仅当存在EC2实例时才创建SNS主题
ConditionalSnsTopic:
  Type: AWS::SNS::Topic
  Condition: SkipResourceProvision
  Properties:
    TopicName: !Sub "ec2-monitor-topic-${AWS::Region}"

关键注意事项

  • Lambda函数的返回格式必须符合CloudFormation自定义资源规范:返回的JSON需包含Status(取值为SUCCESS或FAILED)、Data(存储你要传递的自定义结果)和PhysicalResourceId字段。示例Lambda handler返回结构:
    def lambda_handler(event, context):
        # 执行EC2配置检查逻辑
        check_result = {
            "hasEc2Instances": True,
            "instanceCount": 2
        }
        return {
            "Status": "SUCCESS",
            "Data": check_result,
            "PhysicalResourceId": context.log_stream_name
        }
    
  • 若Lambda执行失败,需返回Status: FAILED并附带Reason字段,CloudFormation会将栈标记为执行失败。

内容的提问来源于stack exchange,提问作者Ranyk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 07:54:56