<?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; linux服务器维护</title>
	<atom:link href="https://www.fuwuqiok.com/topics/linux%e6%9c%8d%e5%8a%a1%e5%99%a8%e7%bb%b4%e6%8a%a4/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>万能配置(网站_服务器_数据库_安全组及端口_系统配置及设置_ftp)</title>
		<link>https://www.fuwuqiok.com/%e4%b8%87%e8%83%bd%e9%85%8d%e7%bd%ae%e7%bd%91%e7%ab%99_%e6%9c%8d%e5%8a%a1%e5%99%a8_%e6%95%b0%e6%8d%ae%e5%ba%93_%e5%ae%89%e5%85%a8%e7%bb%84%e5%8f%8a%e7%ab%af%e5%8f%a3_%e7%b3%bb%e7%bb%9f%e9%85%8d/</link>
		<comments>https://www.fuwuqiok.com/%e4%b8%87%e8%83%bd%e9%85%8d%e7%bd%ae%e7%bd%91%e7%ab%99_%e6%9c%8d%e5%8a%a1%e5%99%a8_%e6%95%b0%e6%8d%ae%e5%ba%93_%e5%ae%89%e5%85%a8%e7%bb%84%e5%8f%8a%e7%ab%af%e5%8f%a3_%e7%b3%bb%e7%bb%9f%e9%85%8d/#comments</comments>
		<pubDate>Sun, 01 Mar 2020 07:25:16 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[linux服务器维护]]></category>
		<category><![CDATA[linux系统代维]]></category>
		<category><![CDATA[万能配置(网站_服务器_数据库_安全组及端口_系统配置及设置_ftp)]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=4158</guid>
		<description><![CDATA[<p>万能配置(网站_服务器_数据库_安全组及端口_系统配置及设置_ftp) 服务范围：站点部署，网站部署，网站设置 [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e4%b8%87%e8%83%bd%e9%85%8d%e7%bd%ae%e7%bd%91%e7%ab%99_%e6%9c%8d%e5%8a%a1%e5%99%a8_%e6%95%b0%e6%8d%ae%e5%ba%93_%e5%ae%89%e5%85%a8%e7%bb%84%e5%8f%8a%e7%ab%af%e5%8f%a3_%e7%b3%bb%e7%bb%9f%e9%85%8d/">万能配置(网站_服务器_数据库_安全组及端口_系统配置及设置_ftp)</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<h1 class="view-title"><span data-spm-anchor-id="5176.730006-52734001-52746001-cmfw007702.content.i0.7d187bf9B5uYpM">万能配置(网站_服务器_数据库_安全组及端口_系统配置及设置_ftp)</span></h1>
<p class="product-head-desccription" data-spm-anchor-id="5176.730006-52734001-52746001-cmfw007702.content.i1.7d187bf9B5uYpM">服务范围：站点部署，网站部署，网站设置，数据库设置 ，防火墙设置，系统配置，DEDECMS，帝国等开源模板导数据前配置，安全组设置，安全策略设置，服务器设置，80端口配置及设置，开启或关闭端口。</p>
<p class="product-head-desccription" data-spm-anchor-id="5176.730006-52734001-52746001-cmfw007702.content.i1.7d187bf9B5uYpM">
<table border="1" cellspacing="0" cellpadding="2">
<tbody>
<tr>
<td><strong><span data-spm-anchor-id="5176.730006-52734001-52746001-cmfw007702.content.i2.7d187bf9B5uYpM">服务</span>说明</strong></td>
<td><strong>价格</strong></td>
</tr>
<tr>
<td><strong>网站设置：</strong></p>
<p>1、开源网站设置，及其它网站设置。</td>
<td>100元/个</td>
</tr>
<tr>
<td><strong>网站/程序/服务器/应用部署：</strong></p>
<p>1、部署网站、程序、服务器、应用等。</p>
<p>2、配置网站、程序、服务器、应用等。</td>
<td>200元/个</td>
</tr>
<tr>
<td><strong>数据库设置</strong><strong>：</strong></p>
<p>1、数据库安全设置。</p>
<p>2、数据库应用设置等。</p>
<p>3、数据库性能调优。</td>
<td>200元/次</td>
</tr>
<tr>
<td><strong>防火墙设置</strong><strong>：</strong></p>
<p>1、第三方防火墙设置。</p>
<p>2、服务器防火墙设置，安全组设置，安全规则设置等。</td>
<td>200元/次</td>
</tr>
<tr>
<td><strong>系统设置</strong><strong>：</strong></p>
<p>1、系统安全设置，环境要求设置等。</p>
<p>2、80端口配置及其它端口配置等。</td>
<td>100元/次</td>
</tr>
<tr>
<td><strong>端口配置及设置</strong><strong>：</strong></p>
<p>1、如：80端口配置，或其它指定端口配置。</p>
<p>2、开启或关闭指定端口。</td>
<td>200元/次</td>
</tr>
<tr>
<td colspan="2"><strong>备注</strong><strong>：</strong></p>
<p>1、如果您无法确认或者需要更多服务，可以联系工作人员交流。</p>
<p>2、交付时间：1天内（通常2小时）</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<div class="box-icon">
<div class="element">
<div class="d-item">
<h2 data-spm-anchor-id="5176.730006-52734001-52746001-cmfw007702.content.i4.7d187bf9B5uYpM">产品价格</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">网站设置</td>
<td>版本基础价格</td>
<td>100元</td>
</tr>
<tr>
<td rowspan="1">网站/程序/服务器部署</td>
<td>版本基础价格</td>
<td>200元</td>
</tr>
<tr>
<td rowspan="1">数据库设置</td>
<td>版本基础价格</td>
<td>200元</td>
</tr>
<tr>
<td rowspan="1">防火墙设置</td>
<td>版本基础价格</td>
<td>200元</td>
</tr>
<tr>
<td rowspan="1">系统配置</td>
<td>版本基础价格</td>
<td>100元</td>
</tr>
<tr>
<td rowspan="1" data-spm-anchor-id="5176.730006-52734001-52746001-cmfw007702.content.i5.7d187bf9B5uYpM">端口配置及设置</td>
<td>版本基础价格</td>
<td>200元</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/%e4%b8%87%e8%83%bd%e9%85%8d%e7%bd%ae%e7%bd%91%e7%ab%99_%e6%9c%8d%e5%8a%a1%e5%99%a8_%e6%95%b0%e6%8d%ae%e5%ba%93_%e5%ae%89%e5%85%a8%e7%bb%84%e5%8f%8a%e7%ab%af%e5%8f%a3_%e7%b3%bb%e7%bb%9f%e9%85%8d/">万能配置(网站_服务器_数据库_安全组及端口_系统配置及设置_ftp)</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/%e4%b8%87%e8%83%bd%e9%85%8d%e7%bd%ae%e7%bd%91%e7%ab%99_%e6%9c%8d%e5%8a%a1%e5%99%a8_%e6%95%b0%e6%8d%ae%e5%ba%93_%e5%ae%89%e5%85%a8%e7%bb%84%e5%8f%8a%e7%ab%af%e5%8f%a3_%e7%b3%bb%e7%bb%9f%e9%85%8d/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>网站搬家_服务器搬家_网站/服务器迁移</title>
		<link>https://www.fuwuqiok.com/%e7%bd%91%e7%ab%99%e6%90%ac%e5%ae%b6_%e6%9c%8d%e5%8a%a1%e5%99%a8%e6%90%ac%e5%ae%b6_%e7%bd%91%e7%ab%99%e6%9c%8d%e5%8a%a1%e5%99%a8%e8%bf%81%e7%a7%bb/</link>
		<comments>https://www.fuwuqiok.com/%e7%bd%91%e7%ab%99%e6%90%ac%e5%ae%b6_%e6%9c%8d%e5%8a%a1%e5%99%a8%e6%90%ac%e5%ae%b6_%e7%bd%91%e7%ab%99%e6%9c%8d%e5%8a%a1%e5%99%a8%e8%bf%81%e7%a7%bb/#comments</comments>
		<pubDate>Tue, 05 Mar 2019 12:56:07 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[aliyun服务器代维]]></category>
		<category><![CDATA[ECS云服务器运维代维服务]]></category>
		<category><![CDATA[linux代维]]></category>
		<category><![CDATA[linux服务器代维]]></category>
		<category><![CDATA[linux服务器代维护]]></category>
		<category><![CDATA[linux服务器维护]]></category>
		<category><![CDATA[网站搬家_服务器搬家_网站/服务器迁移]]></category>
		<category><![CDATA[网站搬家，服务器搬家，网站迁移，数据库迁移，服务器迁移，数据备份， 程序迁移，大数据批量迁移， MongoDB迁移，数据恢复]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=3915</guid>
		<description><![CDATA[<p>产品亮点 一站式迁移/搬家服务，7*24小时服务，不满意100%退款。 &#160; 服务说明 价格 网站文件 [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e7%bd%91%e7%ab%99%e6%90%ac%e5%ae%b6_%e6%9c%8d%e5%8a%a1%e5%99%a8%e6%90%ac%e5%ae%b6_%e7%bd%91%e7%ab%99%e6%9c%8d%e5%8a%a1%e5%99%a8%e8%bf%81%e7%a7%bb/">网站搬家_服务器搬家_网站/服务器迁移</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<div class="d-item rich-text">
<h2 data-spm-anchor-id="5176.730006-52734001-52738004-cmfw000415.content.i3.2e384263sOz7op">产品亮点</h2>
<div>一站式迁移/搬家服务，7*24小时服务，不满意100%退款。</div>
</div>
<div class="d-item rich-text">
<h2></h2>
<div>
<p>&nbsp;</p>
<table border="1" cellspacing="0" cellpadding="2">
<tbody>
<tr>
<td><strong>服务说明</strong></td>
<td><strong>价格</strong></td>
</tr>
<tr>
<td>网站文件+数据库&lt;3GB</td>
<td>300元/次</td>
</tr>
<tr>
<td>3GB&lt;网站文件+数据库&lt;5GB</td>
<td>500元/次</td>
</tr>
<tr>
<td>5GB&lt;网站文件+数据库&lt;10GB</td>
<td>800元/次</td>
</tr>
<tr>
<td>10GB&lt;网站文件+数据库&lt;15GB</td>
<td>1000元/次</td>
</tr>
<tr>
<td>15GB&lt;网站文件+数据库&lt;30GB</td>
<td>1500元/次</td>
</tr>
<tr>
<td>30GB&lt;网站文件+数据库&lt;40GB</td>
<td>2000元/次</td>
</tr>
<tr>
<td>40GB&lt;网站文件+数据库</td>
<td>联系客服</td>
</tr>
<tr>
<td><strong>特殊情况说明</strong></td>
<td><strong>价格</strong></td>
</tr>
<tr>
<td>每次迁移默认为1套环境，如果超出需另外支付费用</td>
<td>300元/每套</td>
</tr>
<tr>
<td>WINDOWS迁移WINDOWS额外收费</td>
<td>500元/次</td>
</tr>
<tr>
<td>WINDOWS迁移环境为ASP的</td>
<td>800元/次</td>
</tr>
<tr>
<td>虚拟主机迁移到云服务器</td>
<td>1000元/次</td>
</tr>
<tr>
<td colspan="2"><strong>备注</strong><strong>：</strong></p>
<p>1、此服务已包含环境安装及配置，您可以放心购买哦。</p>
<p>2、如果您疑问或者需要更多服务，可以联系工作人员交流。</p>
<p>3、交付时间：1天（通常2小时内）</p>
<p>4、因搬家有可能存在跨系统等其它特殊情况，请您务必在购买前与我们联系，确认搬家方案，谢谢</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2019/03/formatjpg3"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2019/03/formatjpg3" alt="formatjpg" width="750" height="400" /></a></p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2019/03/qualityq_802"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2019/03/qualityq_802" alt="qualityq_80" width="761" height="186" /></a></p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2019/03/formatjpg4"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2019/03/formatjpg4" alt="formatjpg" width="762" height="212" /></a></p>
</div>
</div>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e7%bd%91%e7%ab%99%e6%90%ac%e5%ae%b6_%e6%9c%8d%e5%8a%a1%e5%99%a8%e6%90%ac%e5%ae%b6_%e7%bd%91%e7%ab%99%e6%9c%8d%e5%8a%a1%e5%99%a8%e8%bf%81%e7%a7%bb/">网站搬家_服务器搬家_网站/服务器迁移</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/%e7%bd%91%e7%ab%99%e6%90%ac%e5%ae%b6_%e6%9c%8d%e5%8a%a1%e5%99%a8%e6%90%ac%e5%ae%b6_%e7%bd%91%e7%ab%99%e6%9c%8d%e5%8a%a1%e5%99%a8%e8%bf%81%e7%a7%bb/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 Lambda 支持的宏扩展 AWS CloudFormation</title>
		<link>https://www.fuwuqiok.com/%e4%bd%bf%e7%94%a8-aws-lambda-%e6%94%af%e6%8c%81%e7%9a%84%e5%ae%8f%e6%89%a9%e5%b1%95-aws-cloudformation/</link>
		<comments>https://www.fuwuqiok.com/%e4%bd%bf%e7%94%a8-aws-lambda-%e6%94%af%e6%8c%81%e7%9a%84%e5%ae%8f%e6%89%a9%e5%b1%95-aws-cloudformation/#comments</comments>
		<pubDate>Wed, 21 Nov 2018 06:34:24 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[aliyun服务器代维]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[linux代维]]></category>
		<category><![CDATA[linux服务器维护]]></category>
		<category><![CDATA[linux系统代维]]></category>
		<category><![CDATA[服务器安全代维]]></category>
		<category><![CDATA[服务器安全设置]]></category>
		<category><![CDATA[系统安全代维]]></category>
		<category><![CDATA[网站代维]]></category>
		<category><![CDATA[使用 AWS Lambda 支持的宏扩展 AWS CloudFormation]]></category>

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

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=3845</guid>
		<description><![CDATA[<p>AWS Config 支持持续监控 AWS 资源，简化评估、审核以及记录资源配置和变化的过程。为此，AWS C [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e5%88%a9%e7%94%a8-aws-config-%e7%9b%91%e6%8e%a7%e5%92%8c%e5%93%8d%e5%ba%94-amazon-simple-storage-service-s3-%e5%85%81%e8%ae%b8%e5%85%ac%e5%bc%80%e8%af%bb%e5%86%99%e8%ae%bf%e9%97%ae%e6%9d%83/">利用 AWS Config 监控和响应 Amazon Simple Storage Service (S3) 允许公开读写访问权限</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p><a title="AWS Config" href="https://amazonaws-china.com/config" target="_blank" rel="noopener noreferrer">AWS Config</a> 支持持续监控 AWS 资源，简化评估、审核以及记录资源配置和变化的过程。为此，AWS Config 使用一系列规则来定义 AWS 资源所需的配置状态。AWS Config 提供多种 <a title="AWS 托管规则" href="https://docs.aws.amazon.com/config/latest/developerguide/managed-rules-by-aws-config.html" target="_blank" rel="noopener noreferrer">AWS 托管规则</a>来解决各种安全问题，例如，检查您是否已将 Amazon Elastic Block Store (Amazon EBS) 卷加密，是否已正确标记资源，以及是否为根账户启用了 Multi-Factor Authentication (MFA)。您还可以使用 <a title="AWS Lambda" href="https://amazonaws-china.com/lambda/" target="_blank" rel="noopener noreferrer">AWS Lambda</a> 函数创建<a title="自定义规则" href="https://docs.aws.amazon.com/config/latest/developerguide/evaluate-config_develop-rules.html" target="_blank" rel="noopener noreferrer">自定义规则</a>，以编写整理您的合规性需求。</p>
<p>在本文中，我们将向您展示如何使用 AWS Config 监控 <a title="Amazon Simple Storage Service" href="https://amazonaws-china.com/s3/" target="_blank" rel="noopener noreferrer">Amazon Simple Storage Service</a> (S3) 存储桶 ACL 和策略，确定是否存在允许公开读写访问权限的违规行为。如果 AWS Config 发现违反策略的行为，我们会使其触发 <a title="Amazon CloudWatch Event" href="https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/WhatIsCloudWatchEvents.html" target="_blank" rel="noopener noreferrer">Amazon CloudWatch Event</a> 规则以触发 <a title="AWS Lambda" href="https://amazonaws-china.com/blogs/security/how-to-centralize-dns-management-in-a-multi-account-environment/" target="_blank" rel="noopener noreferrer">AWS Lambda</a> 函数，从而更正 S3 存储桶 ACL，或通过 <a title="Amazon Simple Notification Service" href="https://amazonaws-china.com/sns" target="_blank" rel="noopener noreferrer">Amazon Simple Notification Service</a> (Amazon SNS) 通知您存在违反策略且允许公开读写访问权限的行为。我们将通过五个主要步骤为您演示此过程。</p>
<ol>
<li><strong>启用 AWS Config</strong> 来监控 Amazon S3 存储桶 ACL 和策略，以发现违规行为。</li>
<li><strong>创建 IAM 角色和策略</strong>，为 Lambda 函数授予读取 S3 存储桶策略和通过 SNS 发送提醒的权限。</li>
<li><strong>创建和配置 CloudWatch Events 规则</strong>，在 AWS Config 检测到违反 S3 存储桶 ACL 或策略的行为时触发 Lambda 函数。</li>
<li><strong>创建 Lambda 函数</strong>，以使用 IAM 角色审核 S3 存储桶 ACL 和策略、更正 ACL，并通知您的团队策略违规行为。</li>
<li><strong>验证监控解决方案</strong>。</li>
</ol>
<blockquote><p><strong>注意：</strong>本文假设您的合规性策略要求您所监控的存储桶不允许公开读写访问权限。例如，如果您打算开放提供静态内容的存储桶，可以从本文着手，根据您的需要定制解决方案。</p></blockquote>
<p>在本文末尾，我们将提供一个可实施本文所述解决方案的 AWS CloudFormation 模板。您可以使用该模板在多个区域快速部署解决方案。</p>
<blockquote><p><strong>重要说明</strong>：如果使用部署的某些资源（包括使用所提供的 CloudFormation 模板部署的资源），则在使用这些资源期间会产生费用。在提供 AWS Config 规则的每个区域使用这些规则都会产生费用。</p></blockquote>
<h2>架构</h2>
<p>以下是我们将要实施的架构图：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/AWS-config-01-1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/AWS-config-01-1.png" alt="AWS-config-01-1" width="1000" height="523" /></a></p>
<p>&nbsp;</p>
<h2>步骤 1：启用 AWS Config 和 Amazon S3 存储桶监控功能</h2>
<p>以下步骤将演示如何设置 AWS Config 来监控 Amazon S3 存储桶。</p>
<ol>
<li>登录 AWS 管理控制台，并打开<a title="未定义的" href="https://console.aws.amazon.com/config/" target="_blank" rel="noopener noreferrer">AWS Config 控制台</a>。</li>
<li>如果这是您第一次使用 AWS Config，请选择<strong>开始使用</strong>。如果您已经使用过 AWS Config，请选择<strong>设置</strong>。</li>
<li>在<strong>设置</strong>页面中的 <strong>Resource types to record</strong> (要记录的资源类型) 下，取消选中 <strong>All resources</strong> (所有资源) 复选框。在 <strong>Specific types</strong> (具体类型) 列表中，选择 <strong>S3</strong> 下的<strong>存储桶</strong>。<a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/AWS-config-02.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/AWS-config-02.png" alt="AWS-config-02" width="1000" height="497" /></a>
<p>&nbsp;</li>
<li>选择用于存储配置历史记录和快照的 Amazon S3 存储桶。我们会创建一个新的 Amazon S3 存储桶。<a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/AWS-config-03.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/AWS-config-03.png" alt="AWS-config-03" width="942" height="213" /></a>
<p>&nbsp;</p>
<ol type="a">
<li>如果您更希望使用账户中现有的 Amazon S3 存储桶，请选择 <strong>Choose a bucket from your account</strong> (从您的账户中选择存储桶) 单选按钮，然后使用下拉菜单选择现有的存储桶。<a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/AWS-config-04.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/AWS-config-04.png" alt="AWS-config-04" width="800" height="286" /></a>
<p>&nbsp;</li>
</ol>
</li>
<li>在 <strong>Amazon SNS topic</strong> (Amazon SNS 主题) 下，选中 <strong>Stream configuration changes and notifications to an Amazon SNS topic</strong> (将配置更改和通知流式传输至 Amazon SNS 主题) 旁边的复选框，然后选择 <strong>Create a topic</strong> (创建主题) 旁边的单选按钮。
<ol type="a">
<li>您也可以选择之前创建和订阅的主题。<a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/AWS-config-05.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/AWS-config-05.png" alt="AWS-config-05" width="800" height="217" /></a>
<p>&nbsp;</li>
<li>如果您创建了新的 SNS 主题，则需要订阅它才能收到通知。我们将在后面的步骤中演示此操作。</li>
</ol>
</li>
<li>除非您已经有要使用的角色，否则请在 <strong>AWS Config role</strong> (AWS Config 角色) 下选择 <strong>Create a role</strong> (创建角色)。我们使用系统自动推荐的角色名称。<a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/AWS-config-06.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/AWS-config-06.png" alt="AWS-config-06" width="800" height="120" /></a>
<p>&nbsp;</li>
<li>选择<strong>下一步</strong>。</li>
<li>配置 Amazon S3 存储桶监控规则：
<ol type="a">
<li>在 <strong>AWS Config rules</strong> (AWS Config 规则) 页面上搜索 <strong>S3</strong>，选择 <strong>s3-bucket-publice-read-prohibited</strong> 和 <strong>s3-bucket-public-write-prohibited</strong> 规则，然后单击<strong>下一步</strong>。<a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/AWS-config-07.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/AWS-config-07.png" alt="AWS-config-07" width="800" height="425" /></a>
<p>&nbsp;</li>
<li>在<strong>审核</strong>页面上，选择<strong>确认</strong>。AWS Config 此时会分析您的 Amazon S3 存储桶，捕获它们当前的配置，并根据我们选择的规则评估配置。</li>
</ol>
</li>
<li>如果您创建了新 Amazon SNS 主题，请打开 Amazon SNS 管理控制台并找到您创建的主题：<a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/AWS-config-08.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/AWS-config-08.png" alt="AWS-config-08" width="800" height="135" /></a>
<p>&nbsp;</li>
<li>复制该主题的 ARN（以 arn: 开头的字符串），您需要在后面的步骤中使用它。</li>
<li>选择主题旁边的复选框，然后在<strong>操作</strong>菜单下选择<strong>订阅主题</strong>。</li>
<li>选择<strong>电子邮件</strong>作为协议，输入您的电子邮件地址，然后选择<strong>创建订阅</strong>。</li>
<li>几分钟后，您会收到一封电子邮件，要求您确认订阅与此主题有关的通知。选择对应链接以确认订阅。</li>
</ol>
<h2>步骤 2：为 Lambda 创建角色</h2>
<p>我们的 Lambda 需要相关权限，才能检查和修改 Amazon S3 存储桶 ACL 和策略，记录 CloudWatch 日志并发布到 Amazon SNS 主题。现在，我们将设置自定义 AWS Identity and Access Management (IAM) 策略和角色来支持这些操作，并将它们分配到我们将在下一节中创建的 Lambda 函数。</p>
<ol>
<li>在 AWS 管理控制台中，在<strong>服务</strong>下选择 <strong>IAM</strong> 以访问 IAM 控制台。</li>
<li>创建具有以下权限的策略，或者复制以下策略：
<div class="hide-language">
<pre class=" language-text"><code class=" language-text">
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "SNSPublish",
            "Effect": "Allow",
            "Action": [
                "sns:Publish"
            ],
            "Resource": "*"
        },
        {
            "Sid": "S3GetBucketACLandPolicy",
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketAcl",
                "s3:GetBucketPolicy"
            ],
            "Resource": "*"
        },
        {
            "Sid": "S3PutBucketACLAccess",
            "Effect": "Allow",
            "Action": "s3:PutBucketAcl",
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Sid": "LambdaBasicExecutionAccess",
            "Effect"quot;: "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "*"
        }
    ]
}

</code></pre>
</div>
</li>
<li>为 Lambda 函数创建角色：
<ol type="a">
<li>从要使用该角色的服务列表中选择 <strong>Lambda</strong>。</li>
<li>选择您之前创建的策略旁边的复选框，然后选择 <strong>Next: Review</strong> (下一步：审核)</li>
<li>指定角色名称，为其输入描述，然后选择<strong>创建角色</strong>。在该示例中，我们将角色命名为 LambdaS3PolicySecuringRole。</li>
</ol>
</li>
</ol>
<h2>步骤 3：创建和配置 CloudWatch 规则</h2>
<p>在这一节中，我们将创建一个 CloudWatch 规则，以便在 AWS Config 确定您的 Amazon S3 存储桶不合规时触发 Lambda 函数。</p>
<ol>
<li>在 AWS 管理控制台中，在<strong>服务</strong>下选择 <strong>CloudWatch</strong>。</li>
<li>在左侧的<strong>事件</strong>下，选择<strong>规则</strong>。</li>
<li>单击<strong>创建规则</strong>。</li>
<li>在 <strong>Step 1: Create rule</strong> (第 1 步：创建规则) 中的<strong>事件源</strong>下，选择下拉列表并选择<strong>生成自定义事件模式</strong>。</li>
<li>复制以下模式，并将其粘贴到文本框中：
<div class="hide-language">
<pre class=" language-text"><code class=" language-text">
{
  "source": [
    "aws.config"
  ],
  "detail": {
    "requestParameters": {
      "evaluations": {
        "complianceType": [
          "NON_COMPLIANT"
        ]
      }
    },
    "additionalEventData": {
      "managedRuleIdentifier": [
        "S3_BUCKET_PUBLIC_READ_PROHIBITED",
        "S3_BUCKET_PUBLIC_WRITE_PROHIBITED"
      ]
    }
  }
}

			</code></pre>
</div>
<p>该模式会在检查 Amazon S3 存储桶的公开访问权限时匹配 AWS Config 生成的事件。</li>
<li>我们将在稍后添加 Lambda 目标。现在，选择您之前创建的 Amazon SNS 主题，然后选择<strong>配置详细信息</strong>。<a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/AWS-config-09-1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/AWS-config-09-1.png" alt="AWS-config-09-1" width="1000" height="530" /></a>
<p>&nbsp;</li>
<li>输入规则的名称和描述。在该示例中，我们指定名称 AWSConfigFoundOpenBucket</li>
<li>单击<strong>创建规则</strong>。</li>
</ol>
<h2>步骤 4：创建 Lambda 函数</h2>
<p>在这一节中，我们将创建新的 Lambda 函数，用于检查 Amazon S3 存储桶的 ACL 和存储桶策略。如果发现存储桶 ACL 允许公开访问权限，该 Lambda 函数会将其覆盖，改为私密。如果找到了存储桶策略，Lambda 函数会创建 SNS 消息，将该策略添加到消息正文中，然后将其发布到我们创建的 Amazon SNS 主题。存储桶策略可能很复杂，而覆盖策略可能会导致访问权限意外丢失，因此该 Lambda 函数不会尝试对您的策略进行任何更改。</p>
<ol>
<li>获取之前创建的 Amazon SNS 主题的 ARN。</li>
<li>在 AWS 管理控制台中，在<strong>服务</strong>下选择 <strong>Lambda</strong> 进入 Lambda 控制台。</li>
<li>在控制面板中，选择<strong>创建函数</strong>。或者，如果您直接进入了<strong>函数</strong>页面，也可以选择右上角的<strong>创建函数</strong>按钮。</li>
<li>在<strong>创建函数</strong>页面上：
<ol type="a">
<li>选择<strong>从头开始创作</strong>。</li>
<li>为该函数提供一个名称。我们使用 AWSConfigOpenAccessResponder。</li>
<li>我们编写的 Lambda 函数与 Python 3.6 兼容，所以请在<strong>运行语言</strong>下拉列表中选择 <strong>Python 3.6</strong>。</li>
<li>在<strong>角色</strong>下选择<strong>选择现有角色</strong>。选择您在前一节中创建的角色，然后选择<strong>创建函数</strong>。<a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/AWS-config-09.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/AWS-config-09.png" alt="AWS-config-09" width="1000" height="524" /></a>
<p>&nbsp;</li>
</ol>
</li>
<li>现在，我们根据之前创建的规则添加 CloudWatch 事件。
<ol type="a">
<li>在 <strong>Add triggers</strong> (添加触发器) 部分，选择 <strong>CloudWatch Events</strong>。CloudWatch Events 框应该会显示在 Lambda 函数左侧，还会显示一条内容为 <strong>Configuration required</strong> (需要配置) 的备注。<a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/AWS-config-11.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/AWS-config-11.png" alt="AWS-config-11" width="1000" height="361" /></a>
<p>&nbsp;</li>
<li>在<strong>规则</strong>下拉框中，选择您之前创建的规则，然后选择<strong>添加</strong>。</li>
</ol>
</li>
<li>向上滚动到 <strong>Designer</strong> (设计者) 部分，然后选择您的 Lambda 函数的名称。</li>
<li>删除默认代码，然后粘贴以下代码：
<div class="hide-language">
<pre class=" language-text"><code class=" language-text">
import boto3
from botocore.exceptions import ClientError
import json
import os

ACL_RD_WARNING = "The S3 bucket ACL allows public read access."
PLCY_RD_WARNING = "The S3 bucket policy allows public read access."
ACL_WRT_WARNING = "The S3 bucket ACL allows public write access."
PLCY_WRT_WARNING = "The S3 bucket policy allows public write access."
RD_COMBO_WARNING = ACL_RD_WARNING + PLCY_RD_WARNING
WRT_COMBO_WARNING = ACL_WRT_WARNING + PLCY_WRT_WARNING

def policyNotifier(bucketName, s3client):
    try:
        bucketPolicy = s3client.get_bucket_policy(Bucket = bucketName)
        # notify that the bucket policy may need to be reviewed due to security concerns
        sns = boto3.client('sns')
        subject = "Potential compliance violation in " + bucketName + " bucket policy"
        message = "Potential bucket policy compliance violation. Please review: " + json.dumps(bucketPolicy['Policy'])
        # send SNS message with warning and bucket policy
        response = sns.publish(
            TopicArn = os.environ['TOPIC_ARN'],
            Subject = subject,
            Message = message
        )
    except ClientError as e:
        # error caught due to no bucket policy
        print("No bucket policy found; no alert sent.")

def lambda_handler(event, context):
    # instantiate Amazon S3 client
    s3 = boto3.client('s3')
    resource = list(event['detail']['requestParameters']['evaluations'])[0]
    bucketName = resource['complianceResourceId']
    complianceFailure = event['detail']['requestParameters']['evaluations'][0]['annotation']
    if(complianceFailure == ACL_RD_WARNING or complianceFailure == ACL_WRT_WARNING):
        s3.put_bucket_acl(Bucket = bucketName, ACL = 'private')
    elif(complianceFailure == PLCY_RD_WARNING or complianceFailure == PLCY_WRT_WARNING):
        policyNotifier(bucketName, s3)
    elif(complianceFailure == RD_COMBO_WARNING or complianceFailure == WRT_COMBO_WARNING):
        s3.put_bucket_acl(Bucket = bucketName, ACL = 'private')
        policyNotifier(bucketName, s3)
    return 0  # done
			</code></pre>
</div>
</li>
<li>向下滚动到<strong>环境变量</strong>部分。该代码使用一个环境变量来存储 Amazon SNS 主题的 ARN。
<ol type="a">
<li>输入 TOPIC_ARN 作为密钥。</li>
<li>输入之前创建的 Amazon SNS 主题的 ARN 作为值。</li>
</ol>
</li>
<li>在 <strong>Execution role</strong> (执行角色) 下选择<strong>选择现有角色</strong>，然后从下拉菜单中选择之前创建的角色。</li>
<li>保留其他内容不变，然后在顶部选择<strong>保存</strong>。</li>
</ol>
<h2>步骤 5：验证效果</h2>
<p>到现在为止，我们已经有了一个 Lambda 函数、一个 Amazon SNS 主题、监控 Amazon S3 存储桶的 AWS Config，以及在发现存储桶不合规时触发 Lambda 函数的 CloudWatch 规则。我们来进行测试，确保它们能够正常工作。</p>
<p>我们有在受 AWS Config 监控的区域中创建的 Amazon S3 存储桶 myconfigtestbucket，还有关联的 Lambda 函数。ACL 或策略中未设置该存储桶的公开读写访问权限，所以它是合规的。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/AWS-config-12.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/AWS-config-12.png" alt="AWS-config-12" width="1000" height="417" /></a></p>
<p>我们来更改存储桶的 ACL，以允许公开列出对象：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/AWS-config-13.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/AWS-config-13.png" alt="AWS-config-13" width="1000" height="545" /></a></p>
<p>保存后，该存储桶便可公开访问了。几分钟后，AWS Config 控制面板会发现一项不合规的资源：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/AWS-config-14.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/AWS-config-14.png" alt="AWS-config-14" width="1000" height="405" /></a></p>
<p>在 Amazon S3 控制台中，我们可以看到：在调用由之前创建的 CloudWatch 规则触发的 Lambda 函数后，存储桶中不再公开列出对象。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/AWS-config-15.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/AWS-config-15.png" alt="AWS-config-15" width="1000" height="619" /></a></p>
<p>请注意，AWS Config 控制面板此时显示没有不合规的资源了：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/AWS-config-16.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/AWS-config-16.png" alt="AWS-config-16" width="1000" height="420" /></a></p>
<p>现在，我们来配置允许列表访问的存储桶策略，以尝试进行 Amazon S3 存储桶策略检查：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/AWS-config-17.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/AWS-config-17.png" alt="AWS-config-17" width="1000" height="421" /></a></p>
<p>对 myconfigtestbucket 存储桶设置该存储桶策略后，AWS Config 会在几分钟后检测到该存储桶不再合规。因为这是存储桶策略而不是 ACL，所以我们将一条通知发布到我们之前创建的 SNS 主题，以通知我们可能违反策略的行为：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/11/AWS-config-18.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/11/AWS-config-18.png" alt="AWS-config-18" width="1000" height="255" /></a></p>
<p>获知该策略允许公开列出存储桶后，我们现在可以修改或删除该策略，随后 AWS Config 会检测到资源符合策略。</p>
<h2>结论</h2>
<p>在本文中，我们演示了如何使用 AWS Config 监控 Amazon S3 存储桶是否使用公开的读写访问权限 ACL 和策略。另外，我们演示了如何使用 Amazon CloudWatch、Amazon SNS 和 Lambda 覆盖公开的存储桶 ACL，或者在存储桶使用可疑策略时提醒您。您可以使用 <a title="CloudFormation 模板" href="https://s3.amazonaws.com/awsiammedia/public/sample/AWSConfigToMonitorAndRespondToAmazonS3Buckets/config.template" target="_blank" rel="noopener noreferrer">CloudFormation 模板</a>在多个区域快速部署该解决方案。通过该方法，您将能够轻松找出并保护公开的 Amazon S3 存储桶 ACL 和策略。将该解决方案部署到多个区域后，可以使用 AWS Config 聚合器来聚合结果。阅读本文<a title="了解更多信息" href="https://amazonaws-china.com/blogs/aws/aws-config-update-aggregate-compliance-data-across-accounts-regions/" target="_blank" rel="noopener noreferrer">了解更多信息</a>。</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e5%88%a9%e7%94%a8-aws-config-%e7%9b%91%e6%8e%a7%e5%92%8c%e5%93%8d%e5%ba%94-amazon-simple-storage-service-s3-%e5%85%81%e8%ae%b8%e5%85%ac%e5%bc%80%e8%af%bb%e5%86%99%e8%ae%bf%e9%97%ae%e6%9d%83/">利用 AWS Config 监控和响应 Amazon Simple Storage Service (S3) 允许公开读写访问权限</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/%e5%88%a9%e7%94%a8-aws-config-%e7%9b%91%e6%8e%a7%e5%92%8c%e5%93%8d%e5%ba%94-amazon-simple-storage-service-s3-%e5%85%81%e8%ae%b8%e5%85%ac%e5%bc%80%e8%af%bb%e5%86%99%e8%ae%bf%e9%97%ae%e6%9d%83/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>将亚马逊 AWS S3 存储桶的访问权限到一个特定 IAM 角色</title>
		<link>https://www.fuwuqiok.com/%e5%b0%86%e4%ba%9a%e9%a9%ac%e9%80%8a-aws-s3-%e5%ad%98%e5%82%a8%e6%a1%b6%e7%9a%84%e8%ae%bf%e9%97%ae%e6%9d%83%e9%99%90%e5%88%b0%e4%b8%80%e4%b8%aa%e7%89%b9%e5%ae%9a-iam-%e8%a7%92%e8%89%b2/</link>
		<comments>https://www.fuwuqiok.com/%e5%b0%86%e4%ba%9a%e9%a9%ac%e9%80%8a-aws-s3-%e5%ad%98%e5%82%a8%e6%a1%b6%e7%9a%84%e8%ae%bf%e9%97%ae%e6%9d%83%e9%99%90%e5%88%b0%e4%b8%80%e4%b8%aa%e7%89%b9%e5%ae%9a-iam-%e8%a7%92%e8%89%b2/#comments</comments>
		<pubDate>Wed, 21 Nov 2018 06:29:48 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<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[将亚马逊 AWS S3 存储桶的访问权限到一个特定 IAM 角色]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=3843</guid>
		<description><![CDATA[<p>AWS 的一名云支持工程师，客户经常问我如何将 Amazon S3 存储桶访问权限限制到特定的 AWS Ide [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e5%b0%86%e4%ba%9a%e9%a9%ac%e9%80%8a-aws-s3-%e5%ad%98%e5%82%a8%e6%a1%b6%e7%9a%84%e8%ae%bf%e9%97%ae%e6%9d%83%e9%99%90%e5%88%b0%e4%b8%80%e4%b8%aa%e7%89%b9%e5%ae%9a-iam-%e8%a7%92%e8%89%b2/">将亚马逊 AWS S3 存储桶的访问权限到一个特定 IAM 角色</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>AWS 的一名云支持工程师，客户经常问我如何将 <a href="https://amazonaws-china.com/cn/s3">Amazon S3</a> 存储桶访问权限限制到特定的 AWS Identity and Access Management (IAM) 角色。通常，他们会尝试以对待 IAM 用户的相同方式执行此操作：使用存储桶策略显式 Deny 不想授予访问权限的所有 Principals（用户和角色）。这种方法的缺点是需要维护存储桶策略。如果将一个新的 IAM 用户添加到账户，并且其 Action 为 “s3:*”，则该用户将获得访问该存储桶的权限。您可以反转逻辑并在存储桶策略的 Deny 语句中利用 NotPrincipal 元素，而不必指定要阻止其访问的用户列表。此元素会为其值中未列出的任何用户创建一个显式的 Deny。</p>
<section class="blog-post-content">但事实证明，这种反转逻辑的方法在处理 IAM 角色时存在问题，因为这种角色的 Principal 值包含两个 Amazon 资源名称 (ARN)，即 role ARN 和 assumed-role ARN。 role ARN 是 IAM 角色本身的标识符， assumed-role ARN 则用于标识日志中的角色会话。在使用 NotPrincipal 元素时，您必须同时包含两个 ARN，此方法才能正常工作，其中第二个 ARN 应包含一个变量名称。通常，您应指定一个通配符，用于表示变量字符串，但不允许在 Principal 或 NotPrincipal 元素中指定此通配符。在本博文中，我会向您展示如何使用 Conditions（而非NotPrincipal 元素），将 S3 存储桶的访问权限限制到一个账户内的特定 IAM 角色或用户。即便相同账户中的另一个用户拥有 Admin 策略或带有 s3:* 的策略，只要未被显式列出，也同样会被拒绝。例如，您可以使用此方法配置存储桶，以供 Auto Scaling 组内的实例访问。您还可以使用此方法，限制对具有高级别安全需求的存储桶的访问。<span id="more-1035"></span></p>
<h3>解决方案概述</h3>
<p>本文所述的解决方案使用存储桶策略来管理对 S3 存储桶的访问 – 即使实体可以访问完整的 S3 API。下图展示了此解决方案如何应用于同一账户内的存储桶。</p>
<p><img class="alignnone" title="展示此解决方案如何应用于同一账户内的存储桶的图解" src="https://dmhnzl5mp9mj6.cloudfront.net/security_awsblog/images/CC_Diagram1_0717.png" alt="展示此解决方案如何应用于同一账户内的存储桶的图解" width="466" height="442" /></p>
<ol>
<li>IAM 用户的策略和角色的用户策略授予对 “s3:*” 的访问权限。</li>
<li>S3 存储桶策略将访问权限限制为仅限该角色。</li>
<li>IAM 用户和角色都可以访问该账户中的存储桶。该角色可以访问这两个存储桶，但用户只能访问没有附加存储桶策略的存储桶。即使角色和用户都拥有完整的 “s3:*” 权限，存储桶策略仍会拒绝任何不具有该角色的人员访问该存储桶。</li>
</ol>
<p>跨账户方法的主要不同之处在于，每个存储桶必须附加存储桶策略。下图展示了这种方法如何应用于跨账户部署场景。</p>
<p><img class="alignnone" title="展示此解决方案如何应用于跨账户部署场景的图解" src="https://dmhnzl5mp9mj6.cloudfront.net/security_awsblog/images/CC_Diagram2_0717_a.png" alt="展示此解决方案如何应用于跨账户部署场景的图解" width="608" height="457" /></p>
<ol>
<li>IAM 角色的用户策略和存储桶账户中的 IAM 用户策略均授予对“s3:*”的访问权限</li>
<li>如果任何人的 user:id 与角色的相应值不同，并且策略定义了允许角色对存储桶执行哪些操作，则存储桶策略会拒绝其访问。</li>
<li>存储桶策略允许从其他账户访问角色。</li>
<li>IAM 用户和角色可以在存储桶策略中没有 Deny 的情况下访问存储桶。角色可以同时访问这两个存储桶，因为 Deny 仅适用于其 user:id 不等于角色的相应值的主体。</li>
</ol>
<h3>了解 NotPrincipal 元素及其用法</h3>
<p>您可以使用 IAM 或 S3 存储桶策略的 NotPrincipal 元素，仅限特定用户组访问资源。此元素允许您阻止未在其值数组中定义的所有用户，即使他们自己的 IAM 用户策略中具有 Allow 也是如此。因此，如果您有一个用户应该可以访问除 S3 中的某个存储桶以外的所有存储桶，则可以在该存储桶本身上进行此定义，而无需编辑用户的 IAM 策略堆栈。</p>
<p>但对于 IAM 角色来说，这要更为复杂，因为角色是由 Principal 中的两个 ARN 定义的：role ARN 和 assumed-role ARN。role ARN (arn:aws:iam::<strong>ACCOUNTNUMBER</strong>:role/<strong>ROLE-NAME</strong>) 是静态的，独立于角色会话发起者。（在本文中，切记将 <strong>placeholder information</strong> 替换为您自己的账户信息。）assumed-roleARN (arn:aws:sts::<strong>ACCOUNTNUMBER</strong>:assumed-role/<strong>ROLE-NAME</strong>/<strong>ROLE-SESSION-NAME</strong>) 将因为角色会话名称定义的内容而异。对于具有一个角色的用户发出的 API 调用，您可以通过查看 AWS CloudTrail 条目中的以下 Identity 元素来了解此信息。</p>
<div>
<pre>{
  "type": "AssumedRole",
  "principalId": "<strong>AROAJI4AVVEXAMPLE:ROLE-SESSION-NAME</strong>",
  "arn": "arn:aws:sts::<strong>ACCOUNTNUMBER:assumed-role/ROLE-NAME/ROLE-SESSION-NAME</strong>",
  "accountId": "<strong>ACCOUNTNUMBER</strong>",
  "accessKeyId": "<strong>ASIAEXAMPLEKEY</strong>",
  "sessionContext": {
    "attributes": {
      "mfaAuthenticated": "false",
      "creationDate": "XXXX-XX-XXTXX:XX:XXZ"
    },
    "sessionIssuer": {
      "type": "Role",
      "principalId": "<strong>AROAJI4AVV3EXAMPLEID</strong>",
      "arn": "arn:aws:iam::<strong>ACCOUNTNUMBER:role/ROLE-NAME</strong>",
      "accountId": "<strong>ACCOUNTNUBMER</strong>",
      "userName": "<strong>ROLE-SESSION-NAME</strong>"
    }
  }
}</pre>
</div>
<p>在此 Identity 元素中，您可以看到 role ARN 和 assumed-role ARN。根据承担角色的用户不同，ROLE-SESSION-NAME 也可能会有所变化。principalId 值也包含此信息，但采用可以在存储桶策略的 Principal 元素以外使用的方式设置格式。在编写存储桶策略时，我会使用这些信息。</p>
<h3>向特定角色授予同账户存储桶访问权限</h3>
<p>在从同一账户访问存储桶时，在大多数情况下不必使用存储桶策略。这是因为存储桶策略定义了已由用户的直接 IAM 策略授予的访问权限。S3 存储桶策略通常用于跨账户访问，但您也可以使用它们，通过显式 Deny 来限制访问，这将应用于所有主体，无论是与存储桶位于相同账户中还是不同账户中的主体。</p>
<p>每个 IAM 实体（用户、组或角色）都有一个已定义的 <a href="http://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_variables.html#policy-vars-infotouse" target="_blank" rel="noopener noreferrer">aws:userid</a> 变量。您需要在存储桶策略中使用此变量，才能在条件元素内以例外的形式指定角色或用户。assumed-role 的 aws:userId 值定义为 UNIQUE-ROLE-ID:ROLE-SESSION-NAME（例如 AROAEXAMPLEID:userdefinedsessionname）。</p>
<p>要获得 IAM 角色的 AROAEXAMPLEID，请执行以下操作：</p>
<ol>
<li>务必安装 <a href="https://amazonaws-china.com/cli/" target="_blank" rel="noopener noreferrer">AWS CLI</a>，并打开一个命令提示符或 shell。</li>
<li>运行以下命令：aws iam get-role -–role-name <strong>ROLE-NAME</strong>。</li>
<li>在输出中，查找以 AROA 开头的 RoleId 字符串。您将在存储桶策略中使用它来将存储桶访问权限的范围仅限于此角色。</li>
</ol>
<p>在前述 CloudTrail 代码示例中，此 ID 为 principalId 元素。此元素的值十分重要，因为 AWS 策略变量也可以在 IAM 策略中作为字符串进行检查。您不必在 NotPrincipal 元素中指定 role 和 assumed-role ARN，而是可以将 StringNotLike 条件中的 aws:userId 值与通配符字符串一起使用。在 aws:userId 值内，您还需要添加账户的 Root 用户，以便在删除定义的角色时，不会致使存储桶完全无法访问。Root 账户的 userId 是账户编号。</p>
<p>使用您刚刚通过 AWS CLI 检索的 AROAEXAMPLEID，即可创建条件逻辑，让存储桶策略将存储桶访问权限的范围仅限于访问存储桶时使用此角色的用户。使用条件逻辑而非 NotPrincipal元素可支持使用通配符字符串，从而允许接受任何角色会话名称。</p>
<p>现在您已获得要允许其访问的角色 ID，接下来需要阻止与存储桶处于相同账户内的其他用户的访问。阻止未使用 IAM 角色或 Root 账户凭证的用户访问存储桶及其对象的策略如下所示。</p>
<div>
<pre>{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::<strong>MyExampleBucket</strong>",
        "arn:aws:s3:::<strong>MyExampleBucket</strong>/*"
      ],
      "Condition": {
        "StringNotLike": {
          "aws:userId": [
            "<strong>AROAEXAMPLEID:*</strong>",
            "<strong>111111111111</strong>"
          ]
        }
      }
    }
  ]
}</pre>
</div>
<p>您也可以对 IAM 用户使用相同的策略。IAM 用户拥有一个以 AIDA 开头的唯一 ID，您可以将此 ID 用于此用途。要查找此唯一 ID，请执行以下操作：</p>
<ol>
<li>安装 AWS CLI 后，打开命令提示符或 shell。</li>
<li>运行命令：aws iam get-user -–user-name <strong>USER-NAME</strong></li>
<li>在输出中，查找以 AIDAEXAMPLEID 开头的 userId 字符串。</li>
</ol>
<p>找到 userId 字符串之后，您可以将其置于“aws:userId”条件数组中，如以下示例所示。</p>
<div>
<pre>{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::<strong>MyExampleBucket</strong>",
        "arn:aws:s3:::<strong>MyExampleBucket</strong>/*"
      ],
      "Condition": {
        "StringNotLike": {
          "aws:userId": [
            "<strong>AROAEXAMPLEID:*</strong>",
            "<strong>AIDAEXAMPLEID</strong>",
            "<strong>111111111111</strong>"
          ]
        }
      }
    }
  ]
}</pre>
</div>
<h3>向特定 IAM 角色授予跨账户存储桶访问权限</h3>
<p>在上一节中，我向您展示了如何将 S3 存储桶访问权限限于同一个账户内的特定 IAM 角色或用户。现在，我将向您展示如何将访问权限限制到另一账户中的特定用户和角色。向 IAM 用户或角色授予跨账户存储桶访问权限时，您必须定义允许 IAM 用户或角色通过该访问权限执行哪些操作。<a href="http://blogs.aws.amazon.com/security/post/Tx3VRSWZ6B3SHAV/Writing-IAM-Policies-How-to-Grant-Access-to-an-Amazon-S3-Bucket" target="_blank" rel="noopener noreferrer">在先前的 AWS 安全性博客中</a>，Jim Scharf 撰文介绍了允许 IAM 实体通过 CLI/API 和控制台访问存储桶所需的权限。利用之前这篇博文中提供的信息，CLI/API 级访问存储桶策略应如下所示。</p>
<div>
<pre>{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<strong>111111111111</strong>:role/<strong>ROLENAME</strong>"
            },
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::<strong>MyExampleBucket</strong>"
        },
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<strong>111111111111</strong>:role/<strong>ROLENAME</strong>"
            },
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::<strong>MyExampleBucket</strong>/*"
        },
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::<strong>MyExampleBucket</strong>",
                "arn:aws:s3:::<strong>MyExampleBucket</strong>/*"
            ],
            "Condition": {
                "StringNotLike": {
                    "aws:userId": [
                        "<strong>AROAEXAMPLEID</strong>:*",
                        "<strong>111111111111</strong>"
                    ]
                }
            }
        }
    ]
}</pre>
</div>
<p>以下策略显示了控制台级访问所需的服务操作，例如与控制台的 IAM 切换角色功能配合使用的操作。</p>
<div>
<pre>{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<strong>111111111111</strong>:role/<strong>ROLENAME</strong>"
            },
            "Action": [
                "s3:ListAllMyBuckets",
                "s3:GetBucketLocation"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<strong>111111111111</strong>:role/<strong>ROLENAME</strong>"
            },
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::<strong>MyExampleBucket</strong>"
        },
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<strong>111111111111</strong>:role/<strong>ROLENAME</strong>"
            },
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::<strong>MyExampleBucket</strong>/*"
        },
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::<strong>MyExampleBucket</strong>",
                "arn:aws:s3:::<strong>MyExampleBucket</strong>/*"
            ],
            "Condition": {
                "StringNotLike": {
                    "aws:userId": [
                        "<strong>AROAEXAMPLEID</strong>:*",
                        "<strong>111111111111</strong>"
                    ]
                }
            }
        }
    ]
}</pre>
</div>
<p>要向其他账户中的 IAM 用户授予 API/CLI 访问权限，您需要将 IAM 用户的 AIDAEXAMPLEID 添加到“aws:userId”条件，就像我们上一节所做的那样。除了“aws:userId”条件之外，您还需要将 IAM 用户的完整 ARN 添加到这些策略的 Principal 元素。请注意，您不能向 IAM 用户授予跨账户控制台访问权限，因为该用户需要具备目标账户中的角色，但您可以通过 API/CLI 授予对存储桶的访问权限。具体如下所示。</p>
<div>
<pre>{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": [
                {
                    "AWS": [
                        "arn:aws:iam::<strong>222222222222</strong>:role/<strong>ROLENAME</strong>",
                        "arn:aws:iam::<strong>222222222222</strong>:user/<strong>USERNAME</strong>"
                    ]
                }
            ],
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::<strong>MyExampleBucket</strong>"
        },
        {
            "Effect": "Allow",
            "Principal": [
                {
                    "AWS": [
                        "arn:aws:iam::<strong>222222222222</strong>:role/<strong>ROLENAME</strong>",
                        "arn:aws:iam::<strong>222222222222</strong>:user/<strong>USERNAME</strong>"
                    ]
                }
            ],
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::<strong>MyExampleBucket</strong>/*"
        },
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::<strong>MyExampleBucket</strong>",
                "arn:aws:s3:::<strong>MyExampleBucket</strong>/*"
            ],
            "Condition": {
                "StringNotLike": {
                    "aws:userId": [
                        "<strong>AROAEXAMPLEID</strong>:*",
                        "<strong>AIDAEXAMPLEID</strong>",
                        "<strong>111111111111</strong>"
                    ]
                }
            }
        }
    ]
}</pre>
</div>
<p>除了在存储桶策略中包含角色权限之外，您还需要在 IAM 用户或角色的用户策略中定义这些权限。这些权限可以添加到<a href="http://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-using.html#create-managed-policy-console" target="_blank" rel="noopener noreferrer">客户托管的策略</a>并<a href="http://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-using.html#attach-managed-policy-console" target="_blank" rel="noopener noreferrer">附加</a>到 IAM 控制台中的角色或用户，详见以下策略文档。</p>
<div>
<pre>{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListAllMyBuckets",
        "s3:GetBucketLocation"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": "s3:ListBucket",
      "Resource": "arn:aws:s3:::<strong>MyExampleBucket</strong>"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "s3:DeleteObject"
      ],
      "Resource": "arn:aws:s3:::<strong>MyExampleBucket</strong>/*"
    }
  ]
}</pre>
</div>
<p>按照本文中的指导，即使用户拥有 Admin 策略或带有 s3:* 的策略，也可以将 S3 存储桶访问权限限于本地账户内和不同账户中的特定 IAM 角色或用户。这种逻辑有多种应用，各种使用案例的要求可能会有所不同。例如，您可以使用此方法设置存储桶，以供 Auto Scaling 组内的实例访问。如同在包含个人记录和账户信息的存储桶中一样，您还可以使用此方法限制对具有高级别安全需求的存储桶的访问。务必牢记，最好始终仅将权限授予执行必要任务所需的资源。</p>
</section>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e5%b0%86%e4%ba%9a%e9%a9%ac%e9%80%8a-aws-s3-%e5%ad%98%e5%82%a8%e6%a1%b6%e7%9a%84%e8%ae%bf%e9%97%ae%e6%9d%83%e9%99%90%e5%88%b0%e4%b8%80%e4%b8%aa%e7%89%b9%e5%ae%9a-iam-%e8%a7%92%e8%89%b2/">将亚马逊 AWS S3 存储桶的访问权限到一个特定 IAM 角色</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/%e5%b0%86%e4%ba%9a%e9%a9%ac%e9%80%8a-aws-s3-%e5%ad%98%e5%82%a8%e6%a1%b6%e7%9a%84%e8%ae%bf%e9%97%ae%e6%9d%83%e9%99%90%e5%88%b0%e4%b8%80%e4%b8%aa%e7%89%b9%e5%ae%9a-iam-%e8%a7%92%e8%89%b2/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>在Virtual Private Cloud中自建基于BIND的DNS服务器</title>
		<link>https://www.fuwuqiok.com/%e5%9c%a8virtual-private-cloud%e4%b8%ad%e8%87%aa%e5%bb%ba%e5%9f%ba%e4%ba%8ebind%e7%9a%84dns%e6%9c%8d%e5%8a%a1%e5%99%a8/</link>
		<comments>https://www.fuwuqiok.com/%e5%9c%a8virtual-private-cloud%e4%b8%ad%e8%87%aa%e5%bb%ba%e5%9f%ba%e4%ba%8ebind%e7%9a%84dns%e6%9c%8d%e5%8a%a1%e5%99%a8/#comments</comments>
		<pubDate>Fri, 27 Jul 2018 09:16:48 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<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[linux系统代维]]></category>
		<category><![CDATA[代维]]></category>
		<category><![CDATA[服务器代维]]></category>
		<category><![CDATA[在Virtual Private Cloud中自建基于BIND的DNS服务器]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=3698</guid>
		<description><![CDATA[<p>Amazon Virtual Private Cloud (Amazon VPC) 是 AWS 提供的虚拟私有 [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e5%9c%a8virtual-private-cloud%e4%b8%ad%e8%87%aa%e5%bb%ba%e5%9f%ba%e4%ba%8ebind%e7%9a%84dns%e6%9c%8d%e5%8a%a1%e5%99%a8/">在Virtual Private Cloud中自建基于BIND的DNS服务器</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>Amazon Virtual Private Cloud (Amazon VPC) 是 AWS 提供的虚拟私有网络服务，允许您在 AWS 云中预配置出一个采用逻辑隔离的部分，让您在自己定义的虚拟网络中启动 AWS 资源。您可以完全掌控您的虚拟联网环境，包括选择自有的 IP 地址范围、创建子网，以及配置路由表和网关。</p>
<p>除了提供IP资源及网络连接，Amazon VPC还提供DNS及DHCP等基础设施服务。当您将实例启动到默认 VPC 中时，我们为实例提供与其公有 IPv4 和私有 IPv4 地址对应的公有和私有 DNS 主机名。当您在非默认 VPC 中启动实例时，我们会为实例提供私有 DNS 主机名，并根据您为 VPC 和实例指定的设置来决定是否提供公有 DNS 主机名。</p>
<p>对于 us-east-1 区域，公有 (外部) DNS 主机名采用 ec2-&lt;public-ipv4-address&gt;.compute-1.amazonaws.com 形式，对于其他区域，则采用 ec2-&lt;public-ipv4-address&gt;.region.amazonaws.com 形式。例如，公有IP为54.222.212.110的EC2实例，其公有DNS名为ec2-54-222-212-110.cn-north-1.compute.amazonaws.com.cn。我们将公有 DNS 主机名解析为该实例在所在网络外的公有 IPv4 地址及其在所在网络内的私有 IPv4 地址。</p>
<p>私有 (内部) DNS 主机名解析为实例的私有 IPv4 地址，并对 us-east-1 区域采用 ip-&lt;private-ipv4-address&gt;.ec2.internal 形式，对其他区域采用 ip-&lt;private-ipv4-address&gt;.region.compute.internal 形式 (其中 private.ipv4.address 是反向查找 IP 地址)。例如，私有IP地址为10.206.2.239的EC2实例，其私有DNS名为ip-10-206-2-239.cn-north-1.compute.internal。您可以使用私有 DNS 主机名在同一网络中实现实例之间的通信，但我们无法解析实例所在网络之外的 DNS 主机名。要解析实例所在网络之外的主机名，可自建DNS服务器来为VPC及外部网络提供DNS服务。</p>
<p>常见的应用场景是在混合IT架构下，客户数据中心通过VPN或是Direct Connect专线连接到AWS上的VPC，在VPC中配置1台DNS服务器，在客户数据中心也配置1台DNS服务器，服务器的主从角色客户可自行定义。通过多台DNS服务器为不同位置的客户端提供DNS服务，即能保证服务的高可用，又能就近提供服务，减少DNS查询延迟。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/20170523-1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/20170523-1.png" alt="20170523-1" width="1748" height="678" /></a></p>
<p>接下来，我将基于上述架构图一步一步说明如何使用BIND搭建DNS服务器。本文不会涉及BIND的高级配置，如需了解BIND的高级配置，可参考<a href="https://www.isc.org/" target="_blank" rel="noopener noreferrer">BIND官方网站</a>。</p>
<h3>安装配置DNS主服务器</h3>
<p>首选需要准备一台EC2实例用于安装BIND软件，如何创建EC2实例可参考<a href="http://docs.amazonaws.cn/AWSEC2/latest/UserGuide/EC2_GetStarted.html" target="_blank" rel="noopener noreferrer">Amazon EC2入门指南</a>。本次示例选用Amazon Linux操作系统的AMI来创建实例，实例类型选用了通用型实例类型: m4.large。BIND对服务器硬件资源要求不高，在不启用DNSSEC的情况下(不在本文讨论范围)，普通配置的服务器即可承载DNS服务。m4.large配置有2颗vCPU和8G内存，运行DNS服务能够支持中等规模的DNS请求，当请求增加时，也可方便的调整实例类型到更大的配置。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/20170523-2.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/20170523-2.png" alt="20170523-2" width="2314" height="594" /></a></p>
<p>创建EC2实例时需要指定安全组来开放服务端口，DNS服务通过UDP 53端口提供DNS查询相应，通过TCP 53端口提供区域传送。因此，安全组队VPC网段开放UDP 53端口，对客户数据中心的DNS服务器开放TCP 53端口，如下图所示：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/20170523-3.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/20170523-3.png" alt="20170523-3" width="1948" height="764" /></a></p>
<p>DNS服务器作为基础设施服务的重要性无须多言，Amazon EC2持续监控EC2实例的状态以及底层硬件的状态，分别称为实例状态检查和系统状态检查。我们可创建状态检查报告，当任一状态检查失败时，执行重启操作，并将警报发送至指定邮箱。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/20170523-4.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/20170523-4.png" alt="20170523-4" width="1216" height="836" /></a></p>
<p>创建好警报之后，通过SSH登陆至EC2实例，并yum命令安装bind软件：</p>
<p><code>yum install bind-utils bind</code></p>
<p>安装好之后，我们接下来将创建一个示例的DNS域：aws.local，我们首先需要编辑/etc/named.conf文件，修改以下内容：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/20170523-5.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/20170523-5.png" alt="20170523-5" width="932" height="266" /></a></p>
<p>listen-on 缺省配置为127.0.0.1，DNS服务只会绑定到系统的环回接口，其他客户端无法访问，需要添加EC2实例的私有IP地址，才能提供外部访问</p>
<p>allow-query缺省配置为localhost，即只允许DNS服务器所在的EC2实例对自己进行DNS查询，添加VPC的网段可允许来自VPC内部的主机进行DNS查询。注：也可将此参数设置为0.0.0.0/0，因为前面安全组设置里只允许了VPC内的IP访问UDP 53端口。</p>
<p>此外，还需要增加对aws.local这个域的定义，在/etc/named.conf中增加以下内容，allow-transfer指定了只允许从DNS服务器进行区域传送，限定允许区域传送的范围颗可提高DNS服务的安全性：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/20170523-6.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/20170523-6.png" alt="20170523-6" width="556" height="160" /></a></p>
<p>上述配置说明aws.local域的具体解析配置在文件/var/named/aws.local.db 里，其内容如下，在这个示例配置中，定义了两条A记录，分别是dns.aws.local对应10.206.0.212和<a href="http://www.aws.local/">www.aws.local</a>对应10.206.0.213</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/20170523-7.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/20170523-7.png" alt="20170523-7" width="522" height="340" /></a></p>
<h3>配置Amazon VPC使用自建DNS服务器</h3>
<p>Amazon VPC通过DHCP服务为VPC中的EC2及其他连网组件动态分配IP地址，动态主机配置协议 (DHCP) 提供了将配置信息传递到 TCP/IP 网络中主机的标准。DHCP 消息中的options字段包含配置参数。这些参数包括域名、域名服务器以及“netbios-node-type”。接下来我们将创建一个新的DHCP选项集，并在选项集中将域名服务器指向刚才创建的DNS服务器。</p>
<p>在AWS控制台中选择VPC服务，并在左边的菜单中选择“DHCP选项集”，点击“创建DHCP选项集”按钮，输入以下信息，域名服务器可指定多个DNS服务器，按照顺序第一个为VPC内的DNS服务器，第二个为客户数据中心的DNS服务器：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/20170523-8.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/20170523-8.png" alt="20170523-8" width="1342" height="812" /></a></p>
<p>创建好DHCP选项集之后选择左边菜单中“您的VPC”选项，选中要修改的VPC，从“操作”下拉菜单中选择“编辑DHCP选项集”</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/20170523-9.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/20170523-9.png" alt="20170523-9" width="490" height="408" /></a></p>
<p>选择刚才创建的DHCP选项集并保存：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/20170523-10.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/20170523-10.png" alt="20170523-10" width="884" height="330" /></a></p>
<p>在您将新的 DHCP 选项集与 VPC 关联之后，任何现有实例以及您在 VPC 内启动的所有新增实例都将使用这些选项。 无需重新开始或重新启动实例。根据实例更新 DHCP 租赁权的频率，它们会在几个小时内自动拾取更改。如果您愿意，您也可以使用实例上的操作系统，直接更新租赁权。</p>
<h3>安装配置DNS从服务器</h3>
<p>在客户数据中心安装配置DNS服务器的步骤与在Aamazon EC2中安装配置DNS服务器的步骤相同，除了/etc/named.conf的配置稍有差别：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/20170523-11.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/20170523-11.png" alt="20170523-11" width="514" height="182" /></a></p>
<p>从服务器的type类型为slave，file参数对应的域配置文件会自动根据从主DNS服务器接收到的更新来进行创建和更新，masters指定aws.local域的主域名服务器，最后一个参数allow-transfer禁用了区域传送。</p>
<p>配置好从DNS服务器之后，可将客户数据中心内的连网设备设置为从DNS服务器，第二DNS服务器设置为AWS上的主DNS服务器。</p>
<h3>总结</h3>
<p>Amazon VPC提供DHCP服务和DNS服务，为VPC中的EC2实例提供IP地址分配和域名解析服务，为每个EC2实例创建特定格式的DNS域名。如果用户希望使用自定义域名，或者希望使用一套域名统一管理云上和云下的资源，可自行搭建DNS服务器来提供DNS解析服务，Amazon VPC能够支持客户。</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e5%9c%a8virtual-private-cloud%e4%b8%ad%e8%87%aa%e5%bb%ba%e5%9f%ba%e4%ba%8ebind%e7%9a%84dns%e6%9c%8d%e5%8a%a1%e5%99%a8/">在Virtual Private Cloud中自建基于BIND的DNS服务器</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/%e5%9c%a8virtual-private-cloud%e4%b8%ad%e8%87%aa%e5%bb%ba%e5%9f%ba%e4%ba%8ebind%e7%9a%84dns%e6%9c%8d%e5%8a%a1%e5%99%a8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>如何在AWS上构建基于 OpenSwan 的软件 VPN 解决方案</title>
		<link>https://www.fuwuqiok.com/%e5%a6%82%e4%bd%95%e5%9c%a8aws%e4%b8%8a%e6%9e%84%e5%bb%ba%e5%9f%ba%e4%ba%8e-openswan-%e7%9a%84%e8%bd%af%e4%bb%b6-vpn-%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88/</link>
		<comments>https://www.fuwuqiok.com/%e5%a6%82%e4%bd%95%e5%9c%a8aws%e4%b8%8a%e6%9e%84%e5%bb%ba%e5%9f%ba%e4%ba%8e-openswan-%e7%9a%84%e8%bd%af%e4%bb%b6-vpn-%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88/#comments</comments>
		<pubDate>Fri, 27 Jul 2018 08:54:18 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Amazon AWS]]></category>
		<category><![CDATA[linux代维]]></category>
		<category><![CDATA[linux服务器代维]]></category>
		<category><![CDATA[linux服务器维护]]></category>
		<category><![CDATA[服务器代维]]></category>
		<category><![CDATA[如何在AWS上构建基于 OpenSwan 的软件 VPN 解决方案]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=3601</guid>
		<description><![CDATA[<p>概述 随着云的普及以及即用即付的模式，正在被大家逐渐接受，那么在初期从原始数据中心到云迁移的过程中，为了保证数 [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e5%a6%82%e4%bd%95%e5%9c%a8aws%e4%b8%8a%e6%9e%84%e5%bb%ba%e5%9f%ba%e4%ba%8e-openswan-%e7%9a%84%e8%bd%af%e4%bb%b6-vpn-%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88/">如何在AWS上构建基于 OpenSwan 的软件 VPN 解决方案</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<h3>概述</h3>
<p>随着云的普及以及即用即付的模式，正在被大家逐渐接受，那么在初期从原始数据中心到云迁移的过程中，为了保证数据的平稳迁移，并不推荐将应用以及数据库一次性的迁移到云中。所有项目都应该分阶段来进行，阶段迁移的情况下就必须要将云资源与本地数据中心的资源互连互通。</p>
<p>要做到互连互通，有三种备选方案，互联网，专线直连（DX）和 VPN。从三个方面比较下这三种解决方案，安全，稳定性以及费用。DX 服务无疑是最优的一种解决方案，提供安全稳定的网络性能，高吞吐量。由于国内专线铺设所带来的高昂费用，所以在初期阶段，DX 并不是一个最优的。这里面互联网是最便宜的，因为本身数据中心就已经支付了这部分费用，只要保证云中的资源可以上互联网就可以了，但互联网面临的问题是网络依赖互联网，互联网的网络性能并不是可控的，另外一方面是互联网的安全性。VPN 呢是基于互联网的服务，虽然不能保证网络性通的可控，但可以做到数据的安全。</p>
<p>就以上比较而言，在初期阶段，VPN 无疑是一种高性比的安全以及节约成本的方案。考虑到目前北京区域并不支持硬件VPN的服务，即Global区域的VPN Connection。那么有没有可以替代的方案呢？答案是肯定的，一切问题都难不倒我们伟大的开源组织，开源方案如 OpenSwan （今天的主角），StrongSwan，Raccoon等等了。除了开源的解决方案外，还有一些商业解决方案，比如Sanfor 深信服，Hillstone 山石，Checkpoint , Cisco CSR1000v等也可以部署，有兴趣的可以与相应的软件提供商联系。</p>
<p>前面说了那么多关于VPN的各种软件，那么该如何选择呢？这里我们从使用上来划分下吧，将VPN主要划分为两类，一类是工作于客户端到服务端的模式，像OpenVPN，SSL VPN，L2TP，PPTP这些都是需要客户端主动发起连接，拨到Server端在两者之间建立一个逻辑上的隧道 (tunnel)进行通信。这种方式一般适用于个人到总部场景。服务器是无法主动发起连接到客户端。</p>
<p>另外一种就是站点到站点（site-to-site）的模式，像OpenSwan，StrongSwan， Raccoon 等软件，这种情况下两端会各有一个设备负责来建立两个站点之间安全通信的隧道，任何需要到对端的通信都会触发设备来建立安全隧道通信。</p>
<p>那么公司原有数据中心与云通信都是双向通信，所以站点到站点更合理。</p>
<p>实际上这里说的 VPN 即是指 IPsec VPN，IPsec 是一种工业标准，只要支持这种标准的设备都可以互相协商建立一个安全的隧道出来，比如支持的硬件设备有路由器，防火墙以及专业的 VPN 设备。</p>
<p>说了这么多，下面我们就以 AWS 端为 OpenSwan 与 Cisco 的路由器之间的配置为例。</p>
<h3>场景及拓扑</h3>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1101-1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1101-1.png" alt="1101-1" width="1259" height="514" /></a></p>
<p>拓扑如上图，AWS端建立一个VPC（CIDR：192.168.0.0/16），包含两个子网，一个可以上互联网的Public子网192.168.1.0/24以及私有子网Private 192.168.2.0/24。在公有子网上会配置一台OpenSwan实例与公司的Cisco设备做VPN连接。</p>
<p>OpenSwan的EIP地址为54.223.152.218 子网：192.168.1.0/24</p>
<p>Cisco设备的公网地址为54.223.170.5 子网：10.1.2.0/24</p>
<p>目标：实现AWS上私有子网192.168.2.0/24和数据中心10.1.2.0/24双向互通</p>
<h3>详细配置步骤</h3>
<p>1.配置 VPC 基础环境</p>
<p>1.1 创建 VPC</p>
<p>在AWS console界面点击VPC，在左侧点击“您的VPC”, 创建VPC</p>
<p>名称标签： MyVPC</p>
<p>CIDR块： 192.168.0.0/16</p>
<p>租赁：默认</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1101-2.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1101-2.png" alt="1101-2" width="648" height="275" /></a></p>
<p>1.2 创建子网</p>
<p>将鼠标点到子网，选择创建子网</p>
<p>标签名称：Public</p>
<p>VPC：选择第一步创建好的VPC</p>
<p>可用区：保持默认</p>
<p>CIDR块：192.168.1.0/24</p>
<p>以同样的方法创建一个192.168.2.0/24的子网</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1101-3.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1101-3.png" alt="1101-3" width="880" height="436" /></a></p>
<p>1.3 创建路由表</p>
<p>点击路由表，创建路由表</p>
<p>名称标签：PrivateRoute</p>
<p>VPC：选择1.1创建好的VPC</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1101-4.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1101-4.png" alt="1101-4" width="859" height="333" /></a></p>
<p>创建完成以后，点到刚刚创建好的路由表，在页面下列点击子网关联，点击编辑</p>
<p>在192.168.2.0/24的路由前打勾，点击保存。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1101-5.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1101-5.png" alt="1101-5" width="843" height="448" /></a></p>
<p>1.4 创建 IGW</p>
<p>点击Internet网关，创建Internet网关</p>
<p>名称标签：MyIGW</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1101-6.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1101-6.png" alt="1101-6" width="856" height="301" /></a>创建完成，点击附加到VPC</p>
<p>选择新创建好的VPC</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1101-7.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1101-7.png" alt="1101-7" width="864" height="365" /></a></p>
<p>2. 启动并配置 VPN 实例</p>
<p>2.1 启动实例</p>
<p>到EC2页面，点击启动实例。选择Amazon Linux</p>
<p>在详细信息页中，网络请选择新创建的VPC</p>
<p>子网选择192.168.1.0/24</p>
<p>点击下一步，存储标签等按需配置</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1101-8.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1101-8.png" alt="1101-8" width="1083" height="498" /></a></p>
<p>配置安全组，选择创建一个新的安全组</p>
<p>添加规则</p>
<p>自定义的UDP规则，端口500 来源任何位置</p>
<p>自定义的UDP规则，端口4500 来源任何位置</p>
<p>自定义协议， 协议 50 来源任何位置</p>
<p>所有流量 来源为 192.168.2.0/24</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1101-9.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1101-9.png" alt="1101-9" width="1088" height="477" /></a></p>
<p>注意：一定要放行来自于192.168.2.0/24的流量，否则无法通信。</p>
<p>最后审核启动，启动时指定一个用于登陆实例的key文件,如果没有创建一个新的。</p>
<p>2.2 配置弹性 IP （EIP）</p>
<p>在EC2页面，左侧导航栏找到弹性IP，申请分配新地址，并将其关联到新创建的OpenSwan实例。这里申请到的为 54.223.152.218。</p>
<p>2.3 关闭源/目的检查</p>
<p>在EC2页面点击OpenSwan实例，右键选择联网，更改源/目标检查，点“是，请禁用”</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1101-10.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1101-10.png" alt="1101-10" width="545" height="311" /></a></p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1101-11.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1101-11.png" alt="1101-11" width="462" height="297" /></a></p>
<p>3. 安装配置 OpenSwan</p>
<p>3.1 登录到实例安装 OpenSwan</p>
<p>如何登陆实例请参考如下文档：</p>
<p>https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/putty.html</p>
<p>登陆完成以后，运行如下命令安装OpenSwan</p>
<p><code>$ sudo yum -y install openswan</code></p>
<p>3.2 根据Cisco 参数来配置 OpenSwan</p>
<p>修改/etc/ipsec.conf去掉最后一行include /etc/ipsec.d/*.conf 的注释</p>
<p><code>$ sudo vim /etc/ipsec.conf</code></p>
<p><code>include /etc/ipsec.d/*.conf</code></p>
<p>&nbsp;</p>
<p>Cisco路由器的配置如下：</p>
<p><code>crypto isakmp policy 10</code></p>
<p><code>encr aes</code></p>
<p><code>authentication pre-share</code></p>
<p><code>group 2</code></p>
<p><code>crypto isakmp key aws123 address 54.223.152.218</code></p>
<p><code>!</code></p>
<p><code>!</code></p>
<p><code>crypto ipsec transform-set OpenSwan esp-aes esp-sha-hmac</code></p>
<p><code>mode tunnel</code></p>
<p><code>!</code></p>
<p><code>!</code></p>
<p><code>!</code></p>
<p><code>crypto map OpenSwan 10 ipsec-isakmp</code></p>
<p><code>set peer 54.223.152.218</code></p>
<p><code>set transform-set OpenSwan</code></p>
<p><code>match address 100</code></p>
<p><code>!</code></p>
<p><code>!</code></p>
<p><code>interface GigabitEthernet1</code></p>
<p><code>ip address 54.223.170.5 255.255.255.252</code></p>
<p><code>ip mtu 1400</code></p>
<p><code>ip tcp adjust-mss 1360</code></p>
<p><code>crypto map OpenSwan</code></p>
<p><code>!</code></p>
<p><code>access-list 100 permit ip 10.1.2.0 0.0.0.255 192.168.2.0 0.0.0.255</code></p>
<p><code>ip route 0.0.0.0 0.0.0.0 54.223.170.6</code></p>
<p>根据cisco的配置创建OpenSwan的配置如下：</p>
<p><code>$ sudo vim /etc/ipsec.d/cisco.conf</code></p>
<p><code>conn cisco</code></p>
<p><code>authby=secret</code></p>
<p><code>auto=start</code></p>
<p><code>leftid=54.223.152.218</code></p>
<p><code>left=%defaultroute</code></p>
<p><code>leftsubnet=192.168.2.0/24</code></p>
<p><code>leftnexthop=%defaultroute</code></p>
<p><code>right=54.223.170.5</code></p>
<p><code>rightsubnet=10.1.2.0/24</code></p>
<p><code>keyingtries=%forever</code></p>
<p><code>ike=aes128-sha1;modp1024</code></p>
<p><code>ikelifetime=86400s</code></p>
<p><code>phase2alg=aes128-sha1</code></p>
<p><code>salifetime=3600s</code></p>
<p><code>pfs=no</code></p>
<p>配置解释：</p>
<p>leftid 标明本地对应公网IP</p>
<p>letftsubnet为本地子网</p>
<p>right为对端公网地址</p>
<p>rightsubnet为对端子网</p>
<p>ike为第一阶段参数</p>
<p>ikelifetime为第一阶段的生存时间</p>
<p>phase2alg为第二阶段参数</p>
<p>salifetime为第二阶段生存时间</p>
<p>结果如下图：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1101-12.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1101-12.png" alt="1101-12" width="415" height="298" /></a></p>
<p>配置预共享密钥：</p>
<p><code>$ sudo vim /etc/ipsec.d/cisco.secrets</code></p>
<p>54.223.152.218  54.223.170.5: PSK “aws123”</p>
<p>启动openswan服务并做配置检查</p>
<p><code>$ sudo service ipsec start</code></p>
<p><code>$ sudo ipsec verify</code></p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1101-13.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1101-13.png" alt="1101-13" width="776" height="323" /></a></p>
<p>3.3 修改系统参数</p>
<p>更改系统参数做IP转发并关闭重定向功能</p>
<p>编辑/etc/sysctl.conf内核配置文件，做如下修改</p>
<p><code>$ vim /etc/sysctl.conf</code></p>
<p><code>$ vim /etc/sysctl.conf</code></p>
<p><code>net.ipv4.ip_forward = 1</code></p>
<p><code>net.ipv4.conf.all.accept_redirects = 0</code></p>
<p><code>net.ipv4.conf.all.send_redirects = 0</code></p>
<p><code>net.ipv4.conf.default.send_redirects = 0</code></p>
<p><code>net.ipv4.conf.eth0.send_redirects = 0</code></p>
<p><code>net.ipv4.conf.default.accept_redirects = 0</code></p>
<p><code>net.ipv4.conf.eth0.accept_redirects = 0</code></p>
<p>配置完成以后，启用新的配置</p>
<p><code>$ sudo sysctl –p</code></p>
<p>3.4 更改 OpenSwan 的网卡 MSS 值</p>
<p><code>$ sudo iptables -t mangle -A FORWARD -o eth0 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1387</code></p>
<p>3.5 修改 VPC 私有子网路由表</p>
<p>找到VPC Console页面，在左侧点路由表，找到192.168.2.0/24关联的路由表（1.3中创建）， 在页面下方点击路由，编辑</p>
<p>添加其他路由，</p>
<p>目标： 10.1.2.0/24</p>
<p>目标：OpenSwan实例ID (i-xxxxx)</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1101-14.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1101-14.png" alt="1101-14" width="721" height="257" /></a></p>
<p>4. 测试连通性</p>
<p>以上步骤都完成以后，就可以在192.168.2.0网段的实例进行测试了。使用 ping 测试到 10.1.2.x private 私有地址段的一个地址。</p>
<p><code>ping 10.1.2.3</code></p>
<p>检查 IPsec tunnel 状态：</p>
<p><code>$ sudo service ipsec status</code></p>
<p><code>IPsec running - pluto pid: 25674</code></p>
<p><code>pluto pid 25674</code></p>
<p><code>1 tunnels up</code></p>
<p><code>some eroutes exist</code></p>
<h3>常见问题及排错</h3>
<p>1.  IPsec Tunnel 没有正常建立</p>
<p>首先检查到对端 IP 是否可以通信，检查安全组是否放行 IKE 需要的端口 UDP 500。如果网络层没问题，检查各项参数配置是否有错误。</p>
<p>2. 隧道建立成功，但是无法进行通信</p>
<p>首先检查 IP forward 是否设置为 1？VPN 实例安全组是否放行了相应的策略？路由是否正确？NAT 是否影响？</p>
<p>3. NAT 问题</p>
<p>如果您的 CGW 配置了 NAT 与 VPN 工作，根据厂家不同对 VPN 包的处理顺序不一致，如果源 NAT 在 VPN 之前被处理了，因为源地址发生了改变，所以也就不会再被 VPN 处理，造成通信失败。像 Cisco 设备就需要做 NAT 的例外策略。主流的 Cisco ASA 就需要做相应修改，参考如下：</p>
<p>8.2 及以前的版本：</p>
<p><code>nat (inside) 0 access-list nat_exemption</code><br />
<code>access-list nat_exemption extended permit ip 192.168.1.0 255.255.255.0 10.0.0.0 255.255.255.0</code></p>
<p>8.3 及更新的版本：</p>
<p><code>object network obj-192.168.1.0</code></p>
<p><code>subnet 192.168.1.0 255.255.255.0</code></p>
<p><code>object network obj-10.0.0.0</code></p>
<p><code>subnet 10.0.0.0 255.255.255.0</code></p>
<p><code>nat (inside,any) source static obj-192.168.1.0 obj-192.168.1.0 destination static obj-10.0.0.0 obj-10.0.0.0 no-proxy-arp</code></p>
<p>如果您经过以上步骤还是不能成功搭建 VPN，AWS Support 提供专业化的技术支持，可根据您当前或计划的使用案例为您提供一套独特的工具和专业知识。建议您开案例联系Support 技术支持。</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e5%a6%82%e4%bd%95%e5%9c%a8aws%e4%b8%8a%e6%9e%84%e5%bb%ba%e5%9f%ba%e4%ba%8e-openswan-%e7%9a%84%e8%bd%af%e4%bb%b6-vpn-%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88/">如何在AWS上构建基于 OpenSwan 的软件 VPN 解决方案</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%9c%a8aws%e4%b8%8a%e6%9e%84%e5%bb%ba%e5%9f%ba%e4%ba%8e-openswan-%e7%9a%84%e8%bd%af%e4%bb%b6-vpn-%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AWS之旅：混合云构建及常见的应用场景</title>
		<link>https://www.fuwuqiok.com/aws%e4%b9%8b%e6%97%85%ef%bc%9a%e6%b7%b7%e5%90%88%e4%ba%91%e6%9e%84%e5%bb%ba%e5%8f%8a%e5%b8%b8%e8%a7%81%e7%9a%84%e5%ba%94%e7%94%a8%e5%9c%ba%e6%99%af/</link>
		<comments>https://www.fuwuqiok.com/aws%e4%b9%8b%e6%97%85%ef%bc%9a%e6%b7%b7%e5%90%88%e4%ba%91%e6%9e%84%e5%bb%ba%e5%8f%8a%e5%b8%b8%e8%a7%81%e7%9a%84%e5%ba%94%e7%94%a8%e5%9c%ba%e6%99%af/#comments</comments>
		<pubDate>Wed, 06 Dec 2017 02:18:26 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Amazon 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>
		<category><![CDATA[AWS云主机托管]]></category>
		<category><![CDATA[AWS云服务解决方案]]></category>
		<category><![CDATA[AWS代付]]></category>
		<category><![CDATA[AWS服务咨询]]></category>
		<category><![CDATA[AWS服务器迁移]]></category>
		<category><![CDATA[AWS电话告警]]></category>
		<category><![CDATA[AWS解决方案提供商！]]></category>
		<category><![CDATA[AWS运维支持]]></category>
		<category><![CDATA[linux服务器代维]]></category>
		<category><![CDATA[亚马逊aws服务器租用代维护]]></category>
		<category><![CDATA[企业上AWS云]]></category>
		<category><![CDATA[海外服务器代维]]></category>
		<category><![CDATA[澳洲华人服务器代维]]></category>
		<category><![CDATA[香港主机代维]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=3341</guid>
		<description><![CDATA[<p>混合云融合了公有云和私有云，是企业上云的中间之旅，也是云计算发展过程中的一种模式和阶段。出于如信息保密、行业合 [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/aws%e4%b9%8b%e6%97%85%ef%bc%9a%e6%b7%b7%e5%90%88%e4%ba%91%e6%9e%84%e5%bb%ba%e5%8f%8a%e5%b8%b8%e8%a7%81%e7%9a%84%e5%ba%94%e7%94%a8%e5%9c%ba%e6%99%af/">AWS之旅：混合云构建及常见的应用场景</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>混合云融合了公有云和私有云，是企业上云的中间之旅，也是云计算发展过程中的一种模式和阶段。出于如信息保密、行业合规、市场细分等因素或考虑，有些企业更愿意将数据存放在本地数据中心或私有云中，但是同时又希望可以获得公有云的计算资源、存储资源。在这种情况下，混合云在企业上云之初被广泛的采用。</p>
<h3>1     构建混合云的关键技术点</h3>
<p><strong>1.1   网络连接</strong></p>
<p>第一点，公有云具备用户自定义网络的能力。这里自定义网络泛指云上的私有网络，Amazon VPC允许企业用户在AWS云上自定义逻辑隔离的专用网络的能力，包括允许用户可以自行划分子网、配置路由，设置公网、VPN网关等基础能力。</p>
<p>第二点，多样、稳定的网络接入能力。混合云最突出的特点就是连接，连接方式主要分为两种：公网接入和专线接入。</p>
<p>为保护用户的信息安全，公网接入在Internet上的流量通常需要经过IPsec VPN加密，AWS提供了托管VPN服务和用户自建VPN两种方式，如果采用用户自建方式，一般小型VPN网关（200Mbps以下）可以通过虚拟软件VPN网关实现，中或大型VPN网关（300Mbps及以上）可通过硬件VPN网关设备实现。VPN部署一般半天即可完成，可以快速满足企业用户需求。</p>
<p>AWS Direct Connect（简称DX专线）为企业上云提供了专线接入能力，能够全时段、全方位的保障用户数据传输隔离加密，并保证可用网络带宽，用户无需担心容量太大而无法承载的问题。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/1-21.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/1-21.png" alt="1-21" width="1352" height="542" /></a></p>
<p><em>示图1：AWS DX专线与VPN混合组网示意图</em></p>
<p><strong>1.2   安全与监控</strong></p>
<p>混合云在网络层面上将私有云和公有云进行了连接，如果发生网络故障或者攻击，需要有能力保障网络间故障不会相互影响，将攻击或者故障限制在一定范围之内。云上的网络环境需要具备灵活、易配置的网络安全访问控制能力。Amazon VPC提供了有状态的EC2实例级别的网络防火墙功能（安全组），还则提供了无状态的子网级别的网络访问控制（网络ACL）。</p>
<p>监控方面，Amazon VPC 提供了流日志（flow log）功能，可以利用此项功能来捕获传入和传出的网络IP流量信息。流日志数据使用 Amazon CloudWatch Logs 存储，创建流日志后，用户可以在 Amazon CloudWatch Logs 中监控和查看其VPC网络的流量传入和传出状态，并可通过CloudWatch预设告警策略以及时反馈网络异常。VPC流日志还可以帮助用户排查网络故障等问题，比如流量为什么没有进入到EC2实例的原因。另外，针对VPC流日志的分析，可以帮助检查AWS云上的网络安全设置，消除网络安全漏洞。</p>
<p><strong>1.3   统一服务，混合云管理平台</strong></p>
<p>云管理平台的定义是Gartner提出来的，总结起来就是两块，第一是管理，管理公有云、私有云，形成混合云。第二是自服务，镜像划分，计量与计费，以及基于策略的负载优化。云管理平台最终的目标是应用在云平台上运行时取得最优化的效果。</p>
<p>企业用户构建混合云平台之后，首先需要解决的就是服务门户的统一，资源状态监控界面的统一，在一个平台上实现本地数据中心（或私有云）和公有云资源的统一申请、统一审批、统一监控、统一计费。这样能够大幅度降低用户跨平台切换带来的复杂运维工作量，让用户跨平台的资源使用与监控更加方便。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/2-1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/2-1.png" alt="2-1" width="1028" height="506" /></a></p>
<p><em>示图2：混合云管理平台（CMP）功能示例图</em></p>
<h3>2     常见的混合云应用场景</h3>
<p><strong>2.1   利用AWS公有云应对业务的爆发式增长</strong></p>
<p>大多数互联网业务呈指数型增长，很难预测基础设施的储备量。一般在业务成长初期很长一段时间内，小规模的物理机托管可以满足用户需求。但随着市场推广活动展开，业务规模爆发增长，原物理托管机房可部署机位有限，只能选择公有云作为弹性手段，快速部署业务，满足用户需求。</p>
<p>今天已经有越来越多的企业用户将他们的互联网业务系统，诸如电子商务系统、Web网站、移动端产品和信息订阅服务系统迁移到AWS云上。应对业务规模爆发增长的用户需求，AWS云服务采用多种方式确保应用系统的可靠性和稳定性，作为最基础的云服务，Amazon EC2提供了大小可调的计算容量，用户可以根据自己的实际需求，完全控制所需的计算资源。配合AWS的Auto Scaling功能，用户可以按照事先设定的条件自动扩展Amazon EC2容量，确保所使用的Amazon EC2数量在需求峰值期间实现无缝增长以保持性能，同时也可以在需求平淡期间自动减少Amazon EC2数量以降低成本。此外，Elastic Load Balancing可以在多个Amazon EC2实例之间自动分配应用程序的访问流量，也可以检测出系统中不健康的实例并自动更改路由，将应用的访问流量导向健康的实例。通过不同功能云服务之间的组合，AWS云平台可以确保应用系统的高可靠性和稳定性。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/3.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/3.png" alt="3" width="1298" height="690" /></a></p>
<p><em>示图3：混合云架构下的电商平台三层系统架构图</em></p>
<p>与早期基于传统数据中心的系统相比，依托AWS云平台的新系统在稳定性、可靠性和响应速度等方面都有了极大的提升，同时大幅度降低了固定资产投资(CAPEX)和运营成本（OPEX）。在传统数据中心模式下，用一台服务器的寿命大约为5年来计算，购入一台与Amazon EC2 c3.4xlarge机型（16 vCPU,30 GB 内存）配置对应的物理服务器，加上网络和托管费用， 核算出5年的总费用；如果按这个需求迁移到AWS云平台后，企业用户在总费用上可以节省20%。</p>
<p>使用AWS云服务也大幅度降低了用户的运营成本。在传统数据中心模式，企业用户的运维团队工作任务繁重，需要做很多简单、重复的工作，比如服务器的上下架、系统重装、硬件检修等。采用AWS云服务之后，运维人员可以把主要精力放在研究和部署更好的技术架构和方案上，提升了工作效率，减少了人力投入，运维人员的人力成本可以节省一半左右。</p>
<p><strong>2.2   利用AWS公有云实现多地容灾的高可用架构部署</strong></p>
<p>与前一类用户不一样，很多企业用户已经具有很大规模，在本地数据中心或运营商机房中运行大量服务器，他们的核心问题不再是担心基础设施部署速度无法满足业务增长，更多的是从稳定性、可靠性等寻求从单中心向多中心化发展，通过消灭单点，解决单数据中心故障带来的业务风险。</p>
<p>根据业务可靠性要求不同，一般多地容灾常见的采用方式有同城容灾、异地双活、两地三中心等。按照传统建设模式，用户只能重新选址并租赁数据中心，发起服务器、网络设备采购，部署网络环境等，中间涉及到一系列的商务沟通、基础设施建设等操作，周期往往从6个月到1年不等。而在公有云蓬勃发展的今天，他们可以不必担心此类问题，直接注册个账号，购买服务器，拉个专线，基础架构就搞定了。</p>
<p>AWS的混合云容灾架构，就是在AWS的云环境中实现“两地三中心”，同时利用AWS云中资源的弹性大幅度降低资源成本和建设以及运维的复杂性。AWS云资源池通过软件定义的方式，能够打造与企业内部完全相同的复杂IT环境，实现企业级应用的完整镜像。</p>
<p>成立于2005年的IGG，是全球领先的手机游戏开发商及运营商，为全球游戏玩家提供游戏和相关服务。为了给玩家提供最佳的用户体验，IGG需要在全球多个区域部署服务器。在使用AWS云服务之前，IGG拥有自建的机房，同时也采用多家公司的主机租用服务。随着业务的快速发展，原有的服务部署模式开始面临多方面的挑战，主要体现在三个方面：其一是服务器资源管理不方便、扩展性和灵活性受限制，当访问峰值来临时，部署新服务器的周期较长，而当某款游戏的访问量暂时降低时，又会造成已有服务器资源的浪费；其二是开发和运营新游戏时难以控制成本，因为对游戏运营公司来说，一款游戏是否成功受很多因素的影响，但在运营每一款新游戏时都需要投入大量的IT资源，万一不成功，则会浪费已购置的服务器资源；其三是如何建立双活的灾备系统以确保在任何情况下都能为全球玩家提供持续可靠的服务。</p>
<p>为了应对这些挑战，IGG开始考虑采用公有云服务作为自有数据中心（下面简称：自有IDC）的补充。经过考察、分析和对比，IGG决定采用AWS云服务，并从几年前开始尝试使用AWS在新加坡、法兰克福、日本、美国等可用区的云服务部署海外游戏节点。2016年8月，为了提升整个游戏运营系统的稳定性和可靠性，IGG决定为其位于北加州的核心业务系统建立双活灾备系统。使用AWS云服务给IGG带来的最大好处是用较低的成本建立起远程的双活灾备中心，实现了核心业务异地实时同步备份，在主机房出现故障时能快速切换到云端，保证服务的连续性。整个灾备系统完全满足IGG的业务需求：RTO不超过30分钟、RPO为0，增强了IGG游戏运营系统的稳定性和可靠性。除此之外，使用AWS云服务也节省了灾备系统的成本，因为利用AWS云服务建立双活灾备系统时并不需要1:1的资源配置，这点相比传统的本地灾备具有极大的性价比优势。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/4-2.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/4-2.png" alt="4-2" width="1048" height="618" /></a></p>
<p><em>示图4: 基于AWS云服务的IGG双活灾备中心</em></p>
<p><strong>AWS混合云容灾架构的用户价值</strong>: 从容灾系统的TCO上看，AWS混合云容灾解决方案更是具备明显优势。无需前期对硬件、软件的采购和安装，省去了大量前提投入成本。更重要的是，容灾方案中AWS云中资源可以选择不开机或只开启少量小机型资源，对于不开机的资源将完全不收取EC2虚拟机资源的费用，又能保持EC2虚拟机的状态和后台数据的增量更新。经过我们的测算，一个典型的容灾系统项目，以5年为周期进行计算，TCO只需花费原有私有云容灾环境的1/3，而第一年的投入资金更是传统项目的1/10。</p>
<p>另外，随着应用容灾系统迁移至AWS云中，可以将企业现有的容灾中心转变成生产中心，从而扩大客户自建数据中心的承载能力，或大幅降低IT资源的运营成本，享受更多AWS云带来的好处。下图从AWS混合云容灾开始，到容灾切换，到生产系统平滑上云的进阶演进图：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/5-2.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/5-2.png" alt="5-2" width="2534" height="1152" /></a></p>
<p><em> 示图5：AWS混合云容灾，到容灾切换，到生产系统平滑上云的进阶演进图</em></p>
<p><strong>2.3   利用AWS公有云实现混合云备份</strong></p>
<p>将数据备份到云端的好处显而易见：管理和操作更加便捷，无需搭建IT备份系统架构、将一次性大额支付变为每月或每年的按需付费，进而减少企业对IT资源的投入等等。现在越来越多的企业客户更倾向于通过其现有的备份软件或云网关，将其现有的备份体系架构扩展到云上。这样做的好处可以用云备份替换离线磁带，大大降低本地存储的资源开销，利用云端完成备份工作，更具性价比。</p>
<p>AWS Storage Gateway （又称“AWS存储网关”，架构图见示图6）是AWS提供的一种混合云存储服务，企业本地数据中心的内部应用程序可以借助它来无缝地使用 AWS 云上的存储资源（如S3，Glacier等），AWS存储网关可以帮助企业用户实现本地数据中心向AWS云端进行备份、存档、灾难恢复、云突增、分级存储分层和迁移。并具有无缝集成能力，企业应用程序或备份工具可以使用 NFS、iSCSI 等标准存储协议通过本地存储网关镜像设备连接到AWS云端的该存储网关，同时存储网关连接 Amazon S3、Amazon Glacier、Amazon EBS 等 AWS 存储服务，可实现文件、卷和虚拟磁带的存储或备份。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/6-11.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/6-11.png" alt="6-11" width="1296" height="614" /></a></p>
<p><em>示图6：AWS存储网关服务架构示意图（Gateway-Cached Volume）</em></p>
<p>AWS存储网关具有高度优化的数据传输机制，能够进行带宽管理、自动实现网络弹性、高效传输数据，并为活动数据的低延迟本地访问提供本地缓存。</p>
<p>当然从企业用户的混合云备份需求角度，通常需要考虑：</p>
<ul>
<li>如何实现对于虚拟机和物理机进行统一管理?</li>
<li>如何缩短备份时间?</li>
<li>如何快速恢复? 能否恢复到任何环境（如物理机,虚拟机,云中的虚拟机） ?</li>
<li>能否确保备份与恢复数据的完整性及安全性?</li>
<li>如何实现冷热数据的分级存储，降低云上的存储成本？</li>
<li>如何避免重复备份数据?</li>
</ul>
<p>目前已经有很多国内外备份服务厂商基于AWS存储网关构建了一体化AWS混合云备份方案，利用AWS云存储资源便宜的特点帮助企业用户实现AWS云端备份，而且方案能很好的满足前述提到用户对混合云备份的要求。下图为国内某备份服务厂商基于AWS存储网关的混合云备份解决方案。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/7-1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/7-1.png" alt="7-1" width="1046" height="550" /></a></p>
<p><em>示图7：国内某备份服务厂商基于AWS存储网关的混合云备份解决方案</em></p>
<p>该备份服务厂商的AWS混合云备份解决方案具有如下优势和技术特点：</p>
<ul>
<li>操作简便：提供功能丰富，操作简便的用户界面，支持手工备份、时间计划、多任务多计划、备份状态监控、版本管理、恢复操作、并提供一键式故障转移切换功能。</li>
<li>块级别全局重复删除数据：基于源端的重复数据删除技术，相同数据块仅发送和存储一次，可以减少备份时间80%以上，这不仅带来效率的提高、带宽、存储空间的节约；还保证窄带宽条件下大数据异地灾备。</li>
<li>瞬间恢复：通过Snapshot技术，保证备份期间不需要关闭应用，定时对发生变更的数据块进行标记并实施迁移 （最小支持一分钟），在下一个备份时间点只检索被标记的数据块，这不仅节省磁盘IO，并且能够瞬间恢复数据。</li>
<li>冷热数据分级存储功能：充份利用Amazon S3提供的生命周期管理策略的功能，用户通过简单的策略制定就可以自动化实现冷热数据的分级存储，冷数据自动归档存储到更便宜的Amazon Glacier上，既实现了用户长期归档的需求，还可以大幅降低云上的存储成本。</li>
<li>支持Windows/Linux/Unix等多种环境的网络集中备份，同时支持多种应用服务类型，如各种常见的应用服务器、数据库（如MySQL、SQL Server、Oracle、Sybase、DB2）、 Domino、AD、Exchange、File server等等。</li>
<li>三重数据安全：</li>
</ul>
<ol>
<li>硬盘锁：数据与设备进行绑定，数据只能恢复到原有硬件</li>
<li>无规则存放：数据以无规则的块存储，避免坚守自盗</li>
<li>通信与数据加密：私有通信协议,可选AES数据加密</li>
</ol>
<ul>
<li>异地灾备与恢复: 备份到异地云计算中心，支持恢复到本地物理机、虚拟机、AWS云上虚拟机等多种不同平台，当本地数据中心出现物理故障时，这种异地恢复机制既可以满足企业用户异地灾备恢复的需求，还可以实现数据异地使用的业务价值。</li>
<li>传输优化：经优化的灾难恢复和复制，几分钟内返回到联机状态。</li>
</ul>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/aws%e4%b9%8b%e6%97%85%ef%bc%9a%e6%b7%b7%e5%90%88%e4%ba%91%e6%9e%84%e5%bb%ba%e5%8f%8a%e5%b8%b8%e8%a7%81%e7%9a%84%e5%ba%94%e7%94%a8%e5%9c%ba%e6%99%af/">AWS之旅：混合云构建及常见的应用场景</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/aws%e4%b9%8b%e6%97%85%ef%bc%9a%e6%b7%b7%e5%90%88%e4%ba%91%e6%9e%84%e5%bb%ba%e5%8f%8a%e5%b8%b8%e8%a7%81%e7%9a%84%e5%ba%94%e7%94%a8%e5%9c%ba%e6%99%af/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
