@@ -3,13 +3,33 @@ package clustercreate
33import (
44 "encoding/base64"
55 "fmt"
6+ "strings"
67 "time"
78
9+ "github.com/aws/aws-sdk-go/service/ec2"
810 "github.com/coldbrewcloud/coldbrew-cli/aws"
11+ "github.com/coldbrewcloud/coldbrew-cli/console"
912 "github.com/coldbrewcloud/coldbrew-cli/core"
1013 "github.com/coldbrewcloud/coldbrew-cli/utils/conv"
1114)
1215
16+ const (
17+ defaultECSContainerInstanceImageIDBaseURL = "https://s3-us-west-2.amazonaws.com/files.coldbrewcloud.com/coldbrew-cli/ecs-ci-ami/default/"
18+ defaultECSContainerInstanceImageOwnerID = "865092420289"
19+ )
20+
21+ var defaultECSContainerInstanceAmazonImageID = map [string ]string {
22+ aws .AWSRegionUSEast1 : "ami-1924770e" ,
23+ aws .AWSRegionUSEast2 : "ami-bd3e64d8" ,
24+ aws .AWSRegionUSWest1 : "ami-7f004b1f" ,
25+ aws .AWSRegionUSWest2 : "ami-56ed4936" ,
26+ aws .AWSRegionEUWest1 : "ami-c8337dbb" ,
27+ aws .AWSRegionEUCentral1 : "ami-dd12ebb2" ,
28+ aws .AWSRegionAPNorthEast1 : "ami-c8b016a9" ,
29+ aws .AWSRegionAPSouthEast1 : "ami-6d22840e" ,
30+ aws .AWSRegionAPSouthEast2 : "ami-73407d10" ,
31+ }
32+
1333func (c * Command ) getAWSInfo () (string , string , []string , error ) {
1434 regionName , vpcID , err := c .globalFlags .GetAWSRegionAndVPCID ()
1535 if err != nil {
@@ -28,30 +48,45 @@ func (c *Command) getAWSInfo() (string, string, []string, error) {
2848 return regionName , vpcID , subnetIDs , nil
2949}
3050
31- func (c * Command ) getClusterImageID (region string ) string {
32- switch region {
33- case aws .AWSRegionUSEast1 :
34- return "ami-40286957"
35- case aws .AWSRegionUSWest1 :
36- return "ami-20fab440"
37- case aws .AWSRegionUSWest2 :
38- return "ami-562cf236"
39- case aws .AWSRegionEUWest1 :
40- return "ami-175f1964"
41- case aws .AWSRegionEUCentral1 :
42- return "ami-c55ea2aa"
43- case aws .AWSRegionAPNorthEast1 :
44- return "ami-010ed160"
45- case aws .AWSRegionAPSouthEast1 :
46- return "ami-438b2f20"
47- case aws .AWSRegionAPSouthEast2 :
48- return "ami-862211e5"
49- default :
50- return ""
51+ func (c * Command ) retrieveDefaultECSContainerInstancesImageID (region string ) string {
52+ defaultImages , err := c .awsClient .EC2 ().FindImage (defaultECSContainerInstanceImageOwnerID , core .AWSTagNameCreatedTimestamp )
53+ if err == nil {
54+ var latestImage * ec2.Image
55+ var latestImageCreationTime string
56+
57+ for _ , image := range defaultImages {
58+ if conv .S (image .OwnerId ) == defaultECSContainerInstanceImageOwnerID {
59+ if latestImage == nil {
60+ latestImageCreationTime = getCreationTimeFromTags (image .Tags )
61+ if latestImageCreationTime != "" {
62+ latestImage = image
63+ }
64+ } else {
65+ creationTime := getCreationTimeFromTags (image .Tags )
66+ if creationTime != "" {
67+ if strings .Compare (latestImageCreationTime , creationTime ) < 0 {
68+ latestImage = image
69+ latestImageCreationTime = creationTime
70+ }
71+ }
72+ }
73+ }
74+ }
75+
76+ if latestImage != nil {
77+ return conv .S (latestImage .ImageId )
78+ }
5179 }
80+
81+ // if failed to find coldbrew-cli default image, use Amazon ECS optimized image as fallback
82+ console .Error ("Failed to retrieve default image ID for ECS Container Instances. Amazon ECS Optimized AMI will be used instead." )
83+ if imageID , ok := defaultECSContainerInstanceAmazonImageID [region ]; ok {
84+ return imageID
85+ }
86+ return ""
5287}
5388
54- func (c * Command ) getInstanceUserData (ecsClusterName string ) string {
89+ func (c * Command ) getDefaultInstanceUserData (ecsClusterName string ) string {
5590 userData := fmt .Sprintf (`#!/bin/bash
5691echo ECS_CLUSTER=%s >> /etc/ecs/ecs.config` , ecsClusterName )
5792 return base64 .StdEncoding .EncodeToString ([]byte (userData ))
@@ -107,3 +142,13 @@ func (c *Command) waitAutoScalingGroupDeletion(autoScalingGroupName string) erro
107142 }
108143 return nil
109144}
145+
146+ func getCreationTimeFromTags (tags []* ec2.Tag ) string {
147+ for _ , tag := range tags {
148+ if conv .S (tag .Key ) == core .AWSTagNameCreatedTimestamp {
149+ return conv .S (tag .Value )
150+ break
151+ }
152+ }
153+ return ""
154+ }
0 commit comments