@@ -16,7 +16,7 @@ import (
16
16
"github.com/joho/godotenv"
17
17
)
18
18
19
- func CreateService (UserName string , Image string , Port int32 , Environment []types.KeyValuePair ) {
19
+ func CreateService (UserName string , Image string , Port int32 , Environment []types.KeyValuePair ) * string {
20
20
err := godotenv .Load ()
21
21
if err != nil {
22
22
log .Fatalf ("Error loading .env file: %v" , err )
@@ -28,40 +28,64 @@ func CreateService(UserName string, Image string, Port int32, Environment []type
28
28
29
29
// Create ECS client
30
30
svc := ecs .NewFromConfig (cfg )
31
-
32
- // Generate names
31
+ sess := session . Must ( session . NewSession ())
32
+ elbSvc := elbv2 . New ( sess )
33
33
containerName := generateName (UserName , Image , "container" )
34
34
serviceName := generateName (UserName , Image , "service" )
35
- loadBalancerName := generateName (UserName , "Image" , "lb" )
35
+ // loadBalancerName := generateName(UserName, "Image", "lb")
36
36
taskName := generateName (UserName , Image , "task" )
37
- // Create target group
38
- // targetGroupArn, err := createTargetGroup(UserName, Image)
37
+ if serviceExists (svc , serviceName , UserName ) {
38
+ log .Printf ("Service %s already exists. Skipping creation." , serviceName )
39
+ _ , err := svc .UpdateService (context .TODO (), & ecs.UpdateServiceInput {
40
+ Service : & serviceName ,
41
+ Cluster : & UserName ,
42
+ ForceNewDeployment : true ,
43
+ DesiredCount : aws .Int32 (2 ),
44
+ })
45
+ if err != nil {
46
+ log .Fatalf ("Unable to update service: %v" , err )
47
+ }
48
+ return aws .String ("OK" )
49
+ }
50
+
51
+ loadBalancerArn , lbdns , err := createLoadBalancer (elbSvc , UserName , Image )
52
+ if err != nil {
53
+ log .Fatalf ("Failed to create load balancer: %v" , err )
54
+ }
55
+ targetGroupArn , err := createTargetGroup (UserName , Image )
39
56
if err != nil {
40
57
log .Fatalf ("Failed to create target group: %v" , err )
41
58
}
59
+ err = createListener (elbSvc , loadBalancerArn , targetGroupArn )
60
+ if err != nil {
61
+ log .Fatalf ("Failed to create listener: %v" , err )
62
+ }
63
+ // Generate names
42
64
43
65
serviceInput := & ecs.CreateServiceInput {
44
66
ServiceName : & serviceName ,
45
67
Cluster : & UserName ,
46
- DesiredCount : aws .Int32 (0 ),
68
+ DesiredCount : aws .Int32 (2 ),
47
69
LaunchType : types .LaunchTypeFargate ,
48
70
LoadBalancers : []types.LoadBalancer {
49
71
{
50
-
51
- LoadBalancerName : & loadBalancerName ,
52
- ContainerName : & containerName ,
53
- ContainerPort : & Port ,
72
+ TargetGroupArn : targetGroupArn ,
73
+ ContainerName : & containerName ,
74
+ ContainerPort : & Port ,
54
75
},
55
76
},
56
77
NetworkConfiguration : & types.NetworkConfiguration {
57
78
AwsvpcConfiguration : & types.AwsVpcConfiguration {
58
79
Subnets : []string {
59
- os .Getenv ("SUBNET1" ),
60
- os .Getenv ("SUBNET2" ),
61
- os .Getenv ("SUBNET3" ),
80
+ // os.Getenv("SUBNET1"),
81
+ // os.Getenv("SUBNET2"),
82
+ // os.Getenv("SUBNET3"),
83
+ "subnet-03f664a0d4fe40293" ,
84
+ "subnet-01850c7c6f49dfb7f" ,
85
+ "subnet-0450df2a14564e3d5" ,
62
86
},
63
87
AssignPublicIp : types .AssignPublicIpEnabled ,
64
- SecurityGroups : []string {"sg-0a9330b2203aac089 " },
88
+ SecurityGroups : []string {"sg-0d1526e6316cb2abf " },
65
89
},
66
90
},
67
91
SchedulingStrategy : types .SchedulingStrategyReplica ,
@@ -80,12 +104,13 @@ func CreateService(UserName string, Image string, Port int32, Environment []type
80
104
}
81
105
82
106
log .Printf ("Service created with status: %v" , * resp .Service .Status )
107
+ return lbdns
83
108
}
84
109
85
110
func generateName (UserName string , Image , suffix string ) string {
86
111
return UserName + "-" + strings .ReplaceAll (strings .ReplaceAll (strings .ReplaceAll (Image , "/" , "-" ), "." , "-" ), ":" , "-" ) + "-" + suffix
87
112
}
88
- func createTargetGroup (UserName string , Image string ) (* string , error ) {
113
+ func createTargetGroup (_ string , Image string ) (* string , error ) {
89
114
targetGroupName := strings .ReplaceAll (strings .ReplaceAll (strings .ReplaceAll (Image , "/" , "-" ), "." , "-" ), ":" , "-" ) + "-" + "tg"
90
115
91
116
// Create ELBv2 client
@@ -112,6 +137,78 @@ func createTargetGroup(UserName string, Image string) (*string, error) {
112
137
if len (createResp .TargetGroups ) == 0 {
113
138
return nil , fmt .Errorf ("no target groups created" )
114
139
}
115
-
140
+ log . Printf ( "TG CREATED" )
116
141
return createResp .TargetGroups [0 ].TargetGroupArn , nil
117
142
}
143
+ func createLoadBalancer (elbSvc * elbv2.ELBV2 , _ string , Image string ) (* string , * string , error ) {
144
+ loadBalancerName := strings .ReplaceAll (strings .ReplaceAll (strings .ReplaceAll (Image , "/" , "-" ), "." , "-" ), ":" , "-" ) + "-" + "lb"
145
+
146
+ subnets := []* string {
147
+ aws .String (os .Getenv ("SUBNET1" )),
148
+ aws .String (os .Getenv ("SUBNET2" )),
149
+ aws .String (os .Getenv ("SUBNET3" )),
150
+ }
151
+
152
+ createInput := & elbv2.CreateLoadBalancerInput {
153
+ Name : aws .String (loadBalancerName ),
154
+ Subnets : subnets ,
155
+ SecurityGroups : []* string {aws .String ("sg-0a9330b2203aac089" )},
156
+ Scheme : aws .String ("internet-facing" ),
157
+ Type : aws .String ("application" ),
158
+ }
159
+
160
+ createResp , err := elbSvc .CreateLoadBalancer (createInput )
161
+ if err != nil {
162
+ log .Fatal (err )
163
+ }
164
+
165
+ if len (createResp .LoadBalancers ) == 0 {
166
+ log .Fatal ("No LB created" )
167
+ }
168
+ log .Println ("LB CREATED" )
169
+ lbdns := * createResp .LoadBalancers [0 ].DNSName
170
+ log .Printf ("LB public DNS %v" , lbdns )
171
+ return createResp .LoadBalancers [0 ].LoadBalancerArn , & lbdns , nil
172
+ }
173
+
174
+ func createListener (elbSvc * elbv2.ELBV2 , loadBalancerArn * string , targetGroupArn * string ) error {
175
+ listenerInput := & elbv2.CreateListenerInput {
176
+ LoadBalancerArn : loadBalancerArn ,
177
+ Protocol : aws .String ("HTTP" ),
178
+ Port : aws .Int64 (80 ),
179
+ DefaultActions : []* elbv2.Action {
180
+ {
181
+ Type : aws .String ("forward" ),
182
+ ForwardConfig : & elbv2.ForwardActionConfig {
183
+ TargetGroups : []* elbv2.TargetGroupTuple {
184
+ {
185
+ TargetGroupArn : targetGroupArn ,
186
+ },
187
+ },
188
+ },
189
+ },
190
+ },
191
+ }
192
+
193
+ _ , err := elbSvc .CreateListener (listenerInput )
194
+ return err
195
+ }
196
+ func serviceExists (svc * ecs.Client , serviceName string , clusterName string ) bool {
197
+ input := & ecs.DescribeServicesInput {
198
+ Services : []string {serviceName },
199
+ Cluster : aws .String (clusterName ),
200
+ }
201
+
202
+ result , err := svc .DescribeServices (context .TODO (), input )
203
+ if err != nil {
204
+ log .Printf ("Error describing service: %v" , err )
205
+ return false
206
+ }
207
+
208
+ if len (result .Services ) == 0 {
209
+ return false
210
+ }
211
+ log .Printf ("service is %v" , * result .Services [0 ].ServiceName )
212
+
213
+ return * result .Services [0 ].Status != "INACTIVE"
214
+ }
0 commit comments