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)
}