写点什么

使用 AWS Lambda 支持的宏扩展 AWS CloudFormation

  • 2019-10-18
  • 本文字数:2628 字

    阅读完需:约 9 分钟

使用 AWS Lambda 支持的宏扩展 AWS CloudFormation

今天,我非常高兴为大家介绍 AWS CloudFormation 的一个强大新功能,它叫做 Macros。CloudFormation Macros 允许开发人员调用 AWS Lambda 支持的转换函数,从而扩展 CloudFormation 模板的原生句法。它采用与支持流行的无服务器应用程序模型功能所用的相同技术,但转换函数 (transform) 在您自己的账户中运行,使用您自己的 lambda 函数,并且是完全可自定义的。如果您还不熟悉 AWS,请记住 CloudFormation 是一个对基础设施即代码(YAML 或 JSON)的建模和定义绝对关键的工具。它也是所有 AWS 产品的核心组件之一,我们的许多服务都依赖它而存在。


宏的使用有两个主要步骤。首先,我们需要定义宏。当然,为此我们需要使用 CloudFormation 模板。然后,为了在我们的模板中使用宏,我们需要将它添加为整个模板的转换函数,或者直接调用它。在本博文中,宏和转换函数这两个术语基本可以互换。已经准备好了解其工作原理了?

创建 CloudFormation 宏

宏的创建有两个要素:一是定义,二是实现。如要创建宏的定义,我们需要一个类型为 AWS::CloudFormation::Macro 的 CloudFormation 资源,该资源定义了需要使用的 Lamda 函数以及应当调用的宏。


YAML


Type: "AWS::CloudFormation::Macro"Properties:  Description: String  FunctionName: String  LogGroupName: String  LogRoleARN: String  Name: String
复制代码


宏的 Name 必须在整个区域是唯一的,并且通过 FunctionName 引用的 Lambda 函数必须与要创建的宏位于同一区域。您执行宏模板时,将会使该宏对其他模板也同样可用。宏的实现由 Lambda 函数完成。宏可以位于自己的模板中,也可与其他宏组合,但无法在注册宏的模板中使用该宏。Lambda 函数会收到与以下类似的 JSON 负载:


Json


{    "region": "us-east-1",    "accountId": "$ACCOUNT_ID",    "fragment": { ... },    "transformId": "$TRANSFORM_ID",    "params": { ... },    "requestId": "$REQUEST_ID",    "templateParameterValues": { ... }}
复制代码


负载的 fragment 部分包含了整个模板或者模板的相关区段 — 具体取决于如何从调用宏的模板中调用转换函数。区段始终在 JSON 中,即使模板在 YAML 中亦是如此。


Lambda 函数预计将会返回一个简单的 JSON 应答:


Json


{    "requestId": "$REQUEST_ID",    "status": "success",    "fragment": { ... }}
复制代码


requestId 需要输入负载中收到的相同,如果 status 包含除 success(不区分大小写)以外的任何值,则变更集的创建将会失败。然后,fragment 必须包含转换后模板的有效 CloudFormation JSON。即使您的函数未执行任何操作,仍然需要返回它的区段以包含到最终模板中。

使用 CloudFormation 宏


如要使用宏,我们只需使用要求的参数调用Fn::Transform。如果您希望利用宏来对整个模板进行句法分析,则我们可以按照与 SAM: Transform: [Echo] 相同的方式,将其列入模板中的转换函数列表中。在我们执行模板时,通过调用每个宏的制定函数并返回最终模板,转换函数将会被收集到变更集中。


假设我们有一个名为 EchoFunction 的 虚拟 Lambda 函数,它只是记录通过它的数据并返回未加任何修改的区段。我们将宏定义为一种正常的 CloudFormation 资源,与以下类似:


YAML


EchoMacro:  Type: "AWS::CloudFormation::Macro"  Properties:    FunctionName: arn:aws:lambda:us-east-1:1234567:function:EchoFunction  Name: EchoMacro
复制代码


Lambda 函数的代码可能简单如下:


Python


def lambda_handler(event, context):    print(event)    return {        "requestId": event['requestId'],        "status": "success",        "fragment": event["fragment"]    }
复制代码


然后在部署此函数并执行宏模板后,我们可以在任何其他模板的顶层的转换函数中调用宏,与以下类似:


YAML


AWSTemplateFormatVersion: 2010-09-09  Transform: [EchoMacro, AWS::Serverless-2016-10-31] Resources:    FancyTable:      Type: AWS::Serverless::SimpleTable
复制代码


CloudFormation 会首先调用我们定义的 Echo 宏,然后调用 AWS::Serverless 转换函数,从而创建模板的变更集。它将按照列表中的顺序执行转换函数中列举的宏。


此外,我们还可以使用内部函数 Fn::Transform 调用宏,该函数允许我们输入额外的参数。例如:


YAML


AWSTemplateFormatVersion: 2010-09-09Resources:  MyS3Bucket:    Type: 'AWS::S3::Bucket'    Fn::Transform:      Name: EchoMacro      Parameters:        Key: Value
复制代码


内联转换函数将拥有其所有同级节点和下级节点的访问权限。转换函数的处理顺序为由深到浅,这意味着最顶层的转换函数将会最后执行。我知道大多数人都会说:不对,你不能在宏中包含宏 — 但想法不错。


在您执行 CloudFormation 模板时,它将会直接要求您创建一个变更集,并且您可以在部署前预览输出结果。


示例宏

我们正在推出多个参考宏,以帮助开发人员上手,同时我预计许多人也将发布更多的宏。以下四个宏是在此功能发布前,一个小的内部骇客马拉松的优胜作品:


名称描述作者
PyPlate允许您在模板中插入内敛 Python 函数Jay McConnel — 合作伙伴解决方案架构师
ShortHand定义通用 cloudformation 资源的简略句法Steve Engledow — 解决方案构建师
StackMetrics为堆栈添加 Cloudwatch 指标Steve Engledow 和 Jason Gregson — 全球解决方案架构师
String Functions为您的模板添加常用的串函数Jay McConnel — 合作伙伴解决方案架构师


以下是我认为有人可能会感兴趣实现的一些理念:



如果您有任何奇妙的想法,我非常期待您写出来!

现已推出

CloudFormation Macros 从今天开始已在所有支持 AWS Lambda 的 AWS 区域推出。使用 Macros 不会发生额外的 CloudFormation 费用,这意味着您只需承担正常的 AWS Lambda 函数费用。更多信息请参阅文档


这是我最喜爱的 CloudFormation 新功能之一,我非常期待看到客户利用它创造出神奇的东西。它的真正强大之处在于,您可以使用代码来扩展现有的基础设施即代码。这种新功能带来的可能性几乎是无限的。


作者介绍:



Randall Hunt


AWS 全球高级布道师。此前供职于 NASA, SpaceX 及 MongoDB。


本文转载自 AWS 技术博客。


原文链接:


https://amazonaws-china.com/cn/blogs/china/cloudformation-macros/


2019-10-18 08:00757
用户头像

发布了 1947 篇内容, 共 164.5 次阅读, 收获喜欢 81 次。

关注

评论

发布
暂无评论
发现更多内容

DeepSeek将如何改变我们的日常生活和工作?

天津汇柏科技有限公司

AI 人工智能 DeepSeek

轻帆云荣获“智慧商业数字化运营优秀服务商”奖项,AITSM赋能零售新未来

云智慧AIOps社区

ITSM ITSM软件 工单管理 工单系统 工单处理

人工智能产品测试 | 特征的概念:离散与连续

测试人

人工智能

充电桩测试系统(源码+文档+讲解+演示)

深圳亥时科技

人工智能丨测试人必看!MCP协议如何让测试工具“智商”翻倍?

测试人

人工智能

90%企业踩坑的数据管道管理问题,4大技术方案实现效率翻倍!

白鲸开源

开源 技术方案 Apache DolphinScheduler

CST软件如何理解远场的坐标、分量和极化

思茂信息

cst电磁仿真 CST软件 CST Studio Suite

企业AI 智启新底座,共探AI与数智化底座的融合创新路径

用友BIP

数智化 用友BIP 企业AI

AI技术赋能企业财务管理,用友BIP创新五大智能财务场景

用友BIP

AI 数智化 企业财务 用友BIP 财务智能体

巧用输出变量,提升Dolphinscheduler工作流灵活性和可维护性

白鲸开源

开源 大数据任务调度 Apache DolphinScheduler

淘宝天猫宝贝详情优惠券数据采集接口:深入探究与实践

tbapi

淘宝API 淘宝优惠券接口 淘宝商品优惠券接口 天猫优惠券接口

【IoTDB 线上小课 13】包教包会的 IoTDB 安装教程来啦!

Apache IoTDB

深入理解 Bitmap 索引:原理、场景与应用案例

镜舟科技

数据分析 OLAP 分析型数据库 StarRocks Bitmap 索引

BOE(京东方)携前沿显示技术亮相ICDT 2025 “绿色+科技”引领产业持续向新

爱极客侠

物资管理系统(源码+文档+讲解+演示)

深圳亥时科技

蚂蚁集团在加速互联网和金融服务创新上的实践——平台工程解决方案

蚂蚁开源

蚂蚁集团 kusionstack 蚂蚁开源

无刷电机工厂生产管理MES系统解决方案

万界星空科技

无刷电机 mes 制造业工厂 电机行业 电机MES

超 400 人团队律所,如何用 NocoBase 高效管理律师提成?

NocoBase

开源 零代码 客户案例 薪酬绩效管理 律师事务所

AI口语练习APP的接口优化

北京木奇移动技术有限公司

软件外包公司 AI口语练习 AI英语学习

淘宝天猫宝贝详情页面商品评论采集接口全解析

tbapi

淘宝商品评论接口 淘宝API 淘宝评论接口

人工智能丨2025年,测试从业者应如何拥抱智能体(AI Agent)?

测试人

AI Agent赛道:昙花一现还是生态革命?6大咖拆解泡沫与未来

TechubNews

AI Agents 币圈不设防

云报工系统(源码+文档+讲解+演示)

深圳亥时科技

智能制造:关于专精特新的解读

积木链小链

数字化 智能制造

2025大型企业财务数智化峰会·上海站圆满落幕!

用友BIP

数智化 用友BIP AI+财务

启动!南宁城投集团携手用友共建全球领先智能化财务共享平台

用友BIP

AI 企业数智化 用友BIP 财务共享

AI 真的懂你问的问题吗?

Immerse

AI口语练习APP的性能测试

北京木奇移动技术有限公司

软件外包公司 AI口语练习 AI英语学习

烟草业需要用到堡垒机的几个情形简单说明

行云管家

网络安全 数据安全 堡垒机

签约+战略合作!水电五局与用友擘画工程项目管理数智新蓝图

用友BIP

数智化 用友BIP 企业AI 企业管理工程

AI赋能时尚零售功能篇:全渠道全流程商品管理数字化

第七在线

使用 AWS Lambda 支持的宏扩展 AWS CloudFormation_语言 & 开发_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章