Saturday, October 8, 2022

[SOLVED] AWS CloudFormation service was unable to place a task because no container instance met all of its requirements

Issue

I am trying to create an ECS using a ci/cd pipeline. I have defined TaskDefination and ECSService along with VPC.

The cloudformation created the cluster and got stuck ECSService creation.

I went to the ECSService event, I found the error 'service my-service-name was unable to place a task because no container instance met all of its requirements. Reason: No Container Instances were found in your cluster. For more information, see the Troubleshooting section.'

enter image description here

Am I missing someting in my pipeline?

Here is my TaskDefination and ECSService

AWSTemplateFormatVersion: 2010-09-09
Description: The CloudFormation template for the Fargate ECS Cluster.

Parameters:
  Stage:
    Type: String
  ContainerPort:
    Type: Number
  ImageURI:
    Type: String

Resources:

  # Create an ECS Cluster
  Cluster:
    Type: AWS::ECS::Cluster
    Properties:
      ClusterName: !Join ['-', [!Ref Stage, !Ref 'AWS::AccountId', 'Cluster']]

  # Create a VPC
  VPC:
    Type: AWS::EC2::VPC
    Properties: 
      CidrBlock: 10.0.0.0/16
      EnableDnsHostnames: True
      EnableDnsSupport: True

  # Create a Subnet
  SubnetA:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: 10.0.0.0/24
      VpcId: !Ref VPC
      AvailabilityZone: !Join ['', [!Ref "AWS::Region", 'a']]

  # Create a Subnet
  SubnetB:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: 10.0.1.0/24
      VpcId: !Ref VPC
      AvailabilityZone: !Join ['', [!Ref "AWS::Region", 'b']]

  # Create Access Role for ECS-Tasks
  ExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Join ['-', [!Ref Stage, !Ref 'AWS::AccountId', 'ExecutionRole']]
      AssumeRolePolicyDocument:
        Statement:
          - Effect: Allow
            Principal:
              Service: ecs-tasks.amazonaws.com
            Action: 'sts:AssumeRole'
      ManagedPolicyArns:
        - 'arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy'

  # Create a TaskDefinition with container details
  TaskDefinition:
    Type: AWS::ECS::TaskDefinition
    Properties:
      NetworkMode: awsvpc
      RequiresCompatibilities:
        - 'EC2'
      TaskRoleArn: !Ref ExecutionRole
      ExecutionRoleArn: !Ref ExecutionRole
      ContainerDefinitions:
        - Name: !Join ['-', [!Ref Stage, !Ref 'AWS::AccountId', 'Container']]
          Image: !Ref ImageURI
          Cpu: 1024
          Memory: 1024
          PortMappings:
            - ContainerPort: !Ref ContainerPort
              HostPort: !Ref ContainerPort

  # Create an ECS Service and add created Cluster, TaskDefintion, Subnets, TargetGroup and SecurityGroup
  ECSService:
    Type: AWS::ECS::Service
    Properties:
      ServiceName: !Join ['-', [!Ref Stage, !Ref 'AWS::AccountId', 'ECSService']]
      Cluster: !Ref Cluster
      TaskDefinition: !Ref TaskDefinition
      DesiredCount: 1
      LaunchType: EC2
      NetworkConfiguration: 
        AwsvpcConfiguration:
          Subnets:
            - !Ref SubnetA
            - !Ref SubnetB

I have tried answers of already posted questions. In most of cases people get this error on AWS web interface. For me ECS is working using Web interface. I am not able to get it working using my pipeline.


Solution

You have to explicitly provision EC2 container instances for your ECS tasks. Your current TF code does not create any EC2 instances for used by your ECS cluster and tasks.



Answered By - Marcin
Answer Checked By - David Marino (WPSolving Volunteer)