<?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; 服务器迁移</title>
	<atom:link href="https://www.fuwuqiok.com/topics/%e6%9c%8d%e5%8a%a1%e5%99%a8%e8%bf%81%e7%a7%bb/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>数据迁移服务（上云或云云迁移）</title>
		<link>https://www.fuwuqiok.com/%e6%95%b0%e6%8d%ae%e8%bf%81%e7%a7%bb%e6%9c%8d%e5%8a%a1%ef%bc%88%e4%b8%8a%e4%ba%91%e6%88%96%e4%ba%91%e4%ba%91%e8%bf%81%e7%a7%bb%ef%bc%89/</link>
		<comments>https://www.fuwuqiok.com/%e6%95%b0%e6%8d%ae%e8%bf%81%e7%a7%bb%e6%9c%8d%e5%8a%a1%ef%bc%88%e4%b8%8a%e4%ba%91%e6%88%96%e4%ba%91%e4%ba%91%e8%bf%81%e7%a7%bb%ef%bc%89/#comments</comments>
		<pubDate>Tue, 05 Mar 2019 13:09:22 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[aliyun服务器代维]]></category>
		<category><![CDATA[ECS云服务器运维代维服务]]></category>
		<category><![CDATA[服务器代维]]></category>
		<category><![CDATA[服务器代维护]]></category>
		<category><![CDATA[服务器维护]]></category>
		<category><![CDATA[服务器迁移]]></category>
		<category><![CDATA[服务器运维]]></category>
		<category><![CDATA[系统安全代维]]></category>
		<category><![CDATA[网站代维]]></category>
		<category><![CDATA[网站防挂马]]></category>
		<category><![CDATA[数据迁移服务（上云或云云迁移）]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=3919</guid>
		<description><![CDATA[<p>注意事项 1) 数据迁移服务仅支持同系统、同版本迁移操作，不支持跨系统与跨版本迁移。 2) 迁移涉及的网站和应 [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e6%95%b0%e6%8d%ae%e8%bf%81%e7%a7%bb%e6%9c%8d%e5%8a%a1%ef%bc%88%e4%b8%8a%e4%ba%91%e6%88%96%e4%ba%91%e4%ba%91%e8%bf%81%e7%a7%bb%ef%bc%89/">数据迁移服务（上云或云云迁移）</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<div class="box-icon">
<div class="element">
<div class="r-product-detail">
<div class="d-item rich-text">
<h2><span data-spm-anchor-id="5176.730006-52734001-52738004-cmfw013550.content.i2.a59015c285YvdH">注意事项</span></h2>
<p>1) 数据迁移服务仅支持同系统、同版本迁移操作，不支持跨系统与跨版本迁移。</p>
<p>2) 迁移涉及的网站和应用程序需要提供详细安装说明、精确的版本信息。</p>
<p>3) 在服务过程中提供的云账号、密码等，建议用户在服务结束后及时进行信息变更。</p>
<p>4) 服务操作过程中需要用户全程及时配合，否则可能导致交付周期的延迟。</p>
<p>&nbsp;</p>
<h2>服务标准及收费</h2>
<table class="ke-zeroborder" border="0" width="814" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td bgcolor="#F5F5F5" width="10"></td>
<td bgcolor="#F5F5F5" width="112" height="33"><strong>服务项</strong></td>
<td bgcolor="#F5F5F5" width="614"><strong>服务说明</strong></td>
<td bgcolor="#F5F5F5" width="78"><strong>价格</strong></td>
</tr>
<tr>
<td colspan="4" height="5"></td>
</tr>
<tr>
<td></td>
<td>数据库迁移</td>
<td>
<ul>
<li>服务内容：云端安装新数据库/迁移数据库/新数据库备份策略设置</li>
<li>数据大小≤5G</li>
</ul>
</td>
<td>1000元/次</td>
</tr>
<tr>
<td colspan="4" height="5"></td>
</tr>
<tr>
<td></td>
<td>网站整体迁移</td>
<td>
<ul>
<li>服务内容：云端运行环境搭建/数据库迁移/网站文件迁移/运行测试/整体备份策略设置</li>
<li>数据大小≤10G</li>
</ul>
</td>
<td>2000元/次</td>
</tr>
<tr>
<td colspan="4" height="5"></td>
</tr>
<tr>
<td></td>
<td>应用软件迁移</td>
<td>
<ul>
<li>服务内容：云端运行环境搭建/数据库迁移/应用程序迁移/运行测试/整体备份策略设置</li>
<li>数据大小≤10G</li>
</ul>
</td>
<td>1000元/次</td>
</tr>
<tr>
<td colspan="4" height="5"></td>
</tr>
<tr>
<td></td>
<td>文件迁移</td>
<td>
<ul>
<li>服务内容：文件打包/文件上传/文件恢复/服务器备份策略设置</li>
<li>数据大小≤10G</li>
</ul>
</td>
<td>500元/次</td>
</tr>
<tr>
<td colspan="4" height="5"></td>
</tr>
<tr>
<td></td>
<td>增量选项</td>
<td>
<ul>
<li>数据库每增加5G，价格增加100元</li>
<li>程序文件每增加10G，价格增加100元</li>
</ul>
</td>
<td>100元/次</td>
</tr>
<tr>
<td colspan="4" height="5"></td>
</tr>
<tr>
<td></td>
<td>海外ECS选项</td>
<td>
<ul>
<li>数据迁移到含香港之类的海外ECS服务器，在基础费用上额外增加100-300元。</li>
</ul>
</td>
<td>1000元/次</td>
</tr>
</tbody>
</table>
</div>
<div class="d-item broderno"></div>
<div class="d-item rich-text"></div>
</div>
</div>
</div>
<div class="box-icon">
<div class="element">
<div class="d-item">
<h2>产品价格</h2>
<table class="param-table price-table module-table" width="100%">
<thead>
<tr>
<td>版本名称</td>
<td>计费项</td>
<td>新购</td>
</tr>
</thead>
<tbody>
<tr>
<td rowspan="1">海外ECS迁移选项（含香港）</td>
<td>版本基础价格</td>
<td>1000元</td>
</tr>
<tr>
<td rowspan="1">增量选项</td>
<td>版本基础价格</td>
<td>100元</td>
</tr>
<tr>
<td rowspan="1">文件迁移</td>
<td>版本基础价格</td>
<td>500元</td>
</tr>
<tr>
<td rowspan="1">应用软件迁移</td>
<td>版本基础价格</td>
<td>1000元</td>
</tr>
<tr>
<td rowspan="1">网站整体迁移</td>
<td>版本基础价格</td>
<td>2000元</td>
</tr>
<tr>
<td rowspan="1" data-spm-anchor-id="5176.730006-52734001-52738004-cmfw013550.content.i3.a59015c285YvdH">数据库迁移</td>
<td>版本基础价格</td>
<td>1000元</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="box-icon">
<div class="element">
<div class="r-comment-list">
<h2></h2>
</div>
</div>
</div>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e6%95%b0%e6%8d%ae%e8%bf%81%e7%a7%bb%e6%9c%8d%e5%8a%a1%ef%bc%88%e4%b8%8a%e4%ba%91%e6%88%96%e4%ba%91%e4%ba%91%e8%bf%81%e7%a7%bb%ef%bc%89/">数据迁移服务（上云或云云迁移）</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/%e6%95%b0%e6%8d%ae%e8%bf%81%e7%a7%bb%e6%9c%8d%e5%8a%a1%ef%bc%88%e4%b8%8a%e4%ba%91%e6%88%96%e4%ba%91%e4%ba%91%e8%bf%81%e7%a7%bb%ef%bc%89/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>云服务器专业安全代维 服务器代维 阿里云代维 云主机代维 运维外包服务</title>
		<link>https://www.fuwuqiok.com/%e4%ba%91%e6%9c%8d%e5%8a%a1%e5%99%a8%e4%b8%93%e4%b8%9a%e5%ae%89%e5%85%a8%e4%bb%a3%e7%bb%b4-%e6%9c%8d%e5%8a%a1%e5%99%a8%e4%bb%a3%e7%bb%b4-%e9%98%bf%e9%87%8c%e4%ba%91%e4%bb%a3%e7%bb%b4-%e4%ba%91-2/</link>
		<comments>https://www.fuwuqiok.com/%e4%ba%91%e6%9c%8d%e5%8a%a1%e5%99%a8%e4%b8%93%e4%b8%9a%e5%ae%89%e5%85%a8%e4%bb%a3%e7%bb%b4-%e6%9c%8d%e5%8a%a1%e5%99%a8%e4%bb%a3%e7%bb%b4-%e9%98%bf%e9%87%8c%e4%ba%91%e4%bb%a3%e7%bb%b4-%e4%ba%91-2/#comments</comments>
		<pubDate>Mon, 04 Mar 2019 13:45:37 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[aliyun服务器代维]]></category>
		<category><![CDATA[linux服务器代维]]></category>
		<category><![CDATA[服务器代维护]]></category>
		<category><![CDATA[服务器维护]]></category>
		<category><![CDATA[服务器迁移]]></category>
		<category><![CDATA[服务器运维]]></category>
		<category><![CDATA[网站代维]]></category>
		<category><![CDATA[网站防挂马]]></category>
		<category><![CDATA[云服务器专业安全代维 服务器代维 阿里云代维 云主机代维 运维外包服务]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=3913</guid>
		<description><![CDATA[<p>您敢托付，绝不辜负。7×24响应，服务器安全、稳定，专业团队标准化运维服务，网站维护，服务器代维，安全代维，清 [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e4%ba%91%e6%9c%8d%e5%8a%a1%e5%99%a8%e4%b8%93%e4%b8%9a%e5%ae%89%e5%85%a8%e4%bb%a3%e7%bb%b4-%e6%9c%8d%e5%8a%a1%e5%99%a8%e4%bb%a3%e7%bb%b4-%e9%98%bf%e9%87%8c%e4%ba%91%e4%bb%a3%e7%bb%b4-%e4%ba%91-2/">云服务器专业安全代维 服务器代维 阿里云代维 云主机代维 运维外包服务</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>您敢托付，绝不辜负。7×24响应，服务器安全、稳定，专业团队标准化运维服务，网站维护，服务器代维，安全代维，清除木马</p>
<p>&nbsp;</p>
<div class="box-icon">
<div class="element">
<div class="r-product-detail">
<div class="d-item rich-text">
<h2 data-spm-anchor-id="5176.730006-52734001-52732002-cmfw032553.content.i2.69e82171XrEMdu">产品亮点</h2>
<div>适用用户： 使用Linux CentOS、Windows Server 2003/2008/2012</div>
</div>
<div class="d-item rich-text">
<h2>产品说明</h2>
<div>
<p><strong>一、安全防护</strong></p>
<p>提供全面安全防护设置，让服务器达到高级别安全。主要包含以下内容：</p>
<p>1、系统补丁更新</p>
<p>2、系统安全加固</p>
<p>3、软件安全防护</p>
<p>4、网页木马查杀及挂马清理</p>
<p>5、网站安全策略</p>
<p>&nbsp;</p>
<p><strong>二、网站运行环境配置</strong></p>
<p>配置Java、IIS、ASP、PHP、ASP.net、FTP、SQL Server、MySQL、主机管理系统、网站自动备份、PHP伪静态Rewrite等网站必备软件；以及代安装用户指定软件。</p>
<p>&nbsp;</p>
<p><strong>三、应用服务搭建</strong></p>
<p>按用户要求搭建好网站，并设置严格的安全策略，让网站不被挂马、挂黑链、篡改等入侵。</p>
<p>&nbsp;</p>
<p><strong>四、数据备份</strong></p>
<p>1、本地备份：对网站、MySQL、SQL Server进行本地自动备份,。</p>
<p>2、云备份：将本地备份数据传输至网盘网盘。</p>
<p>3、其它备份：根据客户实际情况，提供更高级的备份方案。</p>
<p>&nbsp;</p>
<p><strong>五、系统优化</strong></p>
<p>依托我司丰富的经验和强大的技术，对系统进行全面优化；部分服务器性能可得到数倍提升。</p>
<p>&nbsp;</p>
<p><strong>六、每周安全检测</strong></p>
<p>每周我们将安排专门技术人员检测服务器的安全、性能及硬件等状况，并通过短信、邮件等方式告知用户。</p>
<p>同时我们还为每台服务器提供7*24性能监控，您可以通过网页查看到服务器的CPU、内存、IO、带宽等资源参数，一目了然的掌握服务器情况。</p>
<p>&nbsp;</p>
<p><strong>七、应急响应</strong></p>
<p>根据签约不同，我们正常的上班时间为9:00-22:00，其它时间可直接与技术客服沟通，为客户提供最多可达7*24的应急响应服务，处理各种突发情况。</p>
<p>&nbsp;</p>
<p><strong>八、一站式扩展</strong></p>
<p>除了以上常规服务外，我们还可以提供多样化的扩展服务；如：攻击防护方案、网站加速、系统故障排查、负载均衡方案等等。</p>
</div>
</div>
<div class="d-item broderno">
<h2>产品参数</h2>
<table class="param-table" width="100%">
<tbody>
<tr>
<td class="title borderleft" width="20%">交付方式</td>
<td class="borderright pl20" width="80%">服务类</td>
</tr>
<tr>
<td class="title borderleft" width="20%">依托云产品</td>
<td class="borderright pl20" width="80%">云服务器</td>
</tr>
<tr>
<td class="title borderleft" width="20%">质保时间</td>
<td class="borderright pl20" width="80%">7天</td>
</tr>
<tr>
<td class="title borderleft" width="20%">交付时间</td>
<td class="borderright pl20" width="80%">1天</td>
</tr>
</tbody>
</table>
</div>
<div class="d-item rich-text">
<h2>售后支持范围</h2>
<div>服务时间：工作日9:00—12:00,13:00-18:00。</div>
<div></div>
<div>业务范围：服务器环境配置，故障排查（不含程序自身问题），数据库配置更改，数据库权限、账户，数据迁移，程序迁移，数据库故障排查等； 费用范围：详情参照本公司服务类商品定价，或咨询在线技术支持。</div>
</div>
</div>
</div>
</div>
<div class="box-icon">
<div class="element">
<div class="d-item">
<h2>产品价格</h2>
<table class="param-table price-table module-table" width="100%">
<thead>
<tr>
<td>版本名称</td>
<td>计费项</td>
<td>新购</td>
</tr>
</thead>
<tbody>
<tr>
<td rowspan="1">单服务器（5站点大数据）12000起/年</td>
<td>版本基础价格</td>
<td>12000元</td>
</tr>
<tr>
<td rowspan="1">单服务器（3站点20G数据）/年</td>
<td>版本基础价格</td>
<td>9000元</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="box-icon">
<div class="element">
<div class="r-comment-list">
<h2 data-spm-anchor-id="5176.730006-52734001-52732002-cmfw032553.content.i3.69e82171XrEMdu"></h2>
</div>
</div>
</div>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e4%ba%91%e6%9c%8d%e5%8a%a1%e5%99%a8%e4%b8%93%e4%b8%9a%e5%ae%89%e5%85%a8%e4%bb%a3%e7%bb%b4-%e6%9c%8d%e5%8a%a1%e5%99%a8%e4%bb%a3%e7%bb%b4-%e9%98%bf%e9%87%8c%e4%ba%91%e4%bb%a3%e7%bb%b4-%e4%ba%91-2/">云服务器专业安全代维 服务器代维 阿里云代维 云主机代维 运维外包服务</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/%e4%ba%91%e6%9c%8d%e5%8a%a1%e5%99%a8%e4%b8%93%e4%b8%9a%e5%ae%89%e5%85%a8%e4%bb%a3%e7%bb%b4-%e6%9c%8d%e5%8a%a1%e5%99%a8%e4%bb%a3%e7%bb%b4-%e9%98%bf%e9%87%8c%e4%ba%91%e4%bb%a3%e7%bb%b4-%e4%ba%91-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用AWS 媒体服务构建全球直播解决方案</title>
		<link>https://www.fuwuqiok.com/%e4%bd%bf%e7%94%a8aws-%e5%aa%92%e4%bd%93%e6%9c%8d%e5%8a%a1%e6%9e%84%e5%bb%ba%e5%85%a8%e7%90%83%e7%9b%b4%e6%92%ad%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88/</link>
		<comments>https://www.fuwuqiok.com/%e4%bd%bf%e7%94%a8aws-%e5%aa%92%e4%bd%93%e6%9c%8d%e5%8a%a1%e6%9e%84%e5%bb%ba%e5%85%a8%e7%90%83%e7%9b%b4%e6%92%ad%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88/#comments</comments>
		<pubDate>Wed, 21 Nov 2018 06:39:47 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[aliyun服务器代维]]></category>
		<category><![CDATA[Amazon AWS]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[linux代维]]></category>
		<category><![CDATA[服务器代维护]]></category>
		<category><![CDATA[服务器安全代维]]></category>
		<category><![CDATA[服务器维护]]></category>
		<category><![CDATA[服务器迁移]]></category>
		<category><![CDATA[服务器运维]]></category>
		<category><![CDATA[系统安全代维]]></category>
		<category><![CDATA[网站代维]]></category>
		<category><![CDATA[网站防挂马]]></category>
		<category><![CDATA[使用AWS 媒体服务构建全球直播解决方案]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=3885</guid>
		<description><![CDATA[<p>作为全球云服务的领导者，AWS始终在创新的路上飞驰，仅2017年一年AWS就发布了1300多项新的服务、功能或 [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e4%bd%bf%e7%94%a8aws-%e5%aa%92%e4%bd%93%e6%9c%8d%e5%8a%a1%e6%9e%84%e5%bb%ba%e5%85%a8%e7%90%83%e7%9b%b4%e6%92%ad%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88/">使用AWS 媒体服务构建全球直播解决方案</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>作为全球云服务的领导者，AWS始终在创新的路上飞驰，仅2017年一年AWS就发布了1300多项新的服务、功能或者特性，这其中就包括在2017年reInvent上发布的5个全新的媒体服务，MediaConvert, MediaLive, MeidaPackage, MediaStore和MediaTailor，这些完全托管的服务，使得用户可以在云中轻松构建具有广播品质的可靠视频工作流。用户在构建互联网视频，OTT视频业务的时候直接在AWS控制台上即可启动直播，转码，存储，广告插入等广播级的业务流程，可以按照使用量即用即付，随时启停，而无需前期投入购买昂贵的设备资产，无需进行基础架构运维的成本投入，。AWS平台具有全球部署能力，可以分分钟将业务扩展到全球各个区域。</p>
<p>下面我们将借助AWS Elemental MediaLive ， MediaPackage，CloudFront服务构建一套完整的直播OTT转码打包分发服务，通过这个实验您可以直观的体会到AWS的媒体服务是多么便捷，而您所需要的仅仅是一个AWS Global账号和一天可以上网的电脑。</p>
<p>&nbsp;</p>
<h3>1.  准备直播源</h3>
<p>MediaLive支持RTP，RTMP(Push), RTMP(Pull),HLS四种输入源，如果您已经有RTMP直播源可以直接用在本实验中。</p>
<p>本次实验以HLS为例，使用存储在S3上的一个预先转码完成的文件做为输入源，对于MediaLive来说，这个输入源就是一个直播源。</p>
<p>例如https://s3-us-west-2.amazonaws.com/mytestbucket-og-media-3/keynote-hls/testvideo.m3u8</p>
<p>确认此目录已经开启公开访问（关于S3的更多信息请参阅https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/dev/Welcome.html）</p>
<h3>2.  创建MediaPackage Channel</h3>
<p>a.  登陆AWS Global 控制台，在Services中选择MediaPackage，</p>
<p>b.  在Channel页面，选择 Create Channel</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/1-1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/1-1.png" alt="1-1" width="924" height="501" /></a></p>
<p>c.  输入ID，即自行命名这个Channel，例如ch1。可选填Description栏</p>
<p>d.  Input type选择Apple HLS</p>
<p>e.  点击Create channel</p>
<p>f.  点击新创建的Channel，在Channel Overview页面选择Add/edit endpoint</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/2.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/2.png" alt="2" width="1116" height="440" /></a></p>
<p>g.  在endpoints页面点击Add，填写 ID，例如ch1-ep1，点击Save</p>
<p>h.  重复上述步骤创建第二个Channel和对应的endpoint</p>
<p>i.  记下channel的Input URL，username和password</p>
<h3>3.  创建MediaLive Channel</h3>
<p>a.  在控制台Services 中选择MediaLive</p>
<p>b.  选择Channels页面，点击Create Channel</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/3.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/3.png" alt="3" width="1579" height="823" /></a></p>
<p>c.  在Channel Name中填入自行创建的通道名</p>
<p>d.  在IAM Role 选择Create role from template。选中Remember ARN</p>
<p>（关于IAM Role更多信息请参见https://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/id_roles.html）</p>
<h3>创建MediaLive Input</h3>
<p>e.  在Channel input部分点击Create input</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/4.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/4.png" alt="4" width="1223" height="896" /></a></p>
<p>f.  在Input name 创建一个名字</p>
<p>g.  Input type选择HLS</p>
<p>h.  将第一步准备的HLS源的地址填入Input source A和Input source B的URL中。注意，出于高可用性的考虑，MediaLive Input要求2个互为主备的输入源，本试验使用两个不同的存储桶的HLS URL做为输入源，在实际生产环境中也要两个不同的输入源地址来提供高可靠性。</p>
<p>i.  点击Create</p>
<h3>创建HLS Output Group</h3>
<p>j.  在channel template部分，选择HTTP live streaming模版，将会自动添加不同分辨率和码率的10个输出。也可以不使用模版，通过手动添加自定义output</p>
<p>k.  点击Output groups下的模版名TN2224，点击Credentials(optional)，选中Create AWS Elemental MediaLive parameter 将第2步创建的两个channel的URL，Username，password依次填入HLS Group destination A和HLS Group destination B。见下图</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/5.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/5.png" alt="5" width="1440" height="810" /></a></p>
<blockquote><p>l.  点击 Create channel</p></blockquote>
<h3>4.  启动channel并查看</h3>
<p>a.  Channel创建完成后是idle状态，选中之后点击Start</p>
<p>b.  使用第2步创建的endpoint，使用VLC player来播放这个直播流，，例如：</p>
<p>https://103xxxxxxxxe303.mediapackage.us-west-2.amazonaws.com/out/v1/c78bcxxxxxxxxxxxxxxxxxxxxxx45/index.m3u8</p>
<p>c.  如果不能看到直播视频流，请查看并确认MediaLive Channel 和MediaPackage Channel 的network in&amp;out都有流量</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/6.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/6.png" alt="6" width="792" height="856" /></a> <a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/7.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/7.png" alt="7" width="780" height="830" /></a></p>
<blockquote>
<h4>MediaLive Channel网络状态</h4>
</blockquote>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/8-1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/8-1.png" alt="8-1" width="1014" height="976" /></a> <a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/8-2.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/8-2.png" alt="8-2" width="996" height="940" /></a></p>
<blockquote>
<h4>MediaPackage Channel网络状态</h4>
</blockquote>
<h3>5.  使用CloudFront创建CDN发布</h3>
<p>a.  登陆AWS Global 控制台，在Services中选择CloudFront，选择Distributions，点击Create Distribution</p>
<p>b.  使用Web方式，点击Get Start</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/9.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/9.png" alt="9" width="1207" height="335" /></a></p>
<p>c.  在Origin Domain Name中填入第2步创建的MediaPackage end point域名，例如：https://103xxxxxxxxe303.mediapackage.us-west-2.amazonaws.com</p>
<p>在Origin Path 中填入MediaPackage end point中的路径，例如： /out/v1/c78bcxxxxxxxxxxxxxxxxxxxxxx45</p>
<p>Origin Protocol Policy 选择HTTPS only</p>
<p>其他选项可以不修改，（更多CloudFront相关信息，请参阅https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/cf_dg.pdf）</p>
<p>点击Create Distribution</p>
<p>d.  等待创建完成后，status由In progress变为Deployed，即可使用CLoudFront分配的域名，加上index.m3u8即可例如d2xxxxxxxxxxx4n4m.cloudfront.net/index.m3u8</p>
<p>使用VLC player打开这个地址即可播放，这样就完成了播放流的CDN发布，CloudFront会选择距你延时最小的边缘站点进行加速。</p>
<p>&nbsp;</p>
<p>现在，您的直播业务就已经完成了构建，并具有全球分发和加速能力。AWS媒体服务具备内置可靠性和弹性。该服务可透明地管理多个可用区中的资源，并自动监控其运行状况，以便在不中断实时频道的情况下检测并解决任何潜在问题。借助 AWS 媒体服务，您可以获得比通常用于广播工作负载的基础设施更高的可靠性</p>
<p>MediaLive输入支持SD, HD, UHD，支持H.264 (AVC), HEVC (H.265), MPEG-2视频编码格式，支持AAC, Dolby Digital, Dolby Digital Plus, MPEG Audio, PCM音频格式，支持AFD，支持帧率控制，支持GOP结构设置，支持多种编码profile，支持多种字幕标准，支持时码插入，支持数字版权管理等等。</p>
<p>除了MediaLive+MediaPackage，您还可以使用MediaConvert做视频文件转码，使用MediaStore做内容存储，使用MediaTailor做广告插播。AWS媒体服务与包括 Amazon CloudFront、AWS CloudFormation、Amazon CloudWatch 在内的补充性 AWS 服务，以及适用于安全、管理和生产的第三方应用程序相集成，提供一整套工具来处理和交付实时的按需视频内容。最重要的是，AWS 媒体服务使您专注于内容，而非管理复杂的基础设施，让您能为观众提供卓越的体验。</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e4%bd%bf%e7%94%a8aws-%e5%aa%92%e4%bd%93%e6%9c%8d%e5%8a%a1%e6%9e%84%e5%bb%ba%e5%85%a8%e7%90%83%e7%9b%b4%e6%92%ad%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88/">使用AWS 媒体服务构建全球直播解决方案</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/%e4%bd%bf%e7%94%a8aws-%e5%aa%92%e4%bd%93%e6%9c%8d%e5%8a%a1%e6%9e%84%e5%bb%ba%e5%85%a8%e7%90%83%e7%9b%b4%e6%92%ad%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>建立 VPC 并基于参数动态创建子网的 CloudFormation 模板</title>
		<link>https://www.fuwuqiok.com/%e5%bb%ba%e7%ab%8b-vpc-%e5%b9%b6%e5%9f%ba%e4%ba%8e%e5%8f%82%e6%95%b0%e5%8a%a8%e6%80%81%e5%88%9b%e5%bb%ba%e5%ad%90%e7%bd%91%e7%9a%84-cloudformation-%e6%a8%a1%e6%9d%bf/</link>
		<comments>https://www.fuwuqiok.com/%e5%bb%ba%e7%ab%8b-vpc-%e5%b9%b6%e5%9f%ba%e4%ba%8e%e5%8f%82%e6%95%b0%e5%8a%a8%e6%80%81%e5%88%9b%e5%bb%ba%e5%ad%90%e7%bd%91%e7%9a%84-cloudformation-%e6%a8%a1%e6%9d%bf/#comments</comments>
		<pubDate>Wed, 21 Nov 2018 06:36:45 +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[linux系统代维]]></category>
		<category><![CDATA[服务器代维合同]]></category>
		<category><![CDATA[服务器代维护]]></category>
		<category><![CDATA[服务器安全代维]]></category>
		<category><![CDATA[服务器安全设置]]></category>
		<category><![CDATA[服务器迁移]]></category>
		<category><![CDATA[服务器运维]]></category>
		<category><![CDATA[系统安全代维]]></category>
		<category><![CDATA[网站代维]]></category>
		<category><![CDATA[网站防挂马]]></category>
		<category><![CDATA[建立 VPC 并基于参数动态创建子网的 CloudFormation 模板]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=3869</guid>
		<description><![CDATA[<p>创建 Subnet 在大型企业云迁移项目组，经常会遇到企业将线下数据中心的子网迁移到 AWS 云上。线下的子网 [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e5%bb%ba%e7%ab%8b-vpc-%e5%b9%b6%e5%9f%ba%e4%ba%8e%e5%8f%82%e6%95%b0%e5%8a%a8%e6%80%81%e5%88%9b%e5%bb%ba%e5%ad%90%e7%bd%91%e7%9a%84-cloudformation-%e6%a8%a1%e6%9d%bf/">建立 VPC 并基于参数动态创建子网的 CloudFormation 模板</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<h2>创建 Subnet</h2>
<p>在大型企业云迁移项目组，经常会遇到企业将线下数据中心的子网迁移到 AWS 云上。线下的子网划分一般会根据子网的使用功能不同进行划分，例如防火墙子网、负载均衡器子网、配合部署高可用架构的心跳线子网、应用系统子网等。不同企业的子网划分规则、子网的掩码大小和路由规则均不相同，并且在迁移后的系统上线后，企业还会经常划分新的网段以部署新的应用系统，这就需要有一个通用的模板来协助网络管理人员简化工作流程，提高工作效率。在我所经历过的一个项目中，生产 VPC 的子网划分有47个之多，且子网掩码有/24, /25, /26. 27/, /28等不同，在添加新的子网时，需要仔细计算新的子网 CIDR 以及为新建子网配置路由表。</p>
<h2>动态创建子网的方案概述</h2>
<p>因为 CloudFormation 不支持程序逻辑，只支持静态资源的创建，所以在本方案中采用 AWS Lambda 来基于输入参数动态创建不同类型的子网。我们定义了3种不同类型的子网：公共子网 (Public Subnet)， 外部子网 (External Subnet)，内部子网 (Internal Subnet) Subnet。<br />
公共子网的路由表有如下路由信息：</p>
<table border="1">
<tbody>
<tr>
<td><strong>Destination</strong></td>
<td><strong>Target</strong></td>
</tr>
<tr>
<td>0.0.0.0/0</td>
<td>igw-xxxxx (Internet Gateway)</td>
</tr>
</tbody>
</table>
<p>部署在公共子网中的服务器可以直接与 Internet 进行通信（缺省分配 Internet IP 地址，并且有指向 Internet Gateway 的缺省路由）。<br />
外部子网的路由表有如下路由信息：</p>
<table border="1">
<tbody>
<tr>
<td width="293"><strong>Destination</strong></td>
<td width="192"><strong>Target</strong></td>
</tr>
<tr>
<td width="293">0.0.0.0/0</td>
<td width="192">nat-xxxxx (NAT gateway)</td>
</tr>
<tr>
<td width="293">pl-xxxxxx (com.amazonaws.cn-north-1.s3)</td>
<td width="192">vpce-xxxxxxx</td>
</tr>
<tr>
<td width="293">pl-xxxx (com.amazonaws.cn-north-1.dynamodb)</td>
<td width="192">vpce-xxxx</td>
</tr>
</tbody>
</table>
<p>部署在外部子网的服务器可以通过 NAT Gateway 与 Internet 进行通信，并且可以不通过互联网访问 S3 和 dynamodb。<br />
内部子网的路由表有如下路由信息：</p>
<table border="1">
<tbody>
<tr>
<td width="293"><strong>Destination</strong></td>
<td width="192"><strong>Target</strong></td>
</tr>
<tr>
<td width="293">pl-xxxxxx (com.amazonaws.cn-north-1.s3)</td>
<td width="192">vpce-xxxxxxx</td>
</tr>
<tr>
<td width="293">pl-xxxx (com.amazonaws.cn-north-1.dynamodb)</td>
<td width="192">vpce-xxxx</td>
</tr>
</tbody>
</table>
<p>部署在内部子网的服务器不能访问 Internet，但是能直接访问 S3 和 dynamodb。<br />
本方案使用2个 CloudFomation 模板， 第一个模板(CreateBaseVpc.json)创建共享资源，例如 VPC、Internet Gateway、公共子网 (Public Subnet) 路由表、在各个可用区内创建公共子网、NAT Gateway、 VPC Endpoint (S3 endpoint和DynamoDB endpoint)和创建外部子网路由表。在这个模板中还创建了3个 Lambda 功能函数：</p>
<ul>
<ul>
<li>
<h4>SharedInfra – 对应 python 程序 create_shared_infra.zip</h4>
</li>
</ul>
</ul>
<p>功能：根据输入的参数，在程序运行的AWS Region的每个AZ内创建公共子网，将在 CreateBaseVpc.json 模板中建立的公共子网路由表关联到每个公共子网。 在每个公共子网内创建 NAT Gateway 和VPC endpoint，创建内部子网路由表，创建外部子网路由表。删除已经创建完成的资源，包括：子网、路由表、vpc endpoint、NAT Gateway、Elastic IP。</p>
<ul>
<ul>
<li>
<h4>CreateExternalRoute – 对应 python 程序 create_external_route.zip</h4>
</li>
</ul>
</ul>
<p>功能：创建外部子网路由表中的路由。因为 NAT Gateway 的创建速度比较慢，创建路由时一定要等待 NAT Gateway 的状态变成 available 后才可以成功。如果将此功能与 SharedInfra 放在一起，在执行的时候容易发生 Lambda 运行超时错误。删除已经创建的路由信息。</p>
<ul>
<ul>
<li>
<h4>SubnetAutomation – 对应 python 程序 subnet_creation.zip</h4>
</li>
</ul>
</ul>
<p>功能：根据输入的参数，计算网路的子网掩码，创建公共子网、外部子网和内部子网，并将在公共子网路由表、内部子网路由表和外部子网路由表关联到相应的子网上。删除已经创建完成子网。在 CreateBaseVpc.json 模板运行时，通过创建用户定义资源 ExternalRouteCreation和SharedInfraCreation 分别触发 Lambda 功能 CreateExternalRoute 和 SharedInfra，从而完成共享资源的创建。并提供了 SubnetAutomation 的功能函数 ARN，供运行第二个模板时调用。</p>
<p>第二个模板 (SubnetAuto.json) 创建动态资源，例如根据输入参数的不同计算子网掩码、创建子网并分配路由表。</p>
<p>本方案中创建子网时的输入参数并不需要 CIDR，只需要指定子网要提供的可用 IP 地址的个数即可，程序在计算可用 IP 地址时已经排除了 AWS 子网子网中保留的5个 IP 地址。例如：如果要创建有50个 IP 的子网，则子网掩码是/26，共计有64-5=59个可用IP地址；如果要创建有16个 IP 的子网，则子网掩码是/27，共计有32-5=27个可用 IP 地址。</p>
<p>创建子网的参数输入规则如下：</p>
<ol>
<li>每个子网包含4个部分，之间使用“:”分隔 – 功能: IP 地址数量:可用区:子网类型</li>
<li>可用区根据Region的不同可选项为：1a,1b,1c,1d,1e等</li>
<li>子网类型的可选项为：p（公共子网），e（外部子网）或者 i（内部子网）</li>
<li>不同子网之间使用“,”分隔。</li>
</ol>
<h2>安装和运行</h2>
<ol>
<ol>
<li>在浏览器中输入：<a href="https://github.com/shaneliuyx/autosubnet_creation">https://github.com/shaneliuyx/autosubnet_creation</a>， 下载2个 json 文件和3个 zip 文件。将3个 zip 文件上传到一个 S3 存储桶中。</li>
<li>打开 AWS 控制台，并选择 CloudFormation，选择存储在本地的 json 文件 json，运行 CloudFormation 模板。</li>
<li>假设输入缺省的 PublicSubnetCapacity 和 VpcCidr 如下：</li>
</ol>
</ol>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/vpc-cloudformation-template1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/vpc-cloudformation-template1.png" alt="vpc-cloudformation-template1" width="878" height="399" /></a></p>
<ol>
<ol>
<li>选择 Next，直至 AWS 资源开始创建</li>
<li>最终运行结果如下：</li>
</ol>
</ol>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/vpc-cloudformation-template2.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/vpc-cloudformation-template2.png" alt="vpc-cloudformation-template2" width="878" height="387" /></a></p>
<p>创建的 Subnet 如下：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/vpc-cloudformation-template3.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/vpc-cloudformation-template3.png" alt="vpc-cloudformation-template3" width="878" height="69" /></a></p>
<p>公共子网路由表：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/vpc-cloudformation-template4.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/vpc-cloudformation-template4.png" alt="vpc-cloudformation-template4" width="560" height="133" /></a></p>
<ol>
<ol>
<li>打开 AWS 控制台，并选择 CloudFormation，选择存储在本地的 json 文件 json，运行 CloudFormation 模板。</li>
<li>输入 SubnetParameters：web1:50:1a:p,web1:50:1b:p,app1:50:1a:e,app1:50:1b:e,db1:50:1a:i,db1:50:1b:i</li>
</ol>
</ol>
<p>这将创建6个子网，其中 Web、APP 和 DB 各2个子网，分布在2个 AZ 中:</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/vpc-cloudformation-template5.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/vpc-cloudformation-template5.png" alt="vpc-cloudformation-template5" width="878" height="346" /></a></p>
<ol>
<ol>
<li>运行结果如下:</li>
</ol>
</ol>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/vpc-cloudformation-template6.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/vpc-cloudformation-template6.png" alt="vpc-cloudformation-template6" width="878" height="204" /></a></p>
<p>创建的子网：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/vpc-cloudformation-template7.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/vpc-cloudformation-template7.png" alt="vpc-cloudformation-template7" width="878" height="69" /></a><br />
<a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/vpc-cloudformation-template8.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/vpc-cloudformation-template8.png" alt="vpc-cloudformation-template8" width="878" height="72" /></a><br />
<a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/vpc-cloudformation-template9.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/vpc-cloudformation-template9.png" alt="vpc-cloudformation-template9" width="878" height="70" /></a></p>
<p>内部子网路由表：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/vpc-cloudformation-template10.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/vpc-cloudformation-template10.png" alt="vpc-cloudformation-template10" width="650" height="270" /></a></p>
<p>外部子网路由表：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/vpc-cloudformation-template11.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/vpc-cloudformation-template11.png" alt="vpc-cloudformation-template11" width="650" height="305" /></a></p>
<p>假设现在还要创建一个包含16个有效 IP 的公共子网用于部署网络设备，可以再运行一次SubnetAuto.json，输出参数：net1:16:1a:p,net1:16:1b:p<br />
则可以创建出如下子网：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/vpc-cloudformation-template12.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/vpc-cloudformation-template12.png" alt="vpc-cloudformation-template12" width="878" height="68" /></a></p>
<h2>与其他 CloudFormation 模板配合使用，进行 Landing Zone 部署</h2>
<p>Landing Zone 中文名称翻译成着陆区，是指 AWS 的基本环境，用户在其上部署安全和运维流程。Landing Zone 的内容包含：账户结构、账户安全基线、网络结构和AWS用户访问管理。下面简单的介绍一下 AWS Landing Zone 的最佳实践。</p>
<ul>
<ul>
<li>
<h4>账户结构</h4>
</li>
</ul>
</ul>
<p>AWS 建议账户的划分与企业的组织架构和运维部门的组织架构一致。例如按照如下结构划分账户：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/vpc-cloudformation-template13.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/vpc-cloudformation-template13.png" alt="vpc-cloudformation-template13" width="400" height="451" /></a></p>
<ul>
<ul>
<li>
<h4>账户安全基线</h4>
</li>
</ul>
</ul>
<p>AWS 建议在所有账户内打开 CloudTrail 和 AWS Config 功能。所有日志信息要复制到安全账户内的 S3 存储桶中。建立跨账户访问的 Auditor 角色。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/vpc-cloudformation-template14.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/vpc-cloudformation-template14.png" alt="vpc-cloudformation-template14" width="400" height="433" /></a></p>
<ul>
<ul>
<li>
<h4>网络结构</h4>
</li>
</ul>
</ul>
<p>AWS 建议删除缺省 VPC，建立客户自己定义的 VPC。建立共享 VPC（包含目录服务、邮件服务器等），应用 VPC 与共享 VP C建立 Peer 关系。通过 VPN 或者 Direct Connect 与线下的数据中心建立网络连接，或者采用 Transit VPC（参考 <a href="https://amazonaws-china.com/answers/networking/aws-global-transit-network/">https://aws.amazon.com/answers/networking/aws-global-transit-network/</a> ，<a href="https://amazonaws-china.com/blogs/aws/aws-solution-transit-vpc/">https://aws.amazon.com/blogs/aws/aws-solution-transit-vpc/</a> ）建立集中的网络控制机制。网络输入输出的安全控制（建立堡垒机，建立 Security Group、网络 ACL 或者第三方的防火墙工具）</p>
<ul>
<ul>
<li>
<h4>AWS 用户访问管理</h4>
</li>
</ul>
</ul>
<p>包括建议基于 SAML 的单点登录，建立跨账户角色访问机制等。</p>
<p>上述介绍的建立 VPC 和子网的方法可以看成建立 Landing Zone 的基础，在此之上，我们还可以使用 CloudFormation 建立堡垒机，打开 CloudTrail 和 AWS config，建立不同账户间的日志（log）复制机制，建立 Config Rule 进行合规性检查等等。 AWS 已经开发出多个 QuickStart CloudFormation 脚本协助用户完成上述工作，但是这些脚本在中国区（BJS）运行时需要做一些修改。下表列出了一些可用的资源，其中中国区部署模板是我针对中国区的特点修改过的，可以在BJS正常运行。</p>
<table border="1">
<tbody>
<tr>
<td></td>
<td></td>
<td><strong>原始代码</strong> <strong>参考</strong></td>
<td><strong>AWS </strong><strong>中国区部署模板</strong></td>
</tr>
<tr>
<td rowspan="5"><strong>账户安全基线</strong></td>
<td>配置 AWS config 和 CloudTrail</td>
<td rowspan="3"><a href="https://github.com/aws-quickstart/quickstart-compliance-pci">https://github.com/aws-quickstart/quickstart-compliance-pci</a></td>
<td><a href="https://s3.cn-north-1.amazonaws.com.cn/shane/quickstart-security/logging.template">https://s3.cn-north-1.amazonaws.com.cn/shane/quickstart-security/logging.template</a></td>
</tr>
<tr>
<td>配置 IAM 角色</td>
<td><a href="https://s3.cn-north-1.amazonaws.com.cn/shane/quickstart-security/iam.template">https://s3.cn-north-1.amazonaws.com.cn/shane/quickstart-security/iam.template</a></td>
</tr>
<tr>
<td>配置 Config rules</td>
<td><a href="https://s3.cn-north-1.amazonaws.com.cn/shane/quickstart-security/config-rules.template">https://s3.cn-north-1.amazonaws.com.cn/shane/quickstart-security/config-rules.template</a></td>
</tr>
<tr>
<td>将 CloudWatch Log 转储到S3存储桶</td>
<td><a href="https://github.com/alertlogic/cloudwatch-logs-s3-export#setup">https://github.com/alertlogic/cloudwatch-logs-s3-export#setup</a></td>
<td><a href="https://s3.cn-north-1.amazonaws.com.cn/shane/cwl-s3-export-new.template">https://s3.cn-north-1.amazonaws.com.cn/shane/cwl-s3-export-new.template</a></p>
<p>使用说明：<a href="https://s3.cn-north-1.amazonaws.com.cn/shane/User+Guide+-+Copy+VPC+Flow+Logs+to+S3+CloudFormation+Templates.docx">https://s3.cn-north-1.amazonaws.com.cn/shane/User+Guide+-+Copy+VPC+Flow+Logs+to+S3+CloudFormation+Templates.docx</a></td>
</tr>
<tr>
<td>将一个账户下的 S3 存储桶复制到另一个账户的 S3</td>
<td></td>
<td><a href="https://s3.cn-north-1.amazonaws.com.cn/shane/s3-to-s3/1source.json">https://s3.cn-north-1.amazonaws.com.cn/shane/s3-to-s3/1source.json</a><a href="https://s3.cn-north-1.amazonaws.com.cn/shane/s3-to-s3/2target.json">https://s3.cn-north-1.amazonaws.com.cn/shane/s3-to-s3/2target.json</a><a href="https://s3.cn-north-1.amazonaws.com.cn/shane/s3-to-s3/3source.json">https://s3.cn-north-1.amazonaws.com.cn/shane/s3-to-s3/3source.json</a></p>
<p>使用说明：<a href="https://s3.cn-north-1.amazonaws.com.cn/shane/s3-to-s3/User+Guide+-+S3+to+S3+Replication+CloudFormation+Templates.docx">https://s3.cn-north-1.amazonaws.com.cn/shane/s3-to-s3/User+Guide+-+S3+to+S3+Replication+CloudFormation+Templates.docx</a></td>
</tr>
<tr>
<td rowspan="2"><strong>网络结构</strong></td>
<td>配置 Linux Bastion</td>
<td><a href="https://github.com/aws-quickstart/quickstart-linux-bastion">https://github.com/aws-quickstart/quickstart-linux-bastion</a></td>
<td><a href="https://s3.cn-north-1.amazonaws.com.cn/shane/linux-bastion.template">https://s3.cn-north-1.amazonaws.com.cn/shane/linux-bastion.template</a>不支持 CentOS</td>
</tr>
<tr>
<td>建立 VPC 和分配 Subnet</td>
<td><a href="https://github.com/aws-quickstart/quickstart-aws-vpc">https://github.com/aws-quickstart/quickstart-aws-vpc</a></td>
<td><a href="https://github.com/shaneliuyx/autosubnet_creation">https://github.com/shaneliuyx/autosubnet_creation</a></td>
</tr>
</tbody>
</table>
<h3></h3>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e5%bb%ba%e7%ab%8b-vpc-%e5%b9%b6%e5%9f%ba%e4%ba%8e%e5%8f%82%e6%95%b0%e5%8a%a8%e6%80%81%e5%88%9b%e5%bb%ba%e5%ad%90%e7%bd%91%e7%9a%84-cloudformation-%e6%a8%a1%e6%9d%bf/">建立 VPC 并基于参数动态创建子网的 CloudFormation 模板</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/%e5%bb%ba%e7%ab%8b-vpc-%e5%b9%b6%e5%9f%ba%e4%ba%8e%e5%8f%82%e6%95%b0%e5%8a%a8%e6%80%81%e5%88%9b%e5%bb%ba%e5%ad%90%e7%bd%91%e7%9a%84-cloudformation-%e6%a8%a1%e6%9d%bf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AWS Firewall Manager – 您的 Web 应用程序资产的集中管理解决方案</title>
		<link>https://www.fuwuqiok.com/aws-firewall-manager-%e6%82%a8%e7%9a%84-web-%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e8%b5%84%e4%ba%a7%e7%9a%84%e9%9b%86%e4%b8%ad%e7%ae%a1%e7%90%86%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88/</link>
		<comments>https://www.fuwuqiok.com/aws-firewall-manager-%e6%82%a8%e7%9a%84-web-%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e8%b5%84%e4%ba%a7%e7%9a%84%e9%9b%86%e4%b8%ad%e7%ae%a1%e7%90%86%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88/#comments</comments>
		<pubDate>Wed, 21 Nov 2018 06:27:37 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[linux服务器代维]]></category>
		<category><![CDATA[服务器代维]]></category>
		<category><![CDATA[服务器代维护]]></category>
		<category><![CDATA[服务器维护]]></category>
		<category><![CDATA[服务器迁移]]></category>
		<category><![CDATA[服务器运维]]></category>
		<category><![CDATA[网站代维]]></category>
		<category><![CDATA[网站防挂马]]></category>
		<category><![CDATA[AWS Firewall Manager – 您的 Web 应用程序资产的集中管理解决方案]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=3825</guid>
		<description><![CDATA[<p>分布式和集中控制之间经常会有矛盾，尤其是在大型组织中。分布式控制模型允许团队快速移动并响应专业化的本地需求，而 [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/aws-firewall-manager-%e6%82%a8%e7%9a%84-web-%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e8%b5%84%e4%ba%a7%e7%9a%84%e9%9b%86%e4%b8%ad%e7%ae%a1%e7%90%86%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88/">AWS Firewall Manager – 您的 Web 应用程序资产的集中管理解决方案</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>分布式和集中控制之间经常会有矛盾，尤其是在大型组织中。分布式控制模型允许团队快速移动并响应专业化的本地需求，而集中模型可对涉及所有团队的全球动议和挑战进行正确级别的监督。</p>
<p>我们亲身经历过这种挑战，当时 AWS 客户增长到了临界点，其应用足迹遍及众多 AWS 地区、AWS 账户、开发团队和应用程序。AWS 提高了他们的灵活性和响应能力，又能让他们在最适合的地点部署资源，这让他们非常满意。而在安全性和合规性方面，这种多元化和规模带来了新的挑战。创新自由必须在保护重要数据和产生威胁时快速响应的需求之间达到平衡。</p>
<p>在过去几年中，我们为客户提供了越来越多的保护选项，包括 <a href="https://amazonaws-china.com/blogs/aws/new-aws-waf/">AWS WAF</a> 和 <a href="https://amazonaws-china.com/blogs/aws/aws-shield-protect-your-applications-from-ddos-attacks/">AWS Shield</a>。我们的客户将所有这些选项用于各种用途，并要求能够从单一的中央地点管理它们。</p>
<p><strong>遇到 AWS Firewall Manager</strong><br />
<span title="">AWS Firewall Manager</span> 旨在帮助这些客户！通过它，这些客户可以自由地使用多个 AWS 账户并在所需的任何地区托管应用程序，同时保持对其组织的安全设置和配置文件的集中控制。开发人员完成开发，创新人员完成创新，而安全团队则能够对潜在威胁和实际攻击做出快速、一致的全局响应。</p>
<p>通过跨账户和应用程序的自动化策略实施，您的安全团队可以确信当他们使用 <span title="">Firewall Manager</span> 时，新的和现有的应用程序都符合组织级的安全策略。它们可找到未衡量的应用程序和 AWS 资源，快速地使其达到合规。</p>
<p><span title="">Firewall Manager</span> 围绕包含 WAF 规则集和可选 AWS Shield 高级保护的命名策略构建。每个策略适用于按账户、资源类型、资源标识符或标签指定的一组特定 AWS 资源。策略可以自动应用于所有匹配的资源，也可应用于您选择的子集。策略可包括从组织内部获得的 WAF 规则，也可包括 AWS 合作伙伴（例如，Imperva、F5、Trend Micro 和其他 AWS Marketplace 供应商）创建的规则。这让您的安全团队能够将其现有的本地安全方法复制到云中。</p>
<p><strong>入门向导</strong><br />
<span title="">Firewall Manager</span> 有三个前提条件：</p>
<p><strong>AWS Organizations</strong> – 您的组织必须使用 <a title="" href="https://amazonaws-china.com/organizations/">AWS Organizations</a> 管理账户且必须启用<a href="https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_org_support-all-features.html">所有功能</a>。要了解更多信息，请阅读<a href="https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_create.html">创建组织</a>。</p>
<p><strong>Firewall Administrator</strong> – 您必须指定组织中的一个 AWS 账户作为 Firewall Manager 的管理员。这样将赋予该账户在组织中部署 AWS WAF 规则的权限。</p>
<p><strong>AWS Config</strong> – 您必须为组织中的所有账户启用 <a title="" href="https://amazonaws-china.com/config/">AWS Config</a>，以使 <span title="">Firewall Manager</span> 能够检测到新创建的资源（您可以使用 <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-sampletemplates.html">StackSets 示例模板</a>页面上的<strong>启用 AWS Config</strong> 模板来处理这件事）。要了解更多信息，请阅读 <a href="https://docs.aws.amazon.com/config/latest/developerguide/getting-started.html">AWS Config 入门</a>。</p>
<p>由于我没有自己的企业，因此由我的同事帮我创建一些测试账户！当我在主账户中打开 <span title="">Firewall Manager</span> 控制台时，我可以看到关于前两个前提条件的基础：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/fm_status_pre_1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/fm_status_pre_1.png" alt="fm_status_pre_1" width="742" height="381" /></a></p>
<p>“<strong>了解更多…</strong>”按钮可显示管理员的账户 ID：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/fms_admin_id_1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/fms_admin_id_1.png" alt="fms_admin_id_1" width="708" height="343" /></a></p>
<p>我切换到该账户（在实际情况中，我不太可能拥有主账户和此账户的访问权限），打开控制台，看到我现在已经满足了前提条件。我单击“<strong>创建策略</strong>”继续：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/fms_status_pre_ok_1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/fms_status_pre_ok_1.png" alt="fms_status_pre_ok_1" width="746" height="369" /></a></p>
<p>控制台为我提供了流程概要。我需要创建规则和规则组，定义包含规则组的策略，定义策略范围，然后实际创建策略。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/fms_setup_p1_1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/fms_setup_p1_1.png" alt="fms_setup_p1_1" width="710" height="523" /></a></p>
<p>在页面底部，我选择为<span title="">美国东部（弗吉尼亚北部）</span>地区创建新策略和规则组，并单击“<strong>下一步</strong>”：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/fms_setup_p1_bottom_1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/fms_setup_p1_bottom_1.png" alt="fms_setup_p1_bottom_1" width="610" height="391" /></a></p>
<p>然后，我为自己的规则指定条件，从下列选项中做出选择：</p>
<ul>
<li>跨站脚本</li>
<li>地理起源</li>
<li>SQL 注入</li>
<li>IP 地址或范围</li>
<li>大小限制</li>
<li>字符串或正则表达式</li>
</ul>
<p>例如，我可以创建阻挡恶意 IP 地址的条件（<a href="https://amazonaws-china.com/answers/security/aws-waf-security-automations/">此 AWS 解决方案</a>为您展示如何将第三方声誉列表用于 WAF 及其益处）：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/fms_make_ip_block_2.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/fms_make_ip_block_2.png" alt="fms_make_ip_block_2" width="810" height="931" /></a></p>
<p>我将保持此单一设置，但是规则中可包含多个条件。全部添加之后，我单击“<strong>下一步</strong>”继续。现在，我已准备好创建自己的规则，我单击“<strong>创建</strong><strong>规则</strong>”（我可以随后根据需要添加更多条件）：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/fms_create_rule_2.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/fms_create_rule_2.png" alt="fms_create_rule_2" width="610" height="385" /></a></p>
<p>我为自己的规则命名 (<strong>BlockExcludedIPs</strong>)，输入 CloudWatch 指标名称，并添加我的条件 (<strong>ExcludeIPs</strong>)，然后单击“<strong>创建</strong>”：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/fms_create_rule_allover_1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/fms_create_rule_allover_1.png" alt="fms_create_rule_allover_1" width="800" height="896" /></a></p>
<p>我可以创建更多规则，并将其包含在同一个规则组中。同样，我将保持此单一设置，并单击“<strong>下一步</strong>”继续：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/fms_my_rules_rule_1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/fms_my_rules_rule_1.png" alt="fms_my_rules_rule_1" width="610" height="492" /></a></p>
<p>我输入组的名称，选择构成组的规则，然后单击“<strong>创建</strong>”：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/fms_create_rule_group_3.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/fms_create_rule_group_3.png" alt="fms_create_rule_group_3" width="610" height="545" /></a></p>
<p>我现在有两个规则组（账户中已有 testRuleGroup）。我命名自己的策略，并单击“<strong>下一步</strong>”继续：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/fms_create_policy_and_add_groups_covfefe_1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/fms_create_policy_and_add_groups_covfefe_1.png" alt="fms_create_policy_and_add_groups_covfefe_1" width="610" height="531" /></a></p>
<p>现在，我定义自己的策略范围。我选择要保护的资源类型，并指示应在何时应用策略：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/fms_def_policy_scope_4.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/fms_def_policy_scope_4.png" alt="fms_def_policy_scope_4" width="603" height="482" /></a></p>
<p>我还可以使用标签包括或排除资源：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/fms_tags_for_policy_1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/fms_tags_for_policy_1.png" alt="fms_tags_for_policy_1" width="547" height="358" /></a></p>
<p>定义了策略范围之后，我单击“<strong>下一步</strong>”进行审核，然后单击“<strong>创建策略</strong>”：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/fms_review_it_2.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/fms_review_it_2.png" alt="fms_review_it_2" width="810" height="653" /></a></p>
<p>现在，策略已经生效，其范围内的 ALB 最初不合规：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/fms_non_com_1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/fms_non_com_1.png" alt="fms_non_com_1" width="810" height="318" /></a></p>
<p>几分钟之内，<span title="">Firewall Manager</span> 就会应用该策略，并向我提供状态报告：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/fms_applied_1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/fms_applied_1.png" alt="fms_applied_1" width="800" height="473" /></a></p>
<p><strong>现在开始使用 AWS Firewall Manager</strong><br />
您现在可以开始使用 <span title="">AWS Firewall Manager</span> 了！</p>
<p>如果您正在使用 AWS Shield Advanced，则可以访问 AWS Firewall Manager 和 AWS WAF 而无需额外付费。否则，将会每月针对每个区域中的每条策略收费，同时还收取 WAF WebACLs、WAF 规则和 AWS Config 规则的正常费用。</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/aws-firewall-manager-%e6%82%a8%e7%9a%84-web-%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e8%b5%84%e4%ba%a7%e7%9a%84%e9%9b%86%e4%b8%ad%e7%ae%a1%e7%90%86%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88/">AWS Firewall Manager – 您的 Web 应用程序资产的集中管理解决方案</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/aws-firewall-manager-%e6%82%a8%e7%9a%84-web-%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e8%b5%84%e4%ba%a7%e7%9a%84%e9%9b%86%e4%b8%ad%e7%ae%a1%e7%90%86%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>全站加速，Amazon CloudFront 配置</title>
		<link>https://www.fuwuqiok.com/%e5%85%a8%e7%ab%99%e5%8a%a0%e9%80%9f%ef%bc%8camazon-cloudfront-%e9%85%8d%e7%bd%ae/</link>
		<comments>https://www.fuwuqiok.com/%e5%85%a8%e7%ab%99%e5%8a%a0%e9%80%9f%ef%bc%8camazon-cloudfront-%e9%85%8d%e7%bd%ae/#comments</comments>
		<pubDate>Fri, 17 Aug 2018 02:54:32 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<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[服务器迁移]]></category>
		<category><![CDATA[系统安全代维]]></category>
		<category><![CDATA[网站代维]]></category>
		<category><![CDATA[网站防挂马]]></category>
		<category><![CDATA[全站加速，Amazon CloudFront 配置]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=3762</guid>
		<description><![CDATA[<p>本文适合希望使用 CloudFront 对网站、视频进行加速的初始用户及有一定使用经验的用户，涵盖如何配置及优 [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e5%85%a8%e7%ab%99%e5%8a%a0%e9%80%9f%ef%bc%8camazon-cloudfront-%e9%85%8d%e7%bd%ae/">全站加速，Amazon CloudFront 配置</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>本文适合希望使用 CloudFront 对网站、视频进行加速的初始用户及有一定使用经验的用户，涵盖如何配置及优化，内容难度200~300。</p>
<h3><strong>背景</strong></h3>
<p>随着移动互联网的发展，越来越多的图片分享、短视频、在线直播等应用越来越火，如何安全、经济高效、低延迟的将内容分发到终端用户受到开发者越来越多的关注。内容分发网络（CDN）是为解决互联网访问拥塞的问题而生，通过使用大量更靠近终端用户的边缘节点向终端用户提供服务以加速内容的分发，因此在应用系统前端部署 CDN 成为内容加速分发的不二选择。</p>
<h3><strong>一、什么是 Amazon CloudFront</strong></h3>
<p>Amazon CloudFront 是一种全球内容分发网络服务，可以安全地以低延迟和高传输速度向浏览者分发数据、视频、应用程序和 API。CloudFront 与 AWS  与多种 AWS 产品集成，如用于 DDoS 缓解的 AWS Shield、应用程序防火墙 AWS WAF、 Amazon S3、 Elastic Load Balancing、 Amazon EC2 以及 Amazon Route 53，以及可在 AWS 全球基础设施运行用户代码的 Lambda@Edge。</p>
<p>截止目前（2018年7月），Amazon CloudFront 在26个国家/地区的59个城市中设有131个接入点（121个边缘站点和11个区域性边缘缓存站点）。</p>
<p>举例说明，当客户端发起对 www.customer.com 的访问时，首先需要 DNS系统解析出该域名对应的主机 IP，通过本地 ISP DNS 递归查询到 customer.com 的 DNS 域名服务器并了解到该域名是指向了 xxx.cloudfront.net，进一步解析 xxx.cloudfront.net，CloudFront 的 DNS 域名服务器会根据请求来源的 IP 等信息，返回适合当前该客户端访问的边缘节点的主机 IP 如1.1.1.1，最终该客户端向1.1.1.1发出请求。如果该边缘节点已经缓存了该客户端请求的内容（图片、视频等静态文件），则直接返回给客户端，如果未缓存，则首先回源取回该内容，并存储在边缘节点，以便下次客户端对该内容请求时可以直接返回该内容。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/08/cloudf1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/08/cloudf1.png" alt="cloudf1" width="975" height="443" /></a></p>
<p>更好的 CDN 性能表现带来更多的访问流量，以及更好的用户体验，下面我们将介绍如何配置以及优化建议。</p>
<h3><strong>二、如何配置 CloudFront Distribution</strong></h3>
<p>下面介绍下如何为自己的应用配置 CloudFront，实现网站访问加速。</p>
<p>在开始之前，首先简单介绍下 CloudFront的常见术语。</p>
<p>Distribution：分配是 CloudFront 的基本单元，每个分配有独一的 ID 以及CloudFront 为其分配的域名（类似 abcdefg13456789.cloudfront.net）。目前有 Web 和 RTMP 两种方式的分配， Web 分配主要用于分发静态、动态内容，基于 HTTP/s 协议的媒体文件分发，基于 HLS 协议的互联网直播等。 RTMP 分配主要用于基于 RTMP 协议的视频点播场景，源站必须为 S3 存储桶。本文以 Web 分配为例。</p>
<p>Origin： 源站，顾名思义，是加速的站点，可以是 S3 存储桶，可以是 ELB/EC2，可以是 Elemental MediaStore/MediaPackage，或者是用户自定义的站点（如第三方 IDC 中的 HTTP Web 服务器）。一个分配中可以有多个源站。</p>
<p>Behaviors：行为， CloudFront 通过路径匹配的方式决定执行哪一个缓存行为，一个分配中可以有多个 Behaviors，并且每个 Behaviors 对应一个源站。在 Behaviors 中可以设置缓存 TTL 时间，允许的 HTTP 行为（GET，PUT，POST 等），与 Lambda 关联等等。</p>
<p>本节将涉及如下内容：</p>
<ol>
<li>创建一个分配；</li>
<li>该分配有两个源站，其中一个是创建时添加，一个是后添加。一个源站为ELB，一个源站为 S3 存储桶；</li>
<li>两个 Behaviors，一个是默认 Behaviors 并对应回源 ELB，一个是新加Behaviors 并对应源站 S3 存储桶；</li>
<li>ELB，S3 创建过程不做介绍；</li>
</ol>
<p>&nbsp;</p>
<p>1、进入 CloudFront console，并选择新建 Distribution，选择 Web Distribution。</p>
<p>&nbsp;</p>
<p>2、源站设置</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/08/cloudf3.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/08/cloudf3.png" alt="cloudf3" width="999" height="650" /></a></p>
<p>部分解释如下：</p>
<table border="1">
<tbody>
<tr>
<td colspan="2"><strong>Origin Settings</strong></td>
</tr>
<tr>
<td>Origin Domain Name</td>
<td>源站地址，仅支持域名方式。下拉列表中可以看到帐号里已经创建过的 ELB，S3，Elemental Media Service。</p>
<p>如果是自定义站点，需先给该站点配置域名，不能填写 IP。</td>
</tr>
<tr>
<td>Origin Path</td>
<td>（可选）如果源站内容有多层目录，而又希望回源的时候路径上不体现这些目录，可以在此设置要隐藏的目录层级。</td>
</tr>
<tr>
<td>Origin Protocol Policy</td>
<td>CloudFront 回源协议，可以是 HTTP 或 HTTPS，或者与client 发出请求时一样的协议。注意这儿是 CloudFront 回源站时用的协议，而不是 client 到达 CloudFront PoP 点的协议。</p>
<p>如果选用了 HTTPS，一定要注意源站配置对应回源域名（Origin Domain Name）的 SSL 证书。</td>
</tr>
<tr>
<td>Origin Response Timeout</td>
<td>回源超时时间。</td>
</tr>
<tr>
<td>Origin Custom Headers</td>
<td>（可选）自定义回源 Header，即回源的时候添加的 Header，可以是一些自定义的 Header，通常用于由源站对该 Header 进行检测，如果有该 Header 则提供服务，没有则返回错误码，可用于内容访问的安全加强。</td>
</tr>
</tbody>
</table>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/08/cloudf5.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/08/cloudf5.png" alt="cloudf5" width="789" height="924" /></a></p>
<table border="1" width="959">
<tbody>
<tr>
<td colspan="2"><strong>Default Cache Behavior Settings</strong></td>
</tr>
<tr>
<td>Path Pattern</td>
<td>此时是默认的 Default</td>
</tr>
<tr>
<td>Viewer Protocol Policy</td>
<td>Client 到达 CloudFront 时用的协议，支持 HTTP 和 HTTPS，并且提供重定向 HTTP 到 HTTPS。</td>
</tr>
<tr>
<td>Allowed HTTP Methods</td>
<td>允许的 HTTP 动作，不同的 Behavior 可以配置不同的选项。</td>
</tr>
<tr>
<td>Cache Based on Selected Request Headers</td>
<td>是否按 Header 进行缓存。有 None，Whitelist，All 三个选项。如果只是需要按部分 Header 进行缓存，则选 Whitelist 并把对应的 Header 添加。All 是不做缓存，全部转发回源，此时 TTL 必须设置为0.</p>
<p>通常情况下，CloudFront 会将 client 发来的部分 Header 移除，因此需要按 Header 进行内容区分缓存或者源站需要由 Header 内容进行分别处理的，一定要在此白名单该 Header。</p>
<p>默认情况下，源站收到 CloudFront 发来的请求中的 Host 字段值为 Origin 中设置的源站域名，如果用户的源站需要拿到客户端发来的 Host 字段的值（即用户 CNAME 到该分配的域名），在此处就需要将 Host 添加到白名单，此时源站将收到该字段为客户端发出请求时用的值。</td>
</tr>
<tr>
<td>Object Caching</td>
<td>缓存时效。可以遵循源站的设置（Cache-Control Header），或者在此处 Customize。Min, Max, Default TTL 之间的关系及效果详见：</p>
<p><a href="https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/Expiration.html">https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/Expiration.html</a></td>
</tr>
<tr>
<td>Forward Cookies</td>
<td>是否将 Cookie 转发回源，同样 CloudFront 会基于此值缓存不同的内容。</td>
</tr>
<tr>
<td>Query String Forwarding and Caching</td>
<td>是否将查询字符串转发回源，同样 CloudFront 会基于此值缓存不同的内容。</td>
</tr>
<tr>
<td>Restrict Viewer Access</p>
<p>(Use Signed URLs or</p>
<p>Signed Cookies)</td>
<td>是否使用签名的 URL 或签名的 Cookie</td>
</tr>
<tr>
<td>Compress Objects Automatically</td>
<td>是否启用自动压缩。如果请求中 Accept-Encoding 支持 gzip，则 CloudFront 可以自动压缩，以减小流量传输。</td>
</tr>
<tr>
<td>Lambda Function Associations</td>
<td>是否关联 Lambda@Edge，我们在另一篇 blog 中将介绍Lambda@Edge 的使用，本篇不做说明。</td>
</tr>
</tbody>
</table>
<p>由上可见，是否缓存、缓存多久跟是否转发 Header、Cookie、Query string也有关联，如何提高缓存的命中率以提高访问性能，可见<a href="https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/ConfiguringCaching.html">https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/ConfiguringCaching.html</a> 。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/08/cloudf7.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/08/cloudf7.png" alt="cloudf7" width="918" height="927" /></a></p>
<table border="1">
<tbody>
<tr>
<td colspan="2"><strong>Distribution Settings</strong></td>
</tr>
<tr>
<td>Price Class</td>
<td>有三类，北美与欧洲、北美欧洲加亚太非、全球加速，不同类别应用到的 PoP 点不同，对应价格也不一样。</td>
</tr>
<tr>
<td>AWS WAF Web ACL</td>
<td>如果配置了 WAF，可以在此关联，当然 CloudFront Distribution 创建完成后也可以在WAF Console关联。</td>
</tr>
<tr>
<td>Alternate Domain Names（CNAMEs）</td>
<td>（必须项，若使用自己域名） CloudFront Distribution 创建完成后，CloudFront 会提供一个以 cloudfront.net 结尾的域名，如果用户需要使用自己的域名的话，需要在此处填写待使用的域名。</td>
</tr>
<tr>
<td>SSL Certificate</td>
<td>支持用户使用自己域名的证书，需要与上一栏域名匹配。可以使用 Amazon ACM 申请证书，需要注意的是，此时需要在 us-east-1 区域下的 ACM 申请才能应用到 CloudFront。</p>
<p>支持 dedicate IP 和 SNI 两种模式。</td>
</tr>
<tr>
<td>Logging</td>
<td>访问日志，建议开启。</td>
</tr>
<tr>
<td>Bucket for Logs/ Log Prefix</td>
<td>日志开启时，日志将存放的位置。开启日志有助于 client 访问行为分析，debug 等等。</td>
</tr>
</tbody>
</table>
<p>点击创建后，来到 Distribution 的列表页面，可以看到 Status 的状态是“In Process”，大概10分钟左右该状态是“Deployed”时，则表示该分配创建完成，可以使用，并且可见 CloudFront 为其分配的域名。</p>
<p>3、添加源站</p>
<p>点击分配的 ID，可见当前分配的相关设置。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/08/cloudf9.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/08/cloudf9.png" alt="cloudf9" width="734" height="205" /></a></p>
<p>点击 Origin，可见当前的 Origin 配置，点击 Create Origin，可以添加源站。</p>
<p>此时我们添加一个 S3 桶为源站。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/08/cloudf11.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/08/cloudf11.png" alt="cloudf11" width="756" height="318" /></a></p>
<p>注意选择 S3 桶为源站时，会出现是否“Restrict Bucket Access”的选项，我们知道 S3 通过 ACL 和 Bucket Policy 控制存储桶的对象是否被公开访问，因此该 S3 存储桶需要允许 CloudFront 能够从 S3 存储桶拉取对象，这儿有两种方式，一个是该桶设置为公开访问桶，任何人可以直接从该桶下载；方式二是使用 OAI（Origin Access Identity），即该分配获取一个 OAI，并且在 S3 bucket policy 中的 principle 部分填写该 OAI，这样该 S3 存储桶将仅向该分配开放了相应的权限，而其他人无法直接从该存储桶下载资源。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/08/cloudf13.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/08/cloudf13.png" alt="cloudf13" width="521" height="177" /></a></p>
<p>建议选择“Yes, Update Bucket Policy”以避免 Bucket Policy 配置错误<sup>[2]</sup>。</p>
<p>4、添加 Behavior</p>
<p>同样进入分配后，在 Behavior 栏选择 Create Behavior。我们假定访问 jpg图片的请求，回源到前面创建的 S3 存储桶。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/08/cloudf15.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/08/cloudf15.png" alt="cloudf15" width="574" height="439" /></a></p>
<p>Path Pattern 中支持通配符，在此处配置路径模式，即当一个请求到达CloudFront POP 点，CloudFront 检查该请求的 URL 路径，并与 Behavior 中设置的进行匹配，按先匹配到的 Behavior 的配置执行对应的行为。</p>
<p>Origin 栏可以选择该分配中已添加的源站。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/08/cloudf17.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/08/cloudf17.png" alt="cloudf17" width="883" height="292" /></a></p>
<p>当拥有多个 Behavior 时，若路径模式中有重合，可以通过 Move Up/Down调整匹配的顺序，一旦匹配到将按该 Behavior 执行，不再去匹配其他 Behavior。优先级 Precedence 数字越小越优先匹配。</p>
<h3><strong>三、缓存优化</strong></h3>
<p>本节将介绍常见的 TTL 设置建议、动态加速，设置样例以及错误处理。</p>
<p>1、TTL 设置建议</p>
<p>CloudFront 在计算 Cache key 时会将请求的 URL 以及当前分配对应的Behavior 的配置（如是否转发 Header、Cookie、查询字符串）考虑在内，计算出唯一值。因此即使两次请求都是相同的 URL，如果两次请求的个别 Header 不一样，且该 Header 配置为了转发（Cached based on Selected Headers），则计算出的 Cache key 也不同，返回给客户端的内容自然也不同。因此配置转发的查询字符串、Cookie 及 Header 越少，Cache key 也将越少，缓存命中率就越高，带来了性能也越好。</p>
<p>对于用户内容在 PoP 点的缓存 TTL，可以使用源站设置的 Cache Control: max-age 的值，或者在 Behavior 中使用 Customized 设置 Minimum TTL，Maximum TTL、Default TTL（<a href="https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/Expiration.html">https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/Expiration.html</a> ）。</p>
<table border="1">
<tbody>
<tr>
<td><strong>分类</strong></td>
<td><strong>静态内容，长期</strong></td>
<td><strong>静态内容，短期</strong></td>
<td><strong>动态内容</strong></td>
</tr>
<tr>
<td>举例</td>
<td>*.css, *.js, *.jpg, *.png</p>
<p>软件下载，媒体文件，媒体分片文件（HLS *.ts，*.m3u8）。</td>
<td>登录页，index.jsp，新闻，天气信息，HLS 直播 m3u8 文件。</td>
<td>变化的内容，不可缓存的内容。</td>
</tr>
<tr>
<td>建议</td>
<td>不变的内容可以设置较大的 TTL 值，使用版本号更新内容。</td>
<td>定期更新的内容设置低 TTL 值。TTL 到期后，CloudFront 回源校验源站内容是否发生变化。</td>
<td>经常变化的内容；按请求不同内容不同；</p>
<p>设置很低甚至0 TTL。</td>
</tr>
</tbody>
</table>
<p>对于动态内容，动态加速场景，可以在源站设置：</p>
<p>Cache-Control: no-cache; max-age=0; No-store; private</p>
<p>或 Cache-Control: public; max-age=0;</p>
<p>若使用 CloudFront Behavior 中 Customize TTL，可以直接在‘Cache based on Selected Header’处选‘All’，然后 Minimum TTL，Maximum TTL，Default TTL 均设置为0.</p>
<p>对于 Cache-Control Header 设置样例：</p>
<table border="1" width="959">
<tbody>
<tr>
<td width="120">静态资源</td>
<td width="120">登录页</td>
<td width="120">媒体分片</td>
<td width="120">动态内容</td>
<td width="120">HLS 直播</td>
</tr>
<tr>
<td width="120">*.css, *.js, 软件下载，更新包等</td>
<td width="120">Index.html</td>
<td width="120">/*.ts</td>
<td width="120"></td>
<td width="120">/*.m3u8</td>
</tr>
<tr>
<td width="120">Cache-Control:<br />
public;<br />
max-age=31536000</td>
<td width="120">Cache-Control:<br />
no-cache=Set-Cookie;<br />
max-age=30</td>
<td width="120">Cache-Control:<br />
public;<br />
max-age=31536000</td>
<td width="120">Cache-Control:<br />
no-cache;<br />
max-age=0;No-store;private</td>
<td width="120">Cache-Control:<br />
public;<br />
max-age=2</td>
</tr>
</tbody>
</table>
<p>2、错误处理</p>
<p>当源站不可用时，可以在 CloudFront 配置针对400，403，404，405，414，500，501，502，503，504等错误码的自定义响应页并修改返回给客户端的响应码。CloudFront 将周期性验证源站的可用性，并可在源站恢复前将当前缓存中的内容作为响应返回给客户端。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/08/cloudf19.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/08/cloudf19.png" alt="cloudf19" width="1027" height="321" /></a></p>
<p>设置方式可见<a href="https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/GeneratingCustomErrorResponses.html">https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/GeneratingCustomErrorResponses.html</a></p>
<h3><strong>四、内容更新</strong></h3>
<p>当源站静态内容更新时，如何让客户端在 TTL 失效时间前即可拿到最新版本的内容是每一位开发者关心的问题，在 CloudFront 有两种方式。</p>
<p>1、版本号控制</p>
<p>当已发布的内容更新时，可在文件名或者路径中使用版本号进行区分，比如从 v1 到 v2，或者时间戳等可以区别同一对象两种版本的其他方法，同时应用测对资源链接指向新版本号的资源。</p>
<p>2、使用 Invalidation 使缓存中的文件失效</p>
<p>CloudFront 提供一个名为‘Invalidation’的功能，可以使文件在 TTL 失效时间到达前将文件从 PoP 点删除，使用该功能可以快速的在文件名不变的前提下将文件更新。</p>
<p>Invalidation 支持指定单个文件或者以*通配符结尾的路径。限制及费用见<a href="https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/Invalidation.html">https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/Invalidation.html</a></p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/08/cloudf21.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/08/cloudf21.png" alt="cloudf21" width="812" height="455" /></a></p>
<h3><strong>五、监控与日志</strong></h3>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/08/cloudf23.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/08/cloudf23.png" alt="cloudf23" width="556" height="279" /></a></p>
<p>CloudFront 提供多种报告供用户了解自己分配的使用率等情况，您可以使用 CloudWatch API 获取分配的相应监控指标，需要注意的是，使用 CloudWatch API 时 region 应设置为 us-east-1。</p>
<p>CloudFront 报告提供按天或按小时的请求数、数据传输、HTTP Status Code、Top50 访问的对象，使用率以及按设备、浏览器、操作系统、客户端位置等指标的报告，同时可以配置 CloudWatch 警报，对关键指标数据进行监控（请求数、已下载字节、已上传字节、总错误率、4xx错误率、5xx错误率），一旦超过正常阈值，运维人员可第一时间得到告警。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/08/cloudf25.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/08/cloudf25.png" alt="cloudf25" width="556" height="159" /></a></p>
<p>尽管 CloudFront 提供了多维度的报告，但可能仍不能满足用户的多维度分析的需求。因此推荐这类用户对 CloudFront 日志进行分析，当用户开启 CloudFront 分配日志后，日志将会上传到指定的 S3 存储桶，通过分析日志可以了解有关该分配的更多的客户端请求行为，有助于做运营分析或者 debug。关于日志字段解释见<a href="https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html">https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html</a> 用户可以使用 Amazon EMR 或者无服务器交互式查询服务Amazon Athena轻松的使用标准 SQL 直接在 S3 中分析数据，并与 Amazon QuickSight  集成，轻松实现数据可视化。</p>
<p>使用 Amazon Athena 查询  Amazon CloudFront  日志方式见<a href="https://docs.aws.amazon.com/zh_cn/athena/latest/ug/cloudfront-logs.html">https://docs.aws.amazon.com/zh_cn/athena/latest/ug/cloudfront-logs.html</a></p>
<p>使用 Amazon EMR 分析 CloudFront 日志可见参考资料8。</p>
<h3><strong>六、合规与安全</strong></h3>
<p>CloudFront 目前已经获得 PCI DSS 合规，GDPR（<a href="https://amazonaws-china.com/compliance/gdpr-center/service-capabilities/">https://amazonaws-china.com/compliance/gdpr-center/service-capabilities/</a> ）、HIPPA、SOC 以及 ISO 9001, 27001, 27017, 27018 等合规认证。</p>
<p>同时开启 CloudTrail，用户帐号下所有的 CloudFront API 调用记录将均被CloudTrail 记录，便于用户后期审计。</p>
<p>下面我们将从4个方面进行介绍 CloudFront 如何保证您的内容安全。</p>
<p>1、回源保护</p>
<p>我们可以将源站设置为仅允许 CloudFront 访问，而拒绝客户端的直接回源。</p>
<p>当源站为 ELB/EC2 时：</p>
<p>（1）ELB/EC2 的安全组仅对 CloudFront 节点 IP 开放对应的端口（80/443），CloudFront 节点服务器的 IP 地址范围见：</p>
<p><a href="https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/LocationsOfEdgeServers.html">https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/LocationsOfEdgeServers.html</a></p>
<p>（2）在 CloudFront Origin 设置时，添加自定义 Header 字段及值，源站对请求中的字段检查，若不含有该 Header 字段及值，则返回错误码。</p>
<p>（3）回源 HTTPS</p>
<p>回源支持 TLSv1.1、TLSv1.2 安全协议以及 RSA，ECDSA 两类密码算法。</p>
<p>&nbsp;</p>
<p>当源站为 S3 存储桶时：</p>
<p>在 S3 存储桶策略中应用 OAI，仅允许带该 OAI 的 CloudFront 分配从存储桶中获取内容。</p>
<p><a href="https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html">https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html</a></p>
<p>2、传输安全</p>
<p>CloudFront 支持客户端到 PoP 点使用 HTTPS 请求，CloudFront 为每个分配生成的域名支持 HTTPS 请求，并支持用户上传自己从可信 CA 购买的证书。用户可以在 Amazon ACM 服务免费申请自己域名的证书，需要注意的是，需要在 us-east-1 区的 ACM 服务申请，才能应用到 CloudFront 的分配。</p>
<p>对于用户域名证书，CloudFront 支持专属 IP 和 SNI 两种方式。</p>
<p>3、内容保护</p>
<p>（1）签名 URL、签名 Cookie</p>
<p>针对有些内容限制访问的情景，如仅允许付费用户或者授权用户访问的内容，我们可以通过签名 URL 或签名 Cookie 的方式提供内容的私有化访问。文档中已有非常详细的说明，在此不再展开，具体方式见：<a href="https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/PrivateContent.html">https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/PrivateContent.html</a> 另外也可见参考资料[3]。</p>
<p>（2）Field-Level Encryption 字段级加密</p>
<p>2017年12月份，CloudFront 推出了该功能，使用该功能，可以进一步增强敏感数据 (如信用卡号码或个人身份信息) 的安全性。在将  POST  请求转发到您的源站之前，CloudFront 的字段级加密使用特定于字段的加密密钥 (由用户提供) 对  HTTPS  表单中的敏感数据进行进一步加密。这可确保敏感数据只能被应用程序堆栈中的某些组件或服务解密和查看。</p>
<p>配置方式见：<a href="https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/field-level-encryption.html">https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/field-level-encryption.html</a></p>
<p>（3）Geo 限制</p>
<p>CloudFront 提供了基于地理位置访问限制的功能，用户可以通过设置白名单或者黑名单的方式，允许或禁止某个国家或地区对自己分配的访问。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/08/cloudf251.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/08/cloudf251.png" alt="cloudf251" width="556" height="159" /></a><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/08/cloudf29.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/08/cloudf29.png" alt="cloudf29" width="521" height="237" /></a></p>
<p>4、与 AWS WAF、Shield 集成</p>
<p>AWS WAF 是一款 Web 应用程序防火墙，帮助保护您的 Web 应用程序免受常见 Web 漏洞的攻击[5]。AWS Shield 是一种托管式分布式拒绝服务 (DDoS)防护服务，可以保护在 AWS 上运行的防护应用程序 [7]。</p>
<p>用户可以在创建 CloudFront 分配时关联已创建的 WAF，或者在 WAF Console 创建完 WAF 规则后与 CloudFront 分配关联。</p>
<p><strong>七、可编程 CDN</strong></p>
<p>AWS在2017年7月正式推出了 Lambda@Edge，借助  Lambda@Edge，用户可以轻松在 AWS 的全球基础设施上运行代码，从而以最低的延迟响应最终用户。代码可以由  Amazon CloudFront  事件触发，例如源服务器和浏览者之间的内容请求或响应。您只需将 Node.js代码上传到 AWS Lambda，Lambda 就能在靠近最终用户的 AWS 站点实现高可用性，提供复制、路由和扩展代码所需的一切。</p>
<p>我们将在下一篇中对 Lambda@Edge进行讲解与使用案例分享，感兴趣的读者可以查看官方文档进一步的了解：<a href="https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/lambda-at-the-edge.html">https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/lambda-at-the-edge.html</a></p>
<p>&nbsp;</p>
<p><strong>参考资料</strong></p>
[1]开发人员指南：<a href="https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/Introduction.html">https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/Introduction.html</a></p>
[2] Amazon CloudFront 常见错误配置及解决方法: <a href="https://amazonaws-china.com/cn/blogs/china/cloudfront-errors-solutions/">https://amazonaws-china.com/cn/blogs/china/cloudfront-errors-solutions/</a></p>
[3] 使用 Amazon CloudFront 签名 URL+S3 实现私有内容发布<a href="https://amazonaws-china.com/cn/blogs/china/amazon-cloudfront-signature-url-s3/">https://amazonaws-china.com/cn/blogs/china/amazon-cloudfront-signature-url-s3/</a></p>
[5] AWS WAF <a href="https://amazonaws-china.com/cn/waf/?nc2=h_m1">https://amazonaws-china.com/cn/waf/?nc2=h_m1</a></p>
[6] AWS Certificate Manager <a href="https://amazonaws-china.com/cn/certificate-manager/?nc2=h_m1">https://amazonaws-china.com/cn/certificate-manager/?nc2=h_m1</a></p>
[7] AWS Shield <a href="https://amazonaws-china.com/cn/shield/?nc2=h_m1">https://amazonaws-china.com/cn/shield/?nc2=h_m1</a></p>
[8] 手把手教你使用 Amazon EMR 进行交互式数据查询<a href="https://amazonaws-china.com/cn/blogs/china/amazon-emr/">https://amazonaws-china.com/cn/blogs/china/amazon-emr/</a></p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e5%85%a8%e7%ab%99%e5%8a%a0%e9%80%9f%ef%bc%8camazon-cloudfront-%e9%85%8d%e7%bd%ae/">全站加速，Amazon CloudFront 配置</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/%e5%85%a8%e7%ab%99%e5%8a%a0%e9%80%9f%ef%bc%8camazon-cloudfront-%e9%85%8d%e7%bd%ae/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AWS 常见问题汇总</title>
		<link>https://www.fuwuqiok.com/aws-%e5%b8%b8%e8%a7%81%e9%97%ae%e9%a2%98%e6%b1%87%e6%80%bb/</link>
		<comments>https://www.fuwuqiok.com/aws-%e5%b8%b8%e8%a7%81%e9%97%ae%e9%a2%98%e6%b1%87%e6%80%bb/#comments</comments>
		<pubDate>Fri, 17 Aug 2018 02:51:15 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[aliyun服务器代维]]></category>
		<category><![CDATA[Amazon AWS]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[linux代维]]></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[服务器迁移]]></category>
		<category><![CDATA[服务器运维]]></category>
		<category><![CDATA[网站代维]]></category>
		<category><![CDATA[网站防挂马]]></category>
		<category><![CDATA[AWS 常见问题汇总]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=3760</guid>
		<description><![CDATA[<p>大家在使用 AWS 过程中总会遇到一些问题。在此以 Q&#38;A 形式，总结一些常见的架构和故障排查问题，希 [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/aws-%e5%b8%b8%e8%a7%81%e9%97%ae%e9%a2%98%e6%b1%87%e6%80%bb/">AWS 常见问题汇总</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>大家在使用 AWS 过程中总会遇到一些问题。在此以 Q&amp;A 形式，总结一些常见的架构和故障排查问题，希望有所帮助。如果有中国（北京和宁夏区域）特有的问题，会特别注明。</p>
<p>&nbsp;</p>
<h2>Q：如何提高 S3 性能？</h2>
<p>A：S3 index 和实际数据分开存放。默认一个 bucket 所有 object 都位于同一个分区。如果 object 数量太多，而请求速率又不高时，S3 会根据 key name 自动分区。但是，如果请求速率太高，会耗尽 S3 分区的 IO，触发限制，可能会返回503 Slow Down 错误。</p>
<p>尽量利用 hash 或者倒序，使 S3 前缀随机化。如果读写请求过高，可以向 AWS 提交 S3 分区请求，或者采用指数退避(exponential backoff)算法，增加请求的重试等待时间。尽管如此，仍然需要遵循 S3 key name 随机化原则。可以对于某个目录下的已经随机化的 object 进行分区。</p>
<p>例如：S3 bucket 的 log 目录下的.log 对象前缀已经做了随机化。</p>
<p><code>S3://bucket/log/A0B1.log</code></p>
<p><code>S3://bucket/log/C2D3.log</code></p>
<p><code>S3://bucket/log/E4F5.log</code></p>
<p>在提交请求时，除了请求速率，还需要填写 pattern，注明 log/ 目录下是如何进行随机化的。后台就可以在 <code>S3://bucket/log/</code> 后面进行分区。</p>
<p>S3 不限制带宽。但是，也不要对 S3 进行压力测试。实际的传输速率和客户端到 S3 的网络有关。如果客户端请求很多，可以使用 CDN 进行加速。</p>
<h4>Q: 有很多小文件，如何有效上传到 S3？</h4>
<p>A: 如果可能，尽量先压缩成大文件再上传。一方面，减少大量小文件上传时，TCP 连接建立和断开的开销。另外一方面，S3 虽然上传流量不收费，但是请求仍然收费。</p>
<h4>Q: 需要在本地到 S3 之间每日同步文件，现有文件数量非常多（几百万），如何提高效率？</h4>
<p>A: aws s3 sync 命令可以同步本地到 S3 的文件，只同步变化的部分。但是，sync 需要先列出 LIST S3，以进行比较。如果文件数量非常巨大，LIST 所有对象，非常花费时间，甚至可能卡住。</p>
<p>解决办法：只同步变化的目录。例如，按照日期目录来同步。</p>
<p><code>aws s3 sync /data/2018/03/13 s3://bucket/data/2018/03/13</code></p>
<p>如果每天变化的数据分布在不同目录，可以把这些变化记录在 Dynamodb，在同步时，只同步变化的部分。</p>
<p><strong>Q: S3 是否支持断点续传？</strong></p>
<p>A: 断点续传的实现，在于根据 content-length 划分成多个 range，没有传完的，可以保留，下次可以继续传输。</p>
<p>S3 支持 multi-part 分段传输。分三个步骤：</p>
<ol>
<li>Initiate Multipart Upload：初始化任务。</li>
<li>Parts Upload：把文件分成多块，每个块都有一样的 upload ID，和不同的 part number。不同的分块分别传输，与顺序无关。</li>
<li>Complete Multipart Upload：所有分块完成后，把分块合并成 S3 对象。一般的程序，例如 AWS CLI，如果有部分没有完成，并且重试后超时，那么会调用 Abort Multipart Upload，所有已经上传到 S3 的部分全部删除，任务终止。</li>
</ol>
<p>S3 没有提供直接断点续传 API，可以自己在程序加个逻辑来实现。如果在第二阶段有部分一直没有传完，就不会调用第三阶段的 Complete/Abort。这样，已经传输完成的部分会一直放在 S3，直到 Complete/Abort。</p>
<h4>Q: 应用程序在下载S3文件时，会判断MD5以防止文件传输中被篡改，但是大文件总是出错。</h4>
<p>A: S3 大文件传输使用 multi part 分段。对于每一段，分别计算 MD5。最后在任务完成时，把所有分段的 MD5，再进行 MD5 计算，得到 S3 Etag 值。</p>
<p>应用程序只对比了某一段的 MD5 值，与 S3 Etag 不一致，因此出现错误。</p>
<h4>Q:在移动应用上传到S3的场景下，S3 Pre-singed URL和Cognito方式，有何区别？</h4>
<p>A: 移动客户端在上传时，需要在服务器生成 Pre-signed URL，返回客户端。客户端以此临时 URL，无需 credentia l即可上传。实际上，上传时，使用的是服务器生成 URL 时的 IAM 用户权限，相当于以此 IAM 用户来上传。此方式的限制在于，pre-signed URL 不知道整个上传对象的大小，因此不能使用 S3 multi-part，对于大文件的传输效率比较低。</p>
<p>在 Cognito 的环境下，移动客户端上传时，先要进行自定义或者联合认证。验证通过后，与 Cognito 交换 token。之后客户端以 Cognito token 向 STS 获取临时 credentia 以访问 S3。以此方式上传，客户端可以使用正常的 API，包括multi-part。</p>
<p>中国区 Cognito 目前还没有用户池功能，不支持 Google, Facebook 认证。可以自行进行用户管理，比如 LDAP/AD。对于不大的文件上传，pre-signed URL 一般可以满足需求。</p>
<h4>Q:S3最终一致性如何？</h4>
<p>A: 对于新创建的 S3 object，采用 read-after-write 一致性，上传完成后立刻可以访问。</p>
<p>对于覆盖或者 HEAD/GET 操作过的 object，采用最终一致性。如果覆盖后立刻访问，可能会是新内容，也可能是之前的内容，但是最终会是新的内容。</p>
<h4>Q: 我帐号下 S3 的 ELB 访问日志，bucket 策略已经授权别的帐号可以方案，为什么别的帐号还是不能访问？</h4>
<p>A: ELB 访问日志是 AWS 系统帐号经过授权，向您的帐号下 S3 上传的对象。日志文件的所有者是 AWS 帐号，在上传时把您的帐号添加到 Object ACL，因此您可以访问。但是，文件所有者并非您的帐号，别的帐号没有添加到 Object ACL，即使 bucket policy 允许别的帐号访问，仍然不能访问。</p>
<p>解决方法：在 object ACL 加入别的帐号的 canonical id，ID 可以通过 AWS CLI 命令行获得：</p>
<div class="hide-language">
<pre class=" language-json" data-language="Json"><code class=" language-json">aws s3api list-buckets
<span class="token punctuation">{</span>
    <span class="token property">"Owner"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
        <span class="token property">"ID"</span><span class="token operator">:</span> <span class="token string">"633eb40d3277ec23db4bc5a394dc363f48e41c85358c5618f0de3df382855242"</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
</code></pre>
</div>
<p>&nbsp;</p>
<p>注意：对于上传到别的帐号 bucket 的 object，如果没有授权 object ACL 给 bucket 所有者，bucket 所有者也不能下载或者修改 ACL，只能删除。</p>
<h4>Q:设置生命周期为何不生效？</h4>
<p>A: S3 生命周期设置后，于 UTC 时间第二天的0点开始工作。所有对象，按照创建时间，或者变成 non-current version 的时间，如果满足条件，就会被转移到 Glacier/Standard IA 类型，或者删除。在对象太多的情况下，此工作可能需要更长时间。</p>
<p>如果一直不生效，可以检查生命周期规则是否带了空格，或者通过 s3api head-object 查看是否在进行转换。</p>
<p>如果是转换成 Standard IA 类型， S3 对象大小需要在 128KB 以下。</p>
<h4>Q: 浏览器访问 S3 对象 URL 链接，出现 401 Unauthorized 错误。（中国）</h4>
<p>A: 请进行 ICP 备案，打开帐号的 80/443/8080 端口。</p>
<h4>Q: 通过浏览在 AWS 控制台下载 S3 对象，出现 Unexpected IP 错误。（中国）</h4>
<p>A: 控制台下载 S3 对象，会生成一个特殊的 pre-signed URL，带有 x-amz-expect-ip 参数，限制了能使用此 URL 的 IP。返回客户端以此 URL 上传时，如果 IP 发生变化（包括公司出口 IP 变化，使用代理，等等），就会出现 Unexpected IP 错误。</p>
<h4>Q: 如何同步 Global 海外到中国 S3？（中国）</h4>
<p>A: AWS Global 和中国使用不同的帐号，不能直接通过 S3 Cross-region replication 进行同步。<br />
<a name="3F"></a><br />
如果要自动同步，可以考虑 S3 Notification + Lambda 方式。当 S3 对象有变化时，通知触发 Lambda，自动调用函数，复制对象。需要注意，此方法受到中国到海外Internet 网络状况影响，对于大文件支持不够好。</p>
<p>另外一个方法，S3 Notification + SQS。S3 通知发送到 SQS 消息队列，EC2 运行程序，定期从 SQS 获取消息。如果有更新，海外 EC2 下载海外S3对象，复制到中国区 EC2，再从中国区 EC2 上传到中国 S3。此方式虽然比较复杂，但是可以充分利用 AWS 跨区域 EC2 的优化网络，并且可以使用 S3 multi-part  特性，更适合大文件的传输。</p>
<table width="100%">
<tbody>
<tr>
<td width="85%">
<h2>EC2</h2>
</td>
<td width="15%"></td>
</tr>
</tbody>
</table>
<h4>Q: EC2 实例状态检查失败，停止一直卡住。</h4>
<p>A: EC2 实例状态，如果是 0/2，说明底层硬件出现故障。可以停止 (stop) 实例，然后启动 (start)，虚拟机迁移到别的物理主机。如果停止操作时一直卡住，可以再次强制停止。如果仍然不行，请开启技术支持案例。对于 C3, C4, C5, M3, M4, M5, R3, R4, T2, or X1 类型实例，建议开启 EC2 自动恢复功能。当底层硬件出现故障时，可以自行恢复。</p>
<p>请注意：实例存储 (instance store) 的数据会丢失。重要数据尽量使用 EBS，并且进行快照备份。</p>
<p>如果状态检查是1/2，说明底层硬件正常，但是操作系统出现故障，需要结合日志信息自行排查。</p>
<h4>Q: EC2 实例带宽是多少？</h4>
<p>A: EC2 实例根据类型不同，网络性能分低、中、高等。由于客户端到 AWS 网络状况不同，需要测试来获得实际数值，例如 iperf 工具。有些类型，例如 C4，可以达到 10Gb 的网络带宽，这是对于 EC2 实例内部之间而言，到 Internet 的网络性能，仍然需要实际测试。</p>
<p>有些类型支持增强型联网，可以提高网络性能。此功能可能需要在操作系统安装驱动并启用模块。</p>
<h4>Q: 访问位于 EC2 的网站，速度很慢。</h4>
<p>A: 访问速度，在整个过程中的服务器、网络、客户端都会受到影响。</p>
<p>服务器层面，CPU / 内存 / IO 资源的使用情况，操作系统的内核参数，应用程序的优化，都会影响整个用户体验。通过 Cloudwatch 监控 CPU / IO/ 网络情况，在操作系统上查看内存和进程，检查操作系统和应用日志，必要时用 strace 等工具追踪调用。</p>
<p>网络层面，从客户端到服务器，中间要经过多个路由器，运营商可能会出现一些网络拥塞或者路由问题。以双向 traceroute/mtr 工具，检查哪些网络路由可能存在问题。请确认网络问题是否具有普遍性，检查其他地区用户是否也存在同样问题。如果是运营商网络拥塞，或者客户端接入了一些复杂网络，这已经超出了 AWS 所能解决的范围。</p>
<p>客户端层面，自身的 CPU / 内存等资源情况需要检查。对于请求本身，一般来说，带数据库复杂查询的动态 HTTP 请求，或者需要下载很多图片 / 视频 / css / js 的页面，要比简单的 HTML 页面要快。可以换一个别的客户端，以同样的请求，再进行测试。</p>
<h4>Q: EC2 被停止或终止了，但不是自己操作的。</h4>
<p>A: AWS 不会关闭用户 EC2 实例，哪怕是底层硬件故障。请检查是否有 Autoscaling / Cloudformation 等其他服务触发了操作。打开 Cloudtrail 可以看到 API 调用记录。</p>
<h4>Q: EC2 是否支持广播？</h4>
<p>A: EC2 不支持广播和组播，只支持单播。一些应用中，例如 LVS keepalived，需要特别设置为单播模式。</p>
<h4>Q: EC2 设置安全组，允许另外一个安全组访问，但是不通。</h4>
<p>A: 安全组里允许另外一个安全组访问，在连接时，需要使用私有 IP。如果使用公有 IP，安全组里要设置为公有 IP CIDR。</p>
<p>另外，EC2 内部访问尽量使用私有 IP，这样可以减少网络传输成本。</p>
<h4><strong>Q: 创建 CentOS 实例，根盘使用 10GB EBS，但是 df 命令只能看到 8GB。</strong></h4>
<p>A: 默认 CentOS 根盘分区表是 8GB，需要自行更改分区表，并扩展文件系统。</p>
<h4>Q: 创建实例时，挂了 3TB 的根盘，启动后实例马上被终止了。</h4>
<p>A: Windows 使用 MBR 分区，最大支持 2TB 根盘。 Linux MBR 也受到同样限制。</p>
<p>解决办法：根盘使用小于 2TB 的 EBS，数据放在单独添加的 EBS。Linux  也可以使用 GPT 分区，不受 2TB 限制。</p>
<h4>Q: CentOS 配置多网卡不生效。</h4>
<h4>A: CentOS 等非 Amazon Linux 系统，缺少某些网络安装包，需要自己配置策略路由。这样，从哪个网卡接收到的包，还从这个网卡发送回去。</h4>
<h4>Q: 创建 C4 类型 CentOS 实例，出现 1/2 检查状态，不能登录。</h4>
<p>A: C3/C4 等类型实例，默认启用增强网络。一些非 Amazon Linux，可能没有 ixgbev f增强网络驱动，实例不能正常启动。</p>
<p>解决办法：安装 ixgbevf 增强网络驱动。<a name="4F"></a></p>
<h4>Q: 如何在中国区使用 CentOS？（中国）</h4>
<p>A: 中国区暂时没有官方 CentOS。可以自己以 VM Import 方式从本地虚拟机镜像导入，或者，从 AWS 海外区域通过dd 镜像文件导入中国区 AMI。</p>
<p>由于安全原因，不推荐使用非官方的社区 Centos。</p>
<table width="100%">
<tbody>
<tr>
<td width="85%">
<h2>EBS</h2>
</td>
<td width="15%"></td>
</tr>
</tbody>
</table>
<h4>Q: 为什么 EBS 没有达到预期的 IOPS，却被限制了？</h4>
<p>A: EBS 除了IOPS，还有最大吞吐量限制 (GP2 160MB/s, IO1 500MB/s)。这个与 IO 大小有关。请检查 Cloudwatch 的吞吐量指标是否达到上限。</p>
<p>另外，对于连续的小 IO，会合并成单个 IO。</p>
<h4>Q: 创建了 EBS，在 attach 实例时，找不到需要的实例。</h4>
<p>A: EBS 要与 EC2 实例位于同一个可用区 (Availability zone)，才能 attach 到实例。<a name="5F"></a></p>
<h4>Q: 如何为 EBS 自动创建快照？</h4>
<p>A: 方法1：创建定时任务，定期执行 AWS CLI 命令进行快照。</p>
<p>方法2：使用 Cloudwatch Events + Lambda，无服务器方式自动运行。</p>
<table width="100%">
<tbody>
<tr>
<td width="85%">
<h2>ELB</h2>
</td>
<td width="15%"></td>
</tr>
</tbody>
</table>
<h4>Q: 访问 ELB，有的请求正常，有的超时。</h4>
<p>A: 公开的 ELB 要位于 VPC 里的公有子网，即有 IGW，可以从 Internet 访问。如果 ELB 所在的子网，包括了私有子网，这样 ELB 会在私有子网里创建节点。当从 Internet 访问时，DNS 解析到私有子网的节点，这部分请求就不可达。</p>
<h4>Q: 后端服务器日志发现所有的请求源 IP 都是 ELB，如何获取客户端真正的 IP？</h4>
<p>A: HTTP 监听方式时，后端服务器启用 X-Forwarded-For 特性。</p>
<p>TCP 监听方式，ELB 要开启 forward protocol，加入特定 header。</p>
<h4>Q: ELB/ALB 采用什么算法转发请求到后端实例？</h4>
<p>A: ELB TCP 监听端口使用轮询算法，HTTP 监听端口使用未完成最少请求算法。</p>
<p>ALB 使用轮询算法。</p>
<p>如果只有1个健康的后端实例，所有请求都会被转到此实例。如果没有任何健康的后端实例，请求会被转发到所有已注册但是不健康的实例。</p>
<h4>Q: ELB 不是由客户控制，出现服务器错误如何排查？</h4>
<p>A: 客户端请求返回 5XX 错误，可以根据 HTTP 代码，结合 Cloudwatch HTTP 5XX、ELB 5XX、Backend Connection Errors 等监控指标，初步判断是 ELB 还是后端服务器问题。</p>
<p>如果是 504 网关超时，还要打开 ELB 访问日志，在客户端和后端服务器进行抓包分析。一般来说，如果后端 web 服务器启用 keep-alive，超时时间要大于 ELB 空闲超时。</p>
<h4>Q:NLB 如何选择子网？</h4>
<p>A: NLB 要位于公有子网。后端目标实例，可以位于公有子网，也可以位于私有子网。注意：如果后端实例位于私有子网，需要设置 NAT，让数据包能有回到客户端的路由。这一点与 ELB/ALB 不同。</p>
<h4>Q: 应用程序访问 ELB，有时候会出现 Unknown host 无法解析的错误。</h4>
<p>A: ELB 会根据流量自动扩展或者缩减，IP 发生变化。DNS 服务器需要及时更新变化。ELB DNS TTL 是60秒，ELB IP 变化后，会在60秒之内更新 DNS 记录。但是由于客户端有缓存，如果一直不更新，就会出现无法解析的问题。</p>
<p>默认 Java DNS TTL 是永久生效，重启 Java 可以临时解决问题。建议修改 Java DNS TTL 为60秒。<a name="6F"></a></p>
<h4>Q: ELB 预热或者固定 IP 申请时，如何估算 ELB 的请求/响应平均流量？</h4>
<p>A: 举例：一个200KB 的网页通常不太可能是在一次请求/响应中将200KB 的流量全部流过 ELB。更可能的分布是：20KB 是 HTML，30KB 是 Javascript/CSS，150KB 是10个15KB 图片，总共12个请求。这样一个经过 ELB 的请求/响应平均流量不是200KB 而是17KB (200/12=16.67)。如果您将静态内容和下载内容优化在了 S3 或者 CDN 中，这个 ELB 的请求/响应平均流量会更加小。</p>
<table width="100%">
<tbody>
<tr>
<td width="85%">
<h2>Glacier</h2>
</td>
<td width="15%"></td>
</tr>
</tbody>
</table>
<p><a name="7F"></a></p>
<h4>Q: 归档到 Glacier 的文件，如何根据文件名取回？</h4>
<p>A: Glacier 的归档对象都有archive id，以此取回数据。但是 archive id 是一串字符，并非文件名。可以使用数据库（例如 DynamoDB）记录文件名和 archive id 的对应关系。或者，在归档对象的描述中，写入文件名。在归档文件很多的情况下，建议使用数据库方式，提高效率。</p>
<table width="100%">
<tbody>
<tr>
<td width="85%">
<h2>Storage Gateway</h2>
</td>
<td width="15%"></td>
</tr>
</tbody>
</table>
<h4>Q: 是否支持高可用性架构？</h4>
<p>A: 无论使用哪种类型的网关，都是需要在本地或者 EC2 安装网关虚拟机，作为本地和 AWS 之间的存储网关。此网关只有一个，虚拟机本身不支持高可用架构。</p>
<h4>Q: 使用文件共享类型网关，传输速度很差。</h4>
<p>A: 影响性能的因素有：网络、S3、存储网关、客户端。</p>
<p>NFS 客户端挂接存储后，所有读请求是要先到网关。如果网关缓存有数据，则直接返回客户端。</p>
<p>写请求也是要先到达网关，先写入网关的本地存储磁盘，然后再异步复制到 S3。</p>
<p>S3不会限制传输带宽。一般来说，本地网络到 Internet 的出口带宽，只会影响到网关向 S3 复制数据。</p>
<p>对于客户端来说，传输速度是对于客户端到本地存储网关而言。客户端的设置，以及本地网关的性能，是最大的决定性因素。<br />
<a name="8F"></a><br />
Windows 2008 支持 NFSv3，Windows 2012/2016 支持 NFSv4。V4 cache 比 V3 大了很多，对于 NFS 来说，性能影响很大。</p>
<p>网关服务器要有足够的 CPU 处理能力和内存。Upload buffer 最小150GB，Cache 建议是 upload buffer 的1.1倍。存储网关的物理机上，在创建虚拟机磁盘文件时，系统和 cache/upload buffer 所在的物理磁盘要分开，并且尽量使用 SSD。</p>
<table width="100%">
<tbody>
<tr>
<td width="85%">
<h2>IAM</h2>
</td>
<td width="15%">&nbsp;</td>
</tr>
</tbody>
</table>
<h4>Q: 如何让登录 AWS 控制台的 IAM 用户只能启动或停止某些 EC2 实例？</h4>
<p>A: IAM 用户登录到 AWS 控制台，要么列出所 有EC2 实例，要么什么都不能列出。因为，DescribeInstances 权限不支持资源级别，不能单独对于某些资源（EC2 实例、VPC 等）做权限控制。对于不支持资源级别的权限，在策略的 Resource 部分，只能用*来代表所有资源。</p>
<p>StartInstances/StopInstances 支持资源级别权限，可以定义实例 ID，或者通过其他条件来控制。</p>
<p>以下 IAM 策略，允许列出所有 EC2 实例和状态，并且只能对于标签 Group=test 的实例进行 start/stop 操作。</p>
<div class="hide-language">
<pre class=" language-json" data-language="Json"><code class=" language-json"><span class="token punctuation">{</span>
    <span class="token property">"Version"</span><span class="token operator">:</span> <span class="token string">"2012-10-17"</span><span class="token punctuation">,</span>
    <span class="token property">"Statement"</span><span class="token operator">:</span> <span class="token punctuation">[</span>
        <span class="token punctuation">{</span>
            <span class="token property">"Effect"</span><span class="token operator">:</span> <span class="token string">"Allow"</span><span class="token punctuation">,</span>
            <span class="token property">"Action"</span><span class="token operator">:</span> <span class="token punctuation">[</span>
                <span class="token string">"ec2:StartInstances"</span><span class="token punctuation">,</span>
                <span class="token string">"ec2:StopInstances"</span>
            <span class="token punctuation">]</span><span class="token punctuation">,</span>
            <span class="token property">"Resource"</span><span class="token operator">:</span> <span class="token string">"arn:aws-cn:ec2:cn-north-1:794767850066:instance/*"</span><span class="token punctuation">,</span>
            <span class="token property">"Condition"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
                <span class="token property">"StringEquals"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
                    <span class="token property">"ec2:ResourceTag/Group"</span><span class="token operator">:</span> <span class="token string">"test"</span>
                <span class="token punctuation">}</span>
            <span class="token punctuation">}</span>
        <span class="token punctuation">}</span><span class="token punctuation">,</span>
        <span class="token punctuation">{</span>
            <span class="token property">"Effect"</span><span class="token operator">:</span> <span class="token string">"Allow"</span><span class="token punctuation">,</span>
            <span class="token property">"Action"</span><span class="token operator">:</span> <span class="token punctuation">[</span>
                <span class="token string">"ec2:DescribeInstances"</span><span class="token punctuation">,</span>
                <span class="token string">"ec2:DescribeInstanceStatus"</span><span class="token punctuation">,</span>
                <span class="token string">"cloudwatch:Describe*"</span><span class="token punctuation">,</span>
                <span class="token string">"cloudwatch:Get*"</span><span class="token punctuation">,</span>
                <span class="token string">"cloudwatch:List*"</span>
            <span class="token punctuation">]</span><span class="token punctuation">,</span>
            <span class="token property">"Resource"</span><span class="token operator">:</span> <span class="token string">"*"</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">]</span>
<span class="token punctuation">}</span></code></pre>
</div>
<p><a name="9F"></a><br />
除了标签，还可以直接定义实例 ID，或者其他符合的条件，来进行 stop/start 权限控制。</p>
<p>参考：</p>
<p><a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-supported-iam-actions-resources.html">https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-supported-iam-actions-resources.html</a></p>
<table width="100%">
<tbody>
<tr>
<td width="85%">
<h2>RDS</h2>
</td>
<td width="15%">&nbsp;</td>
</tr>
</tbody>
</table>
<h4>Q: 分别在物理机和 AWS RDS 进行测试，为什么类似的机型，同样的测试方式，结果却显著不同？</h4>
<p>A: 测试对比的一个前提是，环境一致。除了服务器处理能力，测试方法外，存储性能，以及数据库本身的参数，都会影响结果。</p>
<p>RDS 如果是从快照恢复，EBS 存储会有一个预热过程，需要先对 EBS 里的数据块进行读取，才能达到最佳性能。测试建议使用新建 RDS，而不是从快照恢复，这样使用全新的 EBS，不会有预热问题。</p>
<p>EBS 的 IOPS 也会有影响。可以通过 Cloudwatch 监控，确保 EBS IOPS 或者吞吐量，没有达到上限。</p>
<p>数据库参数对性能影响极大，例如 <code>innodb_flush_log_at_trx_commit</code>。确保测试比较时，数据库参数一致。</p>
<h4>Q: 访问不同 AZ 可用区的应用，连接 RDS，延迟差异明显。</h4>
<p>A: 为了实现高可用性，把应用部署到不同 AZ 的 EC2。RDS 位于某个 AZ。当从 EC2 访问不同 AZ 的 RDS 时，有微小的网络延迟。如果应用程序在 EC2 和 RDS 之间有多次交互，那么会把微小的网络延迟放大。</p>
<p>对于网络延迟要求很高的业务，可以优化应用，避免在一次交易中进行多次数据库访问。如果应用不能调整，尽量把应用服务器放在与 RDS 同一 AZ，但是这样会有高可用的隐患，需要在性能和可用性之间做出权衡。</p>
<h4>Q: RDS 很多命令执行出现权限错误。</h4>
<p>A: RDS 是托管服务，有很多机制来保证数据库的高可用。涉及到操作系统或者数据库底层的方面（例如系统表），一般不能修改。常见的数据库操作，可以通过一些定义好的存储过程来进行。</p>
<p>例如，杀掉 mysql 进程：</p>
<p><code>CALL mysql.rds_kill(processID)</code>;</p>
<p>其他的一些操作，例如修改数据库参数，可以通过参数组里的参数来修改。</p>
<p>参考：https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.MySQL.CommonDBATasks.html</p>
<h4>Q: RDS Mysql 主从复制，能否选择表？</h4>
<p>A: RDS 和外部 Mysql 之间的主从复制，可以通过外部 Mysql 的 <code>/etc/my.cnf</code>，<code>replicate-ignore-db</code> 或 <code>replicate-do-db</code> 来选择表。</p>
<p>RDS 内部的复制，目前还不支持选择表。</p>
<h4>Q: RDS 显示磁盘容量耗尽，但是似乎并没有那么多的数据。</h4>
<p>A: 除了数据库表的数据，还有索引、日志、临时空间，都会占用存储。Mysql 日志会占据最高 20% 或者 10GB 的存储空间。一些复杂查询可能会使用大量的临时存储。可以设置 Mysql binlog 保留时间，以及是否开启 general log。</p>
<h4>Q: RDS MysQL 数据库重启，提示 Out of memory</h4>
<p>A: 内存耗尽，和数据库参数有关。<code>max_connections</code> 定义了最大连接=内存字节 /12582880。如果修改了此参数，突破限制，可能会造成内存耗尽。监控机制发现问题，自动重启数据库。</p>
<h4>Q: RDS Mysql 主从复制延迟一直在增加。</h4>
<p>A: 主库和从库实例类型要一致，否则容易因为处理能力有差异，在数据量大时，产生滞后。</p>
<p>分别检查主从库的 EBS IOPS 和吞吐量，是否达到上限。</p>
<p>检查从库是否有锁操作。</p>
<p>查看 slave 状态，show slave status \G; 检查是否复制过程中有错误产生而产生停滞。如果有，跳过错误重试。</p>
<p>Mysql 5.7 允许并行复制，以提高同步效率。数据量大时可以打开此功能。</p>
<p><code>slave_parallel_type=LOGICAL_CLOCK</code></p>
<p><code>slave_parallel_workers&gt;1</code></p>
<h4>Q: RDS 设置为公开访问。如何从同一个 VPC 内的 EC2 访问 RDS，不走外网？</h4>
<p>A: RDS 域名在创建 RDS 时生成。应用程序需要访问 RDS 域名。如果 EC2 和 RDS 位于同一个 VPC，DNS 解析出内网 IP，通过私有网络连接。</p>
<h4>Q: 为何 RDS MySQL 不能通过时间点恢复数据？</h4>
<p>A: RDS MySQL 要启用 binlog，通过快照 +binlog 的方式，恢复到之前的某个时间点。</p>
<p>如果没有启用自动快照功能，binlog 不会保存，也就不能通过时间点恢复。</p>
<p>另外，只有 innoDB 表才能使用此功能。MyISAM 不基于事务，重启或者数据库故障时可能会丢失数据。如果没有特别要求，建议使用 innoDB 存储引擎。</p>
<h4>Q: 如何进行数据库迁移？</h4>
<p>A: Mysql: 采用全量 Mysqldump+ 增量 replication 方式。但是，在 mysqldump 导出数据并复制到目标数据库这段时间内，主库要设置为只读，避免新的数据写入。</p>
<p>Oracle：Dataguard 或者 GoldenGate。但是需要特定的 Oracle 企业版本，或者单独购买许可。<a name="10F"></a></p>
<p>AWS DMS 服务：在线数据库同步。主库无需设置只读，同步过程中通过中转节点读取日志变化，并在同步到目标数据库时重放这些变化。即使数据库位于私有子网，DMS 也可以访问数据库，并设置为源或者目标。DMS支持不同数据库迁移，包括 RDS 支持的数据库，以及 Redshift。</p>
<p>AWS DMT 工具：中国还没有上线 DMS 服务，可以申请 DMT AMI，创建 EC2 实例，带有 DMT 图形化迁移工具。</p>
<table width="100%">
<tbody>
<tr>
<td width="85%">
<h2>DynamoDB</h2>
</td>
<td width="15%">&nbsp;</td>
</tr>
</tbody>
</table>
<h4>Q: DynamoDB 预配置很多读写容量，但是没用多少，就出现受限错误。</h4>
<p>A: DynamoDB 预配置读写容量按照整个表来统计。DynamoDB 有分区，每个分区的资源是有限的。当预配置读写容量，或者数据量超过一定程度时，DynamoDB 会自动分区。根据主键 partition key 哈希值，确定每个 item 的所在分区。如果某些特定的 item 读写量巨大，落在某个分区，耗尽此分区的 IO 资源，就会出现受限。</p>
<p>举例，为某个表设置了10000读容量和4000写容量，可能需要总共8个分区。根据预设值的容量计算，每个分区的读容量上限为1250。某些热点数据读取过于频繁，达到1250会出现错误。</p>
<p>还有一种可能，之前设置了大读写容量，自动进行分区。后来减少读写容量，但是分区不会减少，这样分配给每个分区的读写容量更少，更容易出现热点分区数据受限的问题。</p>
<p>解决办法：</p>
<ul>
<li>增加读写容量。</li>
<li>避免过度的热点数据访问。</li>
<li>DynamoDB 之前加入 Elasticache 缓存，或者 DynamoDB DAX 缓存功能，来减少读写压力。</li>
</ul>
<p><a name="11F"></a></p>
<h4>Q: DynamoDB 中国区如何备份？</h4>
<p>A: DynamoDB 在海外区域已经有备份恢复功能，但是中国区目前还没有。可以使用 DynamoDB 自带的导出 csv 功能，或者第三方工具，把数据导出成文件。</p>
<table width="100%">
<tbody>
<tr>
<td width="85%">
<h2>ElastiCache</h2>
</td>
<td width="15%"></td>
</tr>
</tbody>
</table>
<h4>Q: 如何监控 Elasticache Redis 性能指标？</h4>
<p>A: Cloudwatch 有以下指标需要关注：</p>
<ul>
<li>
<ul>
<li>CPUUtilization：CPU利用率。对于Redis这种缓存服务来说，一般CPU利用率不高。</li>
<li>SwapUsage：交换分区。内存不足时会使用。但是，如果只是偶尔出现少量的 swap 使用，也有可能是操作系统某些动作所产生。如果其他指标，例如BytesUsedForCache, Evictions 正常，可以不必过于关注。</li>
<li>Evictions：由于超过最大内存限制，而被驱逐出的key数量。这是重要指标。检查 BytesUsedForCache 指标，如果几乎用满了分配的内存，说明内存不足。</li>
</ul>
</li>
</ul>
<p>BytesUsedForCache：分配给 Redis 的内存。注意，有部分内存是保留给备份或者复制等操作所使用。有可能看到的情况是，选择了16GB内存的 Redis 实例类型，最多只能使用12GB。新创建的 Redis，默认保留25%内存。请检查 <code>reserved-memory</code> 和 <code>reserved-memory-percent</code> 这两个参数。</p>
<p>CurrConnections：当前客户端连接数。如果与之前相比，出现异常，请检查应用程序。Redis是单线程，客户端一般是通过连接池来管理，提高效率。</p>
<p>FreeableMemory：操作系统层面的可用内存。Linux 的一个机制是，尽量使用 buffer/cache，很多内存用于缓存，可用内存一般很少。如果可用内存很少，而其他 Redis 指标正常，不必担心。</p>
<h4>Q: Elasticache Redis 如何做持久化？</h4>
<p>A: AOF (Append Only Files ) 把数据放在本地磁盘，此功能2.8以及之前的版本默认不开启，3.2以上版本进禁止修改。建议使用复制组，而不是 AOF。本地磁盘位于实例存储 (instance store)，用于存储临时数据。如果出现底层硬件故障，本地磁盘的数据，包括 AOF，也会丢失。而复制组位于多可用区，数据自动复制到只读副本，可以自动实现故障转移。</p>
<h4>Q: Elasticache Redis 复制组如果出现故障，应用是否需要调整？</h4>
<p>A:如果只读副本出现故障，那么会自动启动新的只读副本以替代故障节点。应用程序需要修改只读请求，到新的只读副本。到主节点的读写请求无需修改。</p>
<p>如果主节点出现故障，那么会自动提升某个只读副本为新的主节点，DNS 会指向新的 IP。对于应用程序来说，读写请求还是指向主节点 DNS，无需修改。而只读请求要修改，包括新的只读副本。</p>
<h4>Q: 如何设置Redis用户名密码登录？</h4>
<p>A: Elasticache Redis 不支持用户名密码登录。可以通过安全组和网络 ACL，只允许信任的 IP 访问。</p>
<h4>Q: 如何设置 Redis 允许从外网访问?</h4>
<p>A: Elasticache Redis 设计成内部访问，DNS 解析出来的 IP 都是 VPC 内的私有地址。从外网访问，网络延迟会影响性能，并且也不安全。</p>
<p>如果一定要从外网访问，可以在 VPC 内把一个 EC2 实例做成 NAT，添加 iptables 规则，从外网访问 EC2 某个端口（例如6379），通过 NAT 端口映射到内网 Redis 端口。请注意，这些外网流量不加密，谨慎选择此方式。</p>
<h4>Q: Elasticache Redis 有集群和非集群模式，如何选择？</h4>
<p>A: 两种模式都支持主从方式实现高可用性。集群模式中，每个分片中都有一个复制组，包括一个主节点和多个只读副本。</p>
<p>两种模式的不同在于扩展性。<a name="12F"></a></p>
<p>非集群模式中，主节点只有一个，如果内存不足，只能通过升级节点类型的方式。只读副本最大5个。</p>
<p>集群模式提供了分区功能。如果主节点写请求压力大，使用集群模式进行分区，最大15个，把数据写入到多个节点，实现更好的扩展。对于读请求，集群模式可以有最多15*5=75个只读副本。</p>
<table width="100%">
<tbody>
<tr>
<td width="85%">
<h2>Redshift</h2>
</td>
<td width="15%">&nbsp;</td>
</tr>
</tbody>
</table>
<h4>Q: 将 S3 中的大量 Gzip CSV 导入 Redshift，如何提高并发 COPY 性能？</h4>
<p>A: Redshift COPY 性能受以下因素影响：</p>
<ul>
<li>并行传输。将数据拆分成多个文件，同一个 COPY 命令可以把多个文件并行写入到同一个表。请注意，此特性不适用于多个 COPY 命令写入同一个表，需要等待前一个 COPY 完成才能继续。</li>
<li>表压缩。默认情况下， COPY 空表自动压缩。压缩消耗资源，会牺牲一部分 COPY 性能，以换取更小的存储空间。需要在性能和存储之间做出权衡。COMPUPDATE OFF（或 FALSE），将禁用自动压缩。</li>
<li>表分析。默认情况下，COPY 命令会在将数据加载到空表后执行分析。分析就是运行 ANALYZE 命令，以构建和选择最佳计划的统计元数据，也需要消耗资源。在导入过程中，COPY 命令加入 STATUPDATE OFF（或 FALSE），不会更新统计数据。</li>
<li>排序键。如果表定义了排序键 (sort key)，可以在 COPY 导入数据的时候更有效率，并且提高查询效率。</li>
<li>分配。Redshift 导入数据时，会把每一行数据按照 distribution style 存储到不同的计算节点。这对于之后的查询性能也很重要。</li>
<li>文件压缩。多个csv gzip 文件直接放在 S3，在导入 redshift 的时候，需要解压，会影响性能。如果都是小的压缩文件，请解压后再上传到 S3，然后再 copy 到 redshift。</li>
</ul>
<h4>Q: Redshift 为多个表创建联合视图，表已经创建了SORT KEY，但是查询性能很低。</h4>
<p>A: Redshift sort key 默认为 COMPOUND。如果查询条件中使用了这个 sort key 所包含的所有列，那么查询效率将会很高。相反的，如果查询条件中，并没有包括 sort key，或者只包含 COMPOUND SORT KEY 某一部分，查询效率将会下降。</p>
<p>查询视图需要遍历所有数据，视图会创建临时表，并扫描此临时表。即使源表设置了sort key，视图也不会使用，从而降低查询效率。</p>
<p>解决方案：</p>
<ul>
<li>修改 sort key 为最需要排序的列，并且在查询中使用 sort key 的所有列，而不要只指定 sort key 的部分列。如果只需要其中一些列作为优化排序，在创建表时，使用 INTERLEAVED SORT KEY语句。</li>
<li>只创建一个表，每天的数据通过 COPY 命令导入 Redshift 这个表。单个表的查询，可以直接使用 SORT KEY 优化。</li>
<li>如果有别的表需要 JOIN 操作，设置正确的 DISTKEY，避免不必要的节点之间数据传输。</li>
<li>如果表排序已经很乱，或者有一些空间标记为删除，但是没有回收，请运行 vacuum 命令以回收空间，并执行排序。</li>
</ul>
<h4>Q: Redshift 无法并行跑大 Query，出现 out of memory。</h4>
<p>A: 以下是 Redshift 的一些统计信息。</p>
<table border="1">
<tbody>
<tr>
<td>
<h4><strong>table</strong></h4>
</td>
<td>
<h4><strong>table_id </strong></h4>
</td>
<td>
<h4><strong>dist</strong></h4>
</td>
<td>
<h4><strong>skew_rows </strong></h4>
</td>
<td>
<h4><strong>       sortkey       </strong></h4>
</td>
<td>
<h4><strong>%total  </strong></h4>
</td>
<td>
<h4><strong>%stats </strong></h4>
</td>
<td>
<h4><strong>|</strong></h4>
</td>
<td>
<h4><strong> </strong></h4>
</td>
<td>
<h4><strong>%unsorted </strong></h4>
</td>
<td>
<h4><strong>sk_skew </strong></h4>
</td>
</tr>
<tr>
<td>1</td>
<td>4343493 |</td>
<td>KEY(exp_id)</td>
<td>108.33 |</td>
<td>INTERLEAVED         |</td>
<td>0.1334 |</td>
<td>99.99 |</td>
<td></td>
<td></td>
<td>0.00 |</td>
<td>       |</td>
</tr>
<tr>
<td>2</td>
<td>117304 |</td>
<td>KEY(end_date)</td>
<td>100.00 |</td>
<td>user_token          |</td>
<td>0.0389 |</td>
<td>33.00 |</td>
<td></td>
<td></td>
<td>5.04 |</td>
<td>1.00 |</td>
</tr>
<tr>
<td>3</td>
<td>117278 |</td>
<td>KEY(datekey)</td>
<td>5.62 |</td>
<td>datekey             |</td>
<td>0.0313 |</td>
<td>86.22 |</td>
<td></td>
<td></td>
<td>6.74 |</td>
<td>9.70 |</td>
</tr>
<tr>
<td>4</td>
<td>3329295 |</td>
<td>KEY(user_id)</td>
<td>26.04 |</td>
<td>date_key            |</td>
<td>0.0283 |</td>
<td>0.41 |</td>
<td></td>
<td></td>
<td>0.00 |</td>
<td>4.75 |</td>
</tr>
<tr>
<td>5</td>
<td>3897907 |</td>
<td>KEY(datekey)</td>
<td>4.62 |</td>
<td>INTERLEAVED         |</td>
<td>0.0218 |</td>
<td>0.80 |</td>
<td></td>
<td></td>
<td>0.80 |</td>
<td>       |</td>
</tr>
<tr>
<td>6</td>
<td>4364043 |</td>
<td>KEY(datekey)</td>
<td>13.50 |</td>
<td>datekey             |</td>
<td>0.0167 |</td>
<td>99.99 |</td>
<td></td>
<td></td>
<td>0.00 |</td>
<td>1.00 |</td>
</tr>
<tr>
<td>7</td>
<td>1799914 |</td>
<td>KEY(date_key)</td>
<td>100.00 |</td>
<td>INTERLEAVED         |</td>
<td>0.0145 |</td>
<td>99.99 |</td>
<td></td>
<td></td>
<td>0.35 |</td>
<td>       |</td>
</tr>
</tbody>
</table>
<p>skew_rows 表示不同切片中，最多行数与最少行数的比率。这些表倾斜严重，说明分配不当，消耗更多内存，严重时耗尽内存资源。并且，一些表使用了 date 类型的字段作为 dist key，但是 date 类型并不适合。</p>
<p>这些问题会消耗大量内存。</p>
<p>解决方案：</p>
<p>重建倾斜严重的表，选择适当的 DIST KEY，要与其他表最为关联的列。<a name="13F"></a></p>
<h4>Q: Redshift 是否可以在线扩容？</h4>
<p>A: Redshift 可以修改节点数量，实现在线扩容。修改过程是，新建一个 Redshift 集群，把数据复制过去。如果数据量很大，修改可能需要很长时间。也可以考虑把原有集群创建快照，从快照恢复新的集群，再进行改名操作。这样可能会节省时间。</p>
<table width="100%">
<tbody>
<tr>
<td width="85%">
<h2>API Gateway</h2>
</td>
<td width="15%"></td>
</tr>
</tbody>
</table>
<p><a name="14F"></a></p>
<h4>Q: 为什么访问 API Gateway，出现 403 Forbidden 错误？（中国）</h4>
<p>A: 由于中国政策原因，在中国使用 API Gateway，需要提交申请，把帐号加入白名单。</p>
<table width="100%">
<tbody>
<tr>
<td width="85%">
<h2>SNS</h2>
</td>
<td width="15%">&nbsp;</td>
</tr>
</tbody>
</table>
<p><a name="15F"></a></p>
<h4>Q: SNS 是否支持移动消息推送？（中国）</h4>
<p>A: 中国区目前不支持移动消息推送功能，以及 SMS 手机短信功能。SNS 可以发送消息到 Lambda 或者 SQS 消息队列，您可以自己开发程序，进行移动消息推送。</p>
<table width="100%">
<tbody>
<tr>
<td width="85%">
<h2>EMR</h2>
</td>
<td width="15%"></td>
</tr>
</tbody>
</table>
<h4>Q: EMR 数据如何选择，存放于 HDFS 还是 S3？</h4>
<p>A: HDFS 运行于 EC2，与 S3 都位于 AWS 内部网络。访问 S3 并不比 HDFS 有明显的网络延迟差异。</p>
<p>相对于 HDFS，数据存放于 S3，有更多好处：</p>
<ul>
<li>S3 具有11个9的持久性，基本不会丢失数据。</li>
<li>S3 具有无限容量，而 HDFS 要受到本地存储容量限制，以后扩展性受限。</li>
<li>如果数据要迁移到新集群，位于 S3 的数据会一直存在，而 HDFS 则需要进行数据迁移。</li>
</ul>
<h4>Q: EMR 资源不足，如何扩容？</h4>
<p>A: EMR 可以更改节点数量。如果数据量大，时间会很长，甚至几天。修改一旦开始，就不能停止。如果有大量数据都存放在 S3，那么可以重建 EMR，甚至使用自定义 AMI，数据也不会丢失。</p>
<h4>Q: EMR 出现磁盘容量不足。</h4>
<p>A: EMR 上的应用，在可能的情况下，尽量使用 S3 替代 HDFS，不用占用本地存储。</p>
<p><code>/mnt</code> <code>/mnt1</code> 这些本地目录一般用于存储临时数据和日志。有时候临时数据没有清理，会出现这些目录占满磁盘。需要经常清理，或者运行自定义 Cloudwatch 磁盘使用率监控脚本，当磁盘不足时，自动发送通知。</p>
<h4>Q: 如何把 S3 多个小文件合并成大文件？</h4>
<p>A: s3distcp 运行MR任务，把 S3 或者 HDFS 的多个文件合并。例如：</p>
<p><code>s3-dist-cp --src s3://support-billing/ --dest s3://pingaws-support/billing/ --groupBy='.*(794767850066*?).*'</code></p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/aws-%e5%b8%b8%e8%a7%81%e9%97%ae%e9%a2%98%e6%b1%87%e6%80%bb/">AWS 常见问题汇总</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/aws-%e5%b8%b8%e8%a7%81%e9%97%ae%e9%a2%98%e6%b1%87%e6%80%bb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>如何实现对集群任务最小影响的 ECS 容器实例自动化终止方案</title>
		<link>https://www.fuwuqiok.com/%e5%a6%82%e4%bd%95%e5%ae%9e%e7%8e%b0%e5%af%b9%e9%9b%86%e7%be%a4%e4%bb%bb%e5%8a%a1%e6%9c%80%e5%b0%8f%e5%bd%b1%e5%93%8d%e7%9a%84-ecs-%e5%ae%b9%e5%99%a8%e5%ae%9e%e4%be%8b%e8%87%aa%e5%8a%a8%e5%8c%96/</link>
		<comments>https://www.fuwuqiok.com/%e5%a6%82%e4%bd%95%e5%ae%9e%e7%8e%b0%e5%af%b9%e9%9b%86%e7%be%a4%e4%bb%bb%e5%8a%a1%e6%9c%80%e5%b0%8f%e5%bd%b1%e5%93%8d%e7%9a%84-ecs-%e5%ae%b9%e5%99%a8%e5%ae%9e%e4%be%8b%e8%87%aa%e5%8a%a8%e5%8c%96/#comments</comments>
		<pubDate>Fri, 17 Aug 2018 02:48:01 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Amazon AWS]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[服务器代维]]></category>
		<category><![CDATA[服务器代维护]]></category>
		<category><![CDATA[服务器安全代维]]></category>
		<category><![CDATA[服务器安全设置]]></category>
		<category><![CDATA[服务器维护]]></category>
		<category><![CDATA[服务器迁移]]></category>
		<category><![CDATA[如何实现对集群任务最小影响的 ECS 容器实例自动化终止方案]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=3754</guid>
		<description><![CDATA[<p>问题背景 Amazon ECS 是一种容器管理服务，可以很方便地运行、停止和管理群集上的 Docker 容器。 [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e5%a6%82%e4%bd%95%e5%ae%9e%e7%8e%b0%e5%af%b9%e9%9b%86%e7%be%a4%e4%bb%bb%e5%8a%a1%e6%9c%80%e5%b0%8f%e5%bd%b1%e5%93%8d%e7%9a%84-ecs-%e5%ae%b9%e5%99%a8%e5%ae%9e%e4%be%8b%e8%87%aa%e5%8a%a8%e5%8c%96/">如何实现对集群任务最小影响的 ECS 容器实例自动化终止方案</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<h2>问题背景</h2>
<p>Amazon ECS 是一种容器管理服务，可以很方便地运行、停止和管理群集上的 Docker 容器。当使用 ECS 运行容器任务时，会将它们放置在 ECS 群集上。Amazon ECS 从指定的映像存储库中，下载指定的容器映像，并在集群中的容器实例上运行这些映像所承载的任务。</p>
<p>我的同事 Chris Barclay 发了一篇很不错的<a href="https://amazonaws-china.com/cn/blogs/compute/how-to-automate-container-instance-draining-in-amazon-ecs/">博客文章</a>，介绍了在 Auto Scaling 组缩小 ECS 集群之前，使用容器实例耗尽的方法，自动化地删除正在进行的容器实例。</p>
<p>根据多个实际的客户案例，需要从 Amazon ECS 群集中终止实例的应用场景很多且重要， 例如： EC2 AMI 的升级和更新，执行系统关键升级补丁，系统核心组库的更新，Docker 软件版本的升级和更新，ECS 代理的版本升级和更新，集群大小的变更等等。</p>
<h2>解决方案</h2>
<p>通常而言，这些应用场景，都有一个共同的目标就是当容器实例的终止时，或从集群中删除容器实例时，不会影响集群中正在进行的任务，也就是说，阻止将新任务安排在处于 DRAINING 状态的容器实例上，如果资源可用（或预先起动新的容器实例），则新任务分配到 ECS 集群中的其他容器实例，待终止的容器实例上正在运行的任务，等其成功迁移到其他容器实例后，终止实例。实战中，亦可手动修改容器实例的状态为 DRAINING。本文中，我们将展示如何实现对集群任务最小影响的 ECS 容器实例自动化终止方案，其中会需要使用Auto Scaling组的生命周期挂钩以及 Amazon Lambda 提供的无服务函数调用，如下图所示：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/08/1-6.jpg"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/08/1-6.jpg" alt="1-6" width="922" height="268" /></a></p>
<p>Auto Scaling 组支持可调用的生命周期挂钩，例如：Lambda 函数，以允许其在实例启动或终止之前完成，此例为实例终止之前。生命周期挂钩调用的 Lambda 函数完成以下两个任务：</p>
<ol>
<li>将 ECS 容器实例状态设置为 DRAINING。</li>
<li>检查容器实例上是否存在任何正在进行的任务。 如有则会向 SNS 发布消息，再次调用该 Lambda 函数进行检查。</li>
</ol>
<p>该 Lambda 函数会重复执行第2步，直到容器实例上没有任何正在运行的任务，或者生命周期挂钩心跳超时，以先发生者为准。 之后，控制权返回到 Auto Scaling 生命周期挂钩，终止容器实例。</p>
<h2>参考示例</h2>
<p>要实现上述自动化容器实例终止方案，可参考<a href="https://github.com/awslabs/ecs-cid-sample/blob/master/cform/ecs.yaml">开源的 CloudFormation 模板</a>，以及 S3 存储桶中上传 <a href="https://github.com/awslabs/ecs-cid-sample/blob/master/code/index.zip">Lambda 部署软件包</a>，设置本文中描述的资源。该模板创建以下资源：</p>
<ul>
<li>VPC 和关联的网络元素（子网，安全组，路由表等）</li>
<li>ECS 群集，ECS 服务和示例 ECS 任务定义</li>
<li>具有两个 EC2 实例和包含生命周期终止挂钩的 Auto Scaling 组</li>
<li>Lambda 函数</li>
<li>SNS 话题</li>
<li>能执行 Lambda 函数的 IAM 角色</li>
</ul>
<p>鉴于中国区有关 Auto Scaling 组的可信任实体和全球的命名方式有所区别，因此可参考<a href="https://github.com/aws-samples/ecs-cid-sample/pull/17">这里</a>的修改方法，对 CloudFormation 模板进行配置和更改。</p>
<p>创建 CloudFormation 堆栈，我们可以通过触发实例终止事件，来了解这是如何工作的：</p>
<ul>
<li>在 Amazon EC2 控制台中 ，选择 Auto Scaling Groups 并选择由 CloudFormation 创建的 Auto Scaling 组的名称。</li>
<li>选择操作 ， 编辑并更新服务，将实例的数量减少1个。</li>
</ul>
<p>这将触发一个实例的终止过程。选择 Auto Scaling 组实例选项卡：实例状态值应显示生命周期状态：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/08/2-4.jpg"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/08/2-4.jpg" alt="2-4" width="544" height="325" /></a></p>
<p>此时，生命周期挂钩被激活并向 SNS 发布消息，最终触发 Lambda 函数的响应和执行。之后， Lambda 函数将 ECS 容器实例状态更改为 DRAINING。ECS 服务介入调度，停止实例上的任务并在可用实例上启动该任务。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/08/3-5.jpg"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/08/3-5.jpg" alt="3-5" width="628" height="168" /></a></p>
<p>任务完成后，Auto Scaling 组活动历史记录确认 EC2 实例已终止。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/08/4-4.jpg"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/08/4-4.jpg" alt="4-4" width="628" height="97" /></a></p>
<p>&nbsp;</p>
<h2>深入分析</h2>
<p>我们来深入分析一下 Lambda 函数内部的工作原理。该函数首先检查，收到的事件中的 LifecycleTransition 值是否为 EC2_INSTANCE_TERMINATING，表示当前已经进入生命周期挂钩的终止状态之前。</p>
<pre class=" language-c" data-language="C"><code class=" language-c"> <span class="token macro property"># If the event received is instance terminating...</span>
<span class="token keyword">if</span> <span class="token string">'LifecycleTransition'</span> in message<span class="token punctuation">.</span><span class="token function">keys</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
    <span class="token function">print</span><span class="token punctuation">(</span><span class="token string">"message autoscaling {}"</span><span class="token punctuation">.</span><span class="token function">format</span><span class="token punctuation">(</span>message<span class="token punctuation">[</span><span class="token string">'LifecycleTransition'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token keyword">if</span> message<span class="token punctuation">[</span><span class="token string">'LifecycleTransition'</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">find</span><span class="token punctuation">(</span><span class="token string">'autoscaling:EC2_INSTANCE_TERMINATING'</span><span class="token punctuation">)</span> <span class="token operator">&gt;</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">:</span></code></pre>
<p>继续调用函数 “checkContainerInstanceTaskStatus”。该函数根据容器实例的 ID，将容器实例状态设置为 ‘DRAINING’。</p>
<pre class=" language-c" data-language="C"><code class=" language-c"><span class="token macro property"># Get lifecycle hook name</span>
lifecycleHookName <span class="token operator">=</span> message<span class="token punctuation">[</span><span class="token string">'LifecycleHookName'</span><span class="token punctuation">]</span>
<span class="token function">print</span><span class="token punctuation">(</span><span class="token string">"Setting lifecycle hook name {} "</span><span class="token punctuation">.</span><span class="token function">format</span><span class="token punctuation">(</span>lifecycleHookName<span class="token punctuation">)</span><span class="token punctuation">)</span>

<span class="token macro property"># Check if there are any tasks running on the instance</span>
tasksRunning <span class="token operator">=</span> <span class="token function">checkContainerInstanceTaskStatus</span><span class="token punctuation">(</span>Ec2InstanceId<span class="token punctuation">)</span>
</code></pre>
<p>然后，检查实例上是否有任务正在运行。如有任务正在运行，则向 SNS 发布消息以再次触发 Lambda 函数后退出。</p>
<pre class=" language-c" data-language="C"><code class=" language-c"><span class="token macro property"># Use Task ARNs to get describe tasks</span>
descTaskResp <span class="token operator">=</span> ecsClient<span class="token punctuation">.</span><span class="token function">describe_tasks</span><span class="token punctuation">(</span>cluster<span class="token operator">=</span>clusterName<span class="token punctuation">,</span> tasks<span class="token operator">=</span>listTaskResp<span class="token punctuation">[</span><span class="token string">'taskArns'</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
<span class="token keyword">for</span> key in descTaskResp<span class="token punctuation">[</span><span class="token string">'tasks'</span><span class="token punctuation">]</span><span class="token punctuation">:</span>
 <span class="token function">print</span><span class="token punctuation">(</span><span class="token string">"Task status {}"</span><span class="token punctuation">.</span><span class="token function">format</span><span class="token punctuation">(</span>key<span class="token punctuation">[</span><span class="token string">'lastStatus'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
 <span class="token function">print</span><span class="token punctuation">(</span><span class="token string">"Container instance ARN {}"</span><span class="token punctuation">.</span><span class="token function">format</span><span class="token punctuation">(</span>key<span class="token punctuation">[</span><span class="token string">'containerInstanceArn'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
 <span class="token function">print</span><span class="token punctuation">(</span><span class="token string">"Task ARN {}"</span><span class="token punctuation">.</span><span class="token function">format</span><span class="token punctuation">(</span>key<span class="token punctuation">[</span><span class="token string">'taskArn'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span>

<span class="token macro property"># Check if any tasks are running</span>
<span class="token keyword">if</span> <span class="token function">len</span><span class="token punctuation">(</span>descTaskResp<span class="token punctuation">[</span><span class="token string">'tasks'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">&gt;</span> <span class="token number">0</span><span class="token punctuation">:</span>
 <span class="token function">print</span><span class="token punctuation">(</span><span class="token string">"Tasks are still running.."</span><span class="token punctuation">)</span>
 <span class="token keyword">return</span> <span class="token number">1</span>
<span class="token keyword">else</span><span class="token punctuation">:</span>
 <span class="token function">print</span><span class="token punctuation">(</span><span class="token string">"NO tasks are on this instance {}.."</span><span class="token punctuation">.</span><span class="token function">format</span><span class="token punctuation">(</span>Ec2InstanceId<span class="token punctuation">)</span><span class="token punctuation">)</span>
 <span class="token keyword">return</span> <span class="token number">0</span>
</code></pre>
<p>继续执行的 Lambda 函数，发现容器实例上没有运行的任务时，则继续完成生命周期挂钩并终止 EC2 实例。</p>
<pre class=" language-c" data-language="C"><code class=" language-c"><span class="token macro property">#Complete lifecycle hook.</span>
try<span class="token punctuation">:</span>
 response <span class="token operator">=</span> asgClient<span class="token punctuation">.</span><span class="token function">complete_lifecycle_action</span><span class="token punctuation">(</span>
 LifecycleHookName<span class="token operator">=</span>lifecycleHookName<span class="token punctuation">,</span>
 AutoScalingGroupName<span class="token operator">=</span>asgGroupName<span class="token punctuation">,</span>
 LifecycleActionResult<span class="token operator">=</span><span class="token string">'CONTINUE'</span><span class="token punctuation">,</span>
 InstanceId<span class="token operator">=</span>Ec2InstanceId<span class="token punctuation">)</span>
 <span class="token function">print</span><span class="token punctuation">(</span><span class="token string">"Response = {}"</span><span class="token punctuation">.</span><span class="token function">format</span><span class="token punctuation">(</span>response<span class="token punctuation">)</span><span class="token punctuation">)</span>
 <span class="token function">print</span><span class="token punctuation">(</span><span class="token string">"Completedlifecycle hook action"</span><span class="token punctuation">)</span>
except Exception<span class="token punctuation">,</span> e<span class="token punctuation">:</span>
 <span class="token function">print</span><span class="token punctuation">(</span><span class="token function">str</span><span class="token punctuation">(</span>e<span class="token punctuation">)</span><span class="token punctuation">)</span> 
</code></pre>
<h2>结论</h2>
<p>本文讨论了 ECS 容器实例终止的多种应用场景，提供了对集群任务最小影响的 ECS 容器实例自动化终止方案，并通过参考示例展示和深入分析了其工作原理。基于参考示例，可以使用 CloudFormation，Lambda 等服务，实现真正的滚动部署 ，先启动新实例并批量终止实例，同时保证对现有的集群任务带来最小影响。要了解有关容器实例耗尽的更多信息，请参阅 A<a href="http://docs.aws.amazon.com/AmazonECS/latest/developerguide/container-instance-draining.html">mazon ECS 开发人员指南</a> 。</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e5%a6%82%e4%bd%95%e5%ae%9e%e7%8e%b0%e5%af%b9%e9%9b%86%e7%be%a4%e4%bb%bb%e5%8a%a1%e6%9c%80%e5%b0%8f%e5%bd%b1%e5%93%8d%e7%9a%84-ecs-%e5%ae%b9%e5%99%a8%e5%ae%9e%e4%be%8b%e8%87%aa%e5%8a%a8%e5%8c%96/">如何实现对集群任务最小影响的 ECS 容器实例自动化终止方案</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/%e5%a6%82%e4%bd%95%e5%ae%9e%e7%8e%b0%e5%af%b9%e9%9b%86%e7%be%a4%e4%bb%bb%e5%8a%a1%e6%9c%80%e5%b0%8f%e5%bd%b1%e5%93%8d%e7%9a%84-ecs-%e5%ae%b9%e5%99%a8%e5%ae%9e%e4%be%8b%e8%87%aa%e5%8a%a8%e5%8c%96/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用AWS的数据库迁移DMS服务</title>
		<link>https://www.fuwuqiok.com/%e4%bd%bf%e7%94%a8aws%e7%9a%84%e6%95%b0%e6%8d%ae%e5%ba%93%e8%bf%81%e7%a7%bbdms%e6%9c%8d%e5%8a%a1/</link>
		<comments>https://www.fuwuqiok.com/%e4%bd%bf%e7%94%a8aws%e7%9a%84%e6%95%b0%e6%8d%ae%e5%ba%93%e8%bf%81%e7%a7%bbdms%e6%9c%8d%e5%8a%a1/#comments</comments>
		<pubDate>Fri, 27 Jul 2018 08:59:26 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Amazon AWS]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[linux服务器代维]]></category>
		<category><![CDATA[代维]]></category>
		<category><![CDATA[服务器代维]]></category>
		<category><![CDATA[服务器迁移]]></category>
		<category><![CDATA[服务器运维]]></category>
		<category><![CDATA[使用AWS的数据库迁移DMS服务]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=3632</guid>
		<description><![CDATA[<p>1.DMS服务介绍 为了使用户更容易的将数据库迁移到云中，AWS已经在海外区域推出了AWS Database  [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e4%bd%bf%e7%94%a8aws%e7%9a%84%e6%95%b0%e6%8d%ae%e5%ba%93%e8%bf%81%e7%a7%bbdms%e6%9c%8d%e5%8a%a1/">使用AWS的数据库迁移DMS服务</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<h3>1.DMS服务介绍</h3>
<p>为了使用户更容易的将数据库迁移到云中，AWS已经在海外区域推出了AWS Database Migration Service服务，如果您的数据库在海外，DMS可以在源数据库不停机的情况下，帮您将数据迁移到AWS云中。DMS的功能非常强大，支持同构数据库的迁移（如Oracle迁移到Oracle)，也支持异构数据库直接的迁移，如Oracle到Mysql等）。在数据库迁移期间，源数据库无需停机，并且能将迁移期间数据的更改持续复制到目标数据库。因此迁移完成后，您只需在短暂的停机时间内直接切换数据库，从而保证业务数据的完整性。<br />
在中国BJS区域，还没有推出DMS服务，但是提供了Database Migration Tool(DMT)工具，您可以使用DMT工具来完成数据库迁移。</p>
<h3>2.使用DMS完成迁移</h3>
<p>使用DMS服务必须确保源或目标数据库有一个在AWS云中。 使用DMS服务的步骤如下：</p>
<p><strong>步骤一：Create migration</strong></p>
<p>登陆AWS全球区域的Console，选择DMS,点击“Create migration”,我们便来到了“welcome”界面，从该界面我们可以看到，通过DMS进行数据迁移我们至少需要一个源数据库、目标数据库和复制实例。当然，DMS 也支持多个源数据库向一个目标数据库的迁移以及单个源数据库向多个目标数据库的迁移。迁移时，数据通过一个运行在复制实例上的任务将源数据库复制到目标数据库。点击“Next”进行复制实例的创建。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/0928-1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/0928-1.png" alt="0928-1" width="3200" height="2200" /></a></p>
<p><strong>步骤二：创建“Replication Instance”</strong></p>
<p>您在进行数据库迁移过程中的第一个任务是创建具有足够存储空间和处理能力的复制实例，通过复制实例来执行您分配的任务并将数据从您的源数据库迁移到目标数据库。此实例所需的大小取决于您要迁移的数据和您需要执行的任务量。具体配置参数见下表1。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/0928-2.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/0928-2.png" alt="0928-2" width="971" height="700" /></a></p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/0928-3.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/0928-3.png" alt="0928-3" width="3228" height="2444" /></a></p>
<p>如果您需要为网络和加密设置值，请选择高级选项卡。具体参数见表2。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/0928-4.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/0928-4.png" alt="0928-4" width="946" height="706" /></a></p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/0928-5.jpg"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/0928-5.jpg" alt="0928-5" width="819" height="460" /></a></p>
<p><strong>步骤三：创建数据库连接</strong></p>
<p>当您在创建复制实例时，您可以指定源和目标数据库。源数据库和目标数据库可以在AWS的EC2上，也可以是AWS的关系数据库服务（RDS）的DB实例或者本地数据库。在设置源和目标数据库时，             具体参数可以参见表3。您也可以通过高级选项卡来设置连接字符串和加密密钥的值。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/0928-6.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/0928-6.png" alt="0928-6" width="968" height="910" /></a></p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/0928-7.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/0928-7.png" alt="0928-7" width="795" height="920" /></a></p>
<p>等图示上部分的显示变成”Replication instance created successfully”并且“Run test“按钮变成正常，然后测试，确保测试结果为”Connection tested Successfully”,由于需要从AWS服务端连接测试数据库，因此需要设置好security group，设置的security group必须确保复制实例能够访问源和目标数据库。需要的话，可以短暂的将security group 1521　的访问设置为 0.0.0.0/0,测试成功后，点击”Next”按钮。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/0928-8.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/0928-8.png" alt="0928-8" width="805" height="940" /></a></p>
<h4>步骤四：创建“task”</h4>
<p>当源数据库和目标数据库建立连接后，您需要创建一个任务来指定哪些表需要迁移，使用目标架构来映射数据并且在目标数据库中创建新表。作为创建任务的一部分，您可以选择迁移类型：迁移现有数据、迁移现有数据并复制正在进行的更改，或只复制更改的数据。</p>
<p>如果选择”Migrate existing data and replicate data changes”选项需要打开Task Settings 中的supplemental loging开关。在Table Mapping中Schema to Migrate选择“Oracle”,点击“Create Task”。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/0928-9.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/0928-9.png" alt="0928-9" width="821" height="848" /></a></p>
<p>当您创建的task状态从creating变为ready的时候，您的task便创建好了。点击该“task”并点击上方的“Start/Resume”,您数据迁移任务便开始了！</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/0928-10.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/0928-10.png" alt="0928-10" width="1090" height="182" /></a></p>
<p>数据库迁移完成后，目标数据库在您选择的时间段内仍会与源数据库保持同步，使您能够在方便的时候切换数据库。</p>
<h3>3.总结</h3>
<p>从上面过程我们可以看到，只需要简单的配置，DMS就可以帮助我们完成数据库的迁移任务，并且DMS服务是免费的，迁移过程中用到的资源是收费的。</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e4%bd%bf%e7%94%a8aws%e7%9a%84%e6%95%b0%e6%8d%ae%e5%ba%93%e8%bf%81%e7%a7%bbdms%e6%9c%8d%e5%8a%a1/">使用AWS的数据库迁移DMS服务</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/%e4%bd%bf%e7%94%a8aws%e7%9a%84%e6%95%b0%e6%8d%ae%e5%ba%93%e8%bf%81%e7%a7%bbdms%e6%9c%8d%e5%8a%a1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用 Amazon Polly 针对 AWS 账户安全事件进行电话呼叫报警</title>
		<link>https://www.fuwuqiok.com/%e4%bd%bf%e7%94%a8-amazon-polly-%e9%92%88%e5%af%b9-aws-%e8%b4%a6%e6%88%b7%e5%ae%89%e5%85%a8%e4%ba%8b%e4%bb%b6%e8%bf%9b%e8%a1%8c%e7%94%b5%e8%af%9d%e5%91%bc%e5%8f%ab%e6%8a%a5%e8%ad%a6/</link>
		<comments>https://www.fuwuqiok.com/%e4%bd%bf%e7%94%a8-amazon-polly-%e9%92%88%e5%af%b9-aws-%e8%b4%a6%e6%88%b7%e5%ae%89%e5%85%a8%e4%ba%8b%e4%bb%b6%e8%bf%9b%e8%a1%8c%e7%94%b5%e8%af%9d%e5%91%bc%e5%8f%ab%e6%8a%a5%e8%ad%a6/#comments</comments>
		<pubDate>Fri, 23 Mar 2018 02:01:45 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[服务器安全设置]]></category>
		<category><![CDATA[服务器维护]]></category>
		<category><![CDATA[服务器迁移]]></category>
		<category><![CDATA[服务器运维]]></category>
		<category><![CDATA[网站代维]]></category>
		<category><![CDATA[网站防挂马]]></category>
		<category><![CDATA[aws服务器代维]]></category>
		<category><![CDATA[linode云服务器迁移]]></category>
		<category><![CDATA[Linux服务器维护]]></category>
		<category><![CDATA[linux维护]]></category>
		<category><![CDATA[云服务解决方案]]></category>
		<category><![CDATA[企业上云服务咨询]]></category>
		<category><![CDATA[服务器外包]]></category>
		<category><![CDATA[香港服务器代维]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=3539</guid>
		<description><![CDATA[<p>AWS 账户的安全性是重中之重。随时了解您 AWS 账户中与安全相关的所有最新事件非常重要。您可以通过多种方式 [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e4%bd%bf%e7%94%a8-amazon-polly-%e9%92%88%e5%af%b9-aws-%e8%b4%a6%e6%88%b7%e5%ae%89%e5%85%a8%e4%ba%8b%e4%bb%b6%e8%bf%9b%e8%a1%8c%e7%94%b5%e8%af%9d%e5%91%bc%e5%8f%ab%e6%8a%a5%e8%ad%a6/">使用 Amazon Polly 针对 AWS 账户安全事件进行电话呼叫报警</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>AWS 账户的安全性是重中之重。随时了解您 AWS 账户中与安全相关的所有最新事件非常重要。您可以通过多种方式接收警报，例如通过电子邮件或短信，不过在本博客帖子中，我将向您演示如何使用 Amazon AI 服务 (例如 Amazon Polly) 以及任何基于云的通信平台 (例如 Twilio)，在手机上接听语音警报。</p>
<p>Amazon Polly 是一项将文本转换为逼真语音的服务，让您可以构建支持聊天功能的应用程序，从而打造全新类别的具有语音功能的产品。它使用深度学习技术来合成类似于人声的语音。该服务提供了不同语言的各种语音。</p>
<p>对于外出的企业 IT 安全人员，有关 AWS 账户安全事件的电话呼叫警报可以带来极大的帮助。这些安全事件可以根据事件的严重性和优先级进行自定义。严重性和优先级较高的安全事件可以发送到通过电话呼叫报警的系统中。</p>
<p>对于电话呼叫报警，我会使用 Twilio，它提供了 API 功能，例如语音、视频和消息传送。当给定 AWS 账户中发生安全事件时，使用 Twilio 的平台能够以编程方式发布 API 调用，用于进行电话呼叫。Amazon Polly 将此文本警报转换为在电话呼叫上播放的语音消息。</p>
<h2>解决方案概述</h2>
<p>该解决方案包括两个系统，如以下架构图所示：</p>
<ul>
<li>事件检测和通知系统</li>
<li>文本到语音转换系统</li>
</ul>
<p>事件检测和通知系统与文本到语音转换系统彼此分离，这是因为后一个系统对用户定义的任何其他事件检测通用。在此博客帖子中，作为解决方案示例，我重点介绍文本到语音转换系统，并使用来自我之前博客帖子中介绍的<a href="https://aws.amazon.com/blogs/mt/monitor-and-notify-on-aws-account-root-user-activity/">事件检测和通知系统</a>。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/polly-voice-alerts-1.gif"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/polly-voice-alerts-1.gif" alt="polly-voice-alerts-1" width="800" height="582" /></a></p>
<p>如架构图中所示。步骤 3 的警报消息发布到 Amazon SNS 主题，该 SNS 触发我们文本到语音转换系统中的 Lambda 函数。</p>
<ol>
<li>此 Lambda 函数解析 SNS 警报消息的主题，并使用 Amazon Polly 将文本转换为语音文件。</li>
<li>此语音文件存储在 Amazon S3 存储桶中。</li>
<li>Twilio 使用语音文件的位置，对相关方进行出站呼叫并播放语音文件。请注意，您可以根据在使用语音文件进行出站呼叫之后的需求，为这些文件添加 Amazon S3 <a href="http://docs.aws.amazon.com/AmazonS3/latest/dev/object-lifecycle-mgmt.html">对象生命周期策略</a>。</li>
</ol>
<h2>演示</h2>
<h3>先决条件</h3>
<ul>
<li>至少有一个事件检测和通知系统。例如，您可以设置<a href="https://aws.amazon.com/blogs/mt/monitor-and-notify-on-aws-account-root-user-activity/">对 AWS 账户根用户活动进行监视和通知</a></li>
<li>您将需要 Twilio 账户身份验证令牌来进行 API 调用。您可在<a href="https://www.twilio.com/console">此处</a>注册免费 (试用) Twilio 账户。<a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/polly-voice-alerts-2.gif"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/polly-voice-alerts-2.gif" alt="polly-voice-alerts-2" width="800" height="505" /></a></li>
<li>会向您的 Twilio 账户分配一个电话号码。这是您接听电话呼叫报警时的主叫号码。<br />
<a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/polly-voice-alerts-3.gif"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/polly-voice-alerts-3.gif" alt="polly-voice-alerts-3" width="600" height="217" /></a></li>
<li>如果您使用的是试用账户，则需要确保对“被叫”电话号码进行验证。<br />
<a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/polly-voice-alerts-4.gif"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/polly-voice-alerts-4.gif" alt="polly-voice-alerts-4" width="600" height="217" /></a></li>
</ul>
<h3>部署步骤</h3>
<p>以下部署步骤将部署“文本到语音转换”系统，如下图中所示。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/polly-voice-alerts-5.gif"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/polly-voice-alerts-5.gif" alt="polly-voice-alerts-5" width="800" height="449" /></a></p>
<ol>
<li>在 AWS CloudFormation 控制台中，选择 <strong>Create Stack</strong>。使用 CloudFormation JSON 模板 <a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/launchstack.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/launchstack.png" alt="launchstack" width="107" height="20" /></a>。选择 <strong>Next</strong>。(注意：中国和 AWS GovCloud (美国) 区域不支持 Amazon Polly。)</li>
<li>在要部署事件检测和通知系统的区域中创建堆栈。</li>
<li>输入以下参数详细信息，选择 <strong>Next</strong>，然后选择 <strong>Next</strong>：
<ol type="a">
<li><strong>ToPhoneNo：</strong>Twilio 将拨打的电话号码。在电话号码前面加上“+国家/地区代码”，例如 +14561237890。</li>
<li><strong>FromPhoneNo：</strong>Twilio 进行呼叫时所用的虚拟电话号码。在您的 Twilio 账户中可以找到此信息。请参阅“先决条件”部分。</li>
<li><strong>TwilioAccntSid：</strong>输入 Twilio 账户 SID。当您在 <a href="https://www.twilio.com/">https://www.twilio.com/</a> 上注册时提供此项</li>
<li><strong>TwilioAuthToken：</strong>输入 Twilio 身份验证令牌 ID。</li>
<li><strong>BucketName：</strong>输入您要创建的存储桶的名称。此存储桶将存储事件警报的语音文件。</li>
<li><strong>PollyVoiceId：</strong>输入您希望呼入警报的 Amazon Polly 语音。默认语音为“Amy”。</li>
<li><strong>LambdaS3Bucket：</strong>存储 Lambda 函数 zip 文件的 Amazon S3 存储桶的名称。</li>
<li><strong>LambdaS3Key：</strong>Lambda 函数 zip 文件的名称。这是 S3 对象的完整路径，带有前缀。例如，“dir1/dir2/lambdafunction.zip”。Lambda 函数 zip 文件可以从此博客帖子的 Lambda 函数部分中的链接下载。</li>
</ol>
</li>
<li>依次选择 <strong>Capabilities Acknowledgement</strong> 和 <strong>Create</strong>。此字段向堆栈提供权限来创建 IAM 角色和策略。这些角色和策略由 Lambda 函数用于执行特定操作，例如发布消息到 SNS 主题、列出账户别名等等。</li>
<li>CloudFormation 堆栈完成之后，检查 <strong>output</strong> 中提供的 Lambda 函数名</li>
<li>现在，我们将触发器添加到此 Lambda 函数。转到 Lambda 控制台并<strong>选择</strong>刚刚创建的 Lambda 函数，然后选择 <strong>triggers</strong> 和 <strong>add trigger</strong>。</li>
<li>在触发器框中，选择 SNS，并选择您希望用于电话呼叫的“事件检测和通知”系统的 SNS 主题。选择 <strong>Submit</strong>。<br />
<a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/polly-voice-alerts-6.gif"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/polly-voice-alerts-6.gif" alt="polly-voice-alerts-6" width="600" height="443" /></a></li>
<li>现在，Lambda 函数已准备好，可由您的“事件检测和通知”系统的 SNS 主题触发。您可以根据需要，为各种事件检测和通知系统添加任意数量的触发器。在<a href="http://docs.aws.amazon.com/lambda/latest/dg/invoking-lambda-function.html#supported-event-source-sns" target="_blank" rel="noopener noreferrer">此处</a>可以找到有关触发 AWS Lambda 的更多信息。</li>
</ol>
<h3>SNS 触发 Lambda 函数</h3>
<p>在触发时，文本语音转换 Lambda 函数会解析 SNS 消息的主题。然后，它将此主题字段文本传递到 Amazon Polly 服务以将其转换为语音文件。将文本转换为语音文件之后，该文件存储在前一部分中由 CloudFormation 堆栈创建的 S3 存储桶内。</p>
<p>然后，它调用 Twilio API 进行电话呼叫，并播放来自 S3 存储桶的事件通知音频文件。</p>
<div class="hide-language">
<pre class=" language-python" data-language="Python"><code class=" language-python"><span class="token keyword">import</span> boto3
<span class="token keyword">import</span> os
<span class="token keyword">from</span> contextlib <span class="token keyword">import</span> closing
<span class="token keyword">import</span> botocore<span class="token punctuation">.</span>session
<span class="token keyword">from</span> botocore<span class="token punctuation">.</span>exceptions <span class="token keyword">import</span> ClientError
session <span class="token operator">=</span> botocore<span class="token punctuation">.</span>session<span class="token punctuation">.</span>get_session<span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">import</span> logging
<span class="token keyword">import</span> uuid
<span class="token keyword">import</span> twilio
<span class="token keyword">from</span> twilio<span class="token punctuation">.</span>rest <span class="token keyword">import</span> Client

<span class="token keyword">import</span> urllib
<span class="token keyword">from</span> urllib <span class="token keyword">import</span> request<span class="token punctuation">,</span> parse
<span class="token keyword">from</span> urllib<span class="token punctuation">.</span>parse <span class="token keyword">import</span> quote

logging<span class="token punctuation">.</span>basicConfig<span class="token punctuation">(</span>level<span class="token operator">=</span>logging<span class="token punctuation">.</span>DEBUG<span class="token punctuation">)</span>
logger<span class="token operator">=</span>logging<span class="token punctuation">.</span>getLogger<span class="token punctuation">(</span>__name__<span class="token punctuation">)</span>

<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>
    logger<span class="token punctuation">.</span>setLevel<span class="token punctuation">(</span>logging<span class="token punctuation">.</span>DEBUG<span class="token punctuation">)</span>
    logger<span class="token punctuation">.</span>debug<span class="token punctuation">(</span><span class="token string">"Event is --- %s"</span> <span class="token operator">%</span>event<span class="token punctuation">)</span>
    speak <span class="token operator">=</span> event<span class="token punctuation">[</span><span class="token string">"Records"</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">"Sns"</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">"Subject"</span><span class="token punctuation">]</span>
	
	<span class="token comment" spellcheck="true"># 将 SNS 消息的主题文本转换为 mp3 语音文件。</span>
	
    polly <span class="token operator">=</span> boto3<span class="token punctuation">.</span>client<span class="token punctuation">(</span><span class="token string">'polly'</span><span class="token punctuation">)</span>
    response <span class="token operator">=</span> polly<span class="token punctuation">.</span>synthesize_speech<span class="token punctuation">(</span> OutputFormat<span class="token operator">=</span><span class="token string">'mp3'</span><span class="token punctuation">,</span>
                                        Text <span class="token operator">=</span> <span class="token string">'ALERT !'</span> <span class="token operator">+</span> speak<span class="token punctuation">,</span>
                                        SampleRate<span class="token operator">=</span><span class="token string">'22050'</span><span class="token punctuation">,</span>
                                        VoiceId <span class="token operator">=</span> os<span class="token punctuation">.</span>environ<span class="token punctuation">[</span><span class="token string">'VoiceId'</span><span class="token punctuation">]</span>  
                                        <span class="token punctuation">)</span>
    logger<span class="token punctuation">.</span>debug<span class="token punctuation">(</span><span class="token string">"Polly Response is-- %s"</span> <span class="token operator">%</span>response<span class="token punctuation">)</span>
    id <span class="token operator">=</span> str<span class="token punctuation">(</span>uuid<span class="token punctuation">.</span>uuid4<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
    logger<span class="token punctuation">.</span>debug<span class="token punctuation">(</span><span class="token string">"ID= %s"</span> <span class="token operator">%</span>id<span class="token punctuation">)</span>
    
    
    <span class="token comment" spellcheck="true"># 将 Amazon Polly 返回的语音流保存到 Lambda 的临时</span>
    <span class="token comment" spellcheck="true"># 目录。如果有多个文本块，语音流</span>
    <span class="token comment" spellcheck="true"># 将合并为单个文件。</span>
    <span class="token keyword">if</span> <span class="token string">"AudioStream"</span> <span class="token keyword">in</span> response<span class="token punctuation">:</span>
        <span class="token keyword">with</span> closing<span class="token punctuation">(</span>response<span class="token punctuation">[</span><span class="token string">"AudioStream"</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token keyword">as</span> stream<span class="token punctuation">:</span>
            filename<span class="token operator">=</span>id <span class="token operator">+</span> <span class="token string">".mp3"</span>
            output <span class="token operator">=</span> os<span class="token punctuation">.</span>path<span class="token punctuation">.</span>join<span class="token punctuation">(</span><span class="token string">"/tmp/"</span><span class="token punctuation">,</span>filename<span class="token punctuation">)</span>
            <span class="token keyword">with</span> open<span class="token punctuation">(</span>output<span class="token punctuation">,</span> <span class="token string">"wb"</span><span class="token punctuation">)</span> <span class="token keyword">as</span> file<span class="token punctuation">:</span>
                file<span class="token punctuation">.</span>write<span class="token punctuation">(</span>stream<span class="token punctuation">.</span>read<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
	
	<span class="token comment" spellcheck="true"># 将语音 MP3 文件上传到 S3位置</span>
	
    s3 <span class="token operator">=</span> boto3<span class="token punctuation">.</span>client<span class="token punctuation">(</span><span class="token string">'s3'</span><span class="token punctuation">)</span>
    s3upload_response <span class="token operator">=</span> s3<span class="token punctuation">.</span>upload_file<span class="token punctuation">(</span><span class="token string">'/tmp/'</span> <span class="token operator">+</span> filename<span class="token punctuation">,</span> os<span class="token punctuation">.</span>environ<span class="token punctuation">[</span><span class="token string">'BUCKET_NAME'</span><span class="token punctuation">]</span><span class="token punctuation">,</span>filename<span class="token punctuation">,</span>ExtraArgs<span class="token operator">=</span><span class="token punctuation">{</span><span class="token string">"ContentType"</span><span class="token punctuation">:</span> <span class="token string">"audio/mp3"</span><span class="token punctuation">}</span><span class="token punctuation">)</span>
    logger<span class="token punctuation">.</span>debug<span class="token punctuation">(</span><span class="token string">"S3 UPLOAD RESPONSE IS--- %s"</span> <span class="token operator">%</span>s3upload_response<span class="token punctuation">)</span>
    s3<span class="token punctuation">.</span>put_object_acl<span class="token punctuation">(</span>ACL<span class="token operator">=</span><span class="token string">'public-read'</span><span class="token punctuation">,</span> Bucket<span class="token operator">=</span>os<span class="token punctuation">.</span>environ<span class="token punctuation">[</span><span class="token string">'BUCKET_NAME'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> Key<span class="token operator">=</span> filename<span class="token punctuation">)</span>
    
    location <span class="token operator">=</span> s3<span class="token punctuation">.</span>get_bucket_location<span class="token punctuation">(</span>Bucket<span class="token operator">=</span>os<span class="token punctuation">.</span>environ<span class="token punctuation">[</span><span class="token string">'BUCKET_NAME'</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
    logger<span class="token punctuation">.</span>debug<span class="token punctuation">(</span><span class="token string">"Location response is -- %s"</span> <span class="token operator">%</span>location<span class="token punctuation">)</span>
    region <span class="token operator">=</span> location<span class="token punctuation">[</span><span class="token string">'LocationConstraint'</span><span class="token punctuation">]</span>
    
    <span class="token keyword">if</span> region <span class="token keyword">is</span> None<span class="token punctuation">:</span>
    	url_begining <span class="token operator">=</span> <span class="token string">"https://s3.amazonaws.com/"</span>
    <span class="token keyword">else</span><span class="token punctuation">:</span>
    	url <span class="token operator">=</span> url_begining <span class="token operator">+</span> str<span class="token punctuation">(</span>os<span class="token punctuation">.</span>environ<span class="token punctuation">[</span><span class="token string">'BUCKET_NAME'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">"/"</span> <span class="token operator">+</span> filename
    
    url <span class="token operator">=</span> <span class="token string">'{}/{}/{}'</span><span class="token punctuation">.</span>format<span class="token punctuation">(</span>s3<span class="token punctuation">.</span>meta<span class="token punctuation">.</span>endpoint_url<span class="token punctuation">,</span> os<span class="token punctuation">.</span>environ<span class="token punctuation">[</span><span class="token string">'BUCKET_NAME'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> filename<span class="token punctuation">)</span>
    
    <span class="token comment" spellcheck="true">#编码 URL</span>
    encode_url <span class="token operator">=</span> quote<span class="token punctuation">(</span>url<span class="token punctuation">,</span> safe<span class="token operator">=</span><span class="token string">''</span><span class="token punctuation">)</span>
    logger<span class="token punctuation">.</span>debug<span class="token punctuation">(</span><span class="token string">"ENCODED URL-- %s"</span> <span class="token operator">%</span>encode_url<span class="token punctuation">)</span>
    
    <span class="token comment" spellcheck="true"># 从 http://twilio.com/user/account 获取这些凭证</span>
    account_sid <span class="token operator">=</span> os<span class="token punctuation">.</span>environ<span class="token punctuation">[</span><span class="token string">'account_sid'</span><span class="token punctuation">]</span>
    auth_token <span class="token operator">=</span> os<span class="token punctuation">.</span>environ<span class="token punctuation">[</span><span class="token string">'auth_token'</span><span class="token punctuation">]</span>
    client <span class="token operator">=</span> Client<span class="token punctuation">(</span>account_sid<span class="token punctuation">,</span> auth_token<span class="token punctuation">)</span>
    
    <span class="token comment" spellcheck="true"># 使用 Twilio 进行电话呼叫</span>
    call_response <span class="token operator">=</span> client<span class="token punctuation">.</span>api<span class="token punctuation">.</span>account<span class="token punctuation">.</span>calls<span class="token punctuation">.</span>create<span class="token punctuation">(</span>to<span class="token operator">=</span>os<span class="token punctuation">.</span>environ<span class="token punctuation">[</span><span class="token string">'ToPhoneNo'</span><span class="token punctuation">]</span><span class="token punctuation">,</span>  <span class="token comment" spellcheck="true"># 任意电话号码</span>
    												from_<span class="token operator">=</span>os<span class="token punctuation">.</span>environ<span class="token punctuation">[</span><span class="token string">'FromPhoneNo'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token comment" spellcheck="true"># 必须是有效的 Twilio 号码</span>
    												url<span class="token operator">=</span><span class="token string">"http://twimlets.com/message?Message%5B0%5D="</span> <span class="token operator">+</span> encode_url <span class="token operator">+</span> <span class="token string">"&amp;"</span>
    												<span class="token punctuation">)</span>
    												
    logger<span class="token punctuation">.</span>debug<span class="token punctuation">(</span><span class="token string">"Call_response is-- %s"</span> <span class="token operator">%</span>call_response<span class="token punctuation">)</span></code></pre>
</div>
<p>此 AWS Lambda 代码 zip 文件可从<a href="https://s3.amazonaws.com/aws-bigdata-blog/artifacts/polly-voice-alert/ai-audio.zip" target="_blank" rel="noopener noreferrer">此处</a>下载并用于 CloudFormation 堆栈部署。</p>
<h2>解决方案验证</h2>
<p>在接下来的示例语音中，我将演示在部署事件检测系统 (就根 API 活动进行通知) 并将其集成到文本到语音转换系统之后，每次在 AWS 账户上检测到根 API 时，我将收到电话呼叫报警。</p>
<p>由根触发的控制台登录警报电话呼叫示例：</p>
<table>
<tbody>
<tr>
<td><img src="https://d2908q01vomqb2.cloudfront.net/b6692ea5df920cad691c20319a6fffd7a4a766b8/2017/04/20/Polly_mini.gif" alt="" /></td>
<td><small>立即收听</small></p>
<p><small>语音由 <a href="https://aws.amazon.com/polly/" target="_blank" rel="noopener noreferrer">Amazon Polly</a> 提供</small></td>
</tr>
</tbody>
</table>
<p>然后，我使用根凭证创建 Amazon EBS 卷并获取另一个电话呼叫警报。</p>
<table>
<tbody>
<tr>
<td><img src="https://d2908q01vomqb2.cloudfront.net/b6692ea5df920cad691c20319a6fffd7a4a766b8/2017/04/20/Polly_mini.gif" alt="" /></td>
<td><small>立即收听</small></p>
<p><small>语音由 <a href="https://aws.amazon.com/polly/" target="_blank" rel="noopener noreferrer">Amazon Polly</a> 提供</small></td>
</tr>
</tbody>
</table>
<h2>结论</h2>
<p>在这篇帖子中，我演示了如何创建电话呼叫音频警报系统，该系统可集成到现有的警报和监视系统中。针对 AWS 账户中的关键事件，此框架在获取近乎实时的电话呼叫警报方面非常有用。</p>
<p>如需进一步了解，建议阅读以下内容：</p>
<ul>
<li><a href="https://aws.amazon.com/blogs/ai/build-your-own-text-to-speech-applications-with-amazon-polly/" target="_blank" rel="noopener noreferrer">使用 Amazon Polly 构建您自己的文本到语音应用程序</a></li>
<li><a href="https://aws.amazon.com/blogs/mt/monitor-and-notify-on-aws-account-root-user-activity/" target="_blank" rel="noopener noreferrer">对 AWS 账户根用户活动进行监视和通知</a></li>
<li><a href="https://aws.amazon.com/blogs/mt/monitor-changes-and-auto-enable-logging-in-aws-cloudtrail/" target="_blank" rel="noopener noreferrer">在 AWS CloudTrail 中监视更改和自动启用日志记录</a></li>
</ul>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e4%bd%bf%e7%94%a8-amazon-polly-%e9%92%88%e5%af%b9-aws-%e8%b4%a6%e6%88%b7%e5%ae%89%e5%85%a8%e4%ba%8b%e4%bb%b6%e8%bf%9b%e8%a1%8c%e7%94%b5%e8%af%9d%e5%91%bc%e5%8f%ab%e6%8a%a5%e8%ad%a6/">使用 Amazon Polly 针对 AWS 账户安全事件进行电话呼叫报警</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-amazon-polly-%e9%92%88%e5%af%b9-aws-%e8%b4%a6%e6%88%b7%e5%ae%89%e5%85%a8%e4%ba%8b%e4%bb%b6%e8%bf%9b%e8%a1%8c%e7%94%b5%e8%af%9d%e5%91%bc%e5%8f%ab%e6%8a%a5%e8%ad%a6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
