// GetContainerInstances will return a slice of ECS Container Instances within a cluster func GetContainerInstances(svc *ecs.ECS, ec2svc *ec2.EC2, cluster *string) (containerInstances []*ecs.ContainerInstance, instances []*ec2.Reservation, e error) { var ciArns []*string // List clusters reqParams := &ecs.ListContainerInstancesInput{ Cluster: cluster, MaxResults: aws.Int64(100), NextToken: aws.String(""), } // Loop through tokens until no more results remain for { resp, err := svc.ListContainerInstances(reqParams) // Error check if err != nil { return nil, nil, fmt.Errorf("ecs.ListContainerInstances: %s", err.Error()) } // Expand slice of container instances and append to our comprehensive list ciArns = append(ciArns, resp.ContainerInstanceArns...) // Cycle token if resp.NextToken != nil { reqParams.NextToken = resp.NextToken } else { // Kill loop ... out of response pages break } } // Describe the tasks that we just got back ciResponse, err := svc.DescribeContainerInstances(&ecs.DescribeContainerInstancesInput{ Cluster: cluster, ContainerInstances: ciArns, }) if err != nil { return nil, nil, fmt.Errorf("ecs.DescribeContainerInstances: %s", err.Error()) } var instanceIds []*string for _, k := range ciResponse.ContainerInstances { instanceIds = append(instanceIds, k.Ec2InstanceId) } // Create a map of container instances by ci arn... // Note: Will work for <= 1000 instances w/o having to use NextToken ec2Resp, err := ec2svc.DescribeInstances(&ec2.DescribeInstancesInput{ InstanceIds: instanceIds, }) if err != nil { return nil, nil, fmt.Errorf("ec2.DescribeInstances: %s", err.Error()) } return ciResponse.ContainerInstances, ec2Resp.Reservations, nil }
func containerInstances(e *ecspkg.ECS, cluster *string) []*string { instances := []*string{} next := aws.String("") for next != nil { input := ecspkg.ListContainerInstancesInput{ Cluster: cluster, } if next != nil && *next != "" { input.NextToken = next } output, err := e.ListContainerInstances(&input) log.Check(err) instances = append(instances, output.ContainerInstanceArns...) next = output.NextToken } return instances }