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  }