【问题标题】:Invalid action configuration: Exception while trying to read the task definition artifact file无效的操作配置:尝试读取任务定义工件文件时出现异常
【发布时间】:2019-12-04 13:31:18
【问题描述】:

我有一个 Codepipeline,它使用 ECS 蓝/绿部署操作将 ECR 映像部署到 ECS 集群。该管道包含两个源:一个用于使用 AWS ECR 操作的 ECR 映像,另一个用于使用第三方 Github 操作从 Github 获取配置。 ECR 操作输出 image 工件,而 Github 操作输出 config 工件。这两个工件都作为 ECS 蓝/绿部署操作的输入提供。

管道在 ECS 蓝/绿部署操作中失败,并出现以下错误(从 AWS 控制台可见):

动作配置无效

尝试从以下位置读取任务定义工件文件时出现异常: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 存储库中 AppSpecTemplatePathTaskDefinitionTemplatePath 指定位置的配置文件。

这里是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

【问题讨论】:

    标签: amazon-web-services aws-codepipeline


    【解决方案1】:

    据我了解,我们必须检查三个主要事项,即使文件中存在语法问题,我们也可能会遇到异常

    1. 文件存在于正确的路径上,您已经验证了这一点。
    2. taskdef.json 文件和 appspec.yaml 的内容都是正确的,没有任何语法错误,我们可以随时参考此文档 [1]。
    3. 还要确保图片具有正确的占位符“”。
    4. 此外,如果这些选项不起作用,那么您可以尝试在测试公共 github 存储库中创建,只需将 taskdef.json 和 appspec.yaml 文件放入其中并测试相同的东西。

    [1] 教程:使用 Amazon ECR 源和 ECS-to-CodeDeploy 部署创建管道 - https://docs.aws.amazon.com/codepipeline/latest/userguide/tutorials-ecs-ecr-codedeploy.html

    【讨论】:

    • 感谢马卡尼的详细解答。但是,您的任何建议都不适合我。我已检查该文件是否存在于压缩的工件文件中。 taskdef.json 文件适用于单独的 ECS 部署设置,appspec.yaml 是从 AWS 文档中复制的。最后这是一个不同的问题 - 请参阅我的答案。我相信其他人可能会发现您的回答很有用。
    • 谢谢 Krismath...我不知何故错过了提及大小,但是有 3 MB 的大小限制,其背后的原因是 CodeDeploy 只希望源存储库中的 appspec 和 taskdef 文件和 3 MB 限制是这两个文件,我完全同意文档中遗漏了这部分
    【解决方案2】:

    在大量尝试之后,我偶然发现了一个我找不到的外语线程。该线程说有关传递给操作的工件不能大于 3 MB。

    我通过减小工件 (config) 的大小解决了我的问题。配置存储库在许多项目之间共享,通过将这些项目移动到另一个项目,我将压缩的工件大小从 14 MB 减少到 3 kB。奇迹般地,一切正常。 AWS 如果您正在阅读此内容,请向 ECS CodeDeploy 添加更多有关工件大小限制的文档,因为我没有看到任何关于此的提及,并且我无法通过这样的一般错误消息来调试此问题。

    【讨论】:

    • This article 引用了 3MB 的大小限制(不确定是否是在您发布此内容后制作的)。
    【解决方案3】:

    以为我对工件配置了解一点,但找不到任何帮助。

    我创建了另一个 codecommit 存储库,我只存储了 appspec.yml 和 taskdef.json 文件,并遵循了这个 aws userguide。这有效

    以前我是用主项目 repo 提交这些文件。但是每次它在部署状态下都失败并显示此消息。[尝试从...读取任务定义工件文件时出现异常]

    在生产环境中,我觉得这种方式很安全,codebuild 和 codedeploy 在管道中是分开的。

    我创建了工件管道并构建了管道。两条管道。转蓝/绿 ECS 服务。

    【讨论】:

    • 这不是必需的,您可以在主项目中拥有 appspec.yaml 和 taskdef.json,只要您的 buildspec.yml 生成正确的工件,请在此处查看更多信息:stackoverflow.com/a/62037921/843898
    猜你喜欢
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    相关资源
    最近更新 更多