<?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 CodePipeline，AWS CodeBuild与AWS CloudFormation实现Amazon ECS上的持续集成持续部署解决方案</title>
	<atom:link href="https://www.fuwuqiok.com/tag/%e4%bd%bf%e7%94%a8aws-codepipeline%ef%bc%8caws-codebuild%e4%b8%8eaws-cloudformation%e5%ae%9e%e7%8e%b0amazon-ecs%e4%b8%8a%e7%9a%84%e6%8c%81%e7%bb%ad%e9%9b%86%e6%88%90%e6%8c%81%e7%bb%ad%e9%83%a8/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.fuwuqiok.com</link>
	<description></description>
	<lastBuildDate>Sun, 01 Mar 2020 07:28:40 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.2.26</generator>
	<item>
		<title>使用AWS CodePipeline，AWS CodeBuild与AWS CloudFormation实现Amazon ECS上的持续集成持续部署解决方案</title>
		<link>https://www.fuwuqiok.com/%e4%bd%bf%e7%94%a8aws-codepipeline%ef%bc%8caws-codebuild%e4%b8%8eaws-cloudformation%e5%ae%9e%e7%8e%b0amazon-ecs%e4%b8%8a%e7%9a%84%e6%8c%81%e7%bb%ad%e9%9b%86%e6%88%90%e6%8c%81%e7%bb%ad%e9%83%a8/</link>
		<comments>https://www.fuwuqiok.com/%e4%bd%bf%e7%94%a8aws-codepipeline%ef%bc%8caws-codebuild%e4%b8%8eaws-cloudformation%e5%ae%9e%e7%8e%b0amazon-ecs%e4%b8%8a%e7%9a%84%e6%8c%81%e7%bb%ad%e9%9b%86%e6%88%90%e6%8c%81%e7%bb%ad%e9%83%a8/#comments</comments>
		<pubDate>Tue, 05 Dec 2017 08:56:21 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Amazon AWS]]></category>
		<category><![CDATA[代维]]></category>
		<category><![CDATA[服务器代维]]></category>
		<category><![CDATA[AWS云主机托管]]></category>
		<category><![CDATA[AWS云服务解决方案]]></category>
		<category><![CDATA[AWS代付]]></category>
		<category><![CDATA[AWS服务咨询]]></category>
		<category><![CDATA[AWS服务器迁移]]></category>
		<category><![CDATA[AWS电话告警]]></category>
		<category><![CDATA[AWS解决方案提供商！]]></category>
		<category><![CDATA[AWS运维支持]]></category>
		<category><![CDATA[linux服务器代维]]></category>
		<category><![CDATA[企业上AWS云]]></category>
		<category><![CDATA[使用AWS CodePipeline，AWS CodeBuild与AWS CloudFormation实现Amazon ECS上的持续集成持续部署解决方案]]></category>
		<category><![CDATA[海外服务器代维]]></category>
		<category><![CDATA[澳洲华人服务器代维]]></category>
		<category><![CDATA[香港主机代维]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=3304</guid>
		<description><![CDATA[<p>1. 前述 通过本文章，您将了解如何通过AWS CodePipeline，AWS CodeBuild，AWS  [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e4%bd%bf%e7%94%a8aws-codepipeline%ef%bc%8caws-codebuild%e4%b8%8eaws-cloudformation%e5%ae%9e%e7%8e%b0amazon-ecs%e4%b8%8a%e7%9a%84%e6%8c%81%e7%bb%ad%e9%9b%86%e6%88%90%e6%8c%81%e7%bb%ad%e9%83%a8/">使用AWS CodePipeline，AWS CodeBuild与AWS CloudFormation实现Amazon ECS上的持续集成持续部署解决方案</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<h3>1. 前述</h3>
<p>通过本文章，您将了解如何通过AWS CodePipeline，AWS CodeBuild，AWS CloudFormation 来实现基于Amazon ECS的持续集成持续部署方案。</p>
<p>开发人员在GitHub中提交的新版本代码，会自动触发代码获取，打包镜像，上传镜像仓库，更新新版本容器服务，注册到负载均衡器等操作。</p>
<p>方案中会涉及使用如下组件：</p>
<p>GitHub：示例使用的源，一个提交到GitHub上的PHP示例网站。AWS CodePipeline支持GitHub， AWS CodeCommit服务，或者S3作为源。此次实例使用的Demo软件工程可以从以下链接Fork：</p>
<p><a href="https://github.com/awslabs/ecs-demo-php-simple-app">https://github.com/awslabs/ecs-demo-php-simple-app</a></p>
<p>Docker：作为发布服务使用的容器。演示方案的Build阶段会使用AWS CodeBuild托管的ubuntu／docker 1.12.1基础镜像。</p>
<p>Amazon EC2：作为ECS的容器宿主机集群。</p>
<p>Amazon VPC：服务所在的网络。</p>
<p>Amazon ECS：AWS托管的容器编排服务。文档链接 <a href="http://docs.aws.amazon.com/zh_cn/AmazonECS/latest/developerguide/Welcome.html">http://docs.aws.amazon.com/zh_cn/AmazonECS/latest/developerguide/Welcome.html</a></p>
<p>Amazon ECR：AWS 托管的容器镜像仓库。文档链接 <a href="http://docs.aws.amazon.com/zh_cn/AmazonECR/latest/userguide/what-is-ecr.html">http://docs.aws.amazon.com/zh_cn/AmazonECR/latest/userguide/what-is-ecr.html</a></p>
<p>AWS CodePipeline：AWS 托管的持续集成持续交付服务，可以快速可靠的更新应用程序和服务，集成支持GitHub，Jenkins等主流开源工具。文档链接 <a href="http://docs.aws.amazon.com/zh_cn/codepipeline/latest/userguide/welcome.html">http://docs.aws.amazon.com/zh_cn/codepipeline/latest/userguide/welcome.html</a></p>
<p>AWS CodeBuild：AWS 托管的构建服务，用于打包代码生成可部署的软件包。文档链接 <a href="http://docs.aws.amazon.com/zh_cn/codebuild/latest/userguide/welcome.html">http://docs.aws.amazon.com/zh_cn/codebuild/latest/userguide/welcome.html</a></p>
<p>AWS CloudFormation：批量创建和管理AWS资源的自动化脚本。文档链接<a href="http://docs.aws.amazon.com/zh_cn/AWSCloudFormation/latest/UserGuide/Welcome.html">http://docs.aws.amazon.com/zh_cn/AWSCloudFormation/latest/UserGuide/Welcome.html</a></p>
<h3>2.方案架构</h3>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/1-2.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/1-2.png" alt="1-2" width="673" height="357" /></a></p>
<p>流程如下：</p>
<ol>
<li>开发者将一个新版本的代码工程提交到GitHub</li>
<li>Pipeline的Source阶段，检测到指定GitHub的repo有新版本的更新，从GitHub上拉取代码工程，开启已设定好的CICD Pipeline</li>
<li>Pipeline的Build阶段，AWS CodeBuild将新版本的代码工程打包为Docker镜像</li>
<li>AWS CodeBuild将打包好的镜像推送到Amazon ECR</li>
<li>Pipeline的Deploy阶段，AWS CodePipeline触发AWS CloudFormation，其定义了Amazon ECS的Task definition和service</li>
<li>AWS CloudFormation创建新版本的Task definition关联到新版本的Docker镜像，并更新Service</li>
<li>Amazon ECS从Amazon ECR中取到新版本的Docker镜像，并运行来替换旧Task以完成服务的更新部署</li>
</ol>
<h3>3. 搭建</h3>
<p>搭建部分分为以下几个步骤：基础设施，与CICD Pipeline的搭建。</p>
<p><strong>3.1   基础设施部分的搭建</strong></p>
<p>这里需要准备好网络，负载均衡器，S3以及运行ECS所需要的宿主机集群。</p>
<p>3.1.1 网络搭建</p>
<p>创建VPC，子网，Internet Gateway，路由表。将Internet Gateway Attach到VPC上，路由表配置0.0.0.0/0指向Internet Gateway，并关联子网。</p>
<p>之后的EC2宿主机集群，负载均衡器等都使用在这个网络里。</p>
<p>3.1.2 负载均衡器</p>
<p>创建ALB应用负载均衡器，监听80端口</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/2-2.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/2-2.png" alt="2-2" width="2528" height="410" /></a></p>
<p>选择对应的子网</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/3-1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/3-1.png" alt="3-1" width="2368" height="560" /></a></p>
<p>新建安全组，端口80，并新建目标组</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/4.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/4.png" alt="4" width="1194" height="638" /></a></p>
<p>注册目标此时不选择，ECS创建服务时会注册集群和对应端口进来。</p>
<p>下一步审核后创建。</p>
<p>3.1.3 ECS宿主机集群</p>
<p>在ECS的界面下，创建集群</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/5-3.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/5-3.png" alt="5-3" width="2516" height="358" /></a></p>
<p>实例配置保持默认或根据情况自行选择，示例中保持默认。</p>
<p>联网配置，选择创建好的VPC，子网，创建Role允许宿主机上的ECS代理调用ECS服务的API。</p>
<p>创建后画面下面会显示集群信息</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/6-1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/6-1.png" alt="6-1" width="1990" height="538" /></a></p>
<p>集群一览会显示</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/7.jpg"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/7.jpg" alt="7" width="2022" height="332" /></a></p>
<p>修改ECS宿主机集群的安全组，inbound源设置为建好的应用负载均衡器的安全组ID</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/8-1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/8-1.png" alt="8-1" width="2330" height="734" /></a></p>
<p>3.1.4 ECR镜像仓库创建</p>
<p>创建一个用于Build阶段上传存放软件工程Docker镜像的镜像仓库</p>
<p>ECS界面下，创建存储库，创建好后如下</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/9-1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/9-1.png" alt="9-1" width="1724" height="622" /></a></p>
<p>3.1.5 S3桶创建</p>
<p>创建一个S3桶用来存放Deploy阶段CloudFormation使用的脚本模版，创建桶时选择和以上服务同一Region，并且打开桶的版本控制。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/10-1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/10-1.png" alt="10-1" width="1360" height="1124" /></a></p>
<p>将CloudFormation模版压缩zip后上传到桶中。</p>
<p>示例中将模版文件service.yaml放在templates文件夹后压缩为templates.zip。</p>
<p>service.yaml如下，注意缩进</p>
<div class="hide-language">
<pre class=" language-java" data-language="Java"><code class=" language-java">Parameters<span class="token operator">:</span>

  Tag<span class="token operator">:</span>

    Type<span class="token operator">:</span> String

    Default<span class="token operator">:</span> latest


  DesiredCount<span class="token operator">:</span>

    Type<span class="token operator">:</span> Number

    Default<span class="token operator">:</span> <span class="token number">0</span>


  TargetGroup<span class="token operator">:</span>

    Type<span class="token operator">:</span> String


  Cluster<span class="token operator">:</span>

    Type<span class="token operator">:</span> String


  Repository<span class="token operator">:</span>

    Type<span class="token operator">:</span> String


Resources<span class="token operator">:</span>

  ECSServiceRole<span class="token operator">:</span>

    Type<span class="token operator">:</span> AWS<span class="token operator">:</span><span class="token operator">:</span>IAM<span class="token operator">:</span><span class="token operator">:</span>Role

    Properties<span class="token operator">:</span>

      Path<span class="token operator">:</span> <span class="token operator">/</span>

      AssumeRolePolicyDocument<span class="token operator">:</span> <span class="token operator">|</span>

        <span class="token punctuation">{</span>

            <span class="token string">"Statement"</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token punctuation">{</span>

                <span class="token string">"Effect"</span><span class="token operator">:</span> <span class="token string">"Allow"</span><span class="token punctuation">,</span>

                <span class="token string">"Principal"</span><span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token string">"Service"</span><span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token string">"ecs.amazonaws.com"</span> <span class="token punctuation">]</span><span class="token punctuation">}</span><span class="token punctuation">,</span>

                <span class="token string">"Action"</span><span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token string">"sts:AssumeRole"</span> <span class="token punctuation">]</span>

            <span class="token punctuation">}</span><span class="token punctuation">]</span>

        <span class="token punctuation">}</span>

      Policies<span class="token operator">:</span>

        <span class="token operator">-</span> PolicyName<span class="token operator">:</span> root

          PolicyDocument<span class="token operator">:</span>

            Version<span class="token operator">:</span> <span class="token number">2012</span><span class="token operator">-</span><span class="token number">10</span><span class="token operator">-</span><span class="token number">17</span>

            Statement<span class="token operator">:</span>

              <span class="token operator">-</span> Resource<span class="token operator">:</span> <span class="token string">"*"</span>

                Effect<span class="token operator">:</span> Allow

                Action<span class="token operator">:</span>

                  <span class="token operator">-</span> ec2<span class="token operator">:</span><span class="token operator">*</span>

                  <span class="token operator">-</span> elasticloadbalancing<span class="token operator">:</span><span class="token operator">*</span>


  Service<span class="token operator">:</span>

    Type<span class="token operator">:</span> AWS<span class="token operator">:</span><span class="token operator">:</span>ECS<span class="token operator">:</span><span class="token operator">:</span>Service

    Properties<span class="token operator">:</span>

      Cluster<span class="token operator">:</span> <span class="token operator">!</span>Ref Cluster

      Role<span class="token operator">:</span> <span class="token operator">!</span>Ref ECSServiceRole

      DesiredCount<span class="token operator">:</span> <span class="token operator">!</span>Ref DesiredCount

      TaskDefinition<span class="token operator">:</span> <span class="token operator">!</span>Ref TaskDefinition

      LoadBalancers<span class="token operator">:</span>

        <span class="token operator">-</span> ContainerName<span class="token operator">:</span> simple<span class="token operator">-</span>app

          ContainerPort<span class="token operator">:</span> <span class="token number">80</span>

          TargetGroupArn<span class="token operator">:</span> <span class="token operator">!</span>Ref TargetGroup


  TaskDefinition<span class="token operator">:</span>

    Type<span class="token operator">:</span> AWS<span class="token operator">:</span><span class="token operator">:</span>ECS<span class="token operator">:</span><span class="token operator">:</span>TaskDefinition

    Properties<span class="token operator">:</span>

      Family<span class="token operator">:</span> <span class="token operator">!</span>Sub $<span class="token punctuation">{</span>AWS<span class="token operator">:</span><span class="token operator">:</span>StackName<span class="token punctuation">}</span><span class="token operator">-</span>simple<span class="token operator">-</span>app

      ContainerDefinitions<span class="token operator">:</span>

        <span class="token operator">-</span> Name<span class="token operator">:</span> simple<span class="token operator">-</span>app

          Image<span class="token operator">:</span> <span class="token operator">!</span>Sub $<span class="token punctuation">{</span>AWS<span class="token operator">:</span><span class="token operator">:</span>AccountId<span class="token punctuation">}</span><span class="token punctuation">.</span>dkr<span class="token punctuation">.</span>ecr<span class="token punctuation">.</span>$<span class="token punctuation">{</span>AWS<span class="token operator">:</span><span class="token operator">:</span>Region<span class="token punctuation">}</span><span class="token punctuation">.</span>amazonaws<span class="token punctuation">.</span>com<span class="token operator">/</span>$<span class="token punctuation">{</span>Repository<span class="token punctuation">}</span><span class="token operator">:</span>$<span class="token punctuation">{</span>Tag<span class="token punctuation">}</span>

          EntryPoint<span class="token operator">:</span>

            <span class="token operator">-</span> <span class="token operator">/</span>usr<span class="token operator">/</span>sbin<span class="token operator">/</span>apache2

            <span class="token operator">-</span> <span class="token operator">-</span>D

            <span class="token operator">-</span> FOREGROUND

          Essential<span class="token operator">:</span> <span class="token boolean">true</span>

          Memory<span class="token operator">:</span> <span class="token number">128</span>

          MountPoints<span class="token operator">:</span>

            <span class="token operator">-</span> SourceVolume<span class="token operator">:</span> my<span class="token operator">-</span>vol

              ContainerPath<span class="token operator">:</span> <span class="token operator">/</span>var<span class="token operator">/</span>www<span class="token operator">/</span>my<span class="token operator">-</span>vol

          PortMappings<span class="token operator">:</span>

            <span class="token operator">-</span> ContainerPort<span class="token operator">:</span> <span class="token number">80</span>

          Environment<span class="token operator">:</span>

            <span class="token operator">-</span> Name<span class="token operator">:</span> Tag

              Value<span class="token operator">:</span> <span class="token operator">!</span>Ref Tag

        <span class="token operator">-</span> Name<span class="token operator">:</span> busybox

          Image<span class="token operator">:</span> busybox

          EntryPoint<span class="token operator">:</span>

            <span class="token operator">-</span> sh

            <span class="token operator">-</span> <span class="token operator">-</span>c

          Essential<span class="token operator">:</span> <span class="token boolean">false</span>

          Memory<span class="token operator">:</span> <span class="token number">128</span>

          VolumesFrom<span class="token operator">:</span>

            <span class="token operator">-</span> SourceContainer<span class="token operator">:</span> simple<span class="token operator">-</span>app

          Command<span class="token operator">:</span>

            <span class="token operator">-</span> <span class="token operator">/</span>bin<span class="token operator">/</span>sh <span class="token operator">-</span>c <span class="token string">"while true; do /bin/date &gt; /var/www/my-vol/date; sleep 1; done"</span>

      Volumes<span class="token operator">:</span>

        <span class="token operator">-</span> Name<span class="token operator">:</span> my<span class="token operator">-</span>vol</code></pre>
</div>
<p>到此基础设施部分的搭建工作结束。</p>
<p><strong>3.2   Pipeline的搭建</strong></p>
<p>分为Source，Build以及Deploy三阶段：</p>
<p>Source阶段设置GitHub上的软件工程位置，并设置Deploy阶段会使用的CloudFormation脚本模版来更新ECS服务，</p>
<p>Build阶段使用AWS CodeBuild来打包软件工程到Docker镜像并上传到ECR，</p>
<p>Deploy阶段使用Source阶段引入的CloudFormation脚本，找到对应的宿主机集群，负载均衡器，以及上传到ECR的Docker镜像等对象，更新服务。</p>
<p>AWS CodePipeline创建后的展示图是这样的，串起了整个CICD流程</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/11-2.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/11-2.png" alt="11-2" width="842" height="1420" /></a></p>
<p>在AWS CodePipeline界面点击创建管道Pipeline，可以看到画面左侧一个基本流程，从源，到生成Build，到部署Deploy，到角色等配置。实际应用中用户可以随实际需要，或随着CICD流程的由简入繁在创建后编辑加入新的阶段或操作。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/12-1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/12-1.png" alt="12-1" width="2112" height="812" /></a></p>
<p>点击下一步。</p>
<p>3.2.1 Source阶段配置</p>
<p>源提供商下拉菜单选择GitHub，</p>
<p>点击连接到GitHub来授权访问权，来允许AWS CodePipeline从GitHub上获取软件工程源内容，认证后选择GitHub上软件工程所在位置和分支</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/13-2.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/13-2.png" alt="13-2" width="2104" height="1160" /></a></p>
<p>此次实例使用的Demo软件工程可以从以下链接Fork：</p>
<p><a href="https://github.com/awslabs/ecs-demo-php-simple-app">https://github.com/awslabs/ecs-demo-php-simple-app</a></p>
<p>点击下一步。</p>
<p>3.2.2 Build阶段配置</p>
<p>AWS CodePipeline在Build阶段支持包括AWS CodeBuild，Jenkins在内的引擎，此方案选用AWS 托管的CodeBuild服务</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/14-2.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/14-2.png" alt="14-2" width="2160" height="684" /></a></p>
<p>选择新建构建项目</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/15-1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/15-1.png" alt="15-1" width="1420" height="750" /></a></p>
<p>选择AWS CodeBuild托管的镜像，支持Ubuntu系统，运行时支持包括Java，Python，Go语言，Node.js，Docker在内的众多选择，此次方案使用Docker。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/16-2.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/16-2.png" alt="16-2" width="1478" height="904" /></a></p>
<p>构建规范这里选择使用buildspec.yml，里面预定了AWS CodeBuild在Build生命周期中要执行的动作，如login到ECR，打包Docker镜像，给Docker镜像打tag，上传Docker镜像到已login的ECR镜像仓库。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/55.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/55.png" alt="55" width="1232" height="150" /></a></p>
<p>Buildspec.yml放在GitHub软件工程源代码目录中，如果复制粘贴的话注意yaml文件的缩进</p>
<div class="hide-language">
<pre class=" language-java" data-language="Java"><code class=" language-java">version<span class="token operator">:</span> <span class="token number">0.2</span>

phases<span class="token operator">:</span>

  pre_build<span class="token operator">:</span>

    commands<span class="token operator">:</span>

      <span class="token operator">-</span> $<span class="token punctuation">(</span>aws ecr get<span class="token operator">-</span>login<span class="token punctuation">)</span>

      <span class="token operator">-</span> TAG<span class="token operator">=</span><span class="token string">"$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | head -c 8)"</span>

  build<span class="token operator">:</span>

    commands<span class="token operator">:</span>

<span class="token operator">-</span>    docker build <span class="token operator">--</span>tag <span class="token string">"替换创建好的ECR镜像仓库的URI:${TAG}"</span> <span class="token punctuation">.</span>

  post_build<span class="token operator">:</span>

    commands<span class="token operator">:</span>

      <span class="token operator">-</span> docker push <span class="token string">"替换创建好的ECR镜像仓库的URI:${TAG}"</span>

      <span class="token operator">-</span> printf <span class="token string">'{"tag":"%s"}'</span> $TAG <span class="token operator">&gt;</span> build<span class="token punctuation">.</span>json

artifacts<span class="token operator">:</span>

  files<span class="token operator">:</span> build<span class="token punctuation">.</span>json</code></pre>
</div>
<p>选择Role</p>
<p>新建一个Role，这个Role允许AWS CodeBuild来调用相关的AWS服务，此方案中需要调用包括S3，ECR，CloudWatch在内的服务。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/17-2.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/17-2.png" alt="17-2" width="1390" height="1192" /></a></p>
<p><strong>*默认创建的Role不具备对ECR的权限，需要在保存构建项目后，到IAM找到新创建的Role，编辑添加对ECR的权限否则后面Pipeline执行到Build时会报错。</strong></p>
<p>保存构建项目。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/18.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/18.png" alt="18" width="1372" height="836" /></a></p>
<p>点击下一步。</p>
<p>3.2.3 Deploy</p>
<p>AWS CodePipeline部署阶段支持包括AWS CloudFormation，AWS CodeDeploy，AWS Elastic Beanstalk在内的服务提供商，此方案选用AWS CloudFormation来部署ECS容器服务。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/19-2.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/19-2.png" alt="19-2" width="1474" height="490" /></a></p>
<p>这里暂时选择无部署，等Pipeline创建好后，编辑引入Deploy的CloudFormation模版源，再进行配置。</p>
<p>点击下一步。</p>
<p>3.2.4 角色</p>
<p>配置AWS CodePipeline对AWS服务的调用权限，包括S3，AWS CodeBuild，AWS CloudFormation，IAM等。点击创建角色到IAM界面选择相对应的策略创建。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/20-2.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/20-2.png" alt="20-2" width="1420" height="594" /></a></p>
<p>创建好后画面回到Pipeline，IAM创建好的Role已经显示在里面。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/21-2.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/21-2.png" alt="21-2" width="1374" height="584" /></a></p>
<p>点击下一步。</p>
<p>3.2.5 审核后创建管道。</p>
<p>管道创建好后会自动运行，现有的从GitHub软件工程源代码抓取工程，打包Docker镜像并推送到ECR上。界面上显示如图</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/22.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/22.png" alt="22" width="714" height="1120" /></a></p>
<p>3.2.6 添加Deploy阶段CloudFormation需要的模版源以及配置Deploy阶段</p>
<p>点击编辑，点击Source阶段右上角的画笔图标</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/23-1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/23-1.png" alt="23-1" width="1422" height="1202" /></a></p>
<p>可以看到AWS CodePipeline的编辑界面在南北纵向和东西横向都可以添加</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/24-2.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/24-2.png" alt="24-2" width="1438" height="1098" /></a></p>
<p>在GitHub这个Source右侧，点击添加操作，选择源，操作名称Template，选择S3，输入创建好的S3桶的地址</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/25-1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/25-1.png" alt="25-1" width="2528" height="1258" /></a></p>
<p>画面往下拉，注意在输出项目这里，输入Template。</p>
<p>Pipeline中各阶段的传递需要制定南北向的输入输出，即Source阶段S3源的输出Template，在Deploy阶段用输入Template来衔接。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/26-1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/26-1.png" alt="26-1" width="1240" height="654" /></a></p>
<p>点击更新。</p>
<p>点击Build阶段下面的添加阶段，画面右侧选择部署，选择AWS CloudFormation</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/27-1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/27-1.png" alt="27-1" width="2544" height="1300" /></a></p>
<p>操作模式选择创建或更新堆栈，输入创建的堆栈名称，模版这里输入Template::templates/service.yaml，也就是对应的输入是S3源桶中templates.zip里的service.yaml文件。功能选择CAPABILITY_NAMED_IAM。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/28-1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/28-1.png" alt="28-1" width="1268" height="1156" /></a></p>
<p>同样需要创建一个Role，允许AWS CloudFormation调用包括IAM，ECS，ECR在内的AWS服务。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/29.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/29.png" alt="29" width="2134" height="556" /></a></p>
<p>在IAM界面创建好后选择Role。</p>
<p>高级这里点开</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/30.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/30.png" alt="30" width="1224" height="1212" /></a></p>
<p>在参数覆盖这里输入CloudFormation需要传入的参数，其中的固定参数也可以在S3的service.yaml中直接定义。</p>
<div class="hide-language">
<pre class=" language-java" data-language="Java"><code class=" language-java"><span class="token punctuation">{</span>

  <span class="token string">"Tag"</span> <span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token string">"Fn::GetParam"</span> <span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token string">"MyAppBuild"</span><span class="token punctuation">,</span> <span class="token string">"build.json"</span><span class="token punctuation">,</span> <span class="token string">"tag"</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>

  <span class="token string">"DesiredCount"</span><span class="token operator">:</span> <span class="token string">"2"</span><span class="token punctuation">,</span>

  <span class="token string">"Cluster"</span><span class="token operator">:</span> <span class="token string">"CICD-DEMO-CLUSTER-01"</span><span class="token punctuation">,</span>

  <span class="token string">"TargetGroup"</span><span class="token operator">:</span> <span class="token string">"arn:aws:elasticloadbalancing:us-east-2:305890642658:targetgroup/CICD-DEMO-TG-01/b7649674ee8ab97b"</span><span class="token punctuation">,</span>

  <span class="token string">"Repository"</span><span class="token operator">:</span> <span class="token string">"cicd-demo-ecr-01"</span>

<span class="token punctuation">}</span></code></pre>
</div>
<p>Tag是Build阶段传出的Docker镜像Tag使用的值，传入CloudFormation中用于建立Task Definition的Container时从ECR拉取对应版本的Docker镜像。</p>
<p>DesiredCount，即想要在ECS的Service中建立的Task的数量。</p>
<p>Cluster，即建立好的宿主机集群的名称。</p>
<p>TargetGroup，即建立好的宿主机集群的应用负载均衡器的ARN。</p>
<p>Repository，即建立好的ECR的镜像仓库名称。</p>
<p>&nbsp;</p>
<p>输入项目这里输入Build阶段和S3模版源的输出。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/31.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/31.png" alt="31" width="1236" height="1124" /></a></p>
<p>点击添加操作。</p>
<p>保存管道更改。</p>
<h3>4. 运行以及模拟版本更新</h3>
<p><strong>4.1   运行</strong></p>
<p>访问负载均衡器的DNS地址来确认目前服务已经运行正常。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/32.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/32.png" alt="32" width="2556" height="1394" /></a></p>
<p><strong>4.2   模拟版本更新</strong></p>
<p>4.2.1 修改代码</p>
<p>在开发本地更新代码，示例中在src/index.php加入一行文字</p>
<div class="hide-language">
<pre class=" language-java" data-language="Java"><code class=" language-java"><span class="token operator">&lt;</span>h1 style<span class="token operator">=</span><span class="token string">"color:FF7F00;"</span><span class="token operator">&gt;</span>Amazon ECS Awesome<span class="token operator">!</span><span class="token operator">&lt;</span><span class="token operator">/</span>h1<span class="token operator">&gt;</span></code> 4.2.2 提交新版本后查看AWS CodePipeline各阶段触发 <a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/33.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/33.png" alt="33" width="814" height="1420" /></a></pre>
</div>
<p>4.2.3 刷新服务来确认新修改的部分已经发布</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/34.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/34.png" alt="34" width="2554" height="1378" /></a></p>
<p>&nbsp;</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e4%bd%bf%e7%94%a8aws-codepipeline%ef%bc%8caws-codebuild%e4%b8%8eaws-cloudformation%e5%ae%9e%e7%8e%b0amazon-ecs%e4%b8%8a%e7%9a%84%e6%8c%81%e7%bb%ad%e9%9b%86%e6%88%90%e6%8c%81%e7%bb%ad%e9%83%a8/">使用AWS CodePipeline，AWS CodeBuild与AWS CloudFormation实现Amazon ECS上的持续集成持续部署解决方案</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/%e4%bd%bf%e7%94%a8aws-codepipeline%ef%bc%8caws-codebuild%e4%b8%8eaws-cloudformation%e5%ae%9e%e7%8e%b0amazon-ecs%e4%b8%8a%e7%9a%84%e6%8c%81%e7%bb%ad%e9%9b%86%e6%88%90%e6%8c%81%e7%bb%ad%e9%83%a8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
