diff --git a/acm/main.go b/acm/main.go index 537052a..db4effb 100644 --- a/acm/main.go +++ b/acm/main.go @@ -3,20 +3,13 @@ package acm import ( "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/acm" - "github.com/jpignata/fargate/console" ) type ACM struct { svc *acm.ACM } -func New() ACM { - sess, err := session.NewSession() - - if err != nil { - console.ErrorExit(err, "Could not create ACM session") - } - +func New(sess *session.Session) ACM { return ACM{ svc: acm.New(sess), } diff --git a/cloudwatchlogs/main.go b/cloudwatchlogs/main.go index cc5e780..7767b92 100644 --- a/cloudwatchlogs/main.go +++ b/cloudwatchlogs/main.go @@ -3,20 +3,13 @@ package cloudwatchlogs import ( "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/cloudwatchlogs" - "github.com/jpignata/fargate/console" ) type CloudWatchLogs struct { svc *cloudwatchlogs.CloudWatchLogs } -func New() CloudWatchLogs { - sess, err := session.NewSession() - - if err != nil { - console.ErrorExit(err, "Error creating CloudWatch Logs session") - } - +func New(sess *session.Session) CloudWatchLogs { return CloudWatchLogs{ svc: cloudwatchlogs.New(sess), } diff --git a/cmd/certificate_destroy.go b/cmd/certificate_destroy.go index ee4fd98..92ceb7b 100644 --- a/cmd/certificate_destroy.go +++ b/cmd/certificate_destroy.go @@ -22,6 +22,6 @@ func init() { func destroyCertificate(domainName string) { console.Info("[%s] Destroying certificate", domainName) - acm := ACM.New() + acm := ACM.New(sess) acm.DeleteCertificate(domainName) } diff --git a/cmd/certificate_import.go b/cmd/certificate_import.go index 06eb330..ae07a7b 100644 --- a/cmd/certificate_import.go +++ b/cmd/certificate_import.go @@ -58,7 +58,7 @@ func validateCertificateAndKeyFiles() { func importCertificate() { console.Info("Importing certificate") - acm := ACM.New() + acm := ACM.New(sess) certificateData, err := ioutil.ReadFile(certificateFile) diff --git a/cmd/certificate_info.go b/cmd/certificate_info.go index b5294d1..ba862a0 100644 --- a/cmd/certificate_info.go +++ b/cmd/certificate_info.go @@ -26,7 +26,7 @@ func init() { } func infoCertificate(domainName string) { - acm := ACM.New() + acm := ACM.New(sess) certificate := acm.DescribeCertificate(domainName) console.KeyValue("Domain Name", "%s\n", certificate.DomainName) diff --git a/cmd/certificate_list.go b/cmd/certificate_list.go index 5f1a44d..3e53278 100644 --- a/cmd/certificate_list.go +++ b/cmd/certificate_list.go @@ -36,7 +36,7 @@ func init() { } func listCertificates() { - acm := ACM.New() + acm := ACM.New(sess) certificates := acm.ListCertificates() if len(certificates) > 0 { diff --git a/cmd/certificate_request.go b/cmd/certificate_request.go index 84bcd1c..2c96fe2 100644 --- a/cmd/certificate_request.go +++ b/cmd/certificate_request.go @@ -38,7 +38,7 @@ func init() { func createCertificate(domainName string) { console.Info("Requesting certificate [%s]", domainName) - acm := ACM.New() + acm := ACM.New(sess) acm.RequestCertificate(domainName, aliases) console.Info("[%s] You must validate ownership of the domain name for the certificate to be issued", domainName) diff --git a/cmd/certificate_validate.go b/cmd/certificate_validate.go index c348e34..2c453e3 100644 --- a/cmd/certificate_validate.go +++ b/cmd/certificate_validate.go @@ -36,8 +36,8 @@ func init() { func validateCertificate(domainName string) { console.Info("Validating certificate [%s]", domainName) - route53 := Route53.New() - acm := ACM.New() + route53 := Route53.New(sess) + acm := ACM.New(sess) hostedZones := route53.ListHostedZones() certificate := acm.DescribeCertificate(domainName) diff --git a/cmd/lb_create.go b/cmd/lb_create.go index c88084d..f16f0b8 100644 --- a/cmd/lb_create.go +++ b/cmd/lb_create.go @@ -51,7 +51,7 @@ func normalizeFields() { } func getCertificateArns() { - acm := ACM.New() + acm := ACM.New(sess) for _, certificateDomainName := range certificateDomainNames { certificate := acm.DescribeCertificate(certificateDomainName) @@ -115,8 +115,8 @@ func inferType() { func createLb(lbName string) { console.Info("Creating load balancer [%s]", lbName) - elbv2 := ELBV2.New() - ec2 := EC2.New() + elbv2 := ELBV2.New(sess) + ec2 := EC2.New(sess) subnetIds := ec2.GetDefaultVpcSubnetIds() vpcId := ec2.GetDefaultVpcId() diff --git a/cmd/lb_destroy.go b/cmd/lb_destroy.go index c482960..fba8060 100644 --- a/cmd/lb_destroy.go +++ b/cmd/lb_destroy.go @@ -22,7 +22,7 @@ func init() { func destroyLoadBalancer(domainName string) { console.Info("[%s] Destroying load balancer", domainName) - elbv2 := ELBV2.New() + elbv2 := ELBV2.New(sess) elbv2.DeleteLoadBalancer(domainName) elbv2.DeleteTargetGroup(domainName + "-" + "default") } diff --git a/cmd/lb_list.go b/cmd/lb_list.go index 0e5a9e5..def7467 100644 --- a/cmd/lb_list.go +++ b/cmd/lb_list.go @@ -36,7 +36,7 @@ func init() { } func listLoadBalancers() { - elbv2 := ELBV2.New() + elbv2 := ELBV2.New(sess) loadBalancers := elbv2.DescribeLoadBalancers([]string{}) if len(loadBalancers) > 0 { diff --git a/cmd/root.go b/cmd/root.go index 564e907..d8a77a1 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -1,34 +1,66 @@ package cmd import ( + "os" "strconv" "strings" + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" "github.com/jpignata/fargate/console" "github.com/spf13/cobra" ) -const version = "0.0.1" +const ( + version = "0.0.1" + defaultRegion = "us-east-1" +) type Port struct { Port int64 Protocol string } -var verbose bool +var ( + region string + verbose bool + sess *session.Session +) var rootCmd = &cobra.Command{ Use: "fargate", PersistentPreRun: func(cmd *cobra.Command, args []string) { + envAwsRegion := os.Getenv("AWS_REGION") + envAwsDefaultRegion := os.Getenv("AWS_DEFAULT_REGION") + if verbose { verbose = true console.Verbose = true } + + if region == "" { + if envAwsDefaultRegion != "" { + region = envAwsDefaultRegion + } else if envAwsRegion != "" { + region = envAwsDefaultRegion + } else { + region = defaultRegion + } + } + + sess = session.Must( + session.NewSession( + &aws.Config{ + Region: aws.String(region), + }, + ), + ) }, } func init() { rootCmd.PersistentFlags().BoolVarP(&verbose, "verbose", "v", false, "Verbose output") + rootCmd.PersistentFlags().StringVarP(®ion, "region", "r", "", "AWS Region (defaults to us-east-1)") } func Execute() { diff --git a/cmd/service_create.go b/cmd/service_create.go index a77c2a6..6e3aa54 100644 --- a/cmd/service_create.go +++ b/cmd/service_create.go @@ -70,7 +70,7 @@ func init() { } func validateLb() { - elbv2 := ELBV2.New() + elbv2 := ELBV2.New(sess) loadBalancer := elbv2.DescribeLoadBalancer(lbName) if loadBalancer.Type == "network" { @@ -166,12 +166,12 @@ func extractEnvVars() { func createService(serviceName string) { console.Info("Creating %s", serviceName) - cwl := CWL.New() - ec2 := EC2.New() - ecr := ECR.New() - ecs := ECS.New() - elbv2 := ELBV2.New() - iam := IAM.New() + cwl := CWL.New(sess) + ec2 := EC2.New(sess) + ecr := ECR.New(sess) + ecs := ECS.New(sess) + elbv2 := ELBV2.New(sess) + iam := IAM.New(sess) var ( targetGroupArn string @@ -240,6 +240,7 @@ func createService(serviceName string) { Name: serviceName, Port: port.Port, LogGroupName: logGroupName, + LogRegion: region, }, ) ecs.CreateService( diff --git a/cmd/service_deploy.go b/cmd/service_deploy.go index 51387a9..45e09ed 100644 --- a/cmd/service_deploy.go +++ b/cmd/service_deploy.go @@ -26,13 +26,13 @@ func init() { func deployService(serviceName string) { console.Info("Deploying %s", serviceName) - ecs := ECS.New() + ecs := ECS.New(sess) service := ecs.DescribeService(serviceName) if image == "" { var tag string - ecr := ECR.New() + ecr := ECR.New(sess) repositoryUri := ecr.GetRepositoryUri(serviceName) repository := docker.Repository{ Uri: repositoryUri, diff --git a/cmd/service_destroy.go b/cmd/service_destroy.go index 14e4173..991990c 100644 --- a/cmd/service_destroy.go +++ b/cmd/service_destroy.go @@ -22,6 +22,6 @@ func init() { func destroyService(serviceName string) { console.Info("[%s] Destroying service", serviceName) - ecs := ECS.New() + ecs := ECS.New(sess) ecs.DestroyService(serviceName) } diff --git a/cmd/service_info.go b/cmd/service_info.go index 400b9c0..8a66ea0 100644 --- a/cmd/service_info.go +++ b/cmd/service_info.go @@ -28,8 +28,8 @@ func init() { func infoService(serviceName string) { var eniIds []string - ecs := ECS.New() - ec2 := EC2.New() + ecs := ECS.New(sess) + ec2 := EC2.New(sess) service := ecs.DescribeService(serviceName) tasks := ecs.DescribeTasksForService(serviceName) diff --git a/cmd/service_list.go b/cmd/service_list.go index c641657..1f6926d 100644 --- a/cmd/service_list.go +++ b/cmd/service_list.go @@ -23,7 +23,7 @@ func init() { } func listServices() { - ecs := ECS.New() + ecs := ECS.New(sess) services := ecs.ListServices() if len(services) > 0 { diff --git a/cmd/service_ps.go b/cmd/service_ps.go index acaa8c5..4a66170 100644 --- a/cmd/service_ps.go +++ b/cmd/service_ps.go @@ -28,8 +28,8 @@ func init() { func psService(serviceName string) { var eniIds []string - ecs := ECS.New() - ec2 := EC2.New() + ecs := ECS.New(sess) + ec2 := EC2.New(sess) tasks := ecs.DescribeTasksForService(serviceName) for _, task := range tasks { diff --git a/cmd/service_scale.go b/cmd/service_scale.go index f415ab2..26cd4d1 100644 --- a/cmd/service_scale.go +++ b/cmd/service_scale.go @@ -46,7 +46,7 @@ func validateScale(scale string) { func setDesiredCount(serviceName, scale string) { if scale[0] == '+' || scale[0] == '-' { if s, err := strconv.ParseInt(scale[1:len(scale)], 10, 64); err == nil { - ecs := ECS.New() + ecs := ECS.New(sess) desiredCount = ecs.GetDesiredCount(serviceName) if scale[0] == '+' { @@ -74,6 +74,6 @@ func setDesiredCount(serviceName, scale string) { func scaleService(serviceName string) { console.Info("Scaling service %s to %d", serviceName, desiredCount) - ecs := ECS.New() + ecs := ECS.New(sess) ecs.SetDesiredCount(serviceName, desiredCount) } diff --git a/ec2/main.go b/ec2/main.go index cfc1a4f..3bb3c42 100644 --- a/ec2/main.go +++ b/ec2/main.go @@ -1,25 +1,15 @@ package ec2 import ( - "os" - "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/ec2" - "github.com/fatih/color" ) type EC2 struct { svc *ec2.EC2 } -func New() EC2 { - sess, err := session.NewSession() - - if err != nil { - color.Red("Error creating EC2 session: ", err) - os.Exit(1) - } - +func New(sess *session.Session) EC2 { return EC2{ svc: ec2.New(sess), } diff --git a/ecr/main.go b/ecr/main.go index 29c8880..1ac314b 100644 --- a/ecr/main.go +++ b/ecr/main.go @@ -1,26 +1,16 @@ package ecr import ( - "os" - "github.com/aws/aws-sdk-go/aws/session" - awsecr "github.com/aws/aws-sdk-go/service/ecr" - "github.com/fatih/color" + "github.com/aws/aws-sdk-go/service/ecr" ) type ECR struct { - svc *awsecr.ECR + svc *ecr.ECR } -func New() ECR { - sess, err := session.NewSession() - - if err != nil { - color.Red("Error creating ECR session: ", err) - os.Exit(1) - } - +func New(sess *session.Session) ECR { return ECR{ - svc: awsecr.New(sess), + svc: ecr.New(sess), } } diff --git a/ecs/main.go b/ecs/main.go index ac7129b..ef7d1c7 100644 --- a/ecs/main.go +++ b/ecs/main.go @@ -1,32 +1,17 @@ package ecs import ( - "os" - "github.com/aws/aws-sdk-go/aws/session" - awsecs "github.com/aws/aws-sdk-go/service/ecs" - "github.com/fatih/color" + "github.com/aws/aws-sdk-go/service/ecs" ) type ECS struct { - svc *awsecs.ECS + svc *ecs.ECS sess *session.Session } -func New() ECS { - sess, err := session.NewSession() - - if err != nil { - color.Red("Error creating ECS session: ", err) - os.Exit(1) - } - +func New(sess *session.Session) ECS { return ECS{ - svc: awsecs.New(sess), - sess: sess, + svc: ecs.New(sess), } } - -func (ecs *ECS) Region() *string { - return ecs.sess.Config.Region -} diff --git a/ecs/task_definition.go b/ecs/task_definition.go index 4f7d882..1674d46 100644 --- a/ecs/task_definition.go +++ b/ecs/task_definition.go @@ -19,6 +19,7 @@ type CreateTaskDefinitionInput struct { Name string Port int64 LogGroupName string + LogRegion string } func (ecs *ECS) CreateTaskDefinition(input *CreateTaskDefinitionInput) string { @@ -27,7 +28,7 @@ func (ecs *ECS) CreateTaskDefinition(input *CreateTaskDefinitionInput) string { logConfiguration := &awsecs.LogConfiguration{ LogDriver: aws.String(awsecs.LogDriverAwslogs), Options: map[string]*string{ - "awslogs-region": ecs.Region(), + "awslogs-region": aws.String(input.LogRegion), "awslogs-group": aws.String(input.LogGroupName), "awslogs-stream-prefix": aws.String(logStreamPrefix), }, diff --git a/elbv2/main.go b/elbv2/main.go index 28d9d1f..bcf4220 100644 --- a/elbv2/main.go +++ b/elbv2/main.go @@ -3,20 +3,13 @@ package elbv2 import ( "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/elbv2" - "github.com/jpignata/fargate/console" ) type ELBV2 struct { svc *elbv2.ELBV2 } -func New() ELBV2 { - sess, err := session.NewSession() - - if err != nil { - console.ErrorExit(err, "Could not create VPC session") - } - +func New(sess *session.Session) ELBV2 { return ELBV2{ svc: elbv2.New(sess), } diff --git a/iam/main.go b/iam/main.go index 90b087e..a8e7bc8 100644 --- a/iam/main.go +++ b/iam/main.go @@ -1,26 +1,16 @@ package iam import ( - "os" - "github.com/aws/aws-sdk-go/aws/session" - awsiam "github.com/aws/aws-sdk-go/service/iam" - "github.com/fatih/color" + "github.com/aws/aws-sdk-go/service/iam" ) type IAM struct { - svc *awsiam.IAM + svc *iam.IAM } -func New() IAM { - sess, err := session.NewSession() - - if err != nil { - color.Red("Error creating IAM session: ", err) - os.Exit(1) - } - +func New(sess *session.Session) IAM { return IAM{ - svc: awsiam.New(sess), + svc: iam.New(sess), } } diff --git a/route53/main.go b/route53/main.go index 0965b8b..eb1397f 100644 --- a/route53/main.go +++ b/route53/main.go @@ -3,20 +3,13 @@ package route53 import ( "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/route53" - "github.com/jpignata/fargate/console" ) type Route53 struct { svc *route53.Route53 } -func New() Route53 { - sess, err := session.NewSession() - - if err != nil { - console.ErrorExit(err, "Could not create Route53 session") - } - +func New(sess *session.Session) Route53 { return Route53{ svc: route53.New(sess), }