in tool/clean/clean_ecs/clean_ecs.go [44:139]
func terminateClusters(ctx context.Context, client *ecs.Client) {
// you can only filter ecs by name or arn
// not regex of tag name like ec2
// describe cluster input max is 100
ecsListClusterInput := ecs.ListClustersInput{
MaxResults: aws.Int32(100),
}
for {
clusterIds := make([]*string, 0)
expirationDateCluster := time.Now().UTC().Add(clean.KeepDurationOneWeek)
listClusterOutput, err := client.ListClusters(ctx, &ecsListClusterInput)
if err != nil || listClusterOutput.ClusterArns == nil || len(listClusterOutput.ClusterArns) == 0 {
break
}
describeClustersInput := ecs.DescribeClustersInput{Clusters: listClusterOutput.ClusterArns}
describeClustersOutput, err := client.DescribeClusters(ctx, &describeClustersInput)
if err != nil || describeClustersOutput.Clusters == nil || len(describeClustersOutput.Clusters) == 0 {
break
}
for _, cluster := range describeClustersOutput.Clusters {
if !strings.HasPrefix(*cluster.ClusterName, "cwagent-integ-test-cluster-") {
continue
}
if cluster.RunningTasksCount == 0 && cluster.PendingTasksCount == 0 {
clusterIds = append(clusterIds, cluster.ClusterArn)
continue
}
describeTaskInput := ecs.DescribeTasksInput{Cluster: cluster.ClusterArn}
describeTasks, err := client.DescribeTasks(ctx, &describeTaskInput)
if err != nil {
continue
}
addCluster := true
for _, task := range describeTasks.Tasks {
if expirationDateCluster.After(*task.StartedAt) {
log.Printf("Task %s launch-date %s", *task.TaskArn, *task.StartedAt)
} else {
addCluster = false
break
}
}
if addCluster {
clusterIds = append(clusterIds, cluster.ClusterArn)
}
}
if len(clusterIds) == 0 {
log.Printf("No clusters to terminate")
return
}
for _, clusterId := range clusterIds {
log.Printf("cluster to temrinate %s", *clusterId)
listContainerInstanceInput := ecs.ListContainerInstancesInput{Cluster: clusterId}
listContainerInstances, err := client.ListContainerInstances(ctx, &listContainerInstanceInput)
if err != nil {
log.Printf("Error %v getting container instances cluster %s", err, *clusterId)
continue
}
for _, instance := range listContainerInstances.ContainerInstanceArns {
deregisterContainerInstanceInput := ecs.DeregisterContainerInstanceInput{
ContainerInstance: aws.String(instance),
Cluster: clusterId,
Force: aws.Bool(true),
}
_, err = client.DeregisterContainerInstance(ctx, &deregisterContainerInstanceInput)
if err != nil {
log.Printf("Error %v deregister container instances cluster %s container %v", err, *clusterId, instance)
continue
}
}
serviceInput := ecs.ListServicesInput{Cluster: clusterId}
services, err := client.ListServices(ctx, &serviceInput)
if err != nil {
log.Printf("Error %v getting services cluster %s", err, *clusterId)
continue
}
for _, service := range services.ServiceArns {
deleteServiceInput := ecs.DeleteServiceInput{Cluster: clusterId, Service: aws.String(service)}
_, err := client.DeleteService(ctx, &deleteServiceInput)
if err != nil {
log.Printf("Error %v deleteing service %s cluster %s", err, serviceInput, *clusterId)
continue
}
}
terminateClusterInput := ecs.DeleteClusterInput{Cluster: clusterId}
_, err = client.DeleteCluster(ctx, &terminateClusterInput)
if err != nil {
log.Printf("Error %v terminating cluster %s", err, *clusterId)
}
}
if ecsListClusterInput.NextToken == nil {
break
}
ecsListClusterInput.NextToken = listClusterOutput.NextToken
}
}