TL; DR:在部署针对ECS的CodePipeline之后,如何更改内存和CPU要求(或指定ECS任务定义的任何详细信息)?
我创建了一个CodePipeline,用于部署ECS容器。为此,我的构建步骤生成了一个名为imagedefinitions.json的文件:
[
{
"name": "idws",
"imageUri": "xxxxxxxx.dkr.ecr.us-west-2.amazonaws.com/xxx/idws-dev:latest"
}
]
(XXX是为了保护隐私,但您知道了)。
但是,此图像定义文件不支持在ECS任务定义中找到的所有详细信息。它仅允许指定容器URI。任务配置来自哪里?
我发现特别奇怪的是,直到我在ECS中手动创建一个任务定义(该容器的名称与图像定义文件中显示的名称相同)之前,该管道根本无法工作。这种未记录的要求使我假设CodePipeline以某种方式从服务继承了任务定义详细信息,这很烦人,但并非不可能解决:除非您尝试更改任务定义,否则下次管道运行所有任务定义详细信息时,到创建管道时配置的任务定义。对于CodePipeline或ECS的说明,这些都无法解释。
答案 0 :(得分:0)
在您的CodePipeline流程中,尝试插入一个阶段以部署声明ECS任务的Cloudformation堆栈。这样您的管道看起来就像
源->代码构建(构建并推送docker映像)->部署Cloudformation->部署ECS
这是一个不完整的模板:
- Name: Build
Actions:
- Name: Build
ActionTypeId:
Category: Build
Owner: AWS
Version: 1
Provider: CodeBuild
Configuration:
ProjectName: !Ref CodeBuildProject
InputArtifacts:
- Name: App
OutputArtifacts:
- Name: BuildOutput
RunOrder: 1
- Name: DeployCFN
Actions:
- Name: Deploy
ActionTypeId:
Category: Deploy
Owner: AWS
Provider: CloudFormation
Version: '1'
Configuration:
ActionMode: CREATE_UPDATE
Capabilities: CAPABILITY_IAM
RoleArn: !GetAtt CloudformationRole.Arn
StackName: 'ecs-task'
TemplatePath: SourceOutput::ecs_template.yml
ParameterOverrides: !Sub '{"Cpu": 512, "Memory: "2GB"}'
InputArtifacts:
- Name: SourceOutput
RunOrder: 1
- Name: DeployECS
Actions:
- Name: Deploy
ActionTypeId:
Category: Deploy
Owner: AWS
Version: 1
Provider: ECS
Configuration:
ClusterName: !Ref Cluster
ServiceName: !Ref Service
FileName: images.json
InputArtifacts:
- Name: BuildOutput
RunOrder: 1
ecs_template.yml
看起来像这样:
Parameters:
Cpu:
Default: 1024
Memory:
Default: 1GB
Resources:
TaskDefinition:
Type: AWS::ECS::TaskDefinition
Properties:
ContainerDefinitions:
- Cpu: !Ref Cpu
Memory: !Ref Memory
# ...
答案 1 :(得分:0)
我已经使用Codepipeline ECS在交叉帐户ECS集群中进行了大量部署。与您的设置不同的是,我在代码管道之前通过Terraform或Cloudformation创建了ECS集群(以及任务定义,服务,ECR存储库,ELB等)。
存在集群和任务定义后,代码管道仅更新任务定义中的“图像” URL,使用该定义创建新版本并部署新任务。
分别创建集群对我来说很有效,因为我不需要每次运行管道时都创建集群/服务/负载均衡器/自动扩展策略/规则等。这是我用来创建ECS cluster (& other things it needs)和code pipeline的模板,如果有帮助的话!
答案 2 :(得分:0)
对我来说,唯一的方法是创建一个新的任务定义,因为部署管道将以该任务为基础。
答案 3 :(得分:0)
AWS CodePipeline ECS Deploy操作似乎正在查看与要部署到的服务相关的最新任务定义。这是基于以下实验:
任务定义TDv1
通过代码管道部署
手动更新任务定义TDv3
通过代码管道部署
手动更新任务定义TDv5
更新服务以使用TDv5
通过代码管道部署