Ludo
Ludo

Reputation: 5280

Container launches with EC2 instead of FARGATE launch type

I have written a cloudformation JSON file from scratch, but looks like there are several issues on it...

What I observe is basically 2 issues.

Fisrt, my ECS Service is in EC2 launch type instead of FARGATE, here is what the dashboard says:

Status ACTIVE
Registered container instances 0
Pending tasks count 0 Fargate, 0 EC2
Running tasks count 0 Fargate, 0 EC2
Active service count 0 Fargate, 1 EC2
Draining service count  0 Fargate, 0 EC2

The second issue is in cloudformation itself, it get stuck at the service CREATE_IN_PROGRESS for hours, then it says that the service "cannot be stabilize".

If I understand what the FARGATE mode enable, we don't need to create an AutoScalingGroup, neither a LaunchConfiguration component, right?

Here is my full JSON:

{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "test",
  "Resources": {
    "InstanceSecurityGroupOpenWeb": {
      "Type" : "AWS::EC2::SecurityGroup",
      "Properties" : {
        "GroupName" : "test-open-web",
        "GroupDescription" : "Allow http to client host",
        "VpcId" : "vpc-89a8cfef",
        "SecurityGroupIngress" : [{
          "IpProtocol" : "tcp",
          "FromPort" : "80",
          "ToPort" : "80",
          "CidrIp" : "0.0.0.0/0"
        }],
        "SecurityGroupEgress" : [{
          "IpProtocol" : "tcp",
          "FromPort" : "80",
          "ToPort" : "80",
          "CidrIp" : "0.0.0.0/0"
        }]
      }
    },

    "InstanceSecurityGroupOpenFull": {
      "Type" : "AWS::EC2::SecurityGroup",
      "Properties" : {
        "GroupName" : "test-open-full",
        "GroupDescription" : "Allow http to client host",
        "VpcId" : "vpc-89a8cfef",
        "SecurityGroupIngress" : [{
          "IpProtocol" : "tcp",
          "FromPort" : "0",
          "ToPort" : "65535",
          "CidrIp" : "0.0.0.0/0"
        }],
        "SecurityGroupEgress" : [{
          "IpProtocol" : "tcp",
          "FromPort" : "80",
          "ToPort" : "80",
          "CidrIp" : "0.0.0.0/0"
        }]
      }
    },

    "LoadBalancer" : {
      "Type": "AWS::ElasticLoadBalancingV2::LoadBalancer",
      "DependsOn": [
        "InstanceSecurityGroupOpenWeb",
        "InstanceSecurityGroupOpenFull"
      ],
      "Properties": {
        "Name": "testalb",
        "Scheme" : "internal",
        "Subnets" : [
          "subnet-aaaaaaaa",
          "subnet-bbbbbbbb",
          "subnet-cccccccc"
        ],
        "LoadBalancerAttributes" : [
          { "Key" : "idle_timeout.timeout_seconds", "Value" : "50" }
        ],
        "SecurityGroups": [
          { "Ref": "InstanceSecurityGroupOpenWeb" },
          { "Ref" : "InstanceSecurityGroupOpenFull" }
        ]
      }
    },

    "TargetGroup" : {
      "Type" : "AWS::ElasticLoadBalancingV2::TargetGroup",
      "DependsOn": [
        "LoadBalancer"
      ],
      "Properties" : {
        "Name": "web",
        "Port": 3000,
        "TargetType": "ip",
        "Protocol": "HTTP",
        "HealthCheckIntervalSeconds": 30,
        "HealthCheckProtocol": "HTTP",
        "HealthCheckTimeoutSeconds": 10,
        "HealthyThresholdCount": 4,
        "Matcher" : {
          "HttpCode" : "200"
        },
        "TargetGroupAttributes": [{
          "Key": "deregistration_delay.timeout_seconds",
          "Value": "20"
        }],
        "UnhealthyThresholdCount": 3,
        "VpcId": "vpc-aaaaaaaa"
      }
    },

    "LoadBalancerListener": {
      "Type": "AWS::ElasticLoadBalancingV2::Listener",
      "DependsOn": [
        "TargetGroup"
      ],
      "Properties": {
        "DefaultActions": [{
          "Type": "forward",
          "TargetGroupArn": {
            "Ref": "TargetGroup"
          }
        }],
        "LoadBalancerArn": {
          "Ref": "LoadBalancer"
        },
        "Port": 80,
        "Protocol": "HTTP"
      }
    },

    "EcsCluster": {
      "Type": "AWS::ECS::Cluster",
      "DependsOn": [
        "LoadBalancerListener"
      ],
      "Properties": {
        "ClusterName": "test"
      }
    },

    "EcsTaskRole": {
      "Type":"AWS::IAM::Role",
      "Properties":{
        "AssumeRolePolicyDocument": {
          "Statement": [
            {
              "Effect":"Allow",
              "Principal": {
                "Service": [
                  "ecs.amazonaws.com"
                ]
              },
              "Action": [
                "sts:AssumeRole"
              ]
            }
          ]
        },
        "Path":"/",
        "Policies": [
          {
            "PolicyName": "ecs-task",
            "PolicyDocument": {
              "Statement": [
                {
                  "Effect": "Allow",
                  "Action": [
                    "ecr:**",
                  ],
                  "Resource": "*"
                }
              ]
            }
          }
        ]
      }
    },

    "WebServerTaskDefinition": {
      "Type": "AWS::ECS::TaskDefinition",
      "DependsOn": [
        "EcsCluster",
        "EcsTaskRole"
      ],
      "Properties": {
        "ExecutionRoleArn": {
          "Ref": "EcsTaskRole"
        },
        "RequiresCompatibilities": [
          "FARGATE"
        ],
        "NetworkMode": "awsvpc",
        "Cpu": "1024",
        "Memory": "2048",
        "ContainerDefinitions": [
        {
          "Name": "test-web",
          "Image": "xxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/test-web:latest",
          "Cpu": "1024",
          "Memory": "2048",
          "PortMappings": [
            {
              "ContainerPort": "80",
              "HostPort": "80"
            }
          ],
          "Essential": "true"
        }]
      }
    },

    "EcsService": {
      "Type": "AWS::ECS::Service",
      "DependsOn": [
        "WebServerTaskDefinition"
      ],
      "Properties": {
        "Cluster": {
          "Ref": "EcsCluster"
        },
        "DesiredCount": "1",
        "DeploymentConfiguration": {
          "MaximumPercent": 100,
          "MinimumHealthyPercent": 0
        },
        "LoadBalancers": [
          {
            "ContainerName": "test-web",
            "ContainerPort": "80",
            "TargetGroupArn": {
              "Ref": "TargetGroup"
            }
          }
        ],
        "NetworkConfiguration": {
          "AwsvpcConfiguration": {
            "AssignPublicIp": "DISABLED",
            "SecurityGroups": [
              { "Ref": "InstanceSecurityGroupOpenWeb" },
              { "Ref": "InstanceSecurityGroupOpenFull" }
            ],
            "Subnets": [
              "subnet-aaaaaaaa",
              "subnet-bbbbbbbb",
              "subnet-cccccccc"
            ]
          }
        },
        "TaskDefinition": {
          "Ref": "WebServerTaskDefinition"
        }
      }
    }

  }
}

Upvotes: 0

Views: 834

Answers (1)

Samuel Karp
Samuel Karp

Reputation: 4672

To use the FARGATE launch type, you'll need to specify "LaunchType": "FARGATE" in your EcsService. See the CloudFormation Documentation for details.

Upvotes: 1

Related Questions