NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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

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

关注

评论

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

JDK 15 都发布了,可 Java 8 依然是最爱

古时的风筝

Java Java 25 周年 Java版本

Sula - 可能是西湖区最好用的antd配置框架

开远

大前端 antd sula 配置化开发

GitHub上10个不可错过的另类有趣项目

码农神说

GitHub 开源 程序员

分布式事务 - 三种常见的解决方案

Java收录阁

分布式事务

愚蠢写作术(2):怎么让你的文章变得冷冰冰

史方远

学习 个人成长 写作

路径依赖 - 偶然决策导致的依赖。

石云升

思维模型 路径依赖 网络效应 沉没成本 价值网依赖

csapp-chapter1

卓丁

深入理解计算机系统 csapp

【译文】为什么说Rust是机器人技术的未来

袁承兴

rust 机器人 嵌入式

做一个纸上谈兵的项目经理

escray

科学提升认知方法之贝叶斯公式

奈学教育

贝叶斯公式

大话设计模式 | 0 面向对象基础

Puran

C# 设计模式

ArrayList浅析

章小传

Java collection 原理 ArrayList

架构师必备的ToB产品交付之双轮驱动思维模型

常平

产品 极客大学架构师训练营

多来点胜利,对冲颓丧

zhoo299

成长 备忘

源码分析 | 像盗墓一样分析Spring是怎么初始化xml并注册bean的

小傅哥

源码分析 小傅哥 spring源码 bean注入过程

JUC整理笔记五之梳理Varhandle(下)

JFound

Java

SpringCloud-OpenFeign源码

云淡风轻

Spring Cloud

N皇后问题之位运算解法

孙苏勇

算法 DFS 位运算

自定义 SpringBootStarter

子路无倦

从零到部署:用 Vue 和 Express 实现迷你全栈电商应用(五)

图雀社区

Vue Node

如何让解决无法访问 GitHub 的问题?

JackTian

GitHub

我的个人知识管理方法

lidaobing

个人成长 知识管理 PKM

React之Context源码分析与实践

费马

源码分析 React useContext Context React-Router

从零到部署:用 Vue 和 Express 实现迷你全栈电商应用(六)

图雀社区

node.js Vue

为什么你成不了「超级个体」?

非著名程序员

程序员 互联网 提升认知 认知提升

重磅推出:第14份年度敏捷状态报告(最新2020)

Bob Jiang

敏捷 调查报告 state of agile

csapp-chapter2

卓丁

深入理解计算机系统 csapp

除了公关,我还能为公司做点什么?(系列1)

邓瑞恒Ryan

学习 个人成长 自我管理 成长 职业成长

中台上线半年,我总结出了“七宗罪”

punkboy

中台 企业中台 后台开发 业务中台 后台

从零到部署:用 Vue 和 Express 实现迷你全栈电商应用(三)

图雀社区

vue.js Vue Node

从零到部署:用 Vue 和 Express 实现迷你全栈电商应用(四)

图雀社区

Vue Node

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