ECS是AWS自行研发的容器管理平台,相对于流行的K8S架构,ECS更加简单易用,学习门槛相对很低。此外,Fargate无服务器技术的支持,将ECS完全从管理底层架构中解放出来,用户不需要再去关心Node节点的EC2配置,而是只在乎启动的任务,非常便于高效、快速的将既有容器投入使用。
ECS 201 Workshop分成:
共四个部分。此外,在ECS实验之前,还有一个基础篇是如何Build容器镜像,请参考这里。
下面开始第一篇。
一、创建集群
首先在AWS控制台上找到ECS服务,点击进入。如下截图。

在左侧的菜单中,找到集群按钮,点击进入,然后点击创建集群。如下截图。

在创建集群第一步,选择模式为Networking Only
的模式,也就是Fargate模式。如下截图。

在创建集群第二步,输入集群名称;在创建VPC的选项上不要选中;输入集群的Tag标签,注意Tag标签的Name
字段,N为大写。标签是可选填写。如下截图。

创建成功,点击查看集群返回集群管理页面。如下截图。

至此集群创建完成。
二、创建ECS运行所需要的IAM角色
1、创建任务运行角色
进入IAM控制台,点击左侧的角色按钮,点击创建角色。如下截图。

在创建角色页面,选择类型是AWS服务,在服务清单中选择 Elastic Container Service
,即ECS服务。然后将页面向下滚动。如下截图。

在服务场景上选择 Elastic Container Service Task
服务(最后一项),并点击下一步继续。如下截图。

在创建角色选择策略的页面,上方搜索框内输入ecs,从下方的搜索结果中,选中名为 AmazonECSTaskExecutionRolePolicy
的策略。然后点击下一步继续。如下截图。

在标签页部分可选,可跳过。如下截图。

在向导最后一步,输入角色的名称。注意如果是多人在同一个账号内实验,只创建一个角色即可运行多个ECS集群和任务。如果需要创建多个角色,请使用不同的名称加以区别。如下截图。

创建完成。回到IAM的角色页面,输入名称的开头 ecstask
,如果搜索结果显示出来在,则表示IAM角色创建成功。如下截图。

2、创建CodeDeploy发布角色
在本实验章节中,虽然不会进行版本发布操作,但是为了创建一个支持CodeDeploy发布的集群,也必须在这个步骤创建CodeDeploy需要的部署角色。本章节创建IAM角色成功后,后文实验将进行新版本发布的测试,届时也就无需创建权限。
进入IAM模块界面,点击左侧的角色,点击创建角色。如下截图。

进入创建IAM角色界面后,选择服务类型是CodeDeploy,在使用场景选项中选择 CodeDeployRoleForECS
,并点击下一步权限继续。如下截图。

在权限界面,默认已经包含了 AWSCodeDeployRoleForECS
的策略。点击下一步标签继续。如下截图。

在标签页面不进行设置,跳过标签。在最后一个步骤,输入角色的名称 ecsCodeDeployRole
。注意如果是多人实验,只创建一个Role即可,否则会遇到名称冲突。点击右下角创建完成。如下截图。

在创建完成后,再次搜索刚创建的角色的名称。如下截图。

在角色管理页面上,点击屏幕右侧的Add inline policy
按钮,为本角色添加策略。

点击JSON标签页切换到文本编辑模式,输入如下的一段策略。如果这一段策略复制有问题,可以从这个网址的官网文档中复制。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "iam:PassRole",
"Resource": [
"arn:aws-cn:iam::<aws_account_id>:role/<ecsTaskExecutionRole_or_TaskRole_name>"
]
}
]
}
请替换其中的Account ID为实验ID,替换角色名称为当前上一步创建的Task运行角色的名称,例如前文使用的是 ecsTaskExecutionRole
。如下截图。

在下一步Review界面上,输入策略的名称,并点击右下角的创建策略。

至此IAM操作完成。
三、创建任务(TASK定义)
进入ECS控制台的任务定义界面,点击创建新的任务定义。如下截图。

在任务模式类型上,选择左侧的Fargate
类型。然后点击下一步继续。如下截图。

在新任务定义的第二步界面上,任务名称输入 myphpdemo
,任务角色从下拉框中选取上一步配置IAM创建的名为 ecsTaskExecutionRole
角色 。在网络模式位置,默认已经选中awsvpc且不能修改。再向下在任务执行的IAM角色为孩子,再次选择上一步生成的 ecsTaskExecutionRole
角色。接下来向下滚动界面。如下截图。

当页面向下滚动后,在Task size位置,本任务使用的容器需要的内存是 1GB 和0.5vCPU。然后点击容器定义界面下的添加容器按钮。如下截图。

在页面右侧滑动出现的添加容器界面,输入用户名称,例如 phpdocker
,在Image镜像位置,输入ECR容器镜像仓库服务中显示的URI。例如此格式 420029960748.dkr.ecr.cn-north-1.amazonaws.com.cn/phpdemo:latest
。注意最后的 latest
表示版本,如果应用有升级,版本也可以是2、3、4、5等数字。如下截图。

注意:这里如果不清楚容器镜像仓库ECR服务和URI,可以新开一个浏览器窗口,切换到ECR服务,然后从如下界面的位置上,点击 Copy URI
按钮即可复制下来。如下截图。

在找到容器URI之后,重新回到ECS的任务定义界面,继续配置。在内存限制位置,选择 软限制(soft limit)
,然后输入数值为768MB。在端口映射 Port mappings
部分,输入端口80。下方还有一系列配置都无需操作,直接点击右下角的添加按钮,完成容器镜像的添加。如下截图。

请注意如果当前实验的AWS账号并未通过ICP备案,那么80端口无法访问。此时,在本界面依然要输入80端口,因为容器制作时监听服务就绑定在80端口上。为了解决ICP映射问题,后续可通过ALB发布到其他端口上。
添加容器完成后,页面下方还有代理设置 Proxy Configuration
和 Log Router Integration
连个选项,在这里都保持默认不选中的状态。再下方的卷 Volume
管理选项,可以为ECS容器服务添加持久化的文件存储,例如EFS文件存储服务,本实现不使用这些设置,跳过设置。最后一部分是标签设置 Tag
,不需要修改,跳过标签设置。点击页面右下角的创建按钮,完成任务创建。如下截图。

任务定义创建完成,点击右下角的查看按钮即可返回查看如下截图。

在任务定义界面,可以看到创建任务定义成功。如下截图。

至此任务定义完成。