diff --git a/Makefile b/Makefile index a7ba7df..d5901e4 100644 --- a/Makefile +++ b/Makefile @@ -7,11 +7,11 @@ LDFLAGS = -X main.version=$(VERSION) .PHONY: docker build clean deps -docker: - docker build -t ecs-gen-builder:latest -f Dockerfile.build . - docker run --rm -v $(CURDIR):$(WORKDIR) ecs-gen-builder - docker build -t ecs-gen:latest -f Dockerfile . - docker run --rm ecs-gen:latest ecs-gen --version +# docker: + # docker build -t ecs-gen-builder:latest -f Dockerfile.build . + # docker run --rm -v $(CURDIR):$(WORKDIR) ecs-gen-builder + # docker build -t ecs-gen:latest -f Dockerfile . + # docker run --rm ecs-gen:latest ecs-gen --version build: deps for GOOS in darwin linux; do \ diff --git a/scanner.go b/scanner.go index 2294fd9..91b5901 100644 --- a/scanner.go +++ b/scanner.go @@ -2,6 +2,7 @@ package main import ( "errors" + "fmt" "strconv" "strings" @@ -47,7 +48,7 @@ func (s *scanner) makeIDAddressMap() (map[string]string, error) { return nil, err } containerInstances, err := s.ecs.describeContainerInstances(s.cluster, arns) - if err != nil { + if len(arns) != 0 && err != nil { return nil, err } for i := range containerInstances { @@ -103,19 +104,22 @@ func (s *scanner) makeNameNetworkBindingsMap(containers []*ecs.Container) map[st } func (s *scanner) extractContainer(t *ecs.Task, cd *ecs.ContainerDefinition) (*container, error) { + defer rescue("extractContainer") if strings.ToLower(*cd.Name) == *taskName { return nil, errors.New("container is own container. skipping") } - if len(s.nameNetworkBindingsMap[*cd.Name]) == 0 { - return nil, errors.New("container has no network bindings. skipping") - } virtualHost, virtualPort, envVariables := extractVars(cd.Environment, s.hostVar) if virtualHost == "" { return nil, errors.New("[" + *cd.Name + "] " + s.hostVar + " environment variable not found. skipping") } port := "" - if len(s.nameNetworkBindingsMap[*cd.Name]) == 1 { + address := "" + if len(s.nameNetworkBindingsMap[*cd.Name]) == 0 { + port = strconv.FormatInt(80, 10) + address = string(*t.Containers[0].NetworkInterfaces[0].PrivateIpv4Address) + } else if len(s.nameNetworkBindingsMap[*cd.Name]) == 1 { port = strconv.FormatInt(*s.nameNetworkBindingsMap[*cd.Name][0].HostPort, 10) + address = s.idAddressMap[*t.ContainerInstanceArn] } else if virtualPort != "" { port = extractHostPort(virtualPort, s.nameNetworkBindingsMap[*cd.Name]) } @@ -127,7 +131,7 @@ func (s *scanner) extractContainer(t *ecs.Task, cd *ecs.ContainerDefinition) (*c Host: virtualHost, Port: port, Env: envVariables, - Address: s.idAddressMap[*t.ContainerInstanceArn], + Address: address, }, nil } @@ -155,3 +159,13 @@ func extractVars(env []*ecs.KeyValuePair, hostVar string) (string, string, map[s } return virtualHost, virtualPort, envVariables } + +func rescue(funcName string) { + errorString := "" + r := recover() + if r != nil { + errorString = fmt.Sprintf("We handled Panic [code %v] from function: %s", r, funcName) + errors.New(errorString) + } + return +}