<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>服务器安全维护工作室 &#187; 使用 AWS Lambda 支持的宏扩展 AWS CloudFormation</title>
	<atom:link href="https://www.fuwuqiok.com/tag/%e4%bd%bf%e7%94%a8-aws-lambda-%e6%94%af%e6%8c%81%e7%9a%84%e5%ae%8f%e6%89%a9%e5%b1%95-aws-cloudformation/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.fuwuqiok.com</link>
	<description></description>
	<lastBuildDate>Sun, 01 Mar 2020 07:28:40 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.2.26</generator>
	<item>
		<title>使用 AWS Lambda 支持的宏扩展 AWS CloudFormation</title>
		<link>https://www.fuwuqiok.com/%e4%bd%bf%e7%94%a8-aws-lambda-%e6%94%af%e6%8c%81%e7%9a%84%e5%ae%8f%e6%89%a9%e5%b1%95-aws-cloudformation/</link>
		<comments>https://www.fuwuqiok.com/%e4%bd%bf%e7%94%a8-aws-lambda-%e6%94%af%e6%8c%81%e7%9a%84%e5%ae%8f%e6%89%a9%e5%b1%95-aws-cloudformation/#comments</comments>
		<pubDate>Wed, 21 Nov 2018 06:34:24 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[aliyun服务器代维]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[linux代维]]></category>
		<category><![CDATA[linux服务器维护]]></category>
		<category><![CDATA[linux系统代维]]></category>
		<category><![CDATA[服务器安全代维]]></category>
		<category><![CDATA[服务器安全设置]]></category>
		<category><![CDATA[系统安全代维]]></category>
		<category><![CDATA[网站代维]]></category>
		<category><![CDATA[使用 AWS Lambda 支持的宏扩展 AWS CloudFormation]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=3865</guid>
		<description><![CDATA[<p>今天，我非常高兴为大家介绍 AWS CloudFormation 的一个强大新功能，它叫做 Macros。Cl [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e4%bd%bf%e7%94%a8-aws-lambda-%e6%94%af%e6%8c%81%e7%9a%84%e5%ae%8f%e6%89%a9%e5%b1%95-aws-cloudformation/">使用 AWS Lambda 支持的宏扩展 AWS CloudFormation</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>今天，我非常高兴为大家介绍 <a title="" href="https://amazonaws-china.com/cloudformation/">AWS CloudFormation</a> 的一个强大新功能，它叫做 <strong>Macros</strong>。CloudFormation Macros 允许开发人员调用 <a title="" href="https://amazonaws-china.com/lambda/">AWS Lambda</a> 支持的转换函数，从而扩展 CloudFormation 模板的原生句法。它采用与支持流行的<a title="无服务器应用程序模型 — SAM" href="https://github.com/awslabs/serverless-application-model">无服务器应用程序模型</a>功能所用的相同技术，但转换函数 (transform) 在您自己的账户中运行，使用您自己的 lambda 函数，并且是完全可自定义的。如果您还不熟悉 AWS，请记住 CloudFormation 是一个对基础设施即代码（YAML 或 JSON）的建模和定义绝对关键的工具。它也是所有 AWS 产品的核心组件之一，我们的许多服务都依赖它而存在。</p>
<p>宏的使用有两个主要步骤。首先，我们需要定义宏。当然，为此我们需要使用 CloudFormation 模板。然后，为了在我们的模板中使用宏，我们需要将它添加为整个模板的转换函数，或者直接调用它。在本博文中，宏和转换函数这两个术语基本可以互换。已经准备好了解其工作原理了？</p>
<h3>创建 CloudFormation 宏</h3>
<p>宏的创建有两个要素：一是定义，二是实现。如要创建宏的定义，我们需要一个类型为 <code>AWS::CloudFormation::Macro</code> 的 CloudFormation 资源，该资源定义了需要使用的 Lamda 函数以及应当调用的宏。</p>
<pre class=" language-yaml" data-language="YAML"><code class=" language-yaml">Type<span class="token punctuation">:</span> <span class="token string">"AWS::CloudFormation::Macro"</span>
<span class="token key atrule">Properties</span><span class="token punctuation">:</span>
  <span class="token key atrule">Description</span><span class="token punctuation">:</span> String
  <span class="token key atrule">FunctionName</span><span class="token punctuation">:</span> String
  <span class="token key atrule">LogGroupName</span><span class="token punctuation">:</span> String
  <span class="token key atrule">LogRoleARN</span><span class="token punctuation">:</span> String
  <span class="token key atrule">Name</span><span class="token punctuation">:</span> String</code></pre>
<p>宏的 <code>Name</code> 必须在整个区域是唯一的，并且通过 <code>FunctionName</code> 引用的 Lambda 函数必须与要创建的宏位于同一区域。您执行宏模板时，将会使该宏对其他模板也同样可用。宏的实现由 Lambda 函数完成。宏可以位于自己的模板中，也可与其他宏组合，但无法在注册宏的模板中使用该宏。Lambda 函数会收到与以下类似的 JSON 负载：</p>
<pre class=" language-json" data-language="Json"><code class=" language-json"><span class="token punctuation">{</span>
    <span class="token property">"region"</span><span class="token operator">:</span> <span class="token string">"us-east-1"</span><span class="token punctuation">,</span>
    <span class="token property">"accountId"</span><span class="token operator">:</span> <span class="token string">"$ACCOUNT_ID"</span><span class="token punctuation">,</span>
    <span class="token property">"fragment"</span><span class="token operator">:</span> <span class="token punctuation">{</span> ... <span class="token punctuation">}</span><span class="token punctuation">,</span>
    <span class="token property">"transformId"</span><span class="token operator">:</span> <span class="token string">"$TRANSFORM_ID"</span><span class="token punctuation">,</span>
    <span class="token property">"params"</span><span class="token operator">:</span> <span class="token punctuation">{</span> ... <span class="token punctuation">}</span><span class="token punctuation">,</span>
    <span class="token property">"requestId"</span><span class="token operator">:</span> <span class="token string">"$REQUEST_ID"</span><span class="token punctuation">,</span>
    <span class="token property">"templateParameterValues"</span><span class="token operator">:</span> <span class="token punctuation">{</span> ... <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre>
<p>负载的 <code>fragment</code> 部分包含了整个模板或者模板的相关区段 — 具体取决于如何从调用宏的模板中调用转换函数。区段始终在 JSON 中，即使模板在 YAML 中亦是如此。</p>
<p>Lambda 函数预计将会返回一个简单的 JSON 应答：</p>
<pre class=" language-json" data-language="Json"><code class=" language-json"><span class="token punctuation">{</span>
    <span class="token property">"requestId"</span><span class="token operator">:</span> <span class="token string">"$REQUEST_ID"</span><span class="token punctuation">,</span>
    <span class="token property">"status"</span><span class="token operator">:</span> <span class="token string">"success"</span><span class="token punctuation">,</span>
    <span class="token property">"fragment"</span><span class="token operator">:</span> <span class="token punctuation">{</span> ... <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre>
<p><code>requestId</code> 需要输入负载中收到的相同，如果 <code>status</code> 包含除 success（不区分大小写）以外的任何值，则变更集的创建将会失败。然后，<code>fragment</code> 必须包含转换后模板的有效 CloudFormation JSON。即使您的函数未执行任何操作，仍然需要返回它的区段以包含到最终模板中。</p>
<h3>使用 CloudFormation 宏</h3>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/cfn_macro_use-1024x557.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/cfn_macro_use-1024x557.png" alt="cfn_macro_use-1024x557" width="1024" height="557" /></a><br />
如要使用宏，我们只需使用要求的参数调用<a><code>Fn::Transform</code></a>。如果您希望利用宏来对整个模板进行句法分析，则我们可以按照与 SAM: <code>Transform: [Echo]</code> 相同的方式，将其列入模板中的转换函数列表中。在我们执行模板时，通过调用每个宏的制定函数并返回最终模板，转换函数将会被收集到变更集中。</p>
<p>假设我们有一个名为 EchoFunction 的 虚拟 Lambda 函数，它只是记录通过它的数据并返回未加任何修改的区段。我们将宏定义为一种正常的 CloudFormation 资源，与以下类似：</p>
<pre class=" language-yaml" data-language="YAML"><code class=" language-yaml">EchoMacro<span class="token punctuation">:</span>
  <span class="token key atrule">Type</span><span class="token punctuation">:</span> <span class="token string">"AWS::CloudFormation::Macro"</span>
  <span class="token key atrule">Properties</span><span class="token punctuation">:</span>
    <span class="token key atrule">FunctionName</span><span class="token punctuation">:</span> arn<span class="token punctuation">:</span>aws<span class="token punctuation">:</span>lambda<span class="token punctuation">:</span>us<span class="token punctuation">-</span>east<span class="token punctuation">-</span>1<span class="token punctuation">:</span>1234567<span class="token punctuation">:</span>function<span class="token punctuation">:</span>EchoFunction
	<span class="token key atrule">Name</span><span class="token punctuation">:</span> EchoMacro</code></pre>
<p>Lambda 函数的代码可能简单如下：</p>
<pre class=" language-python" data-language="Python"><code class=" language-python"><span class="token keyword">def</span> <span class="token function">lambda_handler</span><span class="token punctuation">(</span>event<span class="token punctuation">,</span> context<span class="token punctuation">)</span><span class="token punctuation">:</span>
    <span class="token keyword">print</span><span class="token punctuation">(</span>event<span class="token punctuation">)</span>
    <span class="token keyword">return</span> <span class="token punctuation">{</span>
        <span class="token string">"requestId"</span><span class="token punctuation">:</span> event<span class="token punctuation">[</span><span class="token string">'requestId'</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
        <span class="token string">"status"</span><span class="token punctuation">:</span> <span class="token string">"success"</span><span class="token punctuation">,</span>
        <span class="token string">"fragment"</span><span class="token punctuation">:</span> event<span class="token punctuation">[</span><span class="token string">"fragment"</span><span class="token punctuation">]</span>
    <span class="token punctuation">}</span></code></pre>
<p>然后在部署此函数并执行宏模板后，我们可以在任何其他模板的顶层的转换函数中调用宏，与以下类似：</p>
<pre class=" language-yaml" data-language="YAML"><code class=" language-yaml">AWSTemplateFormatVersion<span class="token punctuation">:</span> <span class="token datetime number">2010-09-09</span> 
 <span class="token key atrule">Transform</span><span class="token punctuation">:</span> <span class="token punctuation">[</span>EchoMacro<span class="token punctuation">,</span> AWS<span class="token punctuation">:</span><span class="token punctuation">:</span>Serverless<span class="token punctuation">-</span><span class="token datetime number">2016-10-31</span><span class="token punctuation">]</span>
 <span class="token key atrule">Resources</span><span class="token punctuation">:</span>
    <span class="token key atrule">FancyTable</span><span class="token punctuation">:</span>
      <span class="token key atrule">Type</span><span class="token punctuation">:</span> AWS<span class="token punctuation">:</span><span class="token punctuation">:</span>Serverless<span class="token punctuation">:</span><span class="token punctuation">:</span>SimpleTable</code></pre>
<p>CloudFormation 会首先调用我们定义的 Echo 宏，然后调用 AWS::Serverless 转换函数，从而创建模板的变更集。它将按照列表中的顺序执行转换函数中列举的宏。</p>
<p>此外，我们还可以使用内部函数 <code>Fn::Transform</code> 调用宏，该函数允许我们输入额外的参数。例如：</p>
<pre class=" language-yaml" data-language="YAML"><code class=" language-yaml">AWSTemplateFormatVersion<span class="token punctuation">:</span> <span class="token datetime number">2010-09-09</span>
<span class="token key atrule">Resources</span><span class="token punctuation">:</span>
  <span class="token key atrule">MyS3Bucket</span><span class="token punctuation">:</span>
    <span class="token key atrule">Type</span><span class="token punctuation">:</span> <span class="token string">'AWS::S3::Bucket'</span>
    <span class="token key atrule">Fn::Transform</span><span class="token punctuation">:</span>
      <span class="token key atrule">Name</span><span class="token punctuation">:</span> EchoMacro
      <span class="token key atrule">Parameters</span><span class="token punctuation">:</span>
        <span class="token key atrule">Key</span><span class="token punctuation">:</span> Value</code></pre>
<p>内联转换函数将拥有其所有同级节点和下级节点的访问权限。转换函数的处理顺序为由深到浅，这意味着最顶层的转换函数将会最后执行。我知道大多数人都会说：不对，你不能在宏中包含宏 — 但想法不错。</p>
<p>在您执行 CloudFormation 模板时，它将会直接要求您创建一个变更集，并且您可以在部署前预览输出结果。<br />
<a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/cfn-1024x696.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/cfn-1024x696.png" alt="cfn-1024x696" width="1024" height="696" /></a></p>
<h3>示例宏</h3>
<p>我们正在推出多个<a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-macros.html">参考</a>宏，以帮助开发人员上手，同时我预计许多人也将发布更多的宏。以下四个宏是在此功能发布前，一个小的内部骇客马拉松的优胜作品：</p>
<table>
<tbody>
<tr>
<th>名称</th>
<th>描述</th>
<th>作者</th>
</tr>
<tr>
<td><a href="https://github.com/awslabs/aws-cloudformation-templates/tree/master/aws/services/CloudFormation/MacrosExamples/PyPlate/">PyPlate</a></td>
<td>允许您在模板中插入内敛 Python 函数</td>
<td>Jay McConnel — 合作伙伴解决方案架构师</td>
</tr>
<tr>
<td><a href="https://github.com/awslabs/aws-cloudformation-templates/tree/master/aws/services/CloudFormation/MacrosExamples/ShortHand/">ShortHand</a></td>
<td>定义通用 cloudformation 资源的简略句法</td>
<td><a href="https://www.linkedin.com/in/stilvoid">Steve Engledow — 解决方案构建师</a></td>
</tr>
<tr>
<td><a href="https://github.com/awslabs/aws-cloudformation-templates/tree/master/aws/services/CloudFormation/MacrosExamples/StackMetrics/">StackMetrics</a></td>
<td>为堆栈添加 Cloudwatch 指标</td>
<td>Steve Engledow 和 <a href="https://linkedin.com/in/jgregson">Jason Gregson — 全球解决方案架构师</a></td>
</tr>
<tr>
<td><a href="https://github.com/awslabs/aws-cloudformation-templates/tree/master/aws/services/CloudFormation/MacrosExamples/StringFunctions/">String Functions</a></td>
<td>为您的模板添加常用的串函数</td>
<td>Jay McConnel — 合作伙伴解决方案架构师</td>
</tr>
</tbody>
</table>
<p>以下是我认为有人可能会感兴趣实现的一些理念：</p>
<ul>
<li>自动注册 R53 域 + <a title="" href="https://amazonaws-china.com/certificate-manager/">AWS Certificate Manager (ACM)</a> 凭证预置</li>
<li>自动分配带自定义域的 S3 静态网站或 <a title="" href="https://amazonaws-china.com/cloudfront/">Amazon CloudFront</a></li>
<li>扩展 CloudFormation 映射以读取 DynamoDB 表</li>
<li>自动为 <a title="" href="https://amazonaws-china.com/vpc/">Amazon Virtual Private Cloud</a> 设置 IPv6</li>
<li>自动订阅 Webhook 以与 Slack、Twitter、Messenger 集成</li>
</ul>
<p>如果您有任何奇妙的想法，我非常期待您写出来！</p>
<h3>现已推出</h3>
<p>CloudFormation Macros 从今天开始已在所有支持 AWS Lambda 的 AWS 区域推出。使用 Macros 不会发生额外的 CloudFormation 费用，这意味着您只需承担正常的 AWS Lambda 函数费用。更多信息请参阅<a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-macros.html">文档</a>。</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e4%bd%bf%e7%94%a8-aws-lambda-%e6%94%af%e6%8c%81%e7%9a%84%e5%ae%8f%e6%89%a9%e5%b1%95-aws-cloudformation/">使用 AWS Lambda 支持的宏扩展 AWS CloudFormation</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/%e4%bd%bf%e7%94%a8-aws-lambda-%e6%94%af%e6%8c%81%e7%9a%84%e5%ae%8f%e6%89%a9%e5%b1%95-aws-cloudformation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
