I found another related scenario that will cause this and thought I'd put it here in case anyone else runs into it. If you define a TaskDefinition
with an Image that doesn't actually exist in its ContainerDefinition
and then you try to run that TaskDefinition
as a Service, you'll run into the same hang issue (or at least something that looks like the same issue).
NOTE: The example YAML chunks below were all in the same CloudFormation template
So as an example, I created this Repository
:
MyRepository:
Type: AWS::ECR::Repository
And then I created this Cluster
:
MyCluster:
Type: AWS::ECS::Cluster
And this TaskDefinition
(abridged):
MyECSTaskDefinition:
Type: AWS::ECS::TaskDefinition
Properties:
# ...
ContainerDefinitions:
# ...
Image: !Join ["", [!Ref "AWS::AccountId", ".dkr.ecr.", !Ref "AWS::Region", ".amazonaws.com/", !Ref MyRepository, ":1"]]
# ...
With those defined, I went to create a Service
like this:
MyECSServiceDefinition:
Type: AWS::ECS::Service
Properties:
Cluster: !Ref MyCluster
DesiredCount: 2
PlacementStrategies:
- Type: spread
Field: attribute:ecs.availability-zone
TaskDefinition: !Ref MyECSTaskDefinition
Which all seemed sensible to me, but it turns out there two issues with this as written/deployed that caused it to hang.
- The
DesiredCount
is set to 2 which means it will actually try to spin up the service and run it, not just define it. If I set DesiredCount
to 0, this works just fine.
- The
Image
defined in MyECSTaskDefinition
doesn't exist yet. I made the repository as part of this template, but I didn't actually push anything to it. So when the MyECSServiceDefinition
tried to spin up the DesiredCount
of 2 instances, it hung because the image wasn't actually available in the repository (because the repository literally just got created in the same template).
So, for now, the solution is to create the CloudFormation stack with a DesiredCount
of 0 for the Service
, upload the appropriate Image
to the repository and then update the CloudFormation stack to scale up the service. Or alternately, have a separate template that sets up core infrastructure like the repository, upload builds to that and then have a separate template to run that sets up the Services
themselves.
Hope that helps anyone having this issue!