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

<channel>
	<title>服务器安全维护工作室 &#187; 云服务解决方案</title>
	<atom:link href="https://www.fuwuqiok.com/tag/%e4%ba%91%e6%9c%8d%e5%8a%a1%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88/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>使用 Amazon Polly 针对 AWS 账户安全事件进行电话呼叫报警</title>
		<link>https://www.fuwuqiok.com/%e4%bd%bf%e7%94%a8-amazon-polly-%e9%92%88%e5%af%b9-aws-%e8%b4%a6%e6%88%b7%e5%ae%89%e5%85%a8%e4%ba%8b%e4%bb%b6%e8%bf%9b%e8%a1%8c%e7%94%b5%e8%af%9d%e5%91%bc%e5%8f%ab%e6%8a%a5%e8%ad%a6/</link>
		<comments>https://www.fuwuqiok.com/%e4%bd%bf%e7%94%a8-amazon-polly-%e9%92%88%e5%af%b9-aws-%e8%b4%a6%e6%88%b7%e5%ae%89%e5%85%a8%e4%ba%8b%e4%bb%b6%e8%bf%9b%e8%a1%8c%e7%94%b5%e8%af%9d%e5%91%bc%e5%8f%ab%e6%8a%a5%e8%ad%a6/#comments</comments>
		<pubDate>Fri, 23 Mar 2018 02:01:45 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[服务器安全设置]]></category>
		<category><![CDATA[服务器维护]]></category>
		<category><![CDATA[服务器迁移]]></category>
		<category><![CDATA[服务器运维]]></category>
		<category><![CDATA[网站代维]]></category>
		<category><![CDATA[网站防挂马]]></category>
		<category><![CDATA[aws服务器代维]]></category>
		<category><![CDATA[linode云服务器迁移]]></category>
		<category><![CDATA[Linux服务器维护]]></category>
		<category><![CDATA[linux维护]]></category>
		<category><![CDATA[云服务解决方案]]></category>
		<category><![CDATA[企业上云服务咨询]]></category>
		<category><![CDATA[服务器外包]]></category>
		<category><![CDATA[香港服务器代维]]></category>

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

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=3509</guid>
		<description><![CDATA[<p>为更好遵从各行业的合规要求，构建安全的IT环境，企业的安全团队一般都会在明确安全／管理边界的前提下，选择相关安 [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e9%80%9a%e8%bf%87aws-config-%e7%ae%a1%e7%90%86aws%e6%9c%8d%e5%8a%a1%e9%85%8d%e7%bd%ae/">通过AWS Config 管理AWS服务配置</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>为更好遵从各行业的合规要求，构建安全的IT环境，企业的安全团队一般都会在明确安全／管理边界的前提下，选择相关安全框架，用对应的风险评估方法梳理出符合自身业务特点的安全模型。根据安全模型，通常也会用各种文档标准化抽象为各种管理策略，例如可能包含以下常见的内容：</p>
<ul>
<li>用户权限策略</li>
<li>访问控制策略</li>
<li>服务器安全策略</li>
<li>应用接入策略</li>
<li>网络分区策略</li>
<li>数据传输策略</li>
<li>数据存储策略</li>
<li>备份归档策略</li>
<li>日志记录策略</li>
<li>审计管理策略</li>
</ul>
<p>……….</p>
<p>在实际的应用场景中，标准策略可能会因为业务的变化或管理方式的变化动态调整，如何持续评估和审核在AWS云端的资源配置的合规性是否与企业规划一致？如何帮助用户在云端更好的实现变更管理，安全分析甚至自动修正不合规的配置 ？这种场景下，可以考虑用AWS Config 服务来帮忙。</p>
<h3>一、AWS config 是什么</h3>
<p>AWS Config 是一项托管服务,借助 Config您可以盘点AWS 资源、查看配置更改以及 AWS 资源之间的关系并深入探究详细的资源配置历史记录。使用 Config，还能通过自定义规则来定义所需的资源配置、内部最佳实践和指南，并依据这些规则评估您记录的配置。</p>
<p>AWS Config的主要应用功能：</p>
<ul>
<li>评估您 AWS 资源配置是否具备所需设置。</li>
<li>获得与您的 AWS 账户关联的受支持资源的当前配置快照。</li>
<li>检索您的账户中的一个或多个资源配置。</li>
<li>检索一个或多个资源的历史配置。</li>
<li>在资源被创建、修改或删除时接收通知。</li>
<li>查看不同资源之间的关系。例如，您可能想要找到使用特定安全组的所有资源</li>
</ul>
<p><em>AWS Config工作原理</em></p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-1.png" alt="20170613-1" width="1886" height="856" /></a></p>
<p>更多AWS Config的信息可以参考<a href="https://aws.amazon.com/cn/config/">https://aws.amazon.com/cn/config/</a></p>
<h3>二、 AWS config 配置测试</h3>
<p>为了更好了解AWS Config的工作过程，以下 将以AWS安全组的配置监控为例做一个简短测试 。</p>
<h4>1. 测试场景：</h4>
<ul>
<li>一个为web服务器配置的安全组，该安全组策略只允许对Internet开放HTTP和HTTPS两个端口；</li>
<li>配置AWS Config 规则，当该安全组配置规则中添加了其他端口时，AWS Config 自动记录，并触发修复机制自动删除新加入的不合规的配置。</li>
</ul>
<h4>2. 配置过程</h4>
<p><strong>a. 权限准备。</strong>为成功配置AWS Config 规则，需要创建IAM 角色，授予 AWS Config 权限，使其可以访问Amazon S3 存储桶、Amazon SNS 主题，获取受支持的 AWS 资源的配置详细信息。IAM内置了一个AWSConfigRole的托管策略 。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-2.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-2.png" alt="20170613-2" width="1334" height="362" /></a></p>
<p>新建一个IAM Role 命名为awsconfigrole, 可以直接附加该策略：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-3.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-3.png" alt="20170613-3" width="2330" height="1214" /></a>另外，测试过程中将使用lambda自动对安全组执行安全组操作，cloudwatch log操作，也需要建立好对应的IAM role并编辑策略赋予对应的权限,在测试中该IAM role为：awsoncifgec2security</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-4.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-4.png" alt="20170613-4" width="1390" height="1398" /></a></p>
<p><code>{</code></p>
<p><code>    "Version": "2012-10-17",</code></p>
<p><code>    "Statement": [</code></p>
<p><code>        {</code></p>
<p><code>            "Effect": "Allow",</code></p>
<p><code>            "Action": [</code></p>
<p><code>                "logs:CreateLogGroup",</code></p>
<p><code>                "logs:CreateLogStream",</code></p>
<p><code>                "logs:PutLogEvents"</code></p>
<p><code>            ],</code></p>
<p><code>            "Resource": "arn:aws:logs:*:*:*"</code></p>
<p><code>        },</code></p>
<p><code>        {</code></p>
<p><code>            "Effect": "Allow",</code></p>
<p><code>            "Action": [</code></p>
<p><code>                "config:PutEvaluations",</code></p>
<p><code>                "ec2:DescribeSecurityGroups",</code></p>
<p><code>                "ec2:AuthorizeSecurityGroupIngress",</code></p>
<p><code>                "ec2:RevokeSecurityGroupIngress"</code></p>
<p><code>            ],</code></p>
<p><code>            "Resource": "*"</code></p>
<p><code>        }</code></p>
<p><code>    ]</code></p>
<p><code>}</code></p>
<p><strong>b. 配置AWS Config Setting。</strong>在AWS 控制台，打开 AWS Config ,具体过程可以参考：<a href="http://docs.aws.amazon.com/zh_cn/config/latest/developerguide/gs-console.html">http://docs.aws.amazon.com/zh_cn/config/latest/developerguide/gs-console.html</a></p>
<p>在本测试过程中，我们选择资源类型为SecurityGroup:</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-5.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-5.png" alt="20170613-5" width="2652" height="1186" /></a></p>
<p>在配置过程中，指定一个存储桶保存日志，并指定预先为AWS Config 的IAM Role ,当然也可以在这个步骤选择新建角色：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-6.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-6.png" alt="20170613-6" width="2234" height="1500" /></a></p>
<p>在上述页面中，可以选择是否通过SNS 启用通知将信息流式传输到 Amazon SNS 主题，发送配置历史记录传输、配置快照传输和合规性等通知。</p>
<p>在Resources页面中验证一下，评估的对象是否能正常的筛选出来，本例中我们是对测试的安全组进行查找：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-7.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-7.png" alt="20170613-7" width="1816" height="516" /></a></p>
<p><strong>c. AWS Config 规则配置。</strong>AWS Config提供一些内置的规则，也支持自定义规则创建。在前文中提及测试的背景中需要通过自动机制保证安全组规则符合设定的合规配置，我们将通过lambda完成该步骤。在创建规则的过程中，按向导设置规则名称，点击新建lambda功能按钮：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-8.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-8.png" alt="20170613-8" width="1924" height="478" /></a></p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-9.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-9.png" alt="20170613-9" width="2280" height="960" /></a></p>
<p>在lambda创建过程中，选择blank blueprint 并为函数指定runtime为python2.7 ，将准备好的代码保存在s3（可以在github中找到相关代码参考，比如<a href="https://github.com/awslabs/aws-config-rules">https://github.com/awslabs/aws-config-rules</a> ）并上传。</p>
<p>Lambda函数主要完成以下工作：</p>
<ul>
<li>lambda函数中按照要求只开启tcp 80 和tcp 443端口；</li>
<li>如果有其他端口添加到配置规则中将被删除，最终保证安全组的配置规则条目中只有tcp80和tcp443相关的配置；</li>
<li>相关的操作将记录在cloudwath logs中。</li>
</ul>
<p>在创建过程中，为lambda指定对应的IAM Role.</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-10.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-10.png" alt="20170613-10" width="2416" height="1592" /></a></p>
<p>lambda创建完成后，需要在AWS Config 规则页面中指定Lambda ARN,  配置触发器。本例中,当安全组配置发生变化时即触发对安全组的评估，也可以配置按照时间周期的评估对象。 另外，为了详细记录评估信息，为规则启用debug级别的记录。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-11.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-11.png" alt="20170613-11" width="2100" height="1590" /></a></p>
<p>&nbsp;</p>
<p>AWS config  规则后，当前的安全组配置将自动被评估。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-12.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-12.png" alt="20170613-12" width="2822" height="452" /></a></p>
<p><strong>d. 验证。</strong>为触发AWS Config 对安全组的评估， 我们在对应的安全组规则中除tcp 80 和tpc443，额外新添加tcp445 端口。在cloudwathc logs中创建了logs group,可以进行相关日志查看：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-13.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-13.png" alt="20170613-13" width="2076" height="460" /></a></p>
<p>在日志中可以清楚看到对安全组有revoking的行为，操作的端口正是额外添加的tcp445 ， 并且最终将安全组只开启tcp80 和tcp443 端口。</p>
<h3>三、进一步讨论</h3>
<p>在上述测试过程中，大致可以了解AWS Config的工作机制和配置流程，下面进一步对一些场景的应用场景做进一步说明。</p>
<h4>资产发现</h4>
<p>AWS Config 不仅会发现账户中的资源、记录其当前配置并捕获对这些配置所做的任何更改，Config 还会保留已删除资源的详细配置信息。所有资源及其配置属性的完全快照在您的账户中提供完整的资源库。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-14.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-14.png" alt="20170613-14" width="1888" height="1072" /></a></p>
<h4>持续安全分析</h4>
<p>AWS Config 提供的数据可使您持续监控您的资源配置情况，并评估这些配置是否具有潜在的安全弱点。对您的资源配置进行更改，将触发系统发送 Amazon Simple Notification Service (SNS) 通知，这些通知可发送给您的安全团队，以便他们查看通知并采取相应措施。发生潜在的安全事件后，您可以使用 Config 查看资源的配置历史记录并检查您的安全状况。</p>
<p>正如测试过程中展示，企业IT团队只需明确制定相关的策略，配置AWS Config规则，AWS Config提供了托管规则和自定义规则，能满足各种就能持续监控相关的安全标准是否合规。借助 AWS Config，利用 AWS Lambda 中的自定义规则将合规性要求编制成代码，这些代码会定义资源配置内部最佳实践和指南。您可以使用 Config 自动评估您的资源配置和资源更改，从而确保整个 AWS 基础设施实现持续合规性和自主监管。通过这个机制，为企业的安全自动化提供了一个可行选项。</p>
<h4>变更管理</h4>
<p>在创建、更新或删除资源时，AWS Config 会将这些配置更改流式传输到 Amazon Simple Notification Service (SNS)，如此便会收到所有配置更改通知。根据通知机制也可以考虑引入基于事件触发的机制，进一步集成各个管理环节。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-15.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-15.png" alt="20170613-15" width="1352" height="480" /></a></p>
<p>在AWS Config按照既定规则完成评估后，可以在规则的详细信息中查看到具体的变更事件记录：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-16.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-16.png" alt="20170613-16" width="2136" height="448" /></a></p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-17.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-17.png" alt="20170613-17" width="1132" height="760" /></a></p>
<h4>审计</h4>
<p>AWS CloudTrail 将记录账户上的用户 API 活动，将保存有关 API 操作的完整详细信息，如发起人的身份、该 API 调用的时间、请求参数和 AWS 服务返 。AWS Config 与AWS CloudTrail 集成 ,回答“谁进行了修改此资源的 API 调用？”例如下图， 使用集成的 AWS CloudTrail 信息，可以发现是哪个用户错误配置了安全组。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-18.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-18.png" alt="20170613-18" width="2230" height="690" /></a></p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-19.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-19.png" alt="20170613-19" width="3068" height="846" /></a></p>
<p>综合上述讨论，企业内部资产管理团队可以清楚明确当前在AWS云端的数字资产，安全团队可以将严格制定的安全体系持续的在云端自动化运行，任何相关的变更和配置管理都能详尽的记录，方便后续的审计。</p>
<p>更多关于AWS Config的一些常见问题可参考：<a href="https://aws.amazon.com/cn/config/faq/">https://aws.amazon.com/cn/config/faq/</a></p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e9%80%9a%e8%bf%87aws-config-%e7%ae%a1%e7%90%86aws%e6%9c%8d%e5%8a%a1%e9%85%8d%e7%bd%ae/">通过AWS Config 管理AWS服务配置</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/%e9%80%9a%e8%bf%87aws-config-%e7%ae%a1%e7%90%86aws%e6%9c%8d%e5%8a%a1%e9%85%8d%e7%bd%ae/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AWS在AMAZON ELB环境下限制客户端的访问配置</title>
		<link>https://www.fuwuqiok.com/aws%e5%9c%a8amazon-elb%e7%8e%af%e5%a2%83%e4%b8%8b%e9%99%90%e5%88%b6%e5%ae%a2%e6%88%b7%e7%ab%af%e7%9a%84%e8%ae%bf%e9%97%ae%e9%85%8d%e7%bd%ae/</link>
		<comments>https://www.fuwuqiok.com/aws%e5%9c%a8amazon-elb%e7%8e%af%e5%a2%83%e4%b8%8b%e9%99%90%e5%88%b6%e5%ae%a2%e6%88%b7%e7%ab%af%e7%9a%84%e8%ae%bf%e9%97%ae%e9%85%8d%e7%bd%ae/#comments</comments>
		<pubDate>Wed, 06 Dec 2017 02:31:40 +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[服务器代维合同]]></category>
		<category><![CDATA[AWS代付]]></category>
		<category><![CDATA[上云迁移解决方案]]></category>
		<category><![CDATA[云主机托管]]></category>
		<category><![CDATA[云服务器迁移]]></category>
		<category><![CDATA[云服务解决方案]]></category>
		<category><![CDATA[云迁移]]></category>
		<category><![CDATA[企业上云服务咨询]]></category>
		<category><![CDATA[数据中心迁移]]></category>
		<category><![CDATA[服务器迁移]]></category>
		<category><![CDATA[电话告警]]></category>
		<category><![CDATA[网站迁移]]></category>
		<category><![CDATA[运维支持]]></category>
		<category><![CDATA[阿里云服务器迁移]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=3355</guid>
		<description><![CDATA[<p>&#160; ELB(Elastic Load Balancer) Amazon ELB(Elastic Lo [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/aws%e5%9c%a8amazon-elb%e7%8e%af%e5%a2%83%e4%b8%8b%e9%99%90%e5%88%b6%e5%ae%a2%e6%88%b7%e7%ab%af%e7%9a%84%e8%ae%bf%e9%97%ae%e9%85%8d%e7%bd%ae/">AWS在AMAZON ELB环境下限制客户端的访问配置</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>&nbsp;</p>
<div class="entry-text clearfix"><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/ELB.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/ELB.png" alt="ELB" width="770" height="500" /></a></p>
<div class="shortcode-br clearfix"></div>
<h2>ELB(Elastic Load Balancer)</h2>
<div class="shortcode-columns outer clearfix">
<div class="eight column">
<div class="inner">
<p>Amazon ELB(Elastic Load Balancer)，是AWS提供的弹性负载均衡器，可根据实际情况为外部访问分配最合适的服务器。在实际使用过程中，会需要对经由ELB的客户端访问加以限制，本文将介绍如何通过配置EC2实例来实现对此类客户端的限制访问。</p>
</div>
</div>
<div class="four column">
<div class="inner"><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/ELB.jpg"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/ELB.jpg" alt="ELB" width="365" height="138" /></a></div>
</div>
</div>
<p>如图所示，由于ELB不属于安全组，所以对于安全组实施限制并不会对ELB生效，经由ELB的客户端访问依然可以抵达EC2。</p>
<p>然而倘若限制ELB访问EC2，ELB对EC2发出HealthCheck（健康检查）动作时，ELB将无法访问成功检查，而判断该EC2出现异常情况。所以只有通过在EC2实例上的Web服务器上配置访问限制，才能对经由ELB的客户端访问加以限制。</p>
<p>可是在对访问的客户端实施限制时，由于访问全部经由ELB，则检知的访问IP均为ELB的IP，此时需要借助XFF头（X-Forwarded-For）实施确认和限制。</p>
<h2>举例说明</h2>
<p>1.只允许地址为172.24.40.83的IP访问该网站。</p>
<p>编辑网站配置文件，添加或修改配置文件如下：</p>
<pre>SetEnvIf X-Forwarded-For "172.24.40.83" allow_ip
Order deny,allow
Deny  from all
Allow from env=allow_ip
</pre>
<p>2.拒绝地址为172.24.40.83和17224.40.84的IP访问该网站。</p>
<p>编辑网站配置文件,添加或修改配置文件如下：</p>
<pre>SetEnvIf X-Forwarded-For "172.24.40.83" deny_ip01
SetEnvIf X-Forwarded-For "172.24.40.84" deny_ip02
Order allow,deny
Allow from all
Deny  from env=allow_ip01
Deny  from env=allow_ip02
</pre>
<p>X-Forwarded-For的功能是在ELB接受客户端的请求后，分配到EC2时在数据包的尾部添加上真正客户端的IP地址。</p>
<p>采用Apache的Web服务器，通过mod_extract_forwarded的安装和配置，可以将客户端的IP修改成X-Forwarded-For，具体的方法目前还有待研究。</p>
<pre># yum install mod_extract_forwarded</pre>
<h2>负载均衡器分配方式简介</h2>
<p>ELB弹性负载均衡器是一款比较简单易用的负载均衡器，其采用Round Robin方式平均的将外部访问分配到ELB管理下的EC2实例中，保障实例群在大访问量下最好的分配使用系统资源。</p>
<p>此外，常见的高性能的负载均衡器，一般含有：Least Connections，Observed，Dynamic Ratio，Round Robin，Ratio，Fastest，Predictive等等。由于ELB只提供Round Robin功能所以说是简单的，通过万维网只几步就可以拥有负载均衡器,因此说它又是易用的。</p>
</div>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/aws%e5%9c%a8amazon-elb%e7%8e%af%e5%a2%83%e4%b8%8b%e9%99%90%e5%88%b6%e5%ae%a2%e6%88%b7%e7%ab%af%e7%9a%84%e8%ae%bf%e9%97%ae%e9%85%8d%e7%bd%ae/">AWS在AMAZON ELB环境下限制客户端的访问配置</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/aws%e5%9c%a8amazon-elb%e7%8e%af%e5%a2%83%e4%b8%8b%e9%99%90%e5%88%b6%e5%ae%a2%e6%88%b7%e7%ab%af%e7%9a%84%e8%ae%bf%e9%97%ae%e9%85%8d%e7%bd%ae/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AWS解除AMAZON EC2邮件发送限制教程</title>
		<link>https://www.fuwuqiok.com/aws%e8%a7%a3%e9%99%a4amazon-ec2%e9%82%ae%e4%bb%b6%e5%8f%91%e9%80%81%e9%99%90%e5%88%b6%e6%95%99%e7%a8%8b/</link>
		<comments>https://www.fuwuqiok.com/aws%e8%a7%a3%e9%99%a4amazon-ec2%e9%82%ae%e4%bb%b6%e5%8f%91%e9%80%81%e9%99%90%e5%88%b6%e6%95%99%e7%a8%8b/#comments</comments>
		<pubDate>Wed, 06 Dec 2017 02:23:58 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[linux服务器代维护]]></category>
		<category><![CDATA[服务器代维]]></category>
		<category><![CDATA[系统安全代维]]></category>
		<category><![CDATA[AWS代付]]></category>
		<category><![CDATA[AWS解除AMAZON EC2邮件发送限制教程]]></category>
		<category><![CDATA[云主机托管]]></category>
		<category><![CDATA[云服务解决方案]]></category>
		<category><![CDATA[企业上云服务咨询]]></category>
		<category><![CDATA[服务器迁移]]></category>
		<category><![CDATA[电话告警]]></category>
		<category><![CDATA[运维支持]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=3350</guid>
		<description><![CDATA[<p>&#160; 前话 在AWS的所有服务中，EC2应该是使用最多的服务了。 在很多有关EC2的项目或者需求中，经 [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/aws%e8%a7%a3%e9%99%a4amazon-ec2%e9%82%ae%e4%bb%b6%e5%8f%91%e9%80%81%e9%99%90%e5%88%b6%e6%95%99%e7%a8%8b/">AWS解除AMAZON EC2邮件发送限制教程</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>&nbsp;</p>
<div class="entry-text clearfix"><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/Amazon-EC2.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/Amazon-EC2.png" alt="Amazon-EC2" width="770" height="500" /></a></p>
<div class="shortcode-br clearfix"></div>
<h2>前话</h2>
<p>在AWS的所有服务中，EC2应该是使用最多的服务了。</p>
<p>在很多有关EC2的项目或者需求中，经常会需要配置从EC2中发送邮件。但是,这里也是经常出现问题的一个地方，本文主要说明，在实施配置EC2邮件服务器之前，我们要做什么样的前期准备，确保在正确的配置了邮件服务器后，邮件可以正常的发送。</p>
<h2>邮件发送限制解除申请</h2>
<p>在AWS取得了公网IP后，以Elastic IP的方式提供给各种各样的用户，所以用户在购买了EC2以后从AWS获得的公网IP（Elastic IP），很有可能是一个被RBL(Real-time Blackhole List)记录的IP。即由于前一个使用该IP的用户发送了大量的垃圾邮件，从而被记录到了RBL黑名单。</p>
<p>所以，第一步我们要做的就是向AWS申请解除邮件发送限制。</p>
<p>登录下面的网址，填写必要的项目后，发送给AWS申请解除。</p>
<p>URL：<a href="https://portal.aws.amazon.com/gp/aws/html-forms-controller/contactus/ec2-email-limit-rdns-request" target="_blank">Request to Remove Email Sending Limitations</a><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/request_to_remove_email_sending_limitations.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/request_to_remove_email_sending_limitations.png" alt="request_to_remove_email_sending_limitations" width="969" height="514" /></a>其中，Emaill Address和AWSAccount Number是登录AWS之后自动填写的，无法更改，需要填写的是申请理由。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/Elastic_IP_Address.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/Elastic_IP_Address.png" alt="Elastic_IP_Address" width="733" height="455" /></a>1.需要注意的是，填写需要解除的IP地址时，一次只能够填写两个Elastic IP地址，如果需要对三个及三个以上的IP地址申请解除限制时，则在该页面重新操作。</p>
<p>2.Reverse DNS Record是填写DNS逆向解析(PTR )的记录，AWS会进行登录。但是有以下条件：</p>
<ul>
<li>用户必须使用自己的域名，不可以使用AWS分配的默认域名，如ec2-XX-XX-XX-XX.ap-northeast-1.compute.amazonaws.com等。</li>
<li>提前在DNS登录连接主机名和Elastic IP的A记录(DNS可使用Route 53以外的A记录)。</li>
</ul>
<p>等待几天之后，AWS会将申请结果发送到您的邮箱，如果申请通过的话，即可从EC2中对外发送邮件了，不会再出现偶尔无法发送邮件的情况了。</p>
<h2>DNS配置</h2>
<p>申请过了解除发送邮件限制之后，理论上应该可以正常发送邮件了。但是，利用邮件列表(ML)给多个用户发送邮件的话，通过DNS配置SPF(Sender Policy Framework)和DKIM(DomainKeys Identified Mail)可以提高发送邮件的精确度。</p>
<p><strong>SPF</strong>配置如果从fuwuqiok.com中发送邮件以后，可以从DNS的A记录中获悉这是可被信任的邮件。</p>
<pre>fuwuqiok.com. IN TXT "v=spf1 a:fuwuqiok.com -all"
</pre>
<p><strong>DKIM</strong>通过OpenDKIM的opendkim-genkey命令生成DKIM键，同时将生成好的DKIM键的记录添加进DNS中。其中，EPEL源中已经包含了OpenDKIM，导入EPEL源后可通过yum直接安装。</p>
<p>OpenDKIM官网：<a href="http://www.opendkim.org/" target="_blank">OpenDKIM</a></p>
<pre>default._domainkey IN TXT ( "v=DKIM1; k=rsa;" "p=XXXXXXXXXXXXXXXXX.." ) ; ----- DKIM key default for fuwuqiok.com
</pre>
<h2>备注</h2>
<p>如果不想自己安装并配置邮件服务器，可以使用AWS提供的简单邮件服务SES(Simple Email Service)。</p>
<p>此外，还可以通过搭建一台Mail GateWay服务器，通过该服务器向外部发送邮件。这样做的优点是可以应对自动扫描（Auto Scalling），因为无法预测经过了Auto Scalling后产生的EC2的IP地址。</p>
<h2>后话</h2>
<p>以上就是一些有关利用EC2配置邮件服务器之前所需做的一些准备工作，或者说在EC2配置了邮件服务器后邮件发送异常时，可能需要注意的地方，希望给各位广大读者在日常的生活工作中一点小小的启发。</p>
</div>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/aws%e8%a7%a3%e9%99%a4amazon-ec2%e9%82%ae%e4%bb%b6%e5%8f%91%e9%80%81%e9%99%90%e5%88%b6%e6%95%99%e7%a8%8b/">AWS解除AMAZON EC2邮件发送限制教程</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/aws%e8%a7%a3%e9%99%a4amazon-ec2%e9%82%ae%e4%bb%b6%e5%8f%91%e9%80%81%e9%99%90%e5%88%b6%e6%95%99%e7%a8%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AWS折腾记——为EC2制作镜像</title>
		<link>https://www.fuwuqiok.com/aws%e6%8a%98%e8%85%be%e8%ae%b0-%e4%b8%baec2%e5%88%b6%e4%bd%9c%e9%95%9c%e5%83%8f/</link>
		<comments>https://www.fuwuqiok.com/aws%e6%8a%98%e8%85%be%e8%ae%b0-%e4%b8%baec2%e5%88%b6%e4%bd%9c%e9%95%9c%e5%83%8f/#comments</comments>
		<pubDate>Thu, 23 Nov 2017 05:34:44 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[AWS]]></category>
		<category><![CDATA[AWS折腾记——为EC2制作镜像]]></category>
		<category><![CDATA[aws服务器代维]]></category>
		<category><![CDATA[linode云服务器迁移]]></category>
		<category><![CDATA[Linux服务器维护]]></category>
		<category><![CDATA[linux维护]]></category>
		<category><![CDATA[云服务解决方案]]></category>
		<category><![CDATA[企业上云服务咨询]]></category>
		<category><![CDATA[服务器外包]]></category>
		<category><![CDATA[服务器维护]]></category>
		<category><![CDATA[服务器迁移]]></category>
		<category><![CDATA[网站代维]]></category>
		<category><![CDATA[香港服务器代维]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=3301</guid>
		<description><![CDATA[<p>Amazon web services 在近期启用了悉尼区的服务器，公司终于可以下决心使用了。但在准备开启第一 [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/aws%e6%8a%98%e8%85%be%e8%ae%b0-%e4%b8%baec2%e5%88%b6%e4%bd%9c%e9%95%9c%e5%83%8f/">AWS折腾记——为EC2制作镜像</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>Amazon web services 在近期启用了悉尼区的服务器，公司终于可以下决心使用了。但在准备开启第一个EC2实例的时候，发现没有CentOS的官方AMI（即EC2可用的镜像）可以选择，只有社区制作的第三方AMI。而对于有洁癖的我们来说，使用第三方镜像是不放心，所以这次我的任务是制作自己的AMI。 制作自己的AMI，我使用了2种方法—— 一是将现有的系统打包成镜像上传；二是在现有系统上制作新的镜像并上传，即官方说的『<a href="http://docs.amazonwebservices.com/AWSEC2/latest/UserGuide/creating-loopback-s3-linux.html" target="_blank" rel="external">Creating an Instance Store-Backed AMI From a Loopback</a>』。可惜，虽然2种方法都令EC2成功运行，但启动的时候会将内核变成其他。截至写本文时亦找不到解决办法，是以为记。</p>
<h2 id="一、转换现有系统并上传">一、转换现有系统并上传</h2>
<p>这种方法是将VM上的系统用Amazon提供的命令行工具压缩成image并上传到S3，在注册成AMI。具体做法如下：</p>
<h4 id="1-安装ec2-ami-tools-和ec2-api-tools">1. 安装ec2 ami tools 和ec2 api tools</h4>
<p>通过以下命令安装ec2 ami tools</p>
<figure class="highlight shell">
<table>
<tbody>
<tr>
<td class="gutter">
<div class="line">1</div>
</td>
<td class="code">
<div class="line">yum install http://s3.amazonaws.com/ec2-downloads/ec2-ami-tools.noarch.rpm</div>
</td>
</tr>
</tbody>
</table>
</figure>
<p>对于ec2 api tools，可以参考官方文档安装 『<a href="http://docs.amazonwebservices.com/AWSEC2/latest/UserGuide/SettingUp_CommandLine.html" target="_blank" rel="external">Setting Up the Amazon EC2 Command Line Tools</a>』</p>
<h4 id="2-更改系统配置">2. 更改系统配置</h4>
<p>首先是将ifcfg-eth0里的HWADDRESS去掉，并加上“NM_Controlled no”。然后是安装cloud-init（直接用yum安装）并根据官方修改配置。</p>
<h4 id="3-获得密钥并打包">3. 获得密钥并打包</h4>
<p>在AWS网站上，account里的『Security Credentials』找到『X.509』，生成key.pem和cert.pem，然后用以下命令生成image文件并打包</p>
<figure class="highlight shell">
<table>
<tbody>
<tr>
<td class="gutter">
<div class="line">1</div>
</td>
<td class="code">
<div class="line">ec2-bundle-vol -c cert.pem -k pk.pem -u &lt;account-id&gt; -d /image -e /image -r x86_64 &#8211;no-inherit</div>
</td>
</tr>
</tbody>
</table>
</figure>
<p>其中是帐号的id，-d后面是指镜像放置的目录,-e代表忽略的目录——这个一定要加上，否则会进入死循环。</p>
<h4 id="4-上传">4. 上传</h4>
<p>account里的『access key』找到找到access key id 和secret access key，然后用以下命令上传到S3</p>
<figure class="highlight shell">
<table>
<tbody>
<tr>
<td class="gutter">
<div class="line">1</div>
</td>
<td class="code">
<div class="line">ec2-upload-bundle -b &lt;bucket name&gt; -m /image/image.manifest.xml -a &lt;access id&gt; -s &lt;secret access id&gt;</div>
</td>
</tr>
</tbody>
</table>
</figure>
<h4 id="5-注册AMI">5. 注册AMI</h4>
<figure class="highlight shell">
<table>
<tbody>
<tr>
<td class="gutter">
<div class="line">1</div>
<div class="line">2</div>
<div class="line">3</div>
<div class="line">4</div>
<div class="line">5</div>
<div class="line">6</div>
<div class="line">7</div>
</td>
<td class="code">
<div class="line"><span class="meta">#</span>设置变量，以便直接运行ec2-register</div>
<div class="line">export EC2_HOME=/usr/local/ec2/ec2-api/</div>
<div class="line">export PATH=$PATH:$EC2_HOME/bin</div>
<div class="line">export AWS_ACCESS_KEY=&amp;amp;lt;access key&gt;</div>
<div class="line">export AWS_SECRET_KEY=&amp;amp;lt;secret key&gt;</div>
<div class="line"></div>
<div class="line">ec2-register &lt;bucket name&gt;/image.manifest.xml &#8211;region ap-southeast-2</div>
</td>
</tr>
</tbody>
</table>
</figure>
<p>这里，要用–region表明上传到哪个地区，ap-southeast-2是表示悉尼区。</p>
<h2 id="二、现有系统新建系统并上传">二、现有系统新建系统并上传</h2>
<p>这个做法的具体原理是：先在原有系统新建一个镜像文件，然后将其mount到某个目录，利用yum groupinstall Base将系统安装到该镜像文件，最后将文件打包并上传。 在镜像文件里安装系统的做法可以参考以下文章：『<a href="http://www.practicalclouds.com/content/guide/create-your-own-centos-ami-image-s3-backed" target="_blank" rel="external">Create your own CentOS AMI Image (S3 Backed)</a> 』、『<a href="http://wiki.sysconfig.org.uk/display/howto/Build+your+own+Core+CentOS+5.x+AMI+for+Amazon+EC2" target="_blank" rel="external">Build your own Core CentOS 5.x AMI for Amazon EC2</a>』 其中打包和上传的命令如下</p>
<figure class="highlight shell">
<table>
<tbody>
<tr>
<td class="gutter">
<div class="line">1</div>
<div class="line">2</div>
<div class="line">3</div>
<div class="line">4</div>
<div class="line">5</div>
<div class="line">6</div>
<div class="line">7</div>
<div class="line">8</div>
</td>
<td class="code">
<div class="line"><span class="meta">#</span>打包</div>
<div class="line"><span class="meta">#</span>&#8211;image指镜像文件的位置</div>
<div class="line"><span class="meta">#</span>&#8211;destination指打包后文件的位置</div>
<div class="line">ec2-bundle-image &#8211;image /image/ami-centos5.8-64bit-base-img &#8211;prefix ami-centos5.8-64bit-base &#8211;cert cert-.pem &#8211;privatekey pk.pem &#8211;user &lt;account-id&gt; &#8211;destination /home/public</div>
<div class="line">/EC2AMIFILES &#8211;arch x86_64</div>
<div class="line"></div>
<div class="line"><span class="meta">#</span>上传</div>
<div class="line">ec2-upload-bundle -b crazysalesamistore -m /home/public/EC2AMIFILES/ami-centos5.8-64bit-base.manifest.xml -a &lt;access-key&gt; -s &lt;secret-key&gt;</div>
</td>
</tr>
</tbody>
</table>
</figure>
<p>上传完毕后，可以按照第一种方法注册AMI，也可以在AWS后台使用图形界面注册。</p>
<h2 class="title entry-title"></h2>
<h2 class="title entry-title">在AWS EC2中创建不含Marketplace code的CentOS6 AMI</h2>
<p><strong>参考资料：</strong><br />
<a href="https://www.caseylabs.com/remove-the-aws-marketplace-code-from-a-centos-ami/" target="_blank">https://www.caseylabs.com/remove-the-aws-marketplace-code-from-a-centos-ami/</a><br />
<a href="http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/storage_expand_partition.html" target="_blank">http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/storage_expand_partition.html</a></p>
<p><strong>背景介绍：</strong><br />
在AWS EC2中，从Marketplace里面可以很方便的选择最新的CentOS6的官方Minimal版本的AMI，来创建Instance。<br />
但是这里面却埋了一个大坑，那就是，所有基于Marketplace里面的AMI所创建的Instance，都会带有一个Marketplace code。<br />
它会导致你无法通过为现有根分区所在的EBS Volume创建Snapshot和新的Volume的方式来对其扩容。<br />
在Detach了现有的根分区所在的Volume后，将无法再次将其Attach到Instance当中，在Attach新的Volume时也会遇到相同的报错：</p>
<pre class="brush:[text]">Client.OperationNotPermitted:
'vol-xxxxxxx' with Marketplace codes may not be attached as a secondary device.
</pre>
<p>这个Marketplace code，顾名思义，应该就是为了保护一些付费的AMI不被随意的克隆，但不知道为什么没有对费用为$0的CentOS6 AMI做单独的处理。<br />
上面的限制，主要影响到的是，默认创建好的CentOS6 Instance的EBS Volume只有8G，即使在创建时指定了50G的EBS Volume，创建后的根分区空间也只有8G。这样的大小是无法满足线上需求的，只能对其进行扩容，而因为有上面的Marketplace code的限制，又使扩容变得很艰难。<br />
还好最终我通过参考上面的两篇文章，从官方的CentOS6 AMI中移除了Marketplace code，并成功的对根分区进行了扩容并创建了相应的AMI。</p>
<p><strong>具体步骤：</strong><br />
<strong>1. 从现有的CentOS6 AMI中移除Marketplace code</strong><br />
1.1 从AWS的Marketplace搜索CentOS6 AMI，并创建一个根分区所在的EBS Volume为8G（默认大小）的Instance；<br />
1.2 在AWS EC2 web console中，再创建一个新的大小为8G的EBS Volume；<br />
1.3 将新创建的EBS Volume Attach到Instance上，通常会默认识别为/dev/xvdj（HVM版本的AMI会识别为/dev/xvdf）；<br />
1.4 通过SSH登陆到Instance，并通过dd克隆根分区所在的EBS Volume（HVM版本的AMI会将根目录所在的EBS Volume识别为/dev/xvda）：</p>
<pre class="brush:[text]">dd bs=65536 if=/dev/xvde of=/dev/xvdj
</pre>
<p>1.5 当克隆完成以后，关闭Instance；<br />
1.6 Detach现有根分区所在的EBS Volume;<br />
1.7 Detach新创建的EBS Volume，并重新Attach到Instance，作为/dev/sda（HVM版本的AMI需要指定为/dev/sda1）；<br />
1.8 启动Instance；<br />
1.9 在确认Instance正常启动后，在EC2 web console中右键点击Instance，并选择Create Image，即可创建一个新的不含Marketplace code的CentOS6 AMI了，我一般将其命名为official_centos6_x86_64_minimal_ebs8g。</p>
<p><strong>2. 将现有的AMI根分区所在的EBS Volume扩容为50G，并创建新的AMI official_centos6_x86_64_minimal_ebs50g</strong><br />
2.1 基于AMI official_centos6_x86_64_minimal_ebs8g创建一个Instance；<br />
2.2 为Instance所在的EBS Volume创建一个Snapshot；<br />
2.3 创建一个新的大小为50G的Volume，并包含刚刚创建的Snapshot；<br />
2.4 将新创建的Volume Attach到Instance，作为第二块EBS Volume，默认会识别为/dev/xvdj（HVM版本的AMI会识别为/dev/xvdf）；<br />
2.5 在Instance上对第二块EBS Volume进行扩容，详细步骤如下（HVM版本的AMI会将根目录所在的EBS Volume识别为/dev/xvda）：</p>
<pre class="brush:[text]">[root@ip-172-17-4-12 ~]# parted /dev/xvdj
GNU Parted 2.1
Using /dev/xvdj
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) unit s
(parted) print
Model: Xen Virtual Block Device (xvd)
Disk /dev/xvdj: 104857600s
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start  End        Size       Type     File system  Flags
 1      2048s  16777215s  16775168s  primary  ext4         boot

(parted) rm 1
(parted) mkpart primary 2048s 100%
(parted) print
Model: Xen Virtual Block Device (xvd)
Disk /dev/xvdj: 104857600s
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start  End         Size        Type     File system  Flags
 1      2048s  104857599s  104855552s  primary  ext4

(parted) set 1 boot on
(parted) print
Model: Xen Virtual Block Device (xvd)
Disk /dev/xvdj: 104857600s
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start  End         Size        Type     File system  Flags
1      2048s  104857599s  104855552s  primary  ext4         boot

(parted) quit
Information: You may need to update /etc/fstab.

[root@ip-172-17-4-12 ~]# e2fsck -f /dev/xvdj1
e2fsck 1.41.12 (17-May-2010)
Superblock needs_recovery flag is clear, but journal has data.
Run journal anyway&lt;y&gt;? yes

/dev/xvdj1: recovering journal
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information

/dev/xvdj1: ***** FILE SYSTEM WAS MODIFIED *****
/dev/xvdj1: 18425/524288 files (0.2% non-contiguous), 243772/2096896 blocks

[root@ip-172-17-4-12 ~]# lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvde    202:0    0   8G  0 disk
└─xvde1 202:1    0   8G  0 part /
xvdj    202:80   0  50G  0 disk
└─xvdj1 202:     0  50G  0 part

[root@ip-172-17-4-12 ~]# resize2fs /dev/xvdj1
resize2fs 1.41.12 (17-May-2010)
Resizing the filesystem on /dev/xvdj1 to 13106944 (4k) blocks.
The filesystem on /dev/xvdj1 is now 13106944 blocks long.
</pre>
<p>2.6 关闭Instance；<br />
2.7 Detach现有根分区所在的EBS Volume;<br />
2.8 Detach扩容后的第二块EBS Volume，并重新Attach到Instance，作为/dev/sda（HVM版本的AMI需要指定为/dev/sda1）；<br />
2.9 启动Instance；<br />
2.10 在确认Instance正常启动后，在EC2 web console中右键点击Instance，并选择Create Image，即可创建一个新的根分区大小为50G的CentOS6 AMI了，我一般将其命名为official_centos6_x86_64_minimal_ebs50g。</p>
<p>PS: 自己制作的镜像，如果要支持创建时自定义指定SSH Public Key，需要确保/etc/rc.local中包含以下代码，同时将镜像中的/root/.ssh/authorized_keys文件删除。</p>
<pre class="brush:[bash]">#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

touch /var/lock/subsys/local

# set a random pass on first boot
if [ -f /root/firstrun ]; then
  dd if=/dev/urandom count=50|md5sum|passwd --stdin root
  passwd -l root
  rm /root/firstrun
fi

if [ ! -d /root/.ssh ]; then
  mkdir -m 0700 -p /root/.ssh
  restorecon /root/.ssh
fi

# Get the root ssh key setup
ReTry=0
while [ ! -f /root/.ssh/authorized_keys ] &amp;&amp; [ $ReTry -lt 10 ]; do
  sleep 2
  curl -f http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key &gt; /root/.ssh/pubkey
  if [ 0 -eq 0 ]; then
    mv /root/.ssh/pubkey /root/.ssh/authorized_keys
  fi
  ReTry=$[Retry+1]
done
chmod 600 /root/.ssh/authorized_keys &amp;&amp; restorecon /root/.ssh/authorized_keys

</pre>
<h1 class="entry-title">制作自己的AMI</h1>
<p>亚马逊AMI market上提供的AMI有的含有Market Code(不允许将跟分区作为第二分区挂载到别的实例上进去修改根分区内容），有的AMI不支持特定实例类型（例如CentOS.org提供的AMI就不支持c3系列）。因此有必要自己做几个AMI。制作方法和步骤如下：<br />
（1）自己在合适的位置安装一个精简版的CentOS，尽量最简化安装，因为一会要把系统文件内容全部同步到亚马逊上去。还可以直接将虚拟机import进AWS。安装的时候使用/dev/sda1 跟分区，/dev/sda1 swap分区，不要用LVM。例子里我们是创建1GB的vmware磁盘，不要使用动态扩展，尽量使用一次性分配。然后分区/dev/sda1 768M,剩下的MB全部给swap,此处大小要是2的n次方，否则会出现partition doesn’t end with disk boundry类似的警告提示。<br />
（2）第二部将系统内容弄到AWS上去，此处提供两个方案:<br />
首先在一台配置到aws tools的机器（推荐Amazon AMI创建的的EC2），创建一块25GB的EBS volume,并attach，然后格式化分区，17GB/, 8GB swap，精确到MB，然后</p>
<pre class="wp-code-highlight prettyprint prettyprinted"><span class="pln">mkfs</span><span class="pun">.</span><span class="pln">ext4 </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">xvdj1</span><span class="pun">;</span><span class="pln">
e2label </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">xvdj1 </span><span class="pun">/</span>  <span class="pun">(打上标签）；</span><span class="pln">
mkswap </span><span class="pun">-</span><span class="pln">L swap </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">xvdj2</span><span class="pun">(也打上标签），</span>
<span class="com">#然后挂载</span><span class="pln">
mount </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">xvdj1 </span><span class="pun">/</span><span class="pln">ebs</span><span class="pun">（自己创建一个挂载点）</span></pre>
<p>使用rsync将刚才安装的虚拟机文件系统同步到上述挂载点中</p>
<pre class="wp-code-highlight prettyprint prettyprinted"><span class="pln">rsync </span><span class="pun">-</span><span class="pln">avx </span><span class="pun">-</span><span class="pln">e </span><span class="str">"ssh -i xxxxx.pem"</span> <span class="com">/* user@ip:/ebs/</span></pre>
<p>使用ec2-import-volume命令将虚拟机磁盘导入到AWS的一块EBS磁盘中。命令如下：</p>
<pre class="wp-code-highlight prettyprint prettyprinted"><span class="pln">ec2</span><span class="pun">-</span><span class="kwd">import</span><span class="pun">-</span><span class="pln">volume centos6</span><span class="pun">.</span><span class="lit">5.disk</span> <span class="pun">-</span><span class="pln">f raw </span><span class="pun">-</span><span class="pln">b </span><span class="str">&lt;your_s3_bucket_name&gt;</span><span class="pln"> \
 </span><span class="pun">--</span><span class="pln">region ap</span><span class="pun">-</span><span class="pln">southeast</span><span class="pun">-</span><span class="lit">1</span> <span class="pun">-</span><span class="pln">O </span><span class="str">&lt;access_key_id&gt;</span> <span class="pun">-</span><span class="pln">W </span><span class="str">&lt;secret_access_key&gt;</span><span class="pln"> \
 </span><span class="pun">-</span><span class="pln">o </span><span class="str">&lt;access_key_id&gt;</span> <span class="pun">-</span><span class="pln">w </span><span class="str">&lt;secret_access_key&gt;</span></pre>
<p>-f是指定格式：kvm、xen的是raw, vmware的是vmdk,hyper-v的是vhd（vhdx格式好想目前还不支持，需要转成vhd格式），-b是指定与你导入地区一致的s3 bucket，因为此过程是通过S3中转的。然后你会得到一块磁盘，attach到上述Amazon AMI的EC2上，然后把内容复制出来。<br />
（3）进入到/ebs中修改你刚才同步过来的文件系统<br />
检查/etc/grub.conf，主要是默认会采用uuid来指定分区，但是复制的vm uuid是不一样的，因此要改成LABEL形式，如下：</p>
<pre class="wp-code-highlight prettyprint prettyprinted"><span class="kwd">default</span><span class="pun">=</span><span class="lit">0</span><span class="pln">
timeout</span><span class="pun">=</span><span class="lit">5</span><span class="pln">
splashimage</span><span class="pun">=(</span><span class="pln">hd0</span><span class="pun">,</span><span class="lit">0</span><span class="pun">)/</span><span class="pln">boot</span><span class="pun">/</span><span class="pln">grub</span><span class="pun">/</span><span class="pln">splash</span><span class="pun">.</span><span class="pln">xpm</span><span class="pun">.</span><span class="pln">gz
hiddenmenu
title </span><span class="typ">CentOS</span> <span class="pun">(</span><span class="lit">2.6</span><span class="pun">.</span><span class="lit">32</span><span class="pun">-</span><span class="lit">358.el6.x86</span><span class="pln">_64</span><span class="pun">)</span><span class="pln">
root </span><span class="pun">(</span><span class="pln">hd0</span><span class="pun">,</span><span class="lit">0</span><span class="pun">)</span><span class="pln">
kernel </span><span class="pun">/</span><span class="pln">boot</span><span class="pun">/</span><span class="pln">vmlinuz</span><span class="pun">-</span><span class="lit">2.6</span><span class="pun">.</span><span class="lit">32</span><span class="pun">-</span><span class="lit">358.el6.x86</span><span class="pln">_64 ro root</span><span class="pun">=</span><span class="pln">LABEL</span><span class="pun">=</span><span class="str">/ console=ttyS0
initrd /</span><span class="pln">boot</span><span class="pun">/</span><span class="pln">initramfs</span><span class="pun">-</span><span class="lit">2.6</span><span class="pun">.</span><span class="lit">32</span><span class="pun">-</span><span class="lit">358.el6.x86</span><span class="pln">_64</span><span class="pun">.</span><span class="pln">img</span></pre>
<p>修改/etc/sysconfig/network-scripts/ifcfg-eth0（注意安装虚拟机得时候只要一个网卡),修改成如下</p>
<pre class="wp-code-highlight prettyprint prettyprinted"><span class="pln">DEVICE</span><span class="pun">=</span><span class="pln">eth0
BOOTPROTO</span><span class="pun">=</span><span class="pln">dhcp
ONBOOT</span><span class="pun">=</span><span class="pln">yes</span></pre>
<p>修改/etc/fatab，改成用LABEL挂载，如下：（none开头的保持默认）</p>
<pre class="wp-code-highlight prettyprint prettyprinted"><span class="pln">LABEL</span><span class="pun">=</span><span class="str">/ /</span><span class="pln"> ext4 defaults </span><span class="lit">1</span> <span class="lit">1</span><span class="pln">
LABEL</span><span class="pun">=</span><span class="pln">swap swap swap defaults </span><span class="lit">0</span> <span class="lit">0</span></pre>
<p>( 4）将改好的EBS磁盘做成snapshot快照，并获取snapshot ID备用<br />
（5）在上述工作机上用ec2-register命令注册AMI</p>
<pre class="wp-code-highlight prettyprint prettyprinted"><span class="pln">ec2</span><span class="pun">-</span><span class="kwd">register</span> <span class="pun">-</span><span class="pln">n </span><span class="str">"CentOS6.4"</span> <span class="pun">-</span><span class="pln">d </span><span class="str">"CentOS6.4"</span> <span class="pun">-</span><span class="pln">a x86_64 </span><span class="pun">-</span><span class="pln">K pk</span><span class="pun">-</span><span class="pln">xxxxxx</span><span class="pun">.</span><span class="pln">pem \
 </span><span class="pun">-</span><span class="pln">C cert</span><span class="pun">-</span><span class="pln">mod</span><span class="pun">.</span><span class="pln">pem </span><span class="pun">--</span><span class="pln">root</span><span class="pun">-</span><span class="pln">device</span><span class="pun">-</span><span class="pln">name </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">sda1 \
 </span><span class="pun">-</span><span class="pln">b </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">sda</span><span class="pun">=</span><span class="pln">snap</span><span class="pun">-</span><span class="pln">a40edf49</span><span class="pun">:</span><span class="lit">25</span><span class="pun">:</span><span class="kwd">true</span> <span class="pun">--</span><span class="pln">kernel aki</span><span class="pun">-</span><span class="lit">503e7402</span><span class="pln"> \
 </span><span class="pun">--</span><span class="pln">region ap</span><span class="pun">-</span><span class="pln">southeast</span><span class="pun">-</span><span class="lit">1</span></pre>
<p>这一步骤需要你账号的X.509 Certificates密钥对（在security credential里面找），还需要kernel id,具体该使用哪个aki,详见这个官方文档链接<br />
<a title="AmazonKernelImageIDs" href="http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/UserProvidedKernels.html#AmazonKernelImageIDs" target="_blank"><strong>AmazonKernelImageIDs</strong></a><br />
（6）试着基于自己创建的AMI创建一个实例，然后进去自定义一下，再在实例上右键注册成自己个性化的AMI(我一般会装上CloudWatch然后写个README说这个AMI是我做的cloudwatch别删除）<br />
至此完毕</p>
<h1 class="entry-title">将虚拟机导入到AWS</h1>
<p>&nbsp;</p>
<p>借助ec2-import-instance我们可以将我们的虚拟机导入到AWS中的EC2实例里。</p>
<pre class="wp-code-highlight prettyprint prettyprinted"><span class="pun">~</span><span class="pln">$ ec2</span><span class="pun">-</span><span class="kwd">import</span><span class="pun">-</span><span class="pln">instance centos6</span><span class="pun">.</span><span class="lit">4</span><span class="pun">-</span><span class="pln">vm01</span><span class="pun">.</span><span class="pln">disk </span><span class="pun">-</span><span class="pln">f raw </span><span class="pun">-</span><span class="pln">p </span><span class="typ">Linux</span> <span class="pun">-</span><span class="pln">t m3</span><span class="pun">.</span><span class="pln">large \
 </span><span class="pun">-</span><span class="pln">a x86_64 </span><span class="pun">-</span><span class="pln">b </span><span class="pun">&amp;</span><span class="pln">lt</span><span class="pun">;</span><span class="pln">your_s3_bucket</span><span class="pun">&amp;</span><span class="pln">gt</span><span class="pun">;</span> <span class="pun">--</span><span class="pln">region ap</span><span class="pun">-</span><span class="pln">southeast</span><span class="pun">-</span><span class="lit">1</span> <span class="pun">-</span><span class="pln">O </span><span class="pun">&amp;</span><span class="pln">lt</span><span class="pun">;</span><span class="pln">access_key_id</span><span class="pun">&amp;</span><span class="pln">gt</span><span class="pun">;</span><span class="pln"> \
 </span><span class="pun">-</span><span class="pln">W </span><span class="pun">&amp;</span><span class="pln">lt</span><span class="pun">;</span><span class="pln">secret_access_key</span><span class="pun">&amp;</span><span class="pln">gt</span><span class="pun">;</span> <span class="pun">-</span><span class="pln">o </span><span class="pun">&amp;</span><span class="pln">lt</span><span class="pun">;</span><span class="pln">access_key_id</span><span class="pun">&amp;</span><span class="pln">gt</span><span class="pun">;</span> <span class="pun">-</span><span class="pln">w </span><span class="pun">&amp;</span><span class="pln">lt</span><span class="pun">;</span><span class="pln">secret_access_key</span><span class="pun">&amp;</span><span class="pln">gt</span><span class="pun">;</span></pre>
<p>(参数为多个字母的都是双-，不知为啥我的总显示为多-,不管有几个-。例如–region参数。请注意，后同)<br />
然后可以用ec2-describe-conversion-tasks命令查看导入过程。ec2-cancel-conversion-task命令取消导入任务。</p>
<pre class="wp-code-highlight prettyprint prettyprinted"><span class="pun">~</span><span class="pln">$ ec2</span><span class="pun">-</span><span class="pln">describe</span><span class="pun">-</span><span class="pln">conversion</span><span class="pun">-</span><span class="pln">tasks </span><span class="pun">--</span><span class="pln">region ap</span><span class="pun">-</span><span class="pln">southeast</span><span class="pun">-</span><span class="lit">1</span> <span class="kwd">import</span><span class="pun">-</span><span class="pln">i</span><span class="pun">-</span><span class="pln">ffm0xv71 </span><span class="pun">-</span><span class="pln">O xxxx </span><span class="pun">-</span><span class="pln">W</span></pre>
<p>xxxxx(import-i-ffm0xv71这个是ec2-import-instance任务的任务ID，在命令输出结果中有)<br />
如果都顺利的话，你能到指定的region得到一台EC2实例，默认是关机状态。<br />
在这个过程中需要注意如下事项：<br />
导入虚拟机的时候，虚拟机只支持一个DHCP的网卡，多网卡的删掉，光驱可以删掉（至少不能让他挂载这ISO的状态导入），如果有多个磁盘，此命令只能导入跟分区所在的虚拟磁盘（注意不是指根分区所在的分区）其他的磁盘用下面介绍的ec2-import-volume导入<br />
导入的虚拟机配置类型是有限制的（Linux虚拟机是有限制的，Windows虚拟机时无限制）<br />
We support importing Windows instances into any instance type. Linux instances can be imported into the following instance types：m3.xlarge、m3.2xlarge、hi1.4xlarge、hs1.8xlarge、cc1.4xlarge、cg1.4xlarge、cc2.8xlarge、cr1.8xlarge<br />
如果将导入的虚拟机右键注册成AMI（如果你使用的默认的AKI)将会导致你的AMI只能创建指定类型的EC2实例，需要选择合适的AKI,见上一篇文档的分享链接。</p>
<p>用ec2-import-volume将虚拟机磁盘导入AWS EBS</p>
<pre class="wp-code-highlight prettyprint prettyprinted"><span class="pun">~</span><span class="pln">$ ec2</span><span class="pun">-</span><span class="kwd">import</span><span class="pun">-</span><span class="pln">volume centos6</span><span class="pun">.</span><span class="lit">4.disk</span> <span class="pun">-</span><span class="pln">f raw </span><span class="pun">-</span><span class="pln">b </span><span class="pun">&amp;</span><span class="pln">lt</span><span class="pun">;</span><span class="pln">your</span><span class="pun">-</span><span class="pln">s3</span><span class="pun">-</span><span class="pln">bucket</span><span class="pun">&amp;</span><span class="pln">gt</span><span class="pun">;</span><span class="pln"> \
 </span><span class="pun">--</span><span class="pln">region ap</span><span class="pun">-</span><span class="pln">southeast</span><span class="pun">-</span><span class="lit">1</span> <span class="pun">-</span><span class="pln">O xxxx </span><span class="pun">-</span><span class="pln">W xxxxxxxx </span><span class="pun">-</span><span class="pln">o xxxx </span><span class="pun">-</span><span class="pln">w xxxxxx</span></pre>
<p>使用ec2-describe-conversion-tasks查看导入的进度，完成之后你会得到一个状态为Available的EBS Volume。</p>
<p>&nbsp;</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/aws%e6%8a%98%e8%85%be%e8%ae%b0-%e4%b8%baec2%e5%88%b6%e4%bd%9c%e9%95%9c%e5%83%8f/">AWS折腾记——为EC2制作镜像</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/aws%e6%8a%98%e8%85%be%e8%ae%b0-%e4%b8%baec2%e5%88%b6%e4%bd%9c%e9%95%9c%e5%83%8f/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
