func createService()

in cmd/service_create.go [286:384]


func createService(operation *ServiceCreateOperation) {
	var targetGroupArn string

	cwl := CWL.New(sess)
	ec2 := EC2.New(sess)
	ecr := ECR.New(sess)
	elbv2 := ELBV2.New(sess)
	ecs := ECS.New(sess, clusterName)
	iam := IAM.New(sess)
	ecsTaskExecutionRoleArn := iam.CreateEcsTaskExecutionRole()
	logGroupName := cwl.CreateLogGroup(serviceLogGroupFormat, operation.ServiceName)

	if len(operation.SecurityGroupIds) == 0 {
		defaultSecurityGroupID, _ := ec2.GetDefaultSecurityGroupID()
		operation.SecurityGroupIds = []string{defaultSecurityGroupID}
	}

	if len(operation.SubnetIds) == 0 {
		operation.SubnetIds, _ = ec2.GetDefaultSubnetIDs()
	}

	if operation.Image == "" {
		var tag, repositoryUri string

		if ecr.IsRepositoryCreated(operation.ServiceName) {
			repositoryUri = ecr.GetRepositoryUri(operation.ServiceName)
		} else {
			repositoryUri = ecr.CreateRepository(operation.ServiceName)
		}

		if git.IsCwdGitRepo() {
			tag = git.GetShortSha()
		} else {
			tag = docker.GenerateTag()
		}

		repository := docker.NewRepository(repositoryUri)
		username, password := ecr.GetUsernameAndPassword()

		repository.Login(username, password)
		repository.Build(tag)
		repository.Push(tag)

		operation.Image = repository.UriFor(tag)
	}

	if operation.LoadBalancerArn != "" {
		vpcId, _ := ec2.GetSubnetVPCID(operation.SubnetIds[0])
		targetGroupArn, _ = elbv2.CreateTargetGroup(
			ELBV2.CreateTargetGroupParameters{
				Name:     fmt.Sprintf("%s-%s", clusterName, operation.ServiceName),
				Port:     operation.Port.Number,
				Protocol: operation.Port.Protocol,
				VPCID:    vpcId,
			},
		)

		if len(operation.Rules) > 0 {
			for _, rule := range operation.Rules {
				elbv2.AddRule(operation.LoadBalancerArn, targetGroupArn, rule)
			}
		} else {
			elbv2.ModifyLoadBalancerDefaultAction(operation.LoadBalancerArn, targetGroupArn)
		}
	}

	taskDefinitionArn := ecs.CreateTaskDefinition(
		&ECS.CreateTaskDefinitionInput{
			Cpu:              operation.Cpu,
			EnvVars:          operation.EnvVars,
			ExecutionRoleArn: ecsTaskExecutionRoleArn,
			Image:            operation.Image,
			Memory:           operation.Memory,
			Name:             operation.ServiceName,
			Port:             operation.Port.Number,
			LogGroupName:     logGroupName,
			LogRegion:        region,
			TaskRole:         operation.TaskRole,
			Type:             typeService,
			TaskCommand:      operation.TaskCommand,
		},
	)

	ecs.CreateService(
		&ECS.CreateServiceInput{
			Cluster:               clusterName,
			DesiredCount:          operation.Num,
			Name:                  operation.ServiceName,
			Port:                  operation.Port.Number,
			SecurityGroupIds:      operation.SecurityGroupIds,
			SubnetIds:             operation.SubnetIds,
			TargetGroupArn:        targetGroupArn,
			TaskDefinitionArn:     taskDefinitionArn,
			AssignPublicIpEnabled: operation.AssignPublicIPEnabled,
		},
	)

	console.Info("Created service %s", operation.ServiceName)
}