diff --git a/tools/devops/lambda-funcs/ddlogscollector/Dockerfile b/functions/ddlogscollector/Dockerfile similarity index 100% rename from tools/devops/lambda-funcs/ddlogscollector/Dockerfile rename to functions/ddlogscollector/Dockerfile diff --git a/tools/devops/lambda-funcs/ddlogscollector/lambda-func-definition.json b/functions/ddlogscollector/lambda-func-definition.json similarity index 100% rename from tools/devops/lambda-funcs/ddlogscollector/lambda-func-definition.json rename to functions/ddlogscollector/lambda-func-definition.json diff --git a/tools/devops/lambda-funcs/ddlogscollector/lambda_function.py b/functions/ddlogscollector/lambda_function.py similarity index 100% rename from tools/devops/lambda-funcs/ddlogscollector/lambda_function.py rename to functions/ddlogscollector/lambda_function.py diff --git a/tools/devops/cmd/cicd/deploy.go b/tools/devops/cmd/cicd/deploy.go new file mode 100644 index 0000000..539b40f --- /dev/null +++ b/tools/devops/cmd/cicd/deploy.go @@ -0,0 +1,24 @@ +package cicd + +import "github.com/aws/aws-sdk-go/service/ec2" + +// deployRequest defines the details needed to execute a service deployment. +type deployRequest struct { + *serviceRequest + + EcrRepositoryName string `validate:"required"` + + Ec2SecurityGroupName string `validate:"required"` + Ec2SecurityGroup *ec2.CreateSecurityGroupInput + + GitlabRunnerEc2SecurityGroupName string `validate:"required"` + + S3BucketTempPrefix string `validate:"required_with=S3BucketPrivateName S3BucketPublicName"` + S3BucketPrivateName string `validate:"omitempty"` + S3Buckets []S3Bucket + + + EcsService *deployEcsServiceRequest + LambdaFunction *deployLambdaFuncRequest +} + diff --git a/tools/devops/cmd/cicd/deploy_function.go b/tools/devops/cmd/cicd/deploy_function.go new file mode 100644 index 0000000..24f5b1e --- /dev/null +++ b/tools/devops/cmd/cicd/deploy_function.go @@ -0,0 +1,11 @@ +package cicd + + +// deployLambdaFuncRequest defines the details needed to deploy a function to AWS Lambda. +type deployLambdaFuncRequest struct { + EnableLambdaVPC bool `validate:"omitempty"` + + FuncName string `validate:"required"` + +} + diff --git a/tools/devops/cmd/cicd/service_deploy.go b/tools/devops/cmd/cicd/deploy_service.go similarity index 99% rename from tools/devops/cmd/cicd/service_deploy.go rename to tools/devops/cmd/cicd/deploy_service.go index 3ca9fc6..279de1d 100644 --- a/tools/devops/cmd/cicd/service_deploy.go +++ b/tools/devops/cmd/cicd/deploy_service.go @@ -74,15 +74,18 @@ type ServiceDeployFlags struct { RecreateService bool `validate:"omitempty" example:"false"` } -// serviceDeployRequest defines the details needed to execute a service deployment. -type serviceDeployRequest struct { - *serviceRequest + + +// deployEcsServiceRequest defines the details needed to execute a service deployment to AWS ECS. +type deployEcsServiceRequest struct { + + S3BucketPublicName string `validate:"omitempty"` + S3BucketPublicKeyPrefix string `validate:"omitempty"` EnableHTTPS bool `validate:"omitempty"` ServiceHostPrimary string `validate:"omitempty,required_with=EnableHTTPS,fqdn"` ServiceHostNames []string `validate:"omitempty,dive,fqdn"` - EcrRepositoryName string `validate:"required"` EcsClusterName string `validate:"required"` EcsCluster *ecs.CreateClusterInput @@ -104,19 +107,10 @@ type serviceDeployRequest struct { EcsTaskPolicy *iam.CreatePolicyInput EcsTaskPolicyDocument IamPolicyDocument - Ec2SecurityGroupName string `validate:"required"` - Ec2SecurityGroup *ec2.CreateSecurityGroupInput - - GitlabRunnerEc2SecurityGroupName string `validate:"required"` CloudWatchLogGroupName string `validate:"required"` CloudWatchLogGroup *cloudwatchlogs.CreateLogGroupInput - S3BucketTempPrefix string `validate:"required_with=S3BucketPrivateName S3BucketPublicName"` - S3BucketPrivateName string `validate:"omitempty"` - S3BucketPublicName string `validate:"omitempty"` - S3BucketPublicKeyPrefix string `validate:"omitempty"` - S3Buckets []S3Bucket CloudfrontPublic *cloudfront.DistributionConfig @@ -136,8 +130,6 @@ type serviceDeployRequest struct { VpcPublic *ec2.CreateVpcInput VpcPublicSubnets []*ec2.CreateSubnetInput - EnableLambdaVPC bool `validate:"omitempty"` - IsLambda bool `validate:"omitempty"` RecreateService bool `validate:"omitempty"` SDNamepsace *servicediscovery.CreatePrivateDnsNamespaceInput @@ -152,6 +144,9 @@ type serviceDeployRequest struct { flags ServiceDeployFlags } + + + // NewServiceDeployRequest generates a new request for executing deployment of a single service for a given set of CLI flags. func NewServiceDeployRequest(log *log.Logger, flags ServiceDeployFlags) (*serviceDeployRequest, error) { diff --git a/tools/devops/main.go b/tools/devops/main.go index b028400..530b732 100644 --- a/tools/devops/main.go +++ b/tools/devops/main.go @@ -70,7 +70,7 @@ func main() { }, }, { - Name: "deploy", + Name: "deploy-service", Usage: "-service=web-api -env=dev", Flags: []cli.Flag{ cli.StringFlag{Name: "service", Usage: "name of cmd", Destination: &deployFlags.ServiceName}, @@ -88,7 +88,7 @@ func main() { cli.BoolTFlag{Name: "lambda_vpc", Usage: "deploy lambda behind VPC", Destination: &deployFlags.EnableLambdaVPC}, cli.BoolFlag{Name: "static_files_s3", Usage: "service static files from S3", Destination: &deployFlags.StaticFilesS3Enable}, cli.BoolFlag{Name: "static_files_img_resize", Usage: "enable response images from service", Destination: &deployFlags.StaticFilesImgResizeEnable}, - cli.BoolFlag{Name: "recreate_service", Usage: "skip docker push after build", Destination: &deployFlags.RecreateService}, + cli.BoolFlag{Name: "recreate", Usage: "skip docker push after build", Destination: &deployFlags.RecreateService}, }, Action: func(c *cli.Context) error { if len(deployFlags.ServiceHostNames.Value()) == 1 { @@ -114,6 +114,44 @@ func main() { return cicd.ServiceDeploy(log, req) }, }, + { + Name: "deploy-function", + Usage: "-function=web-api -env=dev", + Flags: []cli.Flag{ + cli.StringFlag{Name: "function", Usage: "name of function", Destination: &deployFlags.ServiceName}, + cli.StringFlag{Name: "env", Usage: "dev, stage, or prod", Destination: &deployFlags.Env}, + cli.StringFlag{Name: "private_bucket", Usage: "dev, stage, or prod", Destination: &deployFlags.S3BucketPrivateName}, + cli.StringFlag{Name: "dockerfile", Usage: "DockerFile for service", Destination: &deployFlags.DockerFile}, + cli.StringFlag{Name: "root", Usage: "project root directory", Destination: &deployFlags.ProjectRoot}, + cli.StringFlag{Name: "project", Usage: "name of project", Destination: &deployFlags.ProjectName}, + cli.BoolTFlag{Name: "use_vpc", Usage: "deploy lambda behind VPC", Destination: &deployFlags.EnableLambdaVPC}, + cli.BoolFlag{Name: "recreate", Usage: "skip docker push after build", Destination: &deployFlags.RecreateService}, + }, + Action: func(c *cli.Context) error { + if len(deployFlags.ServiceHostNames.Value()) == 1 { + var hostNames []string + for _, inpVal := range deployFlags.ServiceHostNames.Value() { + pts := strings.Split(inpVal, ",") + + for _, h := range pts { + h = strings.TrimSpace(h) + if h != "" { + hostNames = append(hostNames, h) + } + } + } + + deployFlags.ServiceHostNames = hostNames + } + + req, err := cicd.NewServiceDeployRequest(log, deployFlags) + if err != nil { + return err + } + return cicd.ServiceDeploy(log, req) + }, + }, + { Name: "migrate", Usage: "-env=dev",