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

<channel>
	<title>服务器安全维护工作室 &#187; aws服务器代维</title>
	<atom:link href="https://www.fuwuqiok.com/tag/aws/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折腾记——为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>
		<item>
		<title>阿里云Docker 镜像服务</title>
		<link>https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91docker-%e9%95%9c%e5%83%8f%e6%9c%8d%e5%8a%a1/</link>
		<comments>https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91docker-%e9%95%9c%e5%83%8f%e6%9c%8d%e5%8a%a1/#comments</comments>
		<pubDate>Tue, 01 Dec 2015 13:52:58 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[aliyun服务器代维]]></category>
		<category><![CDATA[aws代维]]></category>
		<category><![CDATA[aws服务器代维]]></category>
		<category><![CDATA[Docker 镜像服务]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=2759</guid>
		<description><![CDATA[<p>专为阿里云GPU物理机定制的深度学习和HPC工具集，在阿里云Docker Hub上发布。 1 阿里云官方Doc [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91docker-%e9%95%9c%e5%83%8f%e6%9c%8d%e5%8a%a1/">阿里云Docker 镜像服务</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>专为阿里云GPU物理机定制的深度学习和HPC工具集，在阿里云Docker Hub上发布。</p>
<h3 id="1-docker-hub-">1 阿里云官方Docker Hub地址</h3>
<p><a href="http://dev.aliyun.com/search.html?spm=5176.100208.8.1.a8hURy" data-spm-anchor-id="5176.100208.8.1">http://dev.aliyun.com/search.html</a></p>
<h3 id="2-">2 新用户</h3>
<p>第一次使用阿里云Docker服务，用户需要先注册成为开发者，步骤如下：</p>
<p>打开上面的阿里云Docker Hub，未登陆的，先使用云账号登录，登录/注册在左上角； 点击右上角“管理中心”，如下图：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2015/12/dockerhub_login.jpg"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2015/12/dockerhub_login.jpg" alt="dockerhub_login" width="1249" height="123" /></a></p>
<p>对新用户会弹出去注册开发者的页面：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2015/12/dockerhub_sign.jpg"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2015/12/dockerhub_sign.jpg" alt="dockerhub_sign" width="1227" height="263" /></a></p>
<p>注册成功之后，点击“进入管理控制台”，下次进入也可以在Docker Hub页面，点击右上角“管理中心”进入。界面如下：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2015/12/dockerhub_panel.jpg"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2015/12/dockerhub_panel.jpg" alt="dockerhub_panel" width="353" height="404" /></a></p>
<p>选择左侧的“Docker服务”下面的“镜像管理”标签，新用户会提示设置自己的镜像仓库“命名空间”和密码。命名空间是私人镜像的地址前缀。完成设置之后，可以开始使用阿里云Docker仓库。</p>
<h3 id="3-docker">3 使用 Docker</h3>
<h4 id="3-1-docker-">3.1 docker 仓库地址</h4>
<p>阿里云官方docker仓库地址为：</p>
<pre><code>registry.aliyuncs.com（公网)
</code></pre>
<p>在GPU物理机上，对应替换为内网地址：</p>
<pre><code>registry-internal.aliyuncs.com（内网）
</code></pre>
<h4 id="3-2-hello-world">3.2 运行 Hello World</h4>
<p>（GPU物理机预装CentOS 7系统，以下操作仅以CentOS 7为例，且使用root用户） 首先检查机器上安装的docker服务状态：</p>
<p><code># docker info</code></p>
<p>正常会显示当前存储空间等信息。如果出错，请先尝试重启docker服务：</p>
<p><code># systemctl restart docker</code></p>
<p>下一步，使用阿里云账号和之前设定的docker仓库密码，登录阿里云docker仓库：</p>
<p><code># docker login registry-internal.aliyuncs.com</code></p>
<p>运行 Hello World：</p>
<p><code># docker run registry-internal.aliyuncs.com/alicloudhpc/hello-world</code></p>
<p>如果一切正常，说明机器的docker服务运行正常。</p>
<h4 id="3-3-hpc-">3.3 使用深度学习和HPC工具集</h4>
<p>工具集的发布地址是：</p>
<p><a href="http://dev.aliyun.com/detail.html?spm=5176.100208.8.2.a8hURy&amp;repoId=2" data-spm-anchor-id="5176.100208.8.2">http://dev.aliyun.com/detail.html?repoId=2</a></p>
<p>列出了包含的软件工具和简介。</p>
<p>登录之后，可以下载toolkit的镜像到本地：</p>
<p><code># docker pull registry-internal.aliyuncs.com/alicloudhpc/toolkit</code></p>
<p>重命名一个短名称：</p>
<p><code># docker tag registry-internal.aliyuncs.com/alicloudhpc/toolkit toolkit</code></p>
<p>因为需要在docker容器中使用gpu设备，启动docker容器需要设定额外参数。推荐将如下内容保存到一个shell脚本（比如run-toolkit.sh），方便以后运行：</p>
<pre><code class="lang-sh">#!/bin/bash
DOCKER_BIN="/usr/bin/docker"
INTERACT="-ti"
#INTERACT="-d"
DATA_VOLUME="/disk1"
DATA_MOUNT_POINT="/disk1"
MEM_LIMIT=96g

set -e
if [ $# -lt 2 ]; then
    echo "Usage: $0 image command"
    exit -1
else
    IMAGE=$1
    shift 1
    CMD=$@
fi

devices=$(ls -1 /dev | grep nvidia)
dev_param=""
for d in $devices; do
    dev_param="$dev_param --device=/dev/$d"
done

time_param='-v /etc/localtime:/etc/localtime:ro'

if [ ! -z "$CUDA_VISIBLE_DEVICES" ]; then
    dev_env="-e CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES"
else
    dev_env=""
fi

exec $DOCKER_BIN run \
        "$INTERACT" \
        -P \
        $dev_env \
        $dev_param \
        $time_param \
        -m $MEM_LIMIT \
        -v $DATA_VOLUME:$DATA_MOUNT_POINT \
        "$IMAGE" \
        $CMD
</code></pre>
<p>运行脚本，启动toolkit：</p>
<pre><code class="lang-sh"># chmod +x run-toolkit.sh
# ./run-toolkit.sh  toolkit  /bin/bash
</code></pre>
<p>成功运行之后，已经进入交互式的docker容器（理解为一个与host隔离的运行环境）中，物理机上的 /disk1 磁盘映射到容器内的 /disk1 文件夹，建议数据只存储到 /disk1 下（如果容器销毁，其他数据不会保留）。</p>
<p>检查GPU工作正常：</p>
<p><code># /usr/local/cuda/samples/1_Utilities/deviceQuery/deviceQuery</code></p>
<p>检查通过以后，您可以像普通终端一样，运行软件。</p>
<h4 id="3-4-">3.4 重新进入</h4>
<p>在交互式docker容器中，如果您运行 exit，退出docker容器之后，该容器即停止。如果您在容器中修改了 /disk1 以外的内容（比如安装软件），下次还需要继续使用，则不应该运行 run-toolkit.sh 新建容器，而是重启原先的，操作如下：</p>
<p>查询已经停止的容器id：</p>
<p><code># docker ps -a</code></p>
<p>返回结果中，复制下需要重启的容器的 container_id</p>
<p>重启容器：</p>
<p><code># docker start container_id</code></p>
<p>成功则返回一串重复的id</p>
<p>重新进入交互式docker容器：</p>
<p><code># docker attatch container_id</code></p>
<h3 id="4-">4. 使用进阶</h3>
<h4 id="4-1-">4.1 获得更新</h4>
<p>如果toolkit发布新的版本，可以重新pull获得更新：</p>
<p><code># docker pull registry-internal.aliyuncs.com/alicloudhpc/toolkit</code></p>
<p>重命名一个短名称：</p>
<p><code># docker tag registry-internal.aliyuncs.com/alicloudhpc/toolkit toolkit</code></p>
<h4 id="4-2-">4.2 创建私有镜像</h4>
<p>访问阿里云docker控制台：</p>
<p><a href="http://console.d.aliyun.com/index2.html/?spm=5176.100208.8.3.a8hURy#/docker/image/list" data-spm-anchor-id="5176.100208.8.3">http://console.d.aliyun.com/index2.html/?#/docker/image/list</a></p>
<p>可以创建自己的私有镜像（选择本地仓库）。</p>
<p>使用和创建本地镜像的方法，可以参考docker官方文档相关部分：</p>
<p><a href="http://docs.docker.com/userguide/dockerimages?spm=5176.100208.8.4.a8hURy" data-spm-anchor-id="5176.100208.8.4">http://docs.docker.com/userguide/dockerimages</a></p>
<p>另外有一份中文教程：<a href="http://www.docker.org.cn/book/docker.html?spm=5176.100208.8.5.a8hURy" data-spm-anchor-id="5176.100208.8.5">http://www.docker.org.cn/book/docker.html</a> （有些过时） 注意内网环境下，添加或者替换docker仓库的域名。</p>
<p>本地镜像创建完成后，通过docker push上传到阿里云docker仓库：</p>
<pre><code class="lang-sh"># docker tag some-image registry-internal.aliyuncs.com/YOUR_NAMESPCE/YOUR_REPO
# docker push registry-internal.aliyuncs.com/YOUR_NAMESPCE/YOUR_REPO
</code></pre>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91docker-%e9%95%9c%e5%83%8f%e6%9c%8d%e5%8a%a1/">阿里云Docker 镜像服务</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91docker-%e9%95%9c%e5%83%8f%e6%9c%8d%e5%8a%a1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>谷歌是这样做运维的</title>
		<link>https://www.fuwuqiok.com/%e8%b0%b7%e6%ad%8c%e6%98%af%e8%bf%99%e6%a0%b7%e5%81%9a%e8%bf%90%e7%bb%b4%e7%9a%84/</link>
		<comments>https://www.fuwuqiok.com/%e8%b0%b7%e6%ad%8c%e6%98%af%e8%bf%99%e6%a0%b7%e5%81%9a%e8%bf%90%e7%bb%b4%e7%9a%84/#comments</comments>
		<pubDate>Sun, 23 Aug 2015 13:56:10 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[aws服务器代维]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=2703</guid>
		<description><![CDATA[<p>引言 SRE是Site Reliability Engineer的简称，从名字可以看出Google的SRE不只 [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e8%b0%b7%e6%ad%8c%e6%98%af%e8%bf%99%e6%a0%b7%e5%81%9a%e8%bf%90%e7%bb%b4%e7%9a%84/">谷歌是这样做运维的</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>引言</p>
<p>SRE是Site Reliability Engineer的简称，从名字可以看出Google的SRE不只是做Operation方面的工作，更多是保障整个Google服务的稳定性。SRE不接触底层硬件如服务器，这也是高逼格的由来.</p>
<p>Google 数据中心的硬件层面的维护工作是交给technician来做的，technician一般不需要有大学学历。</p>
<p>SWE是SoftWare Egineer的简称，即软件工程师（负责软件服务的开发、测试、发布）。SWE更新的程序代码（下文称为server），只有在SRE同意后才能上线发布。因此，SRE在Google工程师团队中地位非常高！我们下面将分别介绍。</p>
<h4 id="sre">SRE 职责</h4>
<p>SRE在Google不负责某个服务的上线、部署，SRE主要是保障服务的可靠性和性能，同时负责数据中心资源分配，为重要服务预留资源。如上文所述，和SRE相对应的是SWE（软件开发工程师），负责具体的开发工作。</p>
<p>举个例子，我之前在Google的互联网广告部门，我们team负责的server是收集用户数据用于广告精准投放，这个server的开发、测试、上线部署等工作，都是由SWE来完成。</p>
<p>SRE不负责server的具体实现，SRE主要负责在server出现宕机等紧急事故时，做出快速响应，尽快恢复server，减少服务掉线带来的损失。</p>
<p>备注：这里的server是指服务器端程序，而不是物理服务器。在Google，SWE和SRE都无权接触物理服务器。</p>
<h4 id="sre">SRE 要求</h4>
<p>因为SRE的职责是保障服务的稳定和性能，所以在SRE接手某个server之前，对server的性能和稳定性都有一定的要求，比如server出现报警的次数不能超过一定的频率，server对CPU、内存的消耗不能超过预设的指标。</p>
<p><strong>只有server完全满足SRE的要求以后，SRE才会接手这个server：</strong></p>
<p>当server出现问题时，SRE会先紧急修复，恢复服务，然后SRE会和SWE沟通，最终SWE来彻底修复server的bug。</p>
<p><strong>同时，对server的重大更新，SWE都要提前通知SRE，做好各种准备工作，才能发布新版server：</strong></p>
<p>为了能让SRE能接手server，SWE要根据SRE的要求，对server做大量的调优。首先SRE会给出各种性能指标，比如，服务响应延迟、 资源使用量等等，再者SRE会要求SWE给出一些server评测结果，诸如压力测试结果、端到端测试结果等等，同时，SRE也会帮助SWE做一些性能问 题排查。</p>
<p>所以SRE在Google地位很高，SWE为了让server成功上线，都想法跟SRE保持好关系。</p>
<p><strong>我举个具体的例子来说明，在Google，SWE是如何跟SRE配合工作来上线server的。</strong></p>
<p>我们team对所负责的server进行了代码重构，重构之后，要经过SRE同意，才能够上线重构后的server。</p>
<p>为此，我们team的SWE要向SRE证明，重构后的server对资源的开销没有增加，即CPU、内存、硬盘、带宽消耗没有增加，重构后的server性能没有降低，即端到端服务响应延迟、QPS、对压力测试的响应等这些性能指标没有降低。</p>
<p>当时对server代码重构之后，server有个性能指标一直达不到SRE的要求。这个指标是contention，也就是多线程情况下，对竞争资源的等待延迟。重构server之后，contention这项指标变得很高，说明多线程情况下，对竞争资源的等待变长。</p>
<p>我们排查很久找不到具体原因，因为SWE没有在代码中显式使用很多mutex，然后请SRE出面帮忙。SRE使用Google内部的图形化profiling工具，cpprof，帮我们查找原因。</p>
<p>找到两个方面的原因：</p>
<ul>
<li>tc_malloc在多线程情况下频繁请求内存，造成contention变高；</li>
<li>大量使用hash<em>map，hash</em>map没有预先分配足够内存空间，造成对底层tc_malloc调用过多。</li>
</ul>
<h4 id="sre">SRE 工作内容</h4>
<p>简而言之，Google的SRE不是做底层硬件维护，而是负责Google各种服务的性能和稳定性。换句话说，Google的SRE保证软件层面的性能和稳定性，包括软件基础构架和应用服务。</p>
<p>SRE需要对Google内部各种软件基础构架(Infrastructure)非常了解，而且SRE一般具有很强的排查问题、debug、快速恢复server的能力。</p>
<p>我列举一些常见的Google软件基础构架的例子：</p>
<ul>
<li>Borg：分布式任务管理系统，</li>
<li>Borgmon：强大的监控报警系统；</li>
<li>BigTable：分布式Key/Value存储系统；</li>
<li>Google File System：分布式文件系统；</li>
<li>PubSub：分布式消息队列系统；</li>
<li>MapReduce：分布式大数据批处理系统；</li>
<li>F1：分布式数据库；</li>
<li>ECatcher：日志收集检索系统；</li>
<li>Stubby：Google的RPC实现；</li>
<li>Proto Buffer：数据序列化存储协议以及RPC协议；</li>
<li>Chubby：提供类似Zookeeper的服务。</li>
<li>Google还有更多的软件基础构架系统：Megastore、Spanner、Mustang等等，我没有用过，所以不熟悉。</li>
</ul>
<h4 id="">运维未来发展方向</h4>
<p>我个人觉得，在云计算时代，运维工程师会慢慢向Google的SRE这种角色发展，远离底层硬件，更多靠近软件基础架构层面，帮助企业客户打造强大的软件基础构架。</p>
<p>企业客户有了强大的软件基础构架以后，能够更好应对业务的复杂多变的需求，帮助企业客户快速发展业务。</p>
<p>另外我个人观点，为什么Google的产品给人感觉技术含量高？</p>
<p>并不见得是Google的SWE比其他Microsoft、LinkedIn、Facebook的工程师能力强多少，主要是因为Google的软件基础构架（详见上文）非常强大，有了很强大的基础构架，再做出强大的产品就很方便了。</p>
<p>Google内部各种软件基础构架，基本上满足了各种常见分布式功能需求，极大地方便了SWE做业务开发。换句话说，在Google做开发，SWE基本上是专注业务逻辑，应用服务系统(server)的性能主要由底层软件基础构架来保证。</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e8%b0%b7%e6%ad%8c%e6%98%af%e8%bf%99%e6%a0%b7%e5%81%9a%e8%bf%90%e7%bb%b4%e7%9a%84/">谷歌是这样做运维的</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/%e8%b0%b7%e6%ad%8c%e6%98%af%e8%bf%99%e6%a0%b7%e5%81%9a%e8%bf%90%e7%bb%b4%e7%9a%84/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>如何限制通过固定的IP访问阿里云OSS的文件</title>
		<link>https://www.fuwuqiok.com/%e5%a6%82%e4%bd%95%e9%99%90%e5%88%b6%e9%80%9a%e8%bf%87%e5%9b%ba%e5%ae%9a%e7%9a%84ip%e8%ae%bf%e9%97%ae%e9%98%bf%e9%87%8c%e4%ba%91oss%e7%9a%84%e6%96%87%e4%bb%b6/</link>
		<comments>https://www.fuwuqiok.com/%e5%a6%82%e4%bd%95%e9%99%90%e5%88%b6%e9%80%9a%e8%bf%87%e5%9b%ba%e5%ae%9a%e7%9a%84ip%e8%ae%bf%e9%97%ae%e9%98%bf%e9%87%8c%e4%ba%91oss%e7%9a%84%e6%96%87%e4%bb%b6/#comments</comments>
		<pubDate>Sat, 15 Aug 2015 04:19:19 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[aliyun服务器代维]]></category>
		<category><![CDATA[服务器迁移]]></category>
		<category><![CDATA[网站代维]]></category>
		<category><![CDATA[aws代维]]></category>
		<category><![CDATA[aws服务器代维]]></category>
		<category><![CDATA[OSS]]></category>
		<category><![CDATA[如何限制通过固定的IP访问阿里云OSS的文件]]></category>
		<category><![CDATA[小说站代维]]></category>
		<category><![CDATA[阿里云代维]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=2569</guid>
		<description><![CDATA[<p>最近有客户提出需求，在某些情况，需要使用OSS来存大量文件，但是请求这些文件时候需要访问固定的IP（比如程序之 [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e5%a6%82%e4%bd%95%e9%99%90%e5%88%b6%e9%80%9a%e8%bf%87%e5%9b%ba%e5%ae%9a%e7%9a%84ip%e8%ae%bf%e9%97%ae%e9%98%bf%e9%87%8c%e4%ba%91oss%e7%9a%84%e6%96%87%e4%bb%b6/">如何限制通过固定的IP访问阿里云OSS的文件</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>最近有客户提出需求，在某些情况，需要使用OSS来存大量文件，但是请求这些文件时候需要访问固定的IP（比如程序之前写死了IP，比如和运营商谈免流量的问题，公司跳板机，固定公司ip访问限制）</p>
<div>通过查看阿里云服务器手册发现oss的服务是由多个IP的，并且随时可能变化，因此如果要实现这个功能，这时候可以通过ECS搭建反向代理来实现需求</div>
<div></div>
<div>nginx配置如下：</div>
<p>server {<br />
listen       80 default_server;<br />
server_name  _;<br />
location / {<br />
proxy_pass http://xxx.oss-cn-qingdao-internal.aliyuncs.com/;<br />
proxy_set_header   Referer             http://www.test.com;<br />
}<br />
}</p>
<div>这里通过ECS代理OSS的内网，从而省掉了OSS的流量费，但是访问效率需要依赖ECS的带宽</div>
<div><a href="https://www.fuwuqiok.com/wp-content/uploads/2015/08/Image.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2015/08/Image.png" alt="Image" width="669" height="220" /></a></div>
<div>为了安全，OSS配置了refer限制，也可以通过proxy_set_header来代理发送一个refer，这个refer可以设置一个随意别人不知道的值，能够变相实现加密（只有ECS服务器知道这个refer值）</div>
<div> 配置完毕之后，就可以通过访问ECS来访问到OSS上的文件了，比如：</div>
<div><a href="https://www.fuwuqiok.com/wp-content/uploads/2015/08/aaa.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2015/08/aaa.png" alt="aaa" width="408" height="136" /></a></div>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e5%a6%82%e4%bd%95%e9%99%90%e5%88%b6%e9%80%9a%e8%bf%87%e5%9b%ba%e5%ae%9a%e7%9a%84ip%e8%ae%bf%e9%97%ae%e9%98%bf%e9%87%8c%e4%ba%91oss%e7%9a%84%e6%96%87%e4%bb%b6/">如何限制通过固定的IP访问阿里云OSS的文件</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%e9%99%90%e5%88%b6%e9%80%9a%e8%bf%87%e5%9b%ba%e5%ae%9a%e7%9a%84ip%e8%ae%bf%e9%97%ae%e9%98%bf%e9%87%8c%e4%ba%91oss%e7%9a%84%e6%96%87%e4%bb%b6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>阿里云服务器如何配置端口映射Dnat教程</title>
		<link>https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%a6%82%e4%bd%95%e9%85%8d%e7%bd%ae%e7%ab%af%e5%8f%a3%e6%98%a0%e5%b0%84dnat%e6%95%99%e7%a8%8b/</link>
		<comments>https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%a6%82%e4%bd%95%e9%85%8d%e7%bd%ae%e7%ab%af%e5%8f%a3%e6%98%a0%e5%b0%84dnat%e6%95%99%e7%a8%8b/#comments</comments>
		<pubDate>Sat, 15 Aug 2015 04:10:35 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[aliyun服务器代维]]></category>
		<category><![CDATA[服务器迁移]]></category>
		<category><![CDATA[网站代维]]></category>
		<category><![CDATA[网站防挂马]]></category>
		<category><![CDATA[aws服务器代维]]></category>
		<category><![CDATA[小说站代维]]></category>
		<category><![CDATA[服务器基础环境搭建]]></category>
		<category><![CDATA[阿里云服务器，如何配置端口映，Dnat教程]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=2567</guid>
		<description><![CDATA[<p>通过iptables配置Dnat是一个比较常见的操作，阿里云的服务在classic网络下无法支持snat，但是 [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%a6%82%e4%bd%95%e9%85%8d%e7%bd%ae%e7%ab%af%e5%8f%a3%e6%98%a0%e5%b0%84dnat%e6%95%99%e7%a8%8b/">阿里云服务器如何配置端口映射Dnat教程</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>通过iptables配置Dnat是一个比较常见的操作，阿里云的服务在classic网络下无法支持snat，但是dnat功能实际是没问题的，这里将我们工作室平时常用的实现方法罗列一下操作过程：</p>
<pre>
 环境两台阿里云ECS服务器 ，一台公网，一台内网。内网安装nginx，希望访问公网服务器的时候，能够访问到内网的nginx站点。
 <span id="more-486"></span>
 内网服务器操作过程如下：</pre>
<p>首先安装nginx和启动</p>
<div id="highlighter_349548" class="syntaxhighlighter  ">
<div class="lines">
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>1</code></td>
<td class="content"><code class="plain">[root@内网 ~]</code><code class="comments"># yum install nginx -y &gt;&gt;/dev/null</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>2</code></td>
<td class="content"><code class="plain">[root@内网 ~]</code><code class="comments"># /etc/init.d/nginx start</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>3</code></td>
<td class="content"><code class="plain">Starting nginx: [ OK ]</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>4</code></td>
<td class="content"><code class="plain">[root@内网 ~]</code><code class="comments"># lsof -i:80</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>5</code></td>
<td class="content"><code class="plain">COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>6</code></td>
<td class="content"><code class="plain">nginx 1742 root 6u IPv4 5570 0t0 TCP *:http (LISTEN)</code></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>测试nginx安装正常，可以访问。</p>
<div id="highlighter_688157" class="syntaxhighlighter  ">
<div class="lines">
<div class="line alt1">
<table style="height: 29px;" width="400">
<tbody>
<tr>
<td class="number"><code>1</code></td>
<td class="content"><code class="plain">[root@内网 ~]</code><code class="comments"># curl -I www.fuwuqiok.com<br />
</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>2</code></td>
<td class="content"><code class="plain">HTTP/1.1 200 OK</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>3</code></td>
<td class="content"><code class="plain">Server: nginx/0.8.55</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>4</code></td>
<td class="content"><code class="plain">Date: Wed, 14 Jan 2015 07:29:05 GMT</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>5</code></td>
<td class="content"><code class="plain">Content-Type: text/html</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>6</code></td>
<td class="content"><code class="plain">Content-Length: 3698</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>7</code></td>
<td class="content"><code class="plain">Last-Modified: Tue, 11 Nov 2014 16:30:06 GMT</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>8</code></td>
<td class="content"><code class="plain">Connection: keep-alive</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>9</code></td>
<td class="content"><code class="plain">Accept-Ranges: bytes</code></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<pre>公网服务器操作如下：

 首先修改内核参数，开启ip转发</pre>
<div id="highlighter_261767" class="syntaxhighlighter  ">
<div class="lines">
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>1</code></td>
<td class="content"><code class="plain">[root@公网 ~]</code><code class="comments"># sed -i 's/net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/g' /etc/sysctl.conf</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>2</code></td>
<td class="content"><code class="plain">应用生效</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>3</code></td>
<td class="content"><code class="plain">[root@公网 ~]</code><code class="comments"># sysctl -p</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>4</code></td>
<td class="content"><code class="plain">net.ipv4.ip_forward = 1</code></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>配置iptables，将访问公网服务器80端口的请求，转发到内网服务器的80</p>
<div id="highlighter_580261" class="syntaxhighlighter  ">
<div class="lines">
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>1</code></td>
<td class="content"><code class="plain">[root@公网 ~]</code><code class="comments"># iptables -t nat -I PREROUTING -d 115.29.96.246 -p tcp --dport 80 -j DNAT --to 10.144.26.11:80</code></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>这时候我们访问公网服务器IP测试一下，同时抓包看转发后的数据包情况：</p>
<div id="highlighter_497411" class="syntaxhighlighter  ">
<div class="lines">
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>1</code></td>
<td class="content"><code class="plain">15:35:46.602240 IP 42.120.74.108.8864 &gt; 115.29.96.246.80: S 765781831:765781831(0) win 8192</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>2</code></td>
<td class="content"><code class="plain">15:35:46.602272 IP 42.120.74.108.8864 &gt; 10.144.26.11.80: S 765781831:765781831(0) win 8192</code></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>这样原地址是访客的公网IP，目标是内网服务器的内网地址，这样也没办法双向通讯啊，所以，需要让这个数据包的原地址，也变成内网地址，这样才能和内网服务器建立通讯。<br />
修改原地址就是SNAT<br />
我们继续在公网服务器配置：</p>
<div id="highlighter_451003" class="syntaxhighlighter  ">
<div class="lines">
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>1</code></td>
<td class="content"><code class="plain">[root@公网 ~]</code><code class="comments"># iptables -t nat -I POSTROUTING -d 10.144.26.11 -p tcp --dport 80 -j SNAT --to 10.163.209.59</code></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>抓包分析：</p>
<div id="highlighter_665871" class="syntaxhighlighter  ">
<div class="lines">
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>1</code></td>
<td class="content"><code class="plain">15:38:14.846955 IP 42.120.74.108.10839 &gt; 115.29.96.246.80: P 433:858(425) ack 159 win 16385</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>2</code></td>
<td class="content"><code class="plain">15:38:14.846985 IP 10.163.209.59.10839 &gt; 10.144.26.11.80: P 433:858(425) ack 159 win 16385</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>3</code></td>
<td class="content"><code class="plain">15:38:14.847759 IP 10.144.26.11.80 &gt; 10.163.209.59.10839: P 159:317(158) ack 858 win 317</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>4</code></td>
<td class="content"><code class="plain">15:38:14.847772 IP 115.29.96.246.80 &gt; 42.120.74.108.10839: P 159:317(158) ack 858 win 317</code></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>访客本地公网-&gt;公网服务器公网IP<br />
修改目标地址<br />
公网服务器内网IP-&gt;内网服务器IP<br />
修改原地址<br />
内网服务器IP-&gt;公网服务器内网IP<br />
公网服务器公网IP-&gt;访客本地公网</p>
<p>完成通讯，试试看。</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%a6%82%e4%bd%95%e9%85%8d%e7%bd%ae%e7%ab%af%e5%8f%a3%e6%98%a0%e5%b0%84dnat%e6%95%99%e7%a8%8b/">阿里云服务器如何配置端口映射Dnat教程</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%a6%82%e4%bd%95%e9%85%8d%e7%bd%ae%e7%ab%af%e5%8f%a3%e6%98%a0%e5%b0%84dnat%e6%95%99%e7%a8%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>浅谈系统搭建外包的流程及建议</title>
		<link>https://www.fuwuqiok.com/%e6%b5%85%e8%b0%88%e7%b3%bb%e7%bb%9f%e6%90%ad%e5%bb%ba%e5%a4%96%e5%8c%85%e7%9a%84%e6%b5%81%e7%a8%8b%e5%8f%8a%e5%bb%ba%e8%ae%ae/</link>
		<comments>https://www.fuwuqiok.com/%e6%b5%85%e8%b0%88%e7%b3%bb%e7%bb%9f%e6%90%ad%e5%bb%ba%e5%a4%96%e5%8c%85%e7%9a%84%e6%b5%81%e7%a8%8b%e5%8f%8a%e5%bb%ba%e8%ae%ae/#comments</comments>
		<pubDate>Thu, 13 Aug 2015 14:42:48 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[aliyun服务器代维]]></category>
		<category><![CDATA[aws服务器代维]]></category>
		<category><![CDATA[浅谈系统搭建外包的流程及建议]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=2519</guid>
		<description><![CDATA[<p>探讨一下系统搭建外包给专业团队或者企业时，一般流程及简单的建议。 1. 搭建系统之前 这个系统是用来做电子商务 [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e6%b5%85%e8%b0%88%e7%b3%bb%e7%bb%9f%e6%90%ad%e5%bb%ba%e5%a4%96%e5%8c%85%e7%9a%84%e6%b5%81%e7%a8%8b%e5%8f%8a%e5%bb%ba%e8%ae%ae/">浅谈系统搭建外包的流程及建议</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>探讨一下系统搭建外包给专业团队或者企业时，一般流程及简单的建议。</p>
<h2>1. 搭建系统之前</h2>
<p>这个系统是用来做电子商务、论坛、企业网站等等，接着要考虑一下网站上线以后的高峰期的访问量是多少。最重要的是，我能承受系统或者服务器停止服务的时间是多长时间。</p>
<h2>2. 选择专业团队</h2>
<p>自己公司有资源的话就利用现有资源，当自己公司没有专业的系统工程师的时候，就要考虑外包给专业的团队。您可以先找几家系统集成商或者服务器代维公司要报价进行一个比较。你可能会了解到系统构筑的费用构造，并且跟他们的沟通会让你对系统的了解加深。</p>
<h2>3. 系统搭建</h2>
<p>根据你提供的需求(PV/分，系统的可用性，数据的完全性等等)，系统集成商或者服务器代维公司会开始进行搭建。</p>
<h2>4. 测试</h2>
<p>你需要对搭建完的系统进行2个方面的测试。第1个是功能方面的测试，第2个是性能方面的测试。比如；</p>
<ul>
<li>功能方面：FTP访问，root禁止登录，数据库主从切换，故障恢复等等</li>
<li>性能方面：用Jmeter工具等对系统进行压力测试，查看整个系统的承载量。</li>
</ul>
<p>你网站或者应用的访问量大的时候，这个性能测试是必须做的。对今后的系统扩张及每年的系统预算相关的重要部分。</p>
<h2>5. 上线</h2>
<p>当功能测试和性能测试都没有问题的话，恭喜你！系统可以上线了。</p>
<h2>6. 运维</h2>
<p>运维也可以分为2种，一个是攻，一个是守。</p>
<p><strong>运维之攻</strong><br />
监视系统的CPU、内存、磁盘等的使用情况，并且根据业务量的增加，及时的增加服务器或者磁盘等资源。</p>
<p><strong>运维之守</strong><br />
守之重，可以说是备份。比如服务器重要配置文件、应用程序、数据库的数据等等。</p>
<p>当你的系统测底崩溃以后，你想尽快恢复系统的心情是理解的，但是那是有准备的情况下。</p>
<h2>小结</h2>
<p>个人认为系统集成商的技术固然重要，但是更重要的是这个团队有一个站在客户角度思考问题的态度。</p>
<p>IT行业不仅仅是提供技术，而更应该提供良好服务的服务行业。</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e6%b5%85%e8%b0%88%e7%b3%bb%e7%bb%9f%e6%90%ad%e5%bb%ba%e5%a4%96%e5%8c%85%e7%9a%84%e6%b5%81%e7%a8%8b%e5%8f%8a%e5%bb%ba%e8%ae%ae/">浅谈系统搭建外包的流程及建议</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/%e6%b5%85%e8%b0%88%e7%b3%bb%e7%bb%9f%e6%90%ad%e5%bb%ba%e5%a4%96%e5%8c%85%e7%9a%84%e6%b5%81%e7%a8%8b%e5%8f%8a%e5%bb%ba%e8%ae%ae/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Amazon CentOS7 AMI安装MySQL5.6教程</title>
		<link>https://www.fuwuqiok.com/amazon-centos7-ami%e5%ae%89%e8%a3%85mysql5-6%e6%95%99%e7%a8%8b/</link>
		<comments>https://www.fuwuqiok.com/amazon-centos7-ami%e5%ae%89%e8%a3%85mysql5-6%e6%95%99%e7%a8%8b/#comments</comments>
		<pubDate>Thu, 13 Aug 2015 14:35:58 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[网站代维]]></category>
		<category><![CDATA[Amazon CentOS7 AMI安装MySQL5.6教程]]></category>
		<category><![CDATA[aws服务器代维]]></category>
		<category><![CDATA[CentOS7，MySQL5.6，安装MySQL5.6]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=2514</guid>
		<description><![CDATA[<p>有客户需要让这次在Amazon CentOS7 AMI安装MySQL5.6.22。 centos用户登录到Am [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/amazon-centos7-ami%e5%ae%89%e8%a3%85mysql5-6%e6%95%99%e7%a8%8b/">Amazon CentOS7 AMI安装MySQL5.6教程</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>有客户需要让这次在Amazon CentOS7 AMI安装MySQL5.6.22。</p>
<p>centos用户登录到Amazon EC2服务器以后，sudo到root用户。</p>
<p>在CentOS7 AMI执行yum install mysql-server命令会发现无法安装mysql server。</p>
<pre># sudo su -
# yum install mysql-server
Loaded plugins: fastestmirror
base                                                     | 3.6 kB     00:00
epel/x86_64/metalink                                     | 5.5 kB     00:00
epel                                                     | 4.4 kB     00:00
extras                                                   | 3.4 kB     00:00
rpmforge                                                 | 1.9 kB     00:00
updates                                                  | 3.4 kB     00:00
epel/x86_64/primary_db                                     | 3.8 MB   00:00
(1/2): epel/x86_64/updateinfo                              | 230 kB   00:00
(2/2): epel/x86_64/pkgtags                                 | 1.3 MB   00:00
Loading mirror speeds from cached hostfile
 * base: www.ftp.ne.jp
 * epel: s3-mirror-ap-northeast-1.fedoraproject.org
 * extras: www.ftp.ne.jp
 * rpmforge: ftp.riken.jp
 * updates: www.ftp.ne.jp
No package mysql-server available.
Error: Nothing to do
</pre>
<p>因为，CentOS7的默认数据库是MariaDB。</p>
<p>&nbsp;</p>
<h2>1, 配置MySQL5.6的Repository</h2>
<p><strong>访问http://www.mysql.com/downloads/以后，点击「Downloads」→「Yum Repository」。</strong></p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2015/08/mysql.org_.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2015/08/mysql.org_.png" alt="mysql.org_" width="1341" height="637" /></a></p>
<p><strong>选择Red Hat Enterprise Linux 7 / Oracle Linux 7 (Architecture Independent), RPM Package的「Download」</strong></p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2015/08/Download.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2015/08/Download.png" alt="Download" width="1033" height="535" /></a><br />
<strong><br />
在这里会显示登录Oracle的页面，但是不必登录，拷贝No thanks, just start my download.的链接就可以。</strong></p>
<p>拷贝的链接是：http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2015/08/MySQL5.6-Repository.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2015/08/MySQL5.6-Repository.png" alt="MySQL5.6-Repository" width="1914" height="859" /></a></p>
<p><strong>配置MySQL5.6的yum源。</strong></p>
<pre># rpm -ivh http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
Retrieving http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
Preparing...                          ################################# [100%]
Updating / installing...
   1:mysql-community-release-el7-5    ################################# [100%]
</pre>
<p><strong>确认MySQL5.6yum源存在。</strong></p>
<pre># yum repolist
Loaded plugins: fastestmirror
mysql-connectors-community                               | 2.5 kB     00:00
mysql-tools-community                                    | 2.5 kB     00:00
mysql56-community                                        | 2.5 kB     00:00
(1/3): mysql-connectors-community/x86_64/primary_db        | 7.0 kB   00:00
(2/3): mysql-tools-community/x86_64/primary_db             |  11 kB   00:00
(3/3): mysql56-community/x86_64/primary_db                 |  59 kB   00:00
Loading mirror speeds from cached hostfile
 * base: www.ftp.ne.jp
 * epel: ftp.jaist.ac.jp
 * extras: www.ftp.ne.jp
 * rpmforge: ftp.riken.jp
 * updates: www.ftp.ne.jp
repo id                           repo name                               status
base/7/x86_64                     CentOS-7 - Base                         8,465
epel/x86_64                       Extra Packages for Enterprise Linux 7 - 6,912
extras/7/x86_64                   CentOS-7 - Extras                         102
mysql-connectors-community/x86_64 MySQL Connectors Community                 12
mysql-tools-community/x86_64      MySQL Tools Community                      12
mysql56-community/x86_64          MySQL 5.6 Community Server                 94
rpmforge                          RHEL 7 - RPMforge.net - dag               245
updates/7/x86_64                  CentOS-7 - Updates                      1,497
repolist: 17,339
</pre>
<h2>2, 安装MySQL</h2>
<pre># yum install mysql-server

# mysql --version
mysql  Ver 14.14 Distrib 5.6.22, for Linux (x86_64) using  EditLine wrapper
</pre>
<p>成功的在Amazon CentOS7 AMI上安装了MySQL5.6.22。</p>
<h2>小结</h2>
<p>CentOS7，好像有不少改变呀。好像service命令变为systemctl命令了。</p>
<pre># service mysqld stop
Redirecting to /bin/systemctl stop  mysqld.service
</pre>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/amazon-centos7-ami%e5%ae%89%e8%a3%85mysql5-6%e6%95%99%e7%a8%8b/">Amazon CentOS7 AMI安装MySQL5.6教程</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/amazon-centos7-ami%e5%ae%89%e8%a3%85mysql5-6%e6%95%99%e7%a8%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>服务器代维是救命草还是鸡肋</title>
		<link>https://www.fuwuqiok.com/%e6%9c%8d%e5%8a%a1%e5%99%a8%e4%bb%a3%e7%bb%b4%e6%98%af%e6%95%91%e5%91%bd%e8%8d%89%e8%bf%98%e6%98%af%e9%b8%a1%e8%82%8b/</link>
		<comments>https://www.fuwuqiok.com/%e6%9c%8d%e5%8a%a1%e5%99%a8%e4%bb%a3%e7%bb%b4%e6%98%af%e6%95%91%e5%91%bd%e8%8d%89%e8%bf%98%e6%98%af%e9%b8%a1%e8%82%8b/#comments</comments>
		<pubDate>Sat, 08 Aug 2015 07:23:47 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[aliyun服务器代维]]></category>
		<category><![CDATA[aws服务器代维]]></category>
		<category><![CDATA[小说站代维]]></category>
		<category><![CDATA[服务器代维是救命草还是鸡肋]]></category>
		<category><![CDATA[服务器基础环境搭建]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=2471</guid>
		<description><![CDATA[<p>服务器代维就是个人站长或企业将本身的服务器委托专业的公司管理与维护，以达到降低成本的目的。 众所周知，无论个人 [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e6%9c%8d%e5%8a%a1%e5%99%a8%e4%bb%a3%e7%bb%b4%e6%98%af%e6%95%91%e5%91%bd%e8%8d%89%e8%bf%98%e6%98%af%e9%b8%a1%e8%82%8b/">服务器代维是救命草还是鸡肋</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<div class="entry-text clearfix">
<p>服务器代维就是个人站长或企业将本身的服务器委托专业的公司管理与维护，以达到降低成本的目的。</p>
<p>众所周知，无论个人还是企业，想运维好服务器就需要投入大量的精力以及人力物力，服务器外包已经成为很多站长降低成本的一种重要的手段。</p>
<p>目前从实践来看，需要服务器代维群体大体分两类：</p>
<ul>
<li>一类是自己不想承担或承担不起一个可以做到7×24小时服务器运维团队的成本</li>
<li>二类是认为专业人做专业事，将精力、能力聚集到核心业务发展之上</li>
</ul>
<h2>服务器代维会为企业带来什么</h2>
<ol>
<li>大大提高企业服务器运维速度。不仅节省了传统的各环节间转换的时间，还为企业节省了培训员工熟悉业务的时间。</li>
<li>降低企业服务器管理成本。首先是从时间的节约带来的费用的降低，另一方面则是通过减少不必要的人力物力给企业带来更大的益处，相信这一点，没用过服务器代维的企业体会不到的。</li>
<li>提高企业服务器运维质量。由于紧密合作的关系以及长期合作的时间，使得运维方对企业的服务器能进行十分深入、细致的理解，服务器运维过程中在切合企业实际业务运作等方面会有不可比拟的体现。当然，服务器代维也有其天生的缺陷，比如：
<ul>
<li>提供高品质的代维企业难找，即使有，与企业建立互信也成为一个难点。</li>
<li>企业的服务器风险将集中在代维商的责任心和水平之上。这一根本性的问题，也是导致很多企业决策者虽然明白服务器代维的好处，但是却始终犹豫的主要原因。</li>
</ul>
</li>
</ol>
<h2>小结</h2>
<p>因此，本人以多年的服务器运维实践经验认为，企业实行服务器运维外包的可行方法，就是：</p>
<p>企业让代维商从小的、短期合作开始切入，相互磨合、建立了信任的基础、 企业对运维公司的能力也有了充分认识后，再尝试长期的服务合作。此时，运维公司就不再是一个简单的服务提供者，也可以参与企业的决策环节，提供更专业的意见。</p>
<p>简言之，服务器代维就是企业用一个网管的工资雇用了一个专业的运维团队为其开展CTO的工作。形式不同，目的一致，效果却更突出。</p>
<p>信息化管理的时代，服务器代维更符合企业的实际发展需要，代维优势决定了其未来将会得到业内人士更多的关注与研究。</p>
<p><a href="https://www.fuwuqiok.com">运维一二三工作室</a>，你最值得信赖的朋友！</p>
</div>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e6%9c%8d%e5%8a%a1%e5%99%a8%e4%bb%a3%e7%bb%b4%e6%98%af%e6%95%91%e5%91%bd%e8%8d%89%e8%bf%98%e6%98%af%e9%b8%a1%e8%82%8b/">服务器代维是救命草还是鸡肋</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/%e6%9c%8d%e5%8a%a1%e5%99%a8%e4%bb%a3%e7%bb%b4%e6%98%af%e6%95%91%e5%91%bd%e8%8d%89%e8%bf%98%e6%98%af%e9%b8%a1%e8%82%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
