github.com/in4it/ecs-deploy@v0.0.42-0.20240508120354-ed77ff16df25/cmd/ecs-deploy/main.go (about) 1 package main 2 3 import ( 4 "github.com/in4it/ecs-deploy/api" 5 "github.com/in4it/ecs-deploy/provider/ecs" 6 "github.com/in4it/ecs-deploy/util" 7 "github.com/juju/loggo" 8 "github.com/spf13/pflag" 9 10 "fmt" 11 "os" 12 ) 13 14 func startup_checks() { 15 mandatoryEnvVars := []string{ 16 "AWS_REGION", 17 "JWT_SECRET", 18 "DEPLOY_PASSWORD", 19 } 20 paramstore := ecs.Paramstore{} 21 err := paramstore.RetrieveKeys() 22 if err != nil { 23 fmt.Printf("Couldn't retrieve variables from parameter store\n") 24 os.Exit(1) 25 } 26 for _, envVar := range mandatoryEnvVars { 27 if !util.EnvExists(envVar) { 28 fmt.Printf("Environment variable missing: %v\n", envVar) 29 os.Exit(1) 30 } 31 } 32 // start controller, check database and pick up any remaining work 33 controller := api.Controller{} 34 err = controller.Resume() 35 if err != nil { 36 fmt.Printf("Couldn't start controller: %v\n", err.Error()) 37 os.Exit(1) 38 } 39 } 40 41 func addFlags(f *api.Flags, fs *pflag.FlagSet) { 42 fs.BoolVar(&f.Bootstrap, "bootstrap", f.Bootstrap, "bootstrap ECS cluster") 43 fs.StringVar(&f.Profile, "profile", f.Profile, "AWS Profile") 44 fs.StringVar(&f.Region, "region", f.Region, "AWS Region") 45 fs.StringVar(&f.ClusterName, "cluster-name", f.ClusterName, "name of the cluster") 46 fs.StringVar(&f.Environment, "environment", f.Environment, "environment (dev/test/staging/uat/prod)") 47 fs.StringVar(&f.AlbSecurityGroups, "alb-security-groups", f.AlbSecurityGroups, "security groups to attach to the Application Load Balancer") 48 fs.StringVar(&f.EcsSubnets, "ecs-subnets", f.EcsSubnets, "subnets to use for AWS ECS") 49 fs.StringVar(&f.CloudwatchLogsPrefix, "cloudwatch-logs-prefix", f.CloudwatchLogsPrefix, "prefix for cloudwatch logs (e.g. mycompany)") 50 fs.BoolVar(&f.CloudwatchLogsEnabled, "cloudwatch-logs-enabled", f.CloudwatchLogsEnabled, "enable cloudwatch logs") 51 fs.StringVar(&f.KeyName, "key-name", f.KeyName, "ssh key name") 52 fs.StringVar(&f.InstanceType, "instance-type", f.InstanceType, "AWS instance type (e.g. t2.micro)") 53 fs.StringVar(&f.EcsSecurityGroups, "ecs-security-groups", f.EcsSecurityGroups, "ECS security groups to use") 54 fs.StringVar(&f.EcsMinSize, "ecs-min-size", f.EcsMinSize, "ECS minimal size") 55 fs.StringVar(&f.EcsMaxSize, "ecs-max-size", f.EcsMaxSize, "ECS maxium size") 56 fs.StringVar(&f.EcsDesiredSize, "ecs-desired-size", f.EcsDesiredSize, "ECS desired size") 57 fs.BoolVar(&f.ParamstoreEnabled, "paramstore-enabled", f.ParamstoreEnabled, "enable AWS paramater store") 58 fs.StringVar(&f.ParamstoreKmsArn, "paramstore-kms-arn", f.ParamstoreKmsArn, "AWS parameter store KMS key ARN") 59 fs.StringVar(&f.ParamstorePrefix, "paramstore-prefix", f.ParamstorePrefix, "AWS parameter store prefix (e.g. mycompany)") 60 fs.StringVar(&f.LoadbalancerDomain, "loadbalancer-domain", f.LoadbalancerDomain, "domain to access ECS cluster") 61 fs.BoolVar(&f.Server, "server", f.Server, "start server") 62 fs.StringVar(&f.DeleteCluster, "delete-cluster", f.DeleteCluster, "delete-cluster <cluster name>") 63 fs.BoolVar(&f.DisableEcsDeploy, "disable-ecs-deploy", f.DisableEcsDeploy, "disable ecs deploy during bootstrap") 64 fs.MarkHidden("disable-ecs-deploy") 65 } 66 67 // @title ecs-deploy 68 // @version 0.0.1 69 // @description ecs-deploy is the glue between your CI and ECS. It automates deploys based a simple JSON file Edit 70 // @contact.name Edward Viaene 71 // @contact.url https://github.com/in4it/ecs-deploy 72 // @contact.email ward@in4it.io 73 // license.name Apache 2.0 74 func main() { 75 // set logging to debug 76 if util.GetEnv("DEBUG", "") == "true" { 77 loggo.ConfigureLoggers(`<root>=DEBUG`) 78 } else { 79 loggo.ConfigureLoggers(`<root>=INFO`) 80 } 81 82 // parse flags 83 flags := api.NewFlags() 84 addFlags(flags, pflag.CommandLine) 85 pflag.Parse() 86 87 // examine flags 88 if flags.Profile != "" { 89 os.Setenv("AWS_PROFILE", flags.Profile) 90 } 91 if flags.Profile != "" { 92 os.Setenv("AWS_REGION", flags.Region) 93 } 94 if flags.Bootstrap { 95 if ok, _ := util.AskForConfirmation("Bootstrap ECS Cluster?"); ok { 96 controller := api.Controller{} 97 err := controller.Bootstrap(flags) 98 if err != nil { 99 fmt.Printf("Error: %v\n", err.Error()) 100 } 101 } 102 } else if flags.DeleteCluster != "" { 103 if ok, _ := util.AskForConfirmation("This will delete cluster " + flags.DeleteCluster); ok { 104 controller := api.Controller{} 105 flags.ClusterName = flags.DeleteCluster 106 err := controller.DeleteCluster(flags) 107 if err != nil { 108 fmt.Printf("Error: %v\n", err.Error()) 109 } 110 } 111 } else if flags.Server { 112 // startup checks 113 startup_checks() 114 115 // Launch API 116 api := api.API{} 117 err := api.Launch() 118 if err != nil { 119 panic(err) 120 } 121 } else { 122 fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0]) 123 pflag.PrintDefaults() 124 } 125 os.Exit(0) 126 }