From 321d0366f5c6a2bbdebfc77a7a85600bcb1f1fb6 Mon Sep 17 00:00:00 2001 From: John Pignata Date: Sat, 23 Dec 2017 13:12:44 -0500 Subject: [PATCH] Centralize session creation Rather than creating a session in each service, centralize within the root command pass session around as needed. This allows us to DRY up region logic in anticipation of Fargate being available outside of us-east-1 and reduces the amount of boilerplate per service. * Don't alias packages unnecessarily * Pass region to CreateTaskDefinition explicitly rather than plucking it from the session --- acm/main.go | 9 +-------- cloudwatchlogs/main.go | 9 +-------- cmd/certificate_destroy.go | 2 +- cmd/certificate_import.go | 2 +- cmd/certificate_info.go | 2 +- cmd/certificate_list.go | 2 +- cmd/certificate_request.go | 2 +- cmd/certificate_validate.go | 4 ++-- cmd/lb_create.go | 6 +++--- cmd/lb_destroy.go | 2 +- cmd/lb_list.go | 2 +- cmd/root.go | 36 ++++++++++++++++++++++++++++++++++-- cmd/service_create.go | 15 ++++++++------- cmd/service_deploy.go | 4 ++-- cmd/service_destroy.go | 2 +- cmd/service_info.go | 4 ++-- cmd/service_list.go | 2 +- cmd/service_ps.go | 4 ++-- cmd/service_scale.go | 4 ++-- ec2/main.go | 12 +----------- ecr/main.go | 18 ++++-------------- ecs/main.go | 23 ++++------------------- ecs/task_definition.go | 3 ++- elbv2/main.go | 9 +-------- iam/main.go | 18 ++++-------------- route53/main.go | 9 +-------- 26 files changed, 83 insertions(+), 122 deletions(-) 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), }