Cloudformation脚本任务集无法从ECR中提取图像

问题描述 投票:0回答:1

在我目前的设置中,我使用cloudformation来设置环境。到目前为止,除了任务集,所有配置的步骤似乎都能正常工作。我使用AWS ECR repo上的镜像来启动Fargate实例,并将其与服务一起放入一个新的集群中。

当我创建堆栈时,所有的步骤都成功了,但服务的创建却永远停留在 "CREATE_IN_PROGRESS"。当我查看已创建的服务以及更具体的任务时,我发现cloudformation无法获取映像。错误如下。

STOPPED (CannotPullContainerError: Error response from daem)

现在,当我在所述集群上使用相同的图像手动尝试到一个实例时,它工作得很好。经过一些谷歌搜索,我发现了某些解决方案。我已经实现了所有的解决方案,例如。

  • 创建一个带有安全组的网络,允许所有目的地的出站流量。
  • 在awsvpc配置中设置AssignPublicIp标志为'ENABLED'。
  • 将用户执行角色设置为我在手动创建时使用的角色。

请注意,任务确实被创建了,而且它确实收到了一个公共和私人IP地址。另外,我还试着扔掉ECR实例,用新的名称创建一个新的实例(当然也标记并推送了图像)。

下面的片段是我的服务和任务集定义(重命名了一些敏感信息)。

    "MyVPC": {
        "Type": "AWS::EC2::VPC",
        "Properties": {
            "CidrBlock": "10.0.1.0/16",
            "Tags": [
                {"Key":"Name", "Value":"MyVPC"
                }
            ]
        },
    },
    "MyInternetGateway" : {
      "Type" : "AWS::EC2::InternetGateway",
          "Properties" : {
          }
       },
    "MySubPublic": {
        "Type": "AWS::EC2::Subnet",
        "Properties": {
            "AvailabilityZone": "eu-central-1a",
            "CidrBlock": "10.0.1.0/28",
            "MapPublicIpOnLaunch": true,
            "VpcId": {
                "Ref": "MyVPC"
            }
        },
        "DependsOn": "MyInternetGateway"
    },
    "MySecGroup":
            {
      "Type" : "AWS::EC2::SecurityGroup",
      "Properties" : {
          "GroupDescription" : "My security group for all incoming and outgoing.",
          "GroupName" : "MySecGroup",
          "SecurityGroupEgress" : [ {
              "CidrIp" : "0.0.0.0/0",
              "Description" : "Allow machine to reach internet.",
              "FromPort" : -1,
              "IpProtocol" : -1,
              "ToPort" : -1
            } ],
          "SecurityGroupIngress" : [ {
              "CidrIp" : "0.0.0.0/0",
              "Description" : "Allow machine to be reached from the entire internet.",
              "FromPort" : -1,
              "IpProtocol" : -1,
              "ToPort" : -1
            } ],
          "VpcId" : {"Ref": "MyVPC"}
        },
        "DependsOn": "MyVPC"
    },
    "MyCluster": {
        "Type": "AWS::ECS::Cluster",
        "Properties": {
            "ClusterName": "MyCluster"
        },
        "DependsOn": [
            "MyVPC"
        ]
    },
    "MyDockerTask": {
        "Type": "AWS::ECS::TaskDefinition",
        "Properties": {
            "ContainerDefinitions": [
                {
                    "Cpu": 512,
                    "Image": "<NRHERE>.dkr.ecr.eu-central-1.amazonaws.com/mysqs",
                    "Memory": 1024,
                    "MemoryReservation": 1024,
                    "Name": "MyContainer"
                }
            ],
            "Cpu": "512",
            "ExecutionRoleArn": "arn:aws:iam::<NRHERE>:role/ecsTaskExecutionRole",
            "Family": "MyFam",
            "Memory": "1024",
            "NetworkMode": "awsvpc",
            "RequiresCompatibilities": [
                "FARGATE",
                "EC2"
            ],
            "TaskRoleArn": "arn:aws:iam::<NRHERE>:role/ecsTaskExecutionRole"
        },
    },
    "MyService": {
      "Type" : "AWS::ECS::Service",
      "Properties" : {
          "Cluster" : {"Fn::GetAtt": ["MyCluster", "Arn"]},
          "DesiredCount" : 1,
          "LaunchType" : "FARGATE",
          "NetworkConfiguration" : {
             "AwsvpcConfiguration" : {
                  "AssignPublicIp" : "ENABLED",
                  "SecurityGroups" : [ {"Fn::GetAtt": ["MySecGroup", "GroupId"]} ],
                  "Subnets" : [ {"Ref": "MySubPublic"}]
                }
          },
          "SchedulingStrategy" : "REPLICA",
          "ServiceName" : "MyService",
          "TaskDefinition": {"Ref": "MyDockerTask"}
        },
        "DependsOn": "MySubPublic"
    },
    "MyTaskSet": {
        "Type": "AWS::ECS::TaskSet",
        "Properties": {
            "Cluster": {
                "Ref": "MyCluster"
            },
            "LaunchType": "FARGATE",
            "NetworkConfiguration" : {
                 "AwsvpcConfiguration" : {
                      "AssignPublicIp" : "ENABLED",
                      "SecurityGroups" : [ {"Fn::GetAtt": ["MySecGroup", "GroupId"]} ],
                      "Subnets" : [ {"Ref": "MySubPublic"}]
                    }
              },
            "Service": {"Ref": "MyService"},
            "TaskDefinition": {
                "Ref": "MyDockerTask"
            }
        },
        "DependsOn": [
            "MyCluster"
        ]
    },

以上都没有提供解决方案。我愿意接受任何建议解决方案

amazon-web-services amazon-cloudformation
1个回答
1
投票

从提供的CFN模板中,我可以得出以下结论 MySubPublic上不了网.

具体来说,我看到你正在创建以下VPC相关资源。

  • AWS::EC2::VPC
  • AWS::EC2::InternetGateway
  • AWS::EC2::Subnet
  • AWS::EC2::SecurityGroup

但是... 问题 是缺乏的。

  • AWS::EC2::VPCGatewayAttachment 这将连接 InternetGateway 对你的 VPC

  • 的定义 AWS::EC2::RouteTableAWS::EC2::Route 它将用于制作您的 MySubPublic 输送到 AWS::EC2::InternetGateway.

在子网中启用互联网接入的一般步骤如下: 1. 此处:

互联网网关到您的VPC。

添加一条路由到你的子网的 航线表 的子网,将上网流量引导到互联网网关。如果一个子网与路由表相关联,而该路由表有一条通往互联网网关的路由,则称为公共子网。如果一个子网与一个没有通往互联网网关的路由表相关联,它就被称为私有子网。

确保子网中的实例有一个全球唯一的IP地址(公共IPv4 地址、弹性 IP 地址或 IPv6 地址)。)

确保你的网络 访问控制清单和安全组 规则允许相关的流量流入和流出你的实例。

© www.soinside.com 2019 - 2024. All rights reserved.