【AICon】AI 基础设施、LLM运维、大模型训练与推理,一场会议,全方位涵盖! >>> 了解详情
写点什么

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

发布了 1837 篇内容, 共 92.9 次阅读, 收获喜欢 73 次。

关注

评论

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

悦数图数据库推出 AI 知识图谱构建器及图语言生成助手

悦数图数据库

图数据库

程序员必须了解的 10个免费 Devops 工具

EquatorCoco

DevOps 运维 开发

【教程】APP加固的那些小事情

雪奈椰子

easyExcel导出的字段命名问题,导致无法导出数据

进哥

java‘

终于有人讲清楚了!如何成为高价值的程序员

互联网工科生

探讨Java代码混淆加固工具

雪奈椰子

基于火山引擎 VCI 实现资源装箱率提升,助力企业云成本优化

Geek_2d6073

✅到底有没有必要分库分表,如何考量的

派大星

MySQL 数据库 Java 面试

.NET Framework 服务实现监控可观测性最佳实践

观测云

.net

脑洞大开丨让 AI 写代码,能做出什么样的项目?

阿里巴巴云原生

阿里云 云原生

【教程】混淆代码保护与优化

智能商品计划系统:鞋服品牌的未来价值引擎

第七在线

RocketMQ 流存储解析:面向流场景的关键特性与典型案例

阿里巴巴云原生

阿里云 RocketMQ 云原生

【教程】混淆代码保护与优化

雪奈椰子

【教程】uni-app iOS打包解决profile文件与私钥证书不匹配问题

雪奈椰子

一站式测试解决方案,从人才到工具,我们全程护航!

测吧(北京)科技有限公司

测试

云效 AppStack + 阿里云 MSE 实现应用服务全链路灰度

阿里巴巴云原生

阿里云 微服务 云原生 云效

Git进阶命令-reset

不在线第一只蜗牛

【教程】为什么要为 App 应用加固 ?如何为 App 应用加固 ?

雪奈椰子

【教程】APP加固的那些小事情

雪奈椰子

自己动手做一个批量doc转换为docx文件的小工具

快乐非自愿限量之名

C# doc docx

提升Java编程安全性-代码加密混淆工具的重要性和应用

雪奈椰子

易快报与国贸SAP秒同步,数据同步不再是难题!

聚道云软件连接器

案例分享

软件测试学习笔记丨Allure2 添加用例分类

测试人

软件测试

软件全套资料:开发、实施、运维、安全、交付、立项、过程、结项、投标方案、资质评审等

金陵老街

详细设计 软件文档 规格说明

GPU云服务器的优势和应用

Ogcloud

gpu 服务器 云服务器 GPU实例 GPU云服务器

【教程】苹果iOS证书制作教程

雪奈椰子

Redis 又双叒叕改开源协议了,微软提前推出高性能替代方案 Garnet

小猿姐

redis microsoft 开源协议

【教程】oc代码混淆_OC代码混淆工具

雪奈椰子

户外LED防水箱体:技术发展与市场趋势

Dylan

技术 性能 LED显示屏 户外LED显示屏

云效 AppStack + 阿里云 MSE 实现应用服务全链路灰度

阿里云云效

阿里云 微服务 云原生 云效

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