首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于ECS EC2蓝/绿部署的AWS EC2

用于ECS EC2蓝/绿部署的AWS EC2
EN

Stack Overflow用户
提问于 2021-09-13 03:58:58
回答 1查看 612关注 0票数 0

我试图使用CodePipeline和CodeDeploy一起部署产品,用于ECS、EC2、Blue/Green部署,但它在运行时总是返回此错误:

Container.image包含无效字符。

我认为这个错误来自于2个文件appspec.yamltaskdef.json,因为当我使用滚动部署时,它起了作用。

这是我的配置:

appspec.yaml

代码语言:javascript
复制
version: 0.0
Resources:
 - TargetService:
     Type: AWS::ECS::Service
     Properties:
       TaskDefinition: <TASK_DEFINITION>
       LoadBalancerInfo:
         ContainerName: "my-container"
         ContainerPort: 80

taskdef.json

代码语言:javascript
复制
{
  "ipcMode": null,
  "executionRoleArn": null,
  "containerDefinitions": [
    {
      "dnsSearchDomains": null,
      "environmentFiles": null,
      "logConfiguration": null,
      "entryPoint": null,
      "portMappings": [
        {
          "hostPort": 80,
          "protocol": "tcp",
          "containerPort": 80
        },
        {
          "hostPort": 8000,
          "protocol": "tcp",
          "containerPort": 8000
        }
      ],
      "command": null,
      "linuxParameters": null,
      "cpu": 0,
      "environment": [],
      "resourceRequirements": null,
      "ulimits": null,
      "dnsServers": null,
      "mountPoints": [],
      "workingDirectory": null,
      "secrets": null,
      "dockerSecurityOptions": null,
      "memory": null,
      "memoryReservation": null,
      "volumesFrom": [],
      "stopTimeout": null,
      "image": "<IMAGE1_NAME>",
      "startTimeout": null,
      "firelensConfiguration": null,
      "dependsOn": null,
      "disableNetworking": null,
      "interactive": null,
      "healthCheck": null,
      "essential": true,
      "links": null,
      "hostname": null,
      "extraHosts": null,
      "pseudoTerminal": null,
      "user": null,
      "readonlyRootFilesystem": null,
      "dockerLabels": null,
      "systemControls": null,
      "privileged": null,
      "name": "my-container"
    }
  ],
  "placementConstraints": [],
  "memory": "512",
  "taskRoleArn": null,
  "compatibilities": [
    "EXTERNAL",
    "EC2"
  ],
  "taskDefinitionArn": "<TASK_DEFINITION>",
  "family": "task-definition-name",
  "requiresAttributes": [
    {
      "targetId": null,
      "targetType": null,
      "value": null,
      "name": "com.amazonaws.ecs.capability.ecr-auth"
    }
  ],
  "pidMode": null,
  "requiresCompatibilities": [
    "EC2"
  ],
  "networkMode": null,
  "cpu": "512",
  "revision": 17,
  "status": "ACTIVE",
  "inferenceAccelerators": null,
  "proxyConfiguration": null,
  "volumes": []
}

我的配置如下所示:

https://www.proud2becloud.com/how-to-setup-a-continuous-deployment-pipeline-on-aws-for-ecs-blue-green-deployments/ https://docs.aws.amazon.com/codepipeline/latest/userguide/action-reference-ECSbluegreen.html

我试图找到解决这一问题的办法,但仍然没有效果。任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2021-09-13 21:13:49

有关这方面的文件通常很贫乏。

在任务定义中有:“图像”:"

在管道定义中,您需要一个文件,特别是名为imageDetail.json的文件。

它需要与以下完全一样,与相关的码头形象。

代码语言:javascript
复制
{"ImageURI":"???????.dkr.ecr.eu-west-1.amazonaws.com/???/???:????"}

如果您的管道使用ECR作为源来触发管道,那么它会为您创建它--我认为,如果不是您需要自己创建它。

例如,在我的管道中,我不使用ECR作为源代码,我编译代码,创建和推送映像,然后使用一个名为BuildDockerOutput的CodeBuild项目生成imageDetail.json

代码语言:javascript
复制
            - Name: BlueGreenDeploy
              InputArtifacts:
              - Name: PrepareCodeDeployOutputProd
              - Name: BuildDockerOutput
              Region: !Ref DeployRegion1
              ActionTypeId:
                Category: Deploy
                Owner: AWS
                Version: '1'
                Provider: CodeDeployToECS
              RoleArn: !Sub arn:aws:iam::${ProdAccountId}:role/CrossAccountsDeploymentRole
              Configuration:

                AppSpecTemplateArtifact: PrepareCodeDeployOutputProd
                AppSpecTemplatePath: appspec.json

                ApplicationName: !Ref ApplicationName
                DeploymentGroupName: !Ref ApplicationName
                
                TaskDefinitionTemplateArtifact: PrepareCodeDeployOutputProd
                TaskDefinitionTemplatePath: taskdef.json

                Image1ArtifactName: BuildDockerOutput
                Image1ContainerName: "IMAGE1_NAME"

工件BuildDockerOutput是CodeDeploy阶段的输入,它用来自imageDetail.json的ImageURI值替换占位符。

注意:我从不指定文件名。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69157099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档