无效的操作配置:尝试读取任务定义工件文件时出现异常
Invalid action configuration: Exception while trying to read the task definition artifact file
我有一个代码管道,它使用 ECS 蓝/绿部署操作将 ECR 映像部署到 ECS 集群。该管道包含两个来源:一个用于使用 AWS ECR 操作的 ECR 映像,另一个用于使用第三方 Github 操作从 Github 获取配置。 ECR 操作输出一个 image
工件,而 Github 操作输出一个 config
工件。这两个工件都作为 ECS 蓝/绿部署操作的输入提供。
管道在 ECS 蓝/绿部署操作中失败并出现以下错误(从 AWS 控制台可见):
Invalid action configuration
Exception while trying to read the task definition artifact file from: config
这里是管道的结构(为了匿名编辑了一些细节):
$ aws codepipeline get-pipeline --name my-codepipeline
{
"pipeline": {
"name": "my-codepipeline",
"roleArn": "arn:aws:iam::123456789000:role/my-codepipeline-role",
"artifactStore": {
"type": "S3",
"location": "my-codepipeline-s3"
},
"stages": [
{
"name": "Source",
"actions": [
{
"name": "ImageSource",
"actionTypeId": {
"category": "Source",
"owner": "AWS",
"provider": "ECR",
"version": "1"
},
"runOrder": 1,
"configuration": {
"ImageTag": "latest",
"RepositoryName": "my-ecr"
},
"outputArtifacts": [
{
"name": "image"
}
],
"inputArtifacts": []
},
{
"name": "ConfigSource",
"actionTypeId": {
"category": "Source",
"owner": "ThirdParty",
"provider": "GitHub",
"version": "1"
},
"runOrder": 1,
"configuration": {
"Branch": "master",
"OAuthToken": "****",
"Owner": "me",
"PollForSourceChanges": "false",
"Repo": "application-config"
},
"outputArtifacts": [
{
"name": "config"
}
],
"inputArtifacts": []
}
]
},
{
"name": "Deploy",
"actions": [
{
"name": "DeployBackend",
"actionTypeId": {
"category": "Deploy",
"owner": "AWS",
"provider": "CodeDeployToECS",
"version": "1"
},
"runOrder": 1,
"configuration": {
"AppSpecTemplateArtifact": "config",
"AppSpecTemplatePath": "production/appspec.yaml",
"ApplicationName": "my-codedeploy",
"DeploymentGroupName": "my-codedeploy-group",
"Image1ArtifactName": "image",
"Image1ContainerName": "IMAGE_NAME",
"TaskDefinitionTemplateArtifact": "config",
"TaskDefinitionTemplatePath": "production/taskdef.json"
},
"outputArtifacts": [],
"inputArtifacts": [
{
"name": "image"
},
{
"name": "config"
}
]
}
]
}
],
"version": 1
},
"metadata": {
"pipelineArn": "arn:aws:codepipeline:ap-northeast-1:123456789000:my-codepipeline",
"created": 1564107543.285,
"updated": 1564107543.285
}
}
我检查了 S3 中的压缩工件,它肯定包含 Github 存储库中的配置文件,位于 AppSpecTemplatePath
和 TaskDefinitionTemplatePath
指定的位置。
这里是appspec.yaml
的内容:
$ cat production/appspec.yaml
version: 0.0
Resources:
- TargetService:
Type: AWS::ECS::Service
Properties:
TaskDefinition: <TASK_DEFINITION>
LoadBalancerInfo:
ContainerName: "my-container"
ContainerPort: 80
据我所知,我们必须检查三件主要的事情,因为即使文件中存在语法问题,我们也可能会遇到异常
- 文件存在于正确的路径上,您已经验证过了。
- taskdef.json文件和appspec.yaml的内容都是正确的,没有任何语法错误,我们总是可以参考这个文档[1]。
- 还要确保图像具有正确的占位符“
”。
- 此外,如果这些选项不起作用,那么您可以尝试创建测试 public github 存储库,只需将 taskdef.json 和 appspec.yaml 文件放入其中并进行测试同样的事情。
[1] 教程:使用 Amazon ECR 源和 ECS-to-CodeDeploy 部署创建管道 - https://docs.aws.amazon.com/codepipeline/latest/userguide/tutorials-ecs-ecr-codedeploy.html
在广泛尝试之后,我偶然发现了一个我找不到的外语线程。该线程说了一些关于传递给操作的工件不能大于 3 MB 的内容。
我通过减小工件的大小解决了我的问题 (config
)。配置存储库在许多项目之间共享,通过将这些项目移动到另一个项目,我将压缩后的工件大小从 14 MB 减少到 3 kB。奇迹般地,一切正常。 AWS,如果您正在阅读本文,请向 ECS CodeDeploy 添加更多关于工件大小限制的文档,因为我没有看到任何关于此的提及,而且我无法使用此类一般错误消息调试此问题。
以为我对神器配置略知一二,找不到任何帮助。
我创建了另一个 codecommit 存储库,我只在其中存储了 appspec.yml 和 taskdef.json 文件并遵循了这个 aws userguide。这有效
之前我是在主项目回购中提交这些文件。但是每次它在部署状态下都失败并显示此消息。[尝试从...读取任务定义工件文件时出现异常]
我觉得这样在生产环境中是安全的 codebuild 和 codedeploy 在管道中是分开的。
我创建了工件管道并构建了管道。两条管道。至 blue/green ECS 服务。
我有一个代码管道,它使用 ECS 蓝/绿部署操作将 ECR 映像部署到 ECS 集群。该管道包含两个来源:一个用于使用 AWS ECR 操作的 ECR 映像,另一个用于使用第三方 Github 操作从 Github 获取配置。 ECR 操作输出一个 image
工件,而 Github 操作输出一个 config
工件。这两个工件都作为 ECS 蓝/绿部署操作的输入提供。
管道在 ECS 蓝/绿部署操作中失败并出现以下错误(从 AWS 控制台可见):
Invalid action configuration
Exception while trying to read the task definition artifact file from: config
这里是管道的结构(为了匿名编辑了一些细节):
$ aws codepipeline get-pipeline --name my-codepipeline
{
"pipeline": {
"name": "my-codepipeline",
"roleArn": "arn:aws:iam::123456789000:role/my-codepipeline-role",
"artifactStore": {
"type": "S3",
"location": "my-codepipeline-s3"
},
"stages": [
{
"name": "Source",
"actions": [
{
"name": "ImageSource",
"actionTypeId": {
"category": "Source",
"owner": "AWS",
"provider": "ECR",
"version": "1"
},
"runOrder": 1,
"configuration": {
"ImageTag": "latest",
"RepositoryName": "my-ecr"
},
"outputArtifacts": [
{
"name": "image"
}
],
"inputArtifacts": []
},
{
"name": "ConfigSource",
"actionTypeId": {
"category": "Source",
"owner": "ThirdParty",
"provider": "GitHub",
"version": "1"
},
"runOrder": 1,
"configuration": {
"Branch": "master",
"OAuthToken": "****",
"Owner": "me",
"PollForSourceChanges": "false",
"Repo": "application-config"
},
"outputArtifacts": [
{
"name": "config"
}
],
"inputArtifacts": []
}
]
},
{
"name": "Deploy",
"actions": [
{
"name": "DeployBackend",
"actionTypeId": {
"category": "Deploy",
"owner": "AWS",
"provider": "CodeDeployToECS",
"version": "1"
},
"runOrder": 1,
"configuration": {
"AppSpecTemplateArtifact": "config",
"AppSpecTemplatePath": "production/appspec.yaml",
"ApplicationName": "my-codedeploy",
"DeploymentGroupName": "my-codedeploy-group",
"Image1ArtifactName": "image",
"Image1ContainerName": "IMAGE_NAME",
"TaskDefinitionTemplateArtifact": "config",
"TaskDefinitionTemplatePath": "production/taskdef.json"
},
"outputArtifacts": [],
"inputArtifacts": [
{
"name": "image"
},
{
"name": "config"
}
]
}
]
}
],
"version": 1
},
"metadata": {
"pipelineArn": "arn:aws:codepipeline:ap-northeast-1:123456789000:my-codepipeline",
"created": 1564107543.285,
"updated": 1564107543.285
}
}
我检查了 S3 中的压缩工件,它肯定包含 Github 存储库中的配置文件,位于 AppSpecTemplatePath
和 TaskDefinitionTemplatePath
指定的位置。
这里是appspec.yaml
的内容:
$ cat production/appspec.yaml
version: 0.0
Resources:
- TargetService:
Type: AWS::ECS::Service
Properties:
TaskDefinition: <TASK_DEFINITION>
LoadBalancerInfo:
ContainerName: "my-container"
ContainerPort: 80
据我所知,我们必须检查三件主要的事情,因为即使文件中存在语法问题,我们也可能会遇到异常
- 文件存在于正确的路径上,您已经验证过了。
- taskdef.json文件和appspec.yaml的内容都是正确的,没有任何语法错误,我们总是可以参考这个文档[1]。
- 还要确保图像具有正确的占位符“
”。 - 此外,如果这些选项不起作用,那么您可以尝试创建测试 public github 存储库,只需将 taskdef.json 和 appspec.yaml 文件放入其中并进行测试同样的事情。
[1] 教程:使用 Amazon ECR 源和 ECS-to-CodeDeploy 部署创建管道 - https://docs.aws.amazon.com/codepipeline/latest/userguide/tutorials-ecs-ecr-codedeploy.html
在广泛尝试之后,我偶然发现了一个我找不到的外语线程。该线程说了一些关于传递给操作的工件不能大于 3 MB 的内容。
我通过减小工件的大小解决了我的问题 (config
)。配置存储库在许多项目之间共享,通过将这些项目移动到另一个项目,我将压缩后的工件大小从 14 MB 减少到 3 kB。奇迹般地,一切正常。 AWS,如果您正在阅读本文,请向 ECS CodeDeploy 添加更多关于工件大小限制的文档,因为我没有看到任何关于此的提及,而且我无法使用此类一般错误消息调试此问题。
以为我对神器配置略知一二,找不到任何帮助。
我创建了另一个 codecommit 存储库,我只在其中存储了 appspec.yml 和 taskdef.json 文件并遵循了这个 aws userguide。这有效
之前我是在主项目回购中提交这些文件。但是每次它在部署状态下都失败并显示此消息。[尝试从...读取任务定义工件文件时出现异常]
我觉得这样在生产环境中是安全的 codebuild 和 codedeploy 在管道中是分开的。
我创建了工件管道并构建了管道。两条管道。至 blue/green ECS 服务。