AWS ECS 无法放置任务,因为没有容器实例满足其所有要求
AWS ECS unable to place a task because no container instance met all of its requirements
我正在使用 .NET Core WEBAPI 及以下 Dockerfile
FROM microsoft/dotnet:sdk AS build-env
WORKDIR /app
# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore
# Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out
# Build runtime image
FROM microsoft/dotnet:aspnetcore-runtime
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "DummyService.dll"]
在我的 cloudformation 模板中,ECS 部分如下所示
dummyWebApiEcsTaskDefinition:
Type: AWS::ECS::TaskDefinition
Properties:
Family: !Ref AWS::StackName
TaskRoleArn: !GetAtt dummyWebApiIamRole.Arn
ContainerDefinitions:
- Name: !Ref AWS::StackName
Image: MY IMAGE URL
DnsSearchDomains:
- !Join [".", [{"Fn::ImportValue": !Sub "${accountStackName}-${AWS::Region}-envName"}, "connected", !If [chinaPartition, "TEST", "CORP"], "cloud"]]
LogConfiguration:
LogDriver: splunk
Options:
splunk-token: {"Fn::ImportValue": !Sub "${splunkHECStackName}-${AWS::Region}-SplunkHECToken"}
splunk-url: "http://splunk-forwarder:8088"
splunk-insecureskipverify: True
tag: !Ref AWS::StackName
splunk-format: json
splunk-source: !Ref AWS::StackName
splunk-sourcetype: AWS:ECS
EntryPoint: []
PortMappings:
- ContainerPort: 5000
Command: []
Cpu: 0
Environment:
- Name: BindAddress
Value: http://0.0.0.0:5000
- Name: MinLogLevel
Value: !If [isProduction, "Information", "Debug"]
Ulimits: []
DnsServers: []
MountPoints: []
DockerSecurityOptions: []
Memory: 512
VolumesFrom: []
Essential: true
ExtraHosts: []
ReadonlyRootFilesystem: false
DockerLabels: {}
Privileged: false
dummyEcsService:
Type: AWS::ECS::Service
DependsOn:
- dummyWebApiIamRole
- dummyInternalAlb
- dummyAlbTargetGroup
Properties:
Cluster:
Fn::ImportValue: !Sub "cld-core-ecs-${AWS::Region}-ECSCluster"
DeploymentConfiguration:
MaximumPercent: 200
MinimumHealthyPercent: 50
DesiredCount: 2
LoadBalancers:
- ContainerName: !Ref AWS::StackName
ContainerPort: 5000
TargetGroupArn: !Ref dummyAlbTargetGroup
PlacementStrategies:
- Type: spread
Field: attribute:ecs.availability-zone
TaskDefinition: !Ref dummyWebApiEcsTaskDefinition
ServiceName: !Ref AWS::StackName
Role: !Sub "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/aws-service-role/ecs.amazonaws.com/AWSServiceRoleForECS"
部署无法完成,我可以在 ECS 服务事件选项卡中看到此错误
service cld-dummy-test was unable to place a task because no container instance met all of its requirements. Reason: No Container Instances were found in your cluster.
我终于弄明白了。下面的错误消息表示此集群中没有 EC2,因此无法启动任何容器。我们没有使用 Fargate。
service cld-dummy-test was unable to place a task because no container instance met all of its requirements. Reason: No Container Instances were found in your cluster.
要将 EC2 注册到集群,您需要遵循这篇 AWS 文章。
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/launch_container_instance.html
请注意,您启动的 EC2 需要具有以下用户数据才能注册。
#!/bin/bash
echo ECS_CLUSTER=your_cluster_name >> /etc/ecs/ecs.config
完成上述操作后,您应该不会看到有关 "no container" 的错误。但是,如果您像我一样,在模板中包含 splunk 日志记录部分。您将遇到一个不同的问题,它说没有容器可以用于该任务,因为它缺少一个属性。这是一条非常模糊的消息,属性可以是任务定义页面底部列出的任何内容。
在我的例子中,它是 splunk 日志记录。需要将 splunk 驱动程序添加到 EC2 实例。因为后来我发现我们不再需要 splunk,所以我删除了 splunk 部分。但是如果你想这样做,你可能需要将下面这行添加到你的用户数据中。
ECS_AVAILABLE_LOGGING_DRIVERS=["splunk","awslogs"]
我希望这对某人有所帮助。
AWS ECS 有两种启动类型配置:
- 法盖特
- Fargate + EC2
在这两种情况下,您都无法访问基础资源。
所以可能是启动类型配置中的 iusse 导致您无法启动任务,否则您可以从 ecs 仪表板选择启动类型并选择任务定义。
我也有同样的错误,但我使用 ecs-cli 创建集群、任务和服务,所以手动将 EC2 实例注册到集群已经完成(如 sheepinwild 的回答所建议的) .
为我们解决问题的是确保分配给实例的 IAM 角色具有 AWS 托管策略 AmazonEC2ContainerServiceforEC2Role
。我只是发现了这一点,因为我们有另一个 ECS 实例 运行 成功地与我进行了比较。如果您使用的是 ecs-cli,这就是您传递的角色 ecs-cli up --instance-role HERE
。或者,您也可以传递 --capability-iam
,这将创建一个具有正确策略的新角色并将其分配给您的实例。有关 AWS KB for ecs-cli.
的更多信息
我正在使用 .NET Core WEBAPI 及以下 Dockerfile
FROM microsoft/dotnet:sdk AS build-env
WORKDIR /app
# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore
# Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out
# Build runtime image
FROM microsoft/dotnet:aspnetcore-runtime
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "DummyService.dll"]
在我的 cloudformation 模板中,ECS 部分如下所示
dummyWebApiEcsTaskDefinition:
Type: AWS::ECS::TaskDefinition
Properties:
Family: !Ref AWS::StackName
TaskRoleArn: !GetAtt dummyWebApiIamRole.Arn
ContainerDefinitions:
- Name: !Ref AWS::StackName
Image: MY IMAGE URL
DnsSearchDomains:
- !Join [".", [{"Fn::ImportValue": !Sub "${accountStackName}-${AWS::Region}-envName"}, "connected", !If [chinaPartition, "TEST", "CORP"], "cloud"]]
LogConfiguration:
LogDriver: splunk
Options:
splunk-token: {"Fn::ImportValue": !Sub "${splunkHECStackName}-${AWS::Region}-SplunkHECToken"}
splunk-url: "http://splunk-forwarder:8088"
splunk-insecureskipverify: True
tag: !Ref AWS::StackName
splunk-format: json
splunk-source: !Ref AWS::StackName
splunk-sourcetype: AWS:ECS
EntryPoint: []
PortMappings:
- ContainerPort: 5000
Command: []
Cpu: 0
Environment:
- Name: BindAddress
Value: http://0.0.0.0:5000
- Name: MinLogLevel
Value: !If [isProduction, "Information", "Debug"]
Ulimits: []
DnsServers: []
MountPoints: []
DockerSecurityOptions: []
Memory: 512
VolumesFrom: []
Essential: true
ExtraHosts: []
ReadonlyRootFilesystem: false
DockerLabels: {}
Privileged: false
dummyEcsService:
Type: AWS::ECS::Service
DependsOn:
- dummyWebApiIamRole
- dummyInternalAlb
- dummyAlbTargetGroup
Properties:
Cluster:
Fn::ImportValue: !Sub "cld-core-ecs-${AWS::Region}-ECSCluster"
DeploymentConfiguration:
MaximumPercent: 200
MinimumHealthyPercent: 50
DesiredCount: 2
LoadBalancers:
- ContainerName: !Ref AWS::StackName
ContainerPort: 5000
TargetGroupArn: !Ref dummyAlbTargetGroup
PlacementStrategies:
- Type: spread
Field: attribute:ecs.availability-zone
TaskDefinition: !Ref dummyWebApiEcsTaskDefinition
ServiceName: !Ref AWS::StackName
Role: !Sub "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/aws-service-role/ecs.amazonaws.com/AWSServiceRoleForECS"
部署无法完成,我可以在 ECS 服务事件选项卡中看到此错误
service cld-dummy-test was unable to place a task because no container instance met all of its requirements. Reason: No Container Instances were found in your cluster.
我终于弄明白了。下面的错误消息表示此集群中没有 EC2,因此无法启动任何容器。我们没有使用 Fargate。
service cld-dummy-test was unable to place a task because no container instance met all of its requirements. Reason: No Container Instances were found in your cluster.
要将 EC2 注册到集群,您需要遵循这篇 AWS 文章。 https://docs.aws.amazon.com/AmazonECS/latest/developerguide/launch_container_instance.html
请注意,您启动的 EC2 需要具有以下用户数据才能注册。
#!/bin/bash
echo ECS_CLUSTER=your_cluster_name >> /etc/ecs/ecs.config
完成上述操作后,您应该不会看到有关 "no container" 的错误。但是,如果您像我一样,在模板中包含 splunk 日志记录部分。您将遇到一个不同的问题,它说没有容器可以用于该任务,因为它缺少一个属性。这是一条非常模糊的消息,属性可以是任务定义页面底部列出的任何内容。
在我的例子中,它是 splunk 日志记录。需要将 splunk 驱动程序添加到 EC2 实例。因为后来我发现我们不再需要 splunk,所以我删除了 splunk 部分。但是如果你想这样做,你可能需要将下面这行添加到你的用户数据中。
ECS_AVAILABLE_LOGGING_DRIVERS=["splunk","awslogs"]
我希望这对某人有所帮助。
AWS ECS 有两种启动类型配置:
- 法盖特
- Fargate + EC2
在这两种情况下,您都无法访问基础资源。
所以可能是启动类型配置中的 iusse 导致您无法启动任务,否则您可以从 ecs 仪表板选择启动类型并选择任务定义。
我也有同样的错误,但我使用 ecs-cli 创建集群、任务和服务,所以手动将 EC2 实例注册到集群已经完成(如 sheepinwild 的回答所建议的) .
为我们解决问题的是确保分配给实例的 IAM 角色具有 AWS 托管策略 AmazonEC2ContainerServiceforEC2Role
。我只是发现了这一点,因为我们有另一个 ECS 实例 运行 成功地与我进行了比较。如果您使用的是 ecs-cli,这就是您传递的角色 ecs-cli up --instance-role HERE
。或者,您也可以传递 --capability-iam
,这将创建一个具有正确策略的新角色并将其分配给您的实例。有关 AWS KB for ecs-cli.