providers/aws/ecs.go (126 lines of code) (raw):

// Copyright 2019 The Terraformer Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package aws import ( "context" "fmt" "strconv" "strings" "github.com/GoogleCloudPlatform/terraformer/terraformutils" "github.com/aws/aws-sdk-go-v2/service/ecs" ) var ecsAllowEmptyValues = []string{"tags."} type EcsGenerator struct { AWSService } func (g *EcsGenerator) InitResources() error { config, e := g.generateConfig() if e != nil { return e } svc := ecs.NewFromConfig(config) p := ecs.NewListClustersPaginator(svc, &ecs.ListClustersInput{}) for p.HasMorePages() { page, e := p.NextPage(context.TODO()) if e != nil { return e } for _, clusterArn := range page.ClusterArns { arnParts := strings.Split(clusterArn, "/") clusterName := arnParts[len(arnParts)-1] g.Resources = append(g.Resources, terraformutils.NewSimpleResource( clusterArn, clusterName, "aws_ecs_cluster", "aws", ecsAllowEmptyValues, )) servicePage := ecs.NewListServicesPaginator(svc, &ecs.ListServicesInput{ Cluster: &clusterArn, }) for servicePage.HasMorePages() { serviceNextPage, err := servicePage.NextPage(context.TODO()) if err != nil { fmt.Println(err.Error()) continue } for _, serviceArn := range serviceNextPage.ServiceArns { arnParts := strings.Split(serviceArn, "/") serviceName := arnParts[len(arnParts)-1] serResp, err := svc.DescribeServices(context.TODO(), &ecs.DescribeServicesInput{ Services: []string{ serviceName, }, Cluster: &clusterArn, }) if err != nil { fmt.Println(err.Error()) continue } serviceDetails := serResp.Services[0] g.Resources = append(g.Resources, terraformutils.NewResource( serviceArn, clusterName+"_"+serviceName, "aws_ecs_service", "aws", map[string]string{ "task_definition": StringValue(serviceDetails.TaskDefinition), "cluster": clusterName, "name": serviceName, "id": serviceArn, }, ecsAllowEmptyValues, map[string]interface{}{}, )) } } } } taskDefinitionsMap := map[string]terraformutils.Resource{} taskDefinitionsPage := ecs.NewListTaskDefinitionsPaginator(svc, &ecs.ListTaskDefinitionsInput{}) for taskDefinitionsPage.HasMorePages() { taskDefinitionsNextPage, e := taskDefinitionsPage.NextPage(context.TODO()) if e != nil { fmt.Println(e.Error()) continue } for _, taskDefinitionArn := range taskDefinitionsNextPage.TaskDefinitionArns { arnParts := strings.Split(taskDefinitionArn, ":") definitionWithFamily := arnParts[len(arnParts)-2] revision, _ := strconv.Atoi(arnParts[len(arnParts)-1]) // fetch only latest revision of task definitions if val, ok := taskDefinitionsMap[definitionWithFamily]; !ok || val.AdditionalFields["revision"].(int) < revision { taskDefinitionsMap[definitionWithFamily] = terraformutils.NewResource( taskDefinitionArn, definitionWithFamily, "aws_ecs_task_definition", "aws", map[string]string{ "task_definition": taskDefinitionArn, "container_definitions": "{}", "family": "test-task", "arn": taskDefinitionArn, }, []string{}, map[string]interface{}{ "revision": revision, }, ) } } } for _, v := range taskDefinitionsMap { delete(v.AdditionalFields, "revision") g.Resources = append(g.Resources, v) } return nil } func (g *EcsGenerator) PostConvertHook() error { for _, r := range g.Resources { if r.InstanceInfo.Type != "aws_ecs_service" { continue } if r.InstanceState.Attributes["propagate_tags"] == "NONE" { delete(r.Item, "propagate_tags") } delete(r.Item, "iam_role") } return nil }