ECS任务未启动-已停止(CannotPullContainerError:“在等待连接时取消了来自守护程序请求的错误响应”

时间:2019-11-04 03:29:30

标签: amazon-web-services amazon-ecs aws-fargate

我正在使用Fargate在ECS中启动任务,并且在挂起一小段时间后,它在STOPPED中出现了以下错误:

STOPPED (CannotPullContainerError: "Error response from daem

展开详细信息后,我会看到

STOPPED (CannotPullContainerError: "Error response from daemon: Get https://id.dkr.ecr.ap-southeast-2.amazonaws.com/v2/: net/http: request canceled while waiting for connection"

有原因

(Client.Timeout exceeded while awaiting headers)

因此,由于某种原因,该任务无法访问容器,但是我不确定缺少什么权限以及缺少什么资源。我已经阅读了一些,我发现的唯一真正的建议是将AssignPublicIp:ENABLED添加到AwsvpcConfiguration,但这没有帮助。

8 个答案:

答案 0 :(得分:8)

我设法通过在ECS上为使用我的服务创建的每个Fargate实例启用公共IP来解决此错误。

服务配置:

{
  ...
  "networkConfiguration": {
    "awsvpcConfiguration": {
      "subnets": [
        "my-subnets",
      ],
      "securityGroups": [
        "my-security-group"
      ],
      "assignPublicIp": "ENABLED" // <-- ENABLED HERE
    }
  },
}

答案 1 :(得分:4)

我找到了一个使用Fargate的解决方案。他们的文档指出:

  1. 如果您正在使用Amazon Elastic Compute Cloud(Amazon EC2)启动类型运行任务并且您的容器实例在私有子网中,或者您正在使用AWS Fargate启动类型在私有子网中运行任务,请在路由表中确认您的子网具有到NAT网关的路由。

这只是意味着

  1. 您必须找到要使用的VPC。
  2. 然后在拥有VPC的表中,将找到其主路由表。
  3. 打开路由表,然后确保您具有链接到Internet网关的条目。

看起来像igw-006b1917dc348d10d。拥有之后,您的vpc将可以访问Internet,并且能够获取您的ECR映像。

table example

来源:AWS docs

答案 2 :(得分:1)

Alan Sereb的解决方案对我有用。

AWS launched Fargate platform version 1.4.0之后,似乎可以使用配置了ECS Service的VPC来访问远程映像注册表(例如本例中的Gitlab注册表)。

因此,现在Fargate容器网络接口(以及ECS使用的VPC)需要具有Internet访问权限,因此必须在VPC路由表中设置Internet网关。

答案 3 :(得分:1)

当您无法拉出图像时,这是一个错误。它可能有很多原因,例如VPC内的权限和Internet访问。

如果您的VPC是“仅公用”子网,则需要添加Internet网关以进行Internet访问。 如果您的VPC仅是私有的,则您需要一个NAT网关,以便任务可以到达docker image进行拉取。

答案 4 :(得分:1)

原因是运行任务定义的服务没有连接到互联网。

我拥有它,因为我的 vpc 位于公共子网中,而该服务没有公共 IP 地址。

建立在 of this answer 之上,如果您使用 python cdk 创建您的服务,您可以在创建服务时指定服务中的任务是否应使用公共 IP 地址以及子网和安全组服务。

基本上,你应该有这样的东西.. :

service = ecs.FargateService(self,
                             "service-name",
                             cluster=cluster,
                             task_definition=task_definition,
                             service_name="service-name", 
                             assign_public_ip=True, # this is important
                             security_groups=[list of security groups , also important],
                             vpc_subnets=[list of subnets]
                             )

有关 FragateService 的更多信息,请参阅 this

如果您使用的是 cli,则可以使用以下命令更新您的服务:

aws ecs update-service --service service-name --cluster the_Cluster  --network-configuration "{
    \"awsvpcConfiguration\": {
      \"subnets\": [\"subnet-***\",\"subnet-****\",\"subnet-*****\"],
      \"securityGroups\": [\"sg-******\"],
      \"assignPublicIp\": \"ENABLED\"
    }

有关如何更新服务检查的详细信息 this

答案 5 :(得分:0)

所以看起来错误消息在某些时候已经改变:https://aws.amazon.com/premiumsupport/knowledge-center/ecs-pull-container-api-error-ecr/可以通过一些步骤来解决,但是提到了错误CannotPullContainerError: API error,它可能与CannotPullContainerError: "Error response from daem同义?

至少对我来说,创建一个AWS :: EC2 :: VPCEndpoint似乎使我更进一步。

答案 6 :(得分:0)

要使用 Fargate 拉取映像,ECS 使用必须具有策略 AmazonECSTaskExecutionRolePolicy 的任务执行角色(例如:ecsTaskExecutionRole)。

当从 ECR 外的私有存储库中提取图像时,此任务执行角色将需要在远程容器注册表中进行身份验证,因此 AWS 文档指出 https://docs.aws.amazon.com/AmazonECS/latest/developerguide/private-auth.html 它需要一个带有凭证的秘密,并且对于任务执行访问机密的角色,也是内联策略 secretsmanager:GetSecretValue

假设镜像可以在任何容器注册表(DockerHub、ECR、GitLab 等)中公开访问,可能还涉及其他事情。

  1. 确保您的 VPC 已将 DNS resolution 设置为 Enable,否则它将无法访问外部网址
  2. 确保运行 fargate 服务的子网可以访问互联网。如果它们是公共的,子网将有一个路由表,将流量重定向到任何 IP (0.0.0.0/0) 到 Internet 网关。否则,他们将不得不使用 NAT 网关作为跳转服务来访问互联网。
  3. 确保子网级别的 NACL 和所使用的安全组允许传入和传出流量。

顺便提一下,VPC 下有一项名为 Reachability Analyzer 的服务,可让您检查连接路径并检测 NACL 或路由表中的任何错误。例如,您可以验证任何子网中的网络接口是否可以访问 Internet 网关。它用作跟踪路由。

答案 7 :(得分:0)

我也遇到了同样的问题。经过调查,我了解到何时禁用 Auto-assign public IP 我们必须通过与 NAT 网关关联的私有子网将您的服务连接到公共互联网。

这里的步骤:

1.创建 2 - 3 个私有子网

enter image description here

2.创建新的路由表并与这些子网关联 enter image description here

3.创建 NAT 网关 enter image description here

-- 分配您的私有子网之一 enter image description here

-- 使用上述子网创建服务 enter image description here