Amazon web services AWS ECS无法放置任务,因为没有容器实例满足其所有要求

Amazon web services AWS ECS无法放置任务,因为没有容器实例满足其所有要求,amazon-web-services,docker,.net-core,amazon-ecs,Amazon Web Services,Docker,.net Core,Amazon Ecs,我使用的是.NET核心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 #

我使用的是.NET核心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服务事件选项卡中看到此错误

服务cld虚拟测试无法放置任务,因为没有容器实例满足其所有要求。原因:在群集中未找到容器实例


我终于弄明白了。下面的错误消息表明此集群中没有EC2,因此无法启动任何容器。我们没有使用Fargate

服务cld虚拟测试无法放置任务,因为没有容器实例满足其所有要求。原因:在群集中未找到容器实例

要将EC2注册到集群,您需要遵循这篇AWS文章。

请注意,您启动的EC2需要具有以下用户数据才能注册

#!/bin/bash
echo ECS_CLUSTER=your_cluster_name >> /etc/ecs/ecs.config
一旦完成上述操作,您就不会看到关于“无容器”的错误。但是,如果您像我一样,在模板中有splunk日志部分。您将遇到另一个问题,即没有容器可以用于任务,因为它缺少一个属性。这是一条非常模糊的消息,属性可以是任务定义页面底部列出的任何内容

在我的情况下,这是splunk日志。splunk驱动程序需要添加到EC2实例中。因为我后来发现我们不再需要splunk,所以我删除了splunk部分。但是如果您想这样做,您可能需要将下面的行添加到您的用户数据中

ECS_AVAILABLE_LOGGING_DRIVERS=["splunk","awslogs"]

我希望这对其他人有所帮助。

AWS ECS有两种启动类型配置:

  • 法尔盖特
  • 远门+EC2
在这两种情况下,您都无法访问基础资源


因此,可能是在启动类型配置中出现iusse的原因您无法启动任务,否则您可以从ecs仪表板选择启动类型并选择任务定义。

我也遇到了相同的错误,但我使用ecs cli创建群集、任务和服务,因此,已经完成了将EC2实例手动注册到集群的工作(正如sheepinwild的回答所建议的那样)


对我们来说,解决问题的方法是确保分配给实例的IAM角色具有AWS管理策略
AmazonEC2ContainerServiceforEC2Role
。我只是在与另一个ECS实例成功运行的情况下发现了这一点。如果您使用的是ecs cli,那么这就是您传递的角色,就像这样
ecs cli up--这里的实例角色
。或者,您也可以传递
--capability iam
,这将创建一个具有正确策略的新角色,并为您的实例分配它。有关的详细信息。

您正在使用Splunk驱动程序进行日志复制。您是否已确保您的
/etc/ecs.config
具有包含
ecs\u可用\u日志记录\u驱动程序=[“splunk”,“awslogs”]。
?@Imran感谢Imran。你的观点并不是对这个问题的直接回答,而是针对解决这个问题后我面临的下一个问题。我会把答案贴在下面。