<?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 API Gateway与AWS Lambda的整合及开发/测试/生产环境的设置</title>
	<atom:link href="https://www.fuwuqiok.com/tag/aws-api-gateway%e4%b8%8eaws-lambda%e7%9a%84%e6%95%b4%e5%90%88%e5%8f%8a%e5%bc%80%e5%8f%91%e6%b5%8b%e8%af%95%e7%94%9f%e4%ba%a7%e7%8e%af%e5%a2%83%e7%9a%84%e8%ae%be%e7%bd%ae/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 API Gateway与AWS Lambda的整合及开发/测试/生产环境的设置</title>
		<link>https://www.fuwuqiok.com/aws-api-gateway%e4%b8%8eaws-lambda%e7%9a%84%e6%95%b4%e5%90%88%e5%8f%8a%e5%bc%80%e5%8f%91%e6%b5%8b%e8%af%95%e7%94%9f%e4%ba%a7%e7%8e%af%e5%a2%83%e7%9a%84%e8%ae%be%e7%bd%ae/</link>
		<comments>https://www.fuwuqiok.com/aws-api-gateway%e4%b8%8eaws-lambda%e7%9a%84%e6%95%b4%e5%90%88%e5%8f%8a%e5%bc%80%e5%8f%91%e6%b5%8b%e8%af%95%e7%94%9f%e4%ba%a7%e7%8e%af%e5%a2%83%e7%9a%84%e8%ae%be%e7%bd%ae/#comments</comments>
		<pubDate>Thu, 17 Aug 2017 07:53:44 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Amazon AWS]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[linux代维]]></category>
		<category><![CDATA[AWS API Gateway与AWS Lambda的整合及开发/测试/生产环境的设置]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=3281</guid>
		<description><![CDATA[<p>AWS API Gateway与AWS Lambda的整合及开发/测试/生产环境的设置 本文不是介绍 AWS  [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/aws-api-gateway%e4%b8%8eaws-lambda%e7%9a%84%e6%95%b4%e5%90%88%e5%8f%8a%e5%bc%80%e5%8f%91%e6%b5%8b%e8%af%95%e7%94%9f%e4%ba%a7%e7%8e%af%e5%a2%83%e7%9a%84%e8%ae%be%e7%bd%ae/">AWS API Gateway与AWS Lambda的整合及开发/测试/生产环境的设置</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<h1>AWS API Gateway与AWS Lambda的整合及开发/测试/生产环境的设置</h1>
<p>本文<strong>不是</strong>介绍 <a href="https://aws.amazon.com/api-gateway/" target="_blank" rel="external">AWS API Gateway</a> 和 <a href="https://aws.amazon.com/lambda/" target="_blank" rel="external">AWS Lambda</a>的基本用法的</p>
<p>简单的来说，有了AWS的API Gateway和Lambda这两样东东，再加一个数据库（<em>最好当然是用AWS DynamoDB啦，或者AWS EC2上装mysql，不用AWS也可以，但是访问速度可能会有一定影响，毕竟如果都用AWS的话算是走内网会快一些？！</em>），不需要任何网络应用的框架你就能开发出非常RESTful的API了，简直是中小型公司提高开发效率的神器！</p>
<p>再简单的来说，API Gateway给你提供一个URL，当这个url被访问的时候，就会调用你设置的某个Lambda函数，这个函数执行完了之后就会返回你设定的数据。也就是说，以前你在服务器端收到一个请求，然后<strong>“做一堆事”</strong>完了之后发出响应Response的这个“做一堆事”和Response，写在一个Lambda函数里就可以了。</p>
<blockquote><p>通常如果浏览器端使用ajax访问这个URL都会存在跨域的问题，API Gateway当然很贴心的提供了enable CORS选项！</p></blockquote>
<p>AWS Lambda目前支持python，JAVA，NodeJS。这个Lambda函数呢，只是叫Lambda而已，实际写起来跟函数式编程也没有太大的关系，以前怎么写现在也还是一样的写…神奇的是，Lambda之间可以相互调用，另外除了API Gateway之外，很多别的跟API Gateway无关的事件event也可以作为trigger（<em>比如当DynamoDB的某个Table新增一条用户记录的时候，调用一个名称为<code>sendWelcomeEmailToUser()</code>的Lambda函数，给用户发欢迎邮件</em>）</p>
<p>那么如何设置AWS API Gateway和AWS Lambda来实现开发/测试/生产环境的需求呢？难道要同一个功能的API建3个、同一个功能的lambda建3个？！</p>
<hr />
<p>以下所有内容都是在AWS的WEB UI中进行设置的。<em>（除了在UI中设置，还可以写Shell脚本去批量执行这些设置，当然啦，这个我还没学会…）</em></p>
<p>哦，忘了说…首先你要有个…API，然后你还要有个Lambda。<br />
假设：</p>
<ul>
<li><strong>API endpoint是 /stageTest，方法是<code>GET</code>。</strong></li>
<li><strong>Lambda名为stageTest。</strong> <em>（endpoint的名字和lambda名字可以不同…原谅我是取名无能星人…）</em></li>
</ul>
<h3 id="DEV-QA-PROD-环境的设置">DEV / QA / PROD 环境的设置</h3>
<ol>
<li><strong>为API Gateway创建不同的stage<a href="http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-set-stage-variables-aws-console.html" target="_blank" rel="external">^1</a>，假设创建了3个分别是dev，qa，prod。</strong><br />
<blockquote><p>设置了stage之后你的api endpoin看起来大概长这样：</p>
<ul>
<li>.execute-api..amazonaws.com/dev</li>
<li>.execute-api..amazonaws.com/qa</li>
<li>.execute-api..amazonaws.com/prod</li>
</ul>
</blockquote>
</li>
<li><strong>为每个的Stage设置stageVariables<a href="http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-set-stage-variables-aws-console.html" target="_blank" rel="external">^2</a>，假设为每个Stage都设置了一个名为env的变量</strong>
<ul>
<li>dev这个stage中env变量的值为DEV</li>
<li>qa这个stage中env变量的值为QA</li>
<li>prod这个stage中env变量的值为PROD</li>
</ul>
</li>
<li><strong>Lambda stageTest()函数创建不同的alias<a href="http://docs.aws.amazon.com/lambda/latest/dg/aliases-intro.html" target="_blank" rel="external">^3</a>，假设创建了3个分别是DEV，QA，PROD，分别指向不同的版本。</strong><br />
<blockquote>
<ul>
<li>在每次deploy后，都是$LATEST版本，点action&gt;publish new version发布不同的版本</li>
<li>建议DEV指向$LATEST版本，QA和PROD指向其他稳定的版本</li>
<li>为Lambda创建了alias之后，其实这个lambda访问的名称就有了以下四种：<code>stageTest</code>，<code>stageTest:DEV</code>，<code>stageTest:QA</code>，<code>stageTest:PROD</code>，其中<code>stageTest</code>永远指向$LATEST版本，其他指向之前设置的各个版本</li>
</ul>
</blockquote>
</li>
<li><strong>整合API /stageTest 的GET方法与Lambda stageTest()<a href="http://docs.aws.amazon.com/apigateway/latest/developerguide/getting-started.html" target="_blank" rel="external">^5</a></strong>
<ul>
<li>首先在API Gateway的界面中设置每个API方法的<strong>Integration Request</strong>：Integration Type选择Lambda Function；Lambda Function填<code>stageTest:${stageVariables.env}</code>，<strong>${stageVariables.env}</strong>就是第2步中，设置的变量。</li>
<li>设置Lambda Function名称的时候一定要记得点旁边的√保存，保存的时候，AWS会弹出一个对话框，需要给函数加上权限才能使用stageVariables变量。加的时候记得要执行三次命令，也就是在AWS给出的命令的对应的位置改成 <code>stageTest:DEV</code>，<code>stageTest:QA</code>，<code>stageTest:PROD</code> 每个执行一次。</li>
<li>执行以上命令之前，你必须：
<ul>
<li>安装AWS CLI</li>
<li>执行命令<code>aws configure</code>，填写你的AWS ID和key，设施default region为你的lambda function所在的region</li>
</ul>
</li>
</ul>
</li>
</ol>
<p>那么，问题又来了…</p>
<ul>
<li>如果你已经部署了很多lambda和api却没有使用stage的话…似乎是不太可能手动去AWS界面上一个一个设置的</li>
<li>就算你已经在使用stage了，似乎也不太可能每次都手动去AWS界面上一个一个deploy最新的版本以及改变alias指向的版本的…</li>
</ul>
<p>这个时候，你就必须研究<a href="https://aws.amazon.com/cli/" target="_blank" rel="external">AWS CLI</a>，然后写shell以及借助其他工具来进行自动化部署了…</p>
<p>其他参考：</p>
<ul>
<li><a href="http://docs.aws.amazon.com/apigateway/latest/developerguide/stage-variables.html" target="_blank" rel="external">http://docs.aws.amazon.com/apigateway/latest/developerguide/stage-variables.html</a></li>
<li><a href="http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html#stagevariables-template-reference" target="_blank" rel="external">http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html#stagevariables-template-reference</a></li>
</ul>
<h1>AWS API Gateway Mapping Template 获取IP, header等</h1>
<p>适用场景</p>
<p>在配合API Gateway和Lambda来搭建RESTful API时，Lambda获取的payload并非通常服务器端获取的一个request对象，lambda获取到的payload并<strong>不包含 request header</strong>的内容，而只有<strong>request body</strong>的内容。</p>
<p>header中的部分内容可以通过API Gateway提供的变量从mapping template中获取。可以获取的内容包括IP, http方法，路由参数，query等，具体可以看文档<a href="http://docs.aws.amazon.com/zh_cn/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html" target="_blank" rel="external">^1</a></p>
<h3 id="设置方法">设置方法</h3>
<p>按照理论来说，AWS设置可以通过界面设置的都可以通过脚本来设置。下面只介绍在界面中的设置：</p>
<ol>
<li>在API Gateway界面中选中具体的api方法，点击右侧的<strong>Intergration Request</strong></li>
<li>在底部点击<strong>Mapping Templates</strong></li>
<li>点击<strong>Add Mapping Template</strong>，输入<code>application/json</code>，点击√进行确认</li>
<li>在右侧新出现的区域，点击编辑按钮（铅笔图标），输入需要的变量即可，例如要获取ip：<br />
<figure class="highlight plain">
<table>
<tbody>
<tr>
<td class="code">
<div class="line">{</div>
<div class="line">&#8220;body&#8221;: $input.json(&#8216;$&#8217;),</div>
<div class="line">&#8220;source_ip&#8221; : &#8220;$context.identity.sourceIp&#8221;,</div>
<div class="line">}</div>
</td>
</tr>
</tbody>
</table>
</figure>
</li>
</ol>
<p>其中<code>$input.json('$')</code>是请求时客户端发来的body</p>
<h3 id="response-header和cookie">response header和cookie</h3>
<p>在配合使用lambda和API gateway的时候，header和cookie是非常令人头疼的问题…<br />
lambda返回的内容，只是response body，因此设置header要在api gateway中进行，并且也是有一些限制的：</p>
<ol>
<li>在API Gateway界面中选中具体的api方法，点击右侧的<strong>Method Response</strong></li>
<li>展开HTTP Status，点击<strong>Add Header</strong>，添加一个header。<br />
<blockquote><p><strong>注意</strong>：可以添加多个Header，但这些header不能同名，这也就意味着，只能有一个<code>Set-Cookie</code>，只能添加一个cookie</p></blockquote>
</li>
<li>完成以上步骤后，返回第一步所在的页面，点击<strong>Integration Response</strong>，点击三角展开，会看到<strong>Header Mappings</strong></li>
<li>在对应的位置编辑<strong>mapping value</strong>
<ul>
<li>如果想使用lambda返回的数据，设置为<code>integration.response.body.KEY</code></li>
<li>如果不是使用lambda（即把gateway用作代理），而是使用实际服务器返回的header，设置为<code>integration.response.header.KEY</code></li>
</ul>
</li>
</ol>
<h3 id="参考">参考</h3>
<ul>
<li><a href="http://docs.aws.amazon.com/zh_cn/apigateway/latest/developerguide/how-to-method-settings-execution-console.html" target="_blank" rel="external">http://docs.aws.amazon.com/zh_cn/apigateway/latest/developerguide/how-to-method-settings-execution-console.html</a></li>
<li><a href="http://docs.aws.amazon.com/zh_cn/apigateway/latest/developerguide/request-response-data-mappings.html" target="_blank" rel="external">http://docs.aws.amazon.com/zh_cn/apigateway/latest/developerguide/request-response-data-mappings.html</a></li>
</ul>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/aws-api-gateway%e4%b8%8eaws-lambda%e7%9a%84%e6%95%b4%e5%90%88%e5%8f%8a%e5%bc%80%e5%8f%91%e6%b5%8b%e8%af%95%e7%94%9f%e4%ba%a7%e7%8e%af%e5%a2%83%e7%9a%84%e8%ae%be%e7%bd%ae/">AWS API Gateway与AWS Lambda的整合及开发/测试/生产环境的设置</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/aws-api-gateway%e4%b8%8eaws-lambda%e7%9a%84%e6%95%b4%e5%90%88%e5%8f%8a%e5%bc%80%e5%8f%91%e6%b5%8b%e8%af%95%e7%94%9f%e4%ba%a7%e7%8e%af%e5%a2%83%e7%9a%84%e8%ae%be%e7%bd%ae/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
