本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
教程:使用 Amazon ECR 源代码和 ECS-to-部署创建管道 CodeDeploy
在本教程中,您将配置一个管道, Amazon CodePipeline 该管道使用支持 Docker 映像的蓝/绿部署部署来部署容器应用程序。在蓝/绿部署中,您可以在运行旧版本应用程序的同时启动新版本应用程序,并在重新路由流量之前测试新版本。您还可以监控部署流程并且在存在问题的情况下迅速回滚。
重要
作为创建管道的一部分,客户提供的 S3 工件存储桶将 CodePipeline 用于项目。(这与用于 S3 源操作的存储桶不同。) 如果 S3 工件存储桶与您的管道账户位于不同的账户中,请确保 S3 工件存储桶归其所有 Amazon Web Services 账户 ,该存储桶是安全且可靠的。
注意
本教程适用于 Amazon ECS 的 CodeDeploy 蓝/绿部署操作。 CodePipeline有关使用中的 Amazon ECS 标准部署操作的教程 CodePipeline,请参阅教程:使用 Amazon ECS 标准部署 CodePipeline。
已完成的管道会检测您的映像的更改,该图像存储在图像存储库(例如 Amazon)中ECR,并用于 CodeDeploy 将流量路由和部署到 Amazon ECS 集群和负载均衡器。 CodeDeploy 使用侦听器将流量重新路由到 AppSpec 文件中指定的已更新容器的端口。有关如何在蓝/绿部署中使用负载均衡器、生产侦听器、目标组和您的 Amazon ECS 应用程序的信息,请参阅教程:部署 Ama ECS zon 服务。
管道还配置为使用存储您的 Amazon ECS 任务定义的源位置 CodeCommit,例如。在本教程中,您将配置这些 Amazon 资源中的每一个,然后创建包含每种资源操作的阶段的管道。
每当源代码发生更改或将新的基础映像上传到 Amazon 时,您的持续交付渠道将自动构建和部署容器映像ECR。
此流程使用以下项目:
-
一个 Docker 镜像文件,用于指定您的 Amazon ECR 镜像存储库URI的容器名称和存储库。
-
列出您的 Docker 映像名称、容器名称、亚马逊ECS服务名称和负载均衡器配置的 Amazon ECS 任务定义。
-
一个 CodeDeploy AppSpec 文件,它指定 Amazon ECS 任务定义文件的名称、更新的应用程序容器的名称以及 CodeDeploy重新路由生产流量的容器端口。它还可以指定可选的网络配置以及您在部署生命周期事件挂钩期间可运行的 Lambda 函数。
注意
当您向 Amazon ECR 图像存储库提交更改时,管道源操作会为该提交创建一个imageDetail.json
文件。有关 imageDetail.json
文件的信息,请参阅imageDetail用于亚马逊ECS蓝/绿部署操作的.json 文件。
在创建或编辑管道和更新或指定部署阶段更新或指定源项目时,请确保指向要使用的带最新名称和版本的源项目。在设置管道后,在对映像或任务定义进行更改时,您可能需要更新存储库中的源项目文件,然后在管道中编辑部署阶段。
主题
先决条件
您必须已创建以下资源:
-
存储 CodeCommit 库。您可以使用您在中创建的 Amazon CodeCommit 存储库教程:创建简单的管道(CodeCommit存储库)。
-
启动亚马逊 EC2 Linux 实例并安装 Docker 以创建映像,如本教程所示。如果您已有要使用的映像,则可以跳过此先决条件。
第 1 步:创建镜像并推送到 Amazon ECR 存储库
在本节中,您将使用 Docker 创建映像,然后使用创建 Amazon ECR 存储库并将该映像推送到存储库。 Amazon CLI
注意
如果您已有要使用的映像,则可以跳过此步骤。
创建映像
-
登录到已安装 Docker 的 Linux 实例。
下拉
nginx
的映像。此命令提供nginx:latest
映像:docker pull nginx
-
运行 docker images。您将在列表中看到该映像。
docker images
创建 Amazon ECR 存储库并推送您的图片
-
创建一个 Amazon ECR 存储库来存储您的图片。记下输出中的
repositoryUri
。aws ecr create-repository --repository-name nginx
输出:
{ "repository": { "registryId": "
aws_account_id
", "repositoryName": "nginx", "repositoryArn": "arn:aws:ecr:us-east-1
:aws_account_id
:repository/nginx", "createdAt": 1505337806.0, "repositoryUri": "aws_account_id
.dkr.ecr.us-east-1
.amazonaws.com/nginx" } } -
使用上一步中的
repositoryUri
值标记映像。docker tag nginx:latest
aws_account_id
.dkr.ecr.us-east-1
.amazonaws.com/nginx:latest -
运行 aws ecr get-login-password 命令,如
us-west-2
区域和 111122223333 账户 ID 的此示例中所示。aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin 111122223333.dkr.ecr.us-west-2.amazonaws.com/nginx
-
ECR使用前面的步骤将图片推送
repositoryUri
到 Amazon。docker push 111122223333.dkr.ecr.
us-east-1
.amazonaws.com/nginx:latest
第 2 步:创建任务定义和 AppSpec 源文件并推送到 CodeCommit 存储库
在本节中,您将创建一个任务定义JSON文件并将其注册到 Amazon ECS。然后,您可以为创建 AppSpec 文件 CodeDeploy 并使用 Git 客户端将这些文件推送到您的 CodeCommit 存储库。
为您的映像创建任务定义
-
使用以下内容创建名为
taskdef.json
的文件。对于image
,输入您的映像名称,如 nginx。此值会在管道运行时进行更新。注意
请确保在任务定义中指定的执行角色包含
AmazonECSTaskExecutionRolePolicy
。有关更多信息,请参阅《亚马逊ECS开发者指南》中的亚马逊ECS任务执行IAM角色。{ "executionRoleArn": "arn:aws:iam::
account_ID
:role/ecsTaskExecutionRole", "containerDefinitions": [ { "name": "sample-website", "image": "nginx", "essential": true, "portMappings": [ { "hostPort": 80, "protocol": "tcp", "containerPort": 80 } ] } ], "requiresCompatibilities": [ "FARGATE" ], "networkMode": "awsvpc", "cpu": "256", "memory": "512", "family": "ecs-demo" } -
使用
taskdef.json
文件注册任务定义。aws ecs register-task-definition --cli-input-json file://taskdef.json
-
注册任务定义后,编辑您的文件以删除映像名称并将
<IMAGE1_NAME>
占位符文本包含在映像字段中。{ "executionRoleArn": "arn:aws:iam::
account_ID
:role/ecsTaskExecutionRole", "containerDefinitions": [ { "name": "sample-website", "image": "<IMAGE1_NAME>", "essential": true, "portMappings": [ { "hostPort": 80, "protocol": "tcp", "containerPort": 80 } ] } ], "requiresCompatibilities": [ "FARGATE" ], "networkMode": "awsvpc", "cpu": "256", "memory": "512", "family": "ecs-demo" }
创建 AppSpec 文件
-
该 AppSpec 文件用于 CodeDeploy 部署。该文件(包含可选字段)使用以下格式:
version: 0.0 Resources: - TargetService: Type: AWS::ECS::Service Properties: TaskDefinition: "
task-definition-ARN
" LoadBalancerInfo: ContainerName: "container-name
" ContainerPort:container-port-number
# Optional properties PlatformVersion: "LATEST" NetworkConfiguration: AwsvpcConfiguration: Subnets: ["subnet-name-1
", "subnet-name-2
"] SecurityGroups: ["security-group
"] AssignPublicIp: "ENABLED
" Hooks: - BeforeInstall: "BeforeInstallHookFunctionName
" - AfterInstall: "AfterInstallHookFunctionName
" - AfterAllowTestTraffic: "AfterAllowTestTrafficHookFunctionName
" - BeforeAllowTraffic: "BeforeAllowTrafficHookFunctionName
" - AfterAllowTraffic: "AfterAllowTrafficHookFunctionName
"有关该 AppSpec 文件的更多信息(包括示例),请参阅CodeDeploy AppSpec 文件引用。
使用以下内容创建名为
appspec.yaml
的文件。对于TaskDefinition
,请勿更改<TASK_DEFINITION>
占位符文本。此值会在管道运行时进行更新。version: 0.0 Resources: - TargetService: Type: AWS::ECS::Service Properties: TaskDefinition: <TASK_DEFINITION> LoadBalancerInfo: ContainerName: "sample-website" ContainerPort: 80
将文件推送到您的 CodeCommit 存储库
-
将文件推送或上传到您的 CodeCommit 存储库。这些文件是由 “创建管道” 向导为中部署操作创建的源项目 CodePipeline。您的文件在本地目录中应如下所示:
/tmp |my-demo-repo |-- appspec.yaml |-- taskdef.json
-
选择要用于上传文件的方法:
-
在本地计算机上从克隆的存储库使用 Git 命令行:
-
将目录更改为本地存储库:
(For Linux, macOS, or Unix)
cd /tmp/my-demo-repo(For Windows)
cd c:\temp\my-demo-repo -
运行以下命令以立即暂存您的所有文件:
git add -A
-
运行以下命令以提交带有提交消息的文件:
git commit -m "Added task definition files"
-
运行以下命令将本地存储库中的文件推送到存储 CodeCommit 库:
git push
-
-
要使用 CodeCommit 控制台上传您的文件,请执行以下操作:
-
打开 CodeCommit 控制台,然后从 “存储库” 列表中选择您的存储库。
-
选择添加文件,然后选择上传文件。
-
选择选择文件,然后浏览以找到您的文件。通过输入您的用户名和电子邮件地址来提交更改。选择提交更改。
-
对要上传的每个文件重复此步骤。
-
-
步骤 3:创建您的应用程序负载均衡器和目标组
在本节中,您将创建一个 Amazon App EC2 lication Load Balancer。稍后在创建 Amazon ECS 服务时,您可以使用您在负载均衡器中创建的子网名称和目标组值。您可以创建应用程序负载均衡器或网络负载均衡器。负载均衡器必须使用VPC具有位于不同可用区域的两个公有子网。在这些步骤中,您将确认您的默认设置VPC,创建负载均衡器,然后为您的负载均衡器创建两个目标组。有关更多信息,请参阅您的网络负载均衡器的目标组。
验证您的默认子网VPC和公有子网
登录 Amazon Web Services Management Console 并打开 Amazon VPC 控制台,网址为https://console.aws.amazon.com/vpc/
。 -
验证VPC要使用的默认值。在导航窗格中,选择您的VPCs。请注意,“默认” VPC 列中VPC显示为 “是”。这是默认值VPC。它包含可供您选择的默认子网。
-
选择子网。选择两个在默认子网列中显示是的子网。
注意
记下您的子网IDs。本教程后面将会用到这些 ID。
-
选择子网,然后选择描述选项卡。验证要使用的子网是否位于不同的可用区中。
-
选择子网,然后选择路由表选项卡。为了验证要使用的每个子网是否为公有子网,请确认网关行包含在路由表中。
创建 Amazon Application EC2 Load Balancer
登录 Amazon Web Services Management Console 并打开 Amazon EC2 控制台,网址为https://console.aws.amazon.com/ec2/
。 -
在导航窗格中,选择负载均衡器。
-
选择 Create Load Balancer(创建负载均衡器)。
-
选择 Application Load Balancer(应用程序负载均衡器),然后选择 Create(创建)。
-
在 Name(名称)中,输入负载均衡器的名称。
-
在 Scheme(模式)中,选择 internet-facing(面向 internet)。
-
在 IP 地址类型中,选择 ipv4。
-
为您的负载均衡器配置两个侦听器端口:
-
在 Loa d Balancer 协议下,选择HTTP。在负载均衡器端口下,输入
80
。 -
选择添加侦听器。
-
在第二个侦听器的 Load Balancer 协议下,选择HTTP。在 Load Balancer Port(负载均衡器端口)下,输入
8080
。
-
-
在 “可用区” 下 VPC,在中,选择默认值VPC。接下来,选择要使用的两个默认子网。
-
选择下一步:配置安全设置。
-
选择下一步:配置安全组。
-
选择选择现有安全组,然后记下安全组 ID。
-
选择下一步:配置路由。
-
在目标组中,选择新建目标组并配置您的第一个目标组:
-
在名称中,输入目标组名称(例如,
target-group-1
)。 -
在 Target type(目标类型)中,选择 IP。
-
在 “协议” 中选择HTTP。在 Port(端口)中,输入
80
。 -
选择下一步:注册目标。
-
-
选择 Next: Review(下一步:审核),然后选择 Create(创建)。
为您的负载均衡器创建第二个目标组
-
配置好负载均衡器后,打开 Amazon EC2 控制台。在导航窗格中,选择目标组。
-
选择创建目标组。
-
在 Name(名称)中,输入目标组名称(例如,
target-group-2
)。 -
在 Target type(目标类型)中,选择 IP。
-
在 “协议” 中选择HTTP。在 Port(端口)中,输入
8080
。 -
在中 VPC,选择默认值VPC。
-
选择创建。
注意
要使部署运行,您必须为您的负载均衡器创建了两个目标组。你只需要记下ARN你的第一个目标群体。下一步将在
create-service
JSON文件中使用它。ARN
更新您的负载均衡器以包含第二个目标组
-
打开 Amazon EC2 控制台。在导航窗格中,选择负载均衡器。
-
选择您的负载均衡器,然后选择侦听器选项卡。选择具有端口 8080 的侦听器,然后选择编辑。
-
选择转发至旁的铅笔图标。选择您的第二个目标组,然后选择复选标记。选择更新以保存更新。
步骤 4:创建您的 Amazon ECS 集群和服务
在本节中,您将创建一个 Amazon ECS 集群和服务,用于在部署期间将流量 CodeDeploy 路由到该ECS集群(而不是EC2实例)。要创建您的 Amazon ECS 服务,您必须使用使用负载均衡器创建的子网名称、安全组和目标组值来创建服务。
注意
当您使用这些步骤创建 Amazon ECS 集群时,您将使用仅限联网的集群模板,该模板预配置 Amazon Fargate 容器。 Amazon Fargate 是一项为您管理容器实例基础设施的技术。您无需为自己的亚马逊ECS集群选择或手动创建 Amazon EC2 实例。
创建 Amazon ECS 集群
打开 Amazon ECS 经典游戏机,网址为https://console.aws.amazon.com/ecs/
。 -
在导航窗格中,选择集群。
-
选择创建集群。
-
选择使用 Amazon Fargate 的仅限联网集群模板,然后选择下一步。
-
在配置集群页面上,输入集群名称。您可以为资源添加可选标签。选择创建。
创建 Amazon ECS 服务
使用在 Amazon CLI Amazon 中创建您的服务ECS。
-
创建一个JSON文件并命名它
create-service.json
。将以下内容粘贴到JSON文件中。对于该
taskDefinition
字段,当你在 Amazon 中注册任务定义时ECS,你会给它一个家族。这类似于使用修订号指定的任务定义的多个版本的名称。在此示例中,对文件中的系列和修订号使用“ecs-demo:1
”。使用您在步骤 3:创建您的应用程序负载均衡器和目标组 中随负载均衡器创建的子网名称、安全组和目标组值。注意
您需要在此文件ARN中包括您的目标群体。打开 Amazon EC2 控制台,然后从导航窗格的下方 LOADBALANCING,选择 “目标群组”。选择您的第一个目标组。ARN从 “描述” 选项卡中复制您的。
{ "taskDefinition": "
family
:revision-number
", "cluster": "my-cluster
", "loadBalancers": [ { "targetGroupArn": "target-group-arn
", "containerName": "sample-website", "containerPort": 80 } ], "desiredCount": 1, "launchType": "FARGATE", "schedulingStrategy": "REPLICA", "deploymentController": { "type": "CODE_DEPLOY" }, "networkConfiguration": { "awsvpcConfiguration": { "subnets": [ "subnet-1
", "subnet-2
" ], "securityGroups": [ "security-group
" ], "assignPublicIp": "ENABLED" } } } -
运行create-service命令,指定JSON文件:
重要
务必在文件名前包含
file://
。此命令中需要该项。此示例创建一个名为
my-service
的服务。注意
此示例命令创建一个名为 my-service 服务。如果您已有一个具有该名称的服务,则命令会返回错误。
aws ecs create-service --service-name my-service --cli-input-json file://create-service.json
输出将返回您的服务的描述字段。
-
运行 describe-services 命令以验证是否已创建您的服务。
aws ecs describe-services --cluster
cluster-name
--servicesservice-name
步骤 5:创建您的 CodeDeploy应用程序和部署组(ECS计算平台)
当您为 Amazon ECS 计算平台创建 CodeDeploy 应用程序和部署组时,将在部署期间使用该应用程序来引用正确的部署组、目标组、侦听器和流量重新路由行为。
创建 CodeDeploy 应用程序
-
打开 CodeDeploy 控制台并选择创建应用程序。
-
在应用程序名称中,输入要使用的名称。
-
在计算平台中,选择 Amazon ECS。
-
选择创建应用程序。
创建 CodeDeploy 部署组
-
在应用程序页面的部署组选项卡上,选择创建部署组。
-
在部署组名称中,输入一个描述部署组的名称。
-
在服务角色中,选择一个授予亚马逊 CodeDeploy访问权限的服务角色ECS。若要创建新的服务角色,请按照以下步骤操作:
-
打开IAM控制台,网址为 https://console.aws.amazon.com/iam/
)。 -
在控制台控制面板中,选择角色。
-
选择创建角色。
-
在选择受信任实体的类型下,选择 Amazon Web Services 服务。在 “选择用例” 下,选择CodeDeploy。在 “选择您的用例” 下,选择 CodeDeploy -ECS。选择下一步: 权限。
AWSCodeDeployRoleForECS
托管策略已附加到角色。 -
选择下一步:标签,然后选择下一步:审核。
-
输入角色的名称(例如
CodeDeployECSRole
),然后选择创建角色。
-
-
在环境配置中,选择您的 Amazon ECS 集群名称和服务名称。
-
在负载均衡器中,选择向您的 Amazon ECS 服务提供流量的负载均衡器的名称。
-
从生产侦听器端口中,为向您的 Ama ECS zon 服务提供生产流量的侦听器选择端口和协议。在测试侦听器端口中,选择测试侦听器的端口和协议。
-
从目标组 1 名称和目标组 2 名称中,选择用于在部署期间路由流量的目标组。请确保它们是您为负载均衡器创建的目标组。
-
选择 “立即重新路由流量”,以确定成功部署后需要多长时间将流量重新路由到更新后的 Ama ECS zon 任务。
-
选择 Create deployment group(创建部署组)。
步骤 6:创建管道
在此部分中,您将使用以下操作创建管道:
-
一种 CodeCommit 操作,其中源对象是任务定义和 AppSpec 文件。
-
带有 Amazon ECR 源操作的源阶段,其中源对象是图像文件。
-
具有 Amazon ECS 部署操作的部署阶段,其中部署与 CodeDeploy 应用程序和部署组一起运行。
使用向导创建两阶段管道
登录 Amazon Web Services Management Console 并打开 CodePipeline 控制台,网址为 http://console.aws.amazon.com/codesuite/codepipeline/home
。 -
在欢迎页面、入门页面或管道页面上,选择创建管道。
-
在步骤 1:选择管道设置的管道名称中,输入
MyImagePipeline
。 -
在管道类型中,选择 V2。有关更多信息,请参阅 管道类型。选择下一步。
-
在服务角色中,选择新建服务角色 CodePipeline 以允许在中创建服务角色IAM。
-
将高级设置中的各项设置保留为默认值,然后选择下一步。
-
在步骤 2:添加源阶段的源提供程序中,选择 Amazon CodeCommit。在存储库名称中,选择您在中创建的 CodeCommit存储库的名称步骤 1:创建 CodeCommit 存储库。在分支名称中,选择包含最新的代码更新的分支的名称。
选择下一步。
-
在步骤 3:添加构建阶段中,选择跳过构建阶段,并通过再次选择跳过接受警告消息。选择下一步。
-
在步骤 4:添加部署阶段中:
-
在部署提供程序中,选择 AmazonECS(蓝色/绿色)。在应用程序名称中,输入应用程序名称或从列表中选择应用程序名称,例如
codedeployapp
。在部署组中,输入部署组名称或从列表中选择部署组名称,例如codedeploydeplgroup
。注意
名称“Deploy”是在 步骤 4:部署步骤中创建的阶段的默认名称,正如“Source”是管道第一阶段的名称一样。
-
在 Amazon ECS 任务定义下,选择SourceArtifact。在字段中,输入
taskdef.json
。 -
在 “Amazon CodeDeploy AppSpec 文件” 下,选择SourceArtifact。在字段中,输入
appspec.yaml
。注意
此时,请不要在动态更新任务定义映像下填写任何信息。
-
选择下一步。
-
-
在步骤 5:审核中,查看信息,然后选择创建管道。
向您的渠道中添加 Amazon ECR 来源操作
查看您的管道并在您的管道中添加 Amazon ECR 源代码操作。
-
选择您的管道。在左上方,选择编辑。
-
在源阶段中,选择编辑阶段。
-
选择 CodeCommit 源操作旁边的 + 添加动作,即可添加并行动作。
-
在操作名称中,输入名称(例如
Image
)。 -
在操作提供者中,选择 Amazon ECR。
-
在存储库名称中,选择您的 Amazon ECR 存储库的名称。
-
在映像标签中,指定映像名称和版本(如果与最新版本不同)。
-
在输出构件中,选择包含下一阶段要使用的图像名称和存储库URI信息的输出对象默认值(例如
MyImage
)。 -
在操作屏幕上选择保存。在阶段屏幕上选择完成。在管道上选择保存。一条消息显示了要为亚马逊ECR源操作创建的 Amazon Ev CloudWatch ents 规则。
将您的源构件连接到部署操作
-
在 “部署” 阶段选择 “编辑”,然后选择用于编辑 AmazonECS(蓝色/绿色)操作的图标。
-
滚动到窗格底部。在输入项目中,选择添加。从您的新 Amazon ECR 存储库中添加源项目(例如,
MyImage
)。 -
在 “任务定义” 中 SourceArtifact,选择,然后输入验证
taskdef.json
。 -
在 “Amazon CodeDeploy AppSpec 文件” 中 SourceArtifact,选择,然后输入验证
appspec.yaml
信息。 -
在动态更新任务定义图像中,在 Input Art URI ifact with Image 中 MyImage,选择,然后输入
taskdef.json
文件中使用的占位符文本:IMAGE1_NAME
。选择保存。 -
在 Amazon CodePipeline 窗格中,选择 “保存管道更改”,然后选择 “保存更改”。查看已更新的管道。
创建此示例管道后,控制台条目的操作配置按如下所示在管道结构中显示:
"configuration": { "AppSpecTemplateArtifact": "SourceArtifact", "AppSpecTemplatePath": "appspec.yaml", "TaskDefinitionTemplateArtifact": "SourceArtifact", "TaskDefinitionTemplatePath": "taskdef.json", "ApplicationName": "codedeployapp", "DeploymentGroupName": "codedeploydeplgroup", "Image1ArtifactName": "MyImage", "Image1ContainerName": "IMAGE1_NAME" },
-
要提交所做的更改并开始管道构建,请选择发布更改,然后选择发布。
-
选择要查看的部署操作 CodeDeploy 并查看流量转移的进度。
注意
您可能会看到一个部署步骤,显示可选的等待时间。默认情况下,在成功部署后 CodeDeploy 等待一小时才终止原始任务集。您可以利用此时间回滚或终止任务,但在任务集终止时,您的部署也会完成。
步骤 7:对您的管道进行更改并验证部署
对您的图片进行更改,然后将更改推送到您的 Amazon ECR 存储库。这将触发您的管道运行。验证是否已部署您的映像源更改。