我想创建一个CodePipeline,它从CodeCommit源构建一个容器映像,然后以蓝色/绿色的方式将新映像部署到我的ECS服务(EC2启动类型)。
- 源阶段是CodeCommit,它已经包括appspec.json
以及taskdef.json - 构建阶段是构建新的集装箱&成功将其推送到ECR,文件imagedefinition.json是在该步骤中创建的BuildArtifact,包含容器和最近创建的带有其标记,该标记对应于CodeCommit commit-id
- 部署阶段由动作"Amazon ECS(蓝色/绿色)"组成,使用SourceArtifact和BuildArtifact作为InputArtifacts来自SourceArtifact和图像的appspec和taskdefBuildArtifact中的描述,以最终部署新的蓝色/绿色集装箱
问题出在BuildArtifact的图像定义上。管道在部署阶段失败,出现错误:
"无效的操作配置尝试从工件读取图像工件文件时出现异常:BuildArtifact。">
如何正确配置"Amazon ECS(蓝/绿)"部署阶段,以便它可以使用最近创建的映像并进行部署……通过替换taskdef.json中的占位符image_NAME?
非常感谢任何提示:D
在这里回答我自己的问题,希望它能帮助其他面临同样情况的人。
- 文件imagedefinitions.json不适合部署操作"亚马逊云服务器蓝/绿"。为此,您必须在构建步骤中创建文件imageDetail.json,并将其作为工件提供给部署步骤。怎样这就是我的buildspec.yaml底部的样子:
- printf '{"ImageURI":"%s"}' $REPOSITORY_URI:$IMAGE_TAG > imageDetail.json
artifacts:
files:
- 'image*.json'
- 'appspec.yaml'
- 'taskdef.json'
secondary-artifacts:
DefinitionArtifact:
files:
- appspec.yaml
- taskdef.json
ImageArtifact:
files:
- imageDetail.json
- 在CodePipeline的Deploy阶段,使用DefinitionArtifact和ImageArtifact作为输入工件,并在相应的">Amazon ECS任务定义"one_answers">AWS CodeDeploy AppSpec文件中进行配置
确保您的appspec.yaml包含任务定义的占位符。这是我的appspec.yaml:
version: 0.0
Resources:
- TargetService:
Type: AWS::ECS::Service
Properties:
TaskDefinition: <TASK_DEFINITION>
LoadBalancerInfo:
ContainerName: "my-test-container"
ContainerPort: 8000
还要确保taskdef.json包含最终图像的占位符,如
...
"image": <IMAGE1_NAME>,
...
- 通过选择输入工件为"ImageArtifact"和占位符
<IMAGE1_NAME>
,在">动态更新任务定义图像-可选"部分的蓝/绿部署阶段的代码管道配置中使用该占位符
Amazon ECS蓝/绿(或CodeDeployToECS)CodePipeline操作需要TaskDefinitionTemplateArtifact参数(请参阅[1])。
除了上面的文件说明外,ECS蓝/绿部署还需要一个imageDetail.json(而不是"imagedefinition.json")。文件结构和详细信息在这里提供[2]。将此文件添加到部署工件/版本控制的根目录中。如果您不想手动添加此文件,可以使用ECR源操作到CodePipeline,并使用您在ECS服务/taskdef.json中使用的映像进行配置。为了清楚起见,这些都在[2]中讨论过。
要了解这一切是如何结合在一起的,您还可以按照此处ECS蓝/绿部署的分步说明[3]进行操作。
参考文献:
[1]https://docs.aws.amazon.com/codepipeline/latest/userguide/reference-pipeline-structure.html#action-要求:CodePipeline管道结构参考-CodePipelines中的动作结构要求[2]https://docs.aws.amazon.com/codepipeline/latest/userguide/file-reference.html#file-reference ecs bluegreen:镜像定义文件reference-imageDetail.json亚马逊云服务器蓝/绿部署操作文件[3]https://docs.aws.amazon.com/codepipeline/latest/userguide/tutorials-ecs-ecr-codedeploy.html:教程:使用Amazon ECR源和ECS创建管道以CodeDeploy部署
我遇到了同样的问题。
tl:dr
我没有将带有imageDetail.json的正确输入工件传递给管道CodeDeployToECS操作。
摘要:
而不是使用'<IMAGE1_NAME>'占位符,我正在管道内动态生成CodeDeploy的任务定义输入。
项目早期的任务定义非常不稳定,新的变量等被传递到容器。它在管道中生成并注册(Cloudformation),然后通过Codebuild项目读出,用'<IMAGE1_NAME>'并通过流水线人工制品传递到流水线中的下一阶段。
修复:
- 我在管道中有一个CodeBuild项目,它生成imageDetail.json:
{"ImageURI":"########.dkr.ecr.eu-west-1.amazonaws.com/##/#####:2739511dd87d4e4e1f65ed69c9e779b63fb72e36-master-fbe73fdc-6213-4bd6-a784-dcc3d2ae7845"}
它的管道输出名为"BuildDockerOutput">
- 我有另一个Codebuild项目,它产生:
taskdef.json
{
"containerDefinitions": [
{
"name": "ronantest1",
"image": "<IMAGE1_NAME>",
]
}
appspec.json
{
"version": 0.0,
"Resources": [
{
"TargetService": {
"Type": "AWS::ECS::Service",
"Properties": {
"TaskDefinition": "<TASK_DEFINITION>",
"LoadBalancerInfo": {
"ContainerName": "ronantest1",
"ContainerPort": "8080"
}
}
}
}
],
"Hooks": [
{
"AfterAllowTestTraffic": "arn:aws:lambda:eu-west-1:######:function:code-deploy-after-allow-test-traffic"
}
]
}
它的管道输出名为"PrepareCodeDeployOutputTesting">
我的最后一个CodeDeploy操作如下:
- Name: BlueGreenDeploy
InputArtifacts:
- Name: BuildDockerOutput
- Name: PrepareCodeDeployOutputTesting
Region: !Ref DeployRegion1
ActionTypeId:
Category: Deploy
Owner: AWS
Version: '1'
Provider: CodeDeployToECS
RoleArn: !Sub arn:aws:iam::${TestingAccountId}:role/######/CrossAccountsDeploymentRole
Configuration:
AppSpecTemplateArtifact: PrepareCodeDeployOutputTesting
AppSpecTemplatePath: appspec.json
ApplicationName: !Ref ApplicationName
DeploymentGroupName: !Ref ApplicationName
TaskDefinitionTemplateArtifact: PrepareCodeDeployOutputTesting
TaskDefinitionTemplatePath: taskdef.json
Image1ArtifactName: BuildDockerOutput
Image1ContainerName: "IMAGE1_NAME"
RunOrder: 4
请注意CodeDeployToECS的不同方面需要来自不同InputArtifact的工件,特别是"Image1ArtifactName">
谢谢大家,这让我对解决这个问题有了一些了解。
我想补充一点,当您使用aws cli
、cloudformation
或Terraform
来配置codepipeline
时,一些参数和选项在控制台中不可用,并在这些工具中设置一些变量,如空字符串""将导致异常错误。
使用这些工具进行部署时,请始终在控制台中检查codepipeline
设置。
因此,当您定义图像伪影但未定义占位符时会发生错误
imageDetail.json可以使用以下方法传递到codedeploy
中:
- git-source(codecommit或github)应用程序代码库中存在的文件
- ECR源-文件将由ECR自动生成,但将使用SHA256而不是图像标记
CodeBuild
源代码-使用codebuild
buildspec.yml更新文件,并将其传递到codedeploy
阶段