写点什么

使用 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:00741
用户头像

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

关注

评论

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

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

镜舟科技

数据处理 金融 greenplum 湖仓一体 镜舟数据库

前沿论文分享 | 京东零售技术团队5篇论文入选WWW 2025

京东零售技术

基于YOLOv8的火灾识别项目|完整源码数据集+PyQt5界面+完整训练流程+开箱即用!

申公豹

yolov8

2025全球人形机器人领域深度报告:人形机器人、具身智能技术、商业化壁垒、产业链公司及投资分析

机器人头条

科技 大模型 人形机器人 具身智能

签约快讯|天润融通签约台铃电动车

天润融通

Apache Doris + MCP:Agent 时代的实时数据分析底座

SelectDB

人工智能 大数据 实时数仓 apache doris MCP

记一次悲观锁重试到达上限报错分析

TiDB 社区干货传送门

6.x 实践 OLTP 场景实践

新闻速递|Altair 与佐治亚理工学院签署合作备忘录,携手推动航空航天领域创新

Altair RapidMiner

人工智能 AI 数字孪生 CAE 航空航天

【华为云MySQL技术专栏】MySQL8.0 InnoDB ReadView的原理及性能优化

华为云开发者联盟

,华为云

SQL Server 2022新功能:将数据库备份到S3兼容的对象存储

电子尖叫食人鱼

数据库 sql

重磅!支持鸿蒙!腾讯视频ovCompose跨平台框架发布

最新动态

Amazon Bedrock 助力 SolveX.AI 构建智能解题 Agent,打造头部教育科技应用

亚马逊云科技 (Amazon Web Services)

内网穿透/DDNS软件怎么选?贝锐花生壳各方面表现最优秀!

科技热闻

议程一览 | KubeCon China 2025 华为云精彩前瞻

华为云原生团队

云计算 容器 云原生

这款AI自动生成播客工具,必须收藏!

Immerse

总决赛定档!“天翼云息壤杯”高校AI大赛巅峰之战即将打响!

天翼云开发者社区

人工智能 AI大赛 天翼云

小鹏,用AI“赌”明天

趣解商业

华为 汽车 小鹏汽车

MES系统如何解决电机制造业自动化生产管理?

万界星空科技

mes 万界星空科技mes 制造业工厂 电机行业 电机MES

谷歌云代理商 | 游戏行业专属方案:谷歌云实时多人游戏服务器架构

Cloud Ace 云一

高性能且低成本的 Goroutine 池库-Ants

天翼云开发者社区

开发 Ants

大数据-06-Hadoop集群 历史服务器配置 超详细 执行任务记录 JobHistoryServer MapReduce执行记录 日志聚合结果可视化查看

武子康

大数据 hadoop mapreduce hive

成功案例丨基于OptiStruct的三轮车车架结构刚强度仿真计算与优化

Altair RapidMiner

仿真 CAE Hypermesh OptiStruct 结构优化

Flink在B站的大规模云原生实践

Apache Flink

大数据 flink 云原生 实时计算

天润融通AI训练师助力企业重构核心竞争力

天润融通

禅道5月更新速览 | 新增交付物配置功能,支持建立跨执行任务依赖关系,研发效能平台上线

禅道项目管理

项目管理 甘特图 #研发效能 研发效能度量 研发效能管理

产品动态速递|Aloudata CAN 指标定义能力与查询加速能力再次增强、用户体验进一步升级

Aloudata

数据分析 指标平台 指标开发 ChatBI 智能问数

基于华为开发者空间,体验鲲鹏DevKit之Python字符串拼接系统性能分析

华为云开发者联盟

Python 鲲鹏 DevKit 开发者空间

CST软件HVDC 高压陶瓷套管

思茂信息

cst CST软件 CST Studio Suite

存储与野生动物保护:Solidigm为创新保育工作保驾护航

科技热闻

2025北京智源大会开幕|智源发布“悟界”系列大模型,解码物理世界交互新范式

智源研究院

人工智能 AI 科技

西南站丨AI驱动仿真未来,2025 Altair区域技术交流会报名开启!

Altair RapidMiner

AI 数字孪生 仿真 CAE 航空航天

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