在我目前的设置中,我使用cloudformation来设置环境。到目前为止,除了任务集,所有配置的步骤似乎都能正常工作。我使用AWS ECR repo上的镜像来启动Fargate实例,并将其与服务一起放入一个新的集群中。
当我创建堆栈时,所有的步骤都成功了,但服务的创建却永远停留在 "CREATE_IN_PROGRESS"。当我查看已创建的服务以及更具体的任务时,我发现cloudformation无法获取映像。错误如下。
STOPPED (CannotPullContainerError: Error response from daem)
现在,当我在所述集群上使用相同的图像手动尝试到一个实例时,它工作得很好。经过一些谷歌搜索,我发现了某些解决方案。我已经实现了所有的解决方案,例如。
请注意,任务确实被创建了,而且它确实收到了一个公共和私人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"
]
},
以上都没有提供解决方案。我愿意接受任何建议解决方案
从提供的CFN模板中,我可以得出以下结论 MySubPublic
有 上不了网.
具体来说,我看到你正在创建以下VPC相关资源。
AWS::EC2::VPC
AWS::EC2::InternetGateway
AWS::EC2::Subnet
AWS::EC2::SecurityGroup
但是... 问题 是缺乏的。
AWS::EC2::VPCGatewayAttachment
这将连接 InternetGateway
对你的 VPC
的定义 AWS::EC2::RouteTable
和 AWS::EC2::Route
它将用于制作您的 MySubPublic
输送到 AWS::EC2::InternetGateway
.
在子网中启用互联网接入的一般步骤如下: 1. 此处:
附 互联网网关到您的VPC。
添加一条路由到你的子网的 航线表 的子网,将上网流量引导到互联网网关。如果一个子网与路由表相关联,而该路由表有一条通往互联网网关的路由,则称为公共子网。如果一个子网与一个没有通往互联网网关的路由表相关联,它就被称为私有子网。
确保子网中的实例有一个全球唯一的IP地址(公共IPv4 地址、弹性 IP 地址或 IPv6 地址)。)
确保你的网络 访问控制清单和安全组 规则允许相关的流量流入和流出你的实例。