2929import software .amazon .awssdk .services .autoscaling .model .TerminateInstanceInAutoScalingGroupRequest ;
3030import software .amazon .awssdk .services .autoscaling .model .DescribeAutoScalingInstancesRequest ;
3131import software .amazon .awssdk .services .ec2 .Ec2Client ;
32+ import software .amazon .awssdk .services .ec2 .model .CreateLaunchTemplateVersionRequest ;
33+ import software .amazon .awssdk .services .ec2 .model .CreateLaunchTemplateVersionResponse ;
34+ import software .amazon .awssdk .services .ec2 .model .DescribeSubnetsRequest ;
35+ import software .amazon .awssdk .services .ec2 .model .DescribeSubnetsResponse ;
36+ import software .amazon .awssdk .services .ec2 .model .DescribeVpcsRequest ;
37+ import software .amazon .awssdk .services .ec2 .model .DescribeVpcsResponse ;
38+ import software .amazon .awssdk .services .ec2 .model .Ec2Exception ;
39+ import software .amazon .awssdk .services .ec2 .model .Filter ;
40+ import software .amazon .awssdk .services .ec2 .model .ModifyLaunchTemplateRequest ;
41+ import software .amazon .awssdk .services .ec2 .model .RequestLaunchTemplateData ;
42+ import software .amazon .awssdk .services .ec2 .model .ResponseLaunchTemplateData ;
43+ import software .amazon .awssdk .services .ec2 .model .Vpc ;
3244
3345import java .util .List ;
46+ import java .util .Map ;
3447// snippet-end:[autoscale.java2.create_scaling_scenario.import]
3548
3649// snippet-start:[autoscale.java2.create_scaling_scenario.main]
6578
6679public class AutoScalingScenario {
6780 public static final String DASHES = new String (new char [80 ]).replace ("\0 " , "-" );
68-
81+ private static final String ROLES_STACK = "MyCdkAutoScaleStack" ;
6982 public static void main (String [] args ) throws InterruptedException {
7083 final String usage = """
7184
7285 Usage:
73- <groupName> <launchTemplateName> <vpcZoneId>
86+ <groupName>
7487
7588 Where:
7689 groupName - The name of the Auto Scaling group.
77- launchTemplateName - The name of the launch template.\s
78- vpcZoneId - A subnet Id for a virtual private cloud (VPC) where instances in the Auto Scaling group can be created.
7990 """ ;
8091
81- //if (args.length != 3) {
82- // System.out.println(usage);
83- // System.exit(1);
84- // }
85-
86- String groupName = "Scott250" ; //rgs[0];
87- String launchTemplateName = "MyTemplate5" ;//args[1];
88- String vpcZoneId = "subnet-0ddc451b8a8a1aa44" ; //args[2];
89-
92+ String groupName = "MyAutoScalingGroup2" ;
9093 AutoScalingClient autoScalingClient = AutoScalingClient .builder ()
91- .region (Region .US_EAST_1 )
94+ .region (Region .US_WEST_2 )
9295 .build ();
9396
94- Ec2Client ec2 = Ec2Client .create ();
97+ Ec2Client ec2 = Ec2Client .builder ()
98+ .region (Region .US_WEST_2 )
99+ .build ();
95100
96101 System .out .println (DASHES );
97102 System .out .println ("Welcome to the Amazon EC2 Auto Scaling example scenario." );
98103 System .out .println (DASHES );
99104
100105 System .out .println (DASHES );
106+ System .out .println ("First, we will create a launch template using a CloudFormation script" );
107+ CloudFormationHelper .deployCloudFormationStack (ROLES_STACK );
108+ Map <String , String > stackOutputs = CloudFormationHelper .getStackOutputsAsync (ROLES_STACK ).join ();
109+ String launchTemplateName = stackOutputs .get ("LaunchTemplateNameOutput" );
110+ String vpcZoneId = getVPC (ec2 );
111+ updateTemlate (ec2 , launchTemplateName );
112+ System .out .println ("The VPC zone id created by the CloudFormation stack is" +vpcZoneId );
113+
101114 System .out .println ("1. Create an Auto Scaling group named " + groupName );
102- createAutoScalingGroup (autoScalingClient , groupName , launchTemplateName , vpcZoneId );
115+ createAutoScalingGroup (autoScalingClient , ec2 , groupName , launchTemplateName , vpcZoneId );
116+
103117 System .out .println (
104118 "Wait 1 min for the resources, including the instance. Otherwise, an empty instance Id is returned" );
105119 Thread .sleep (60000 );
@@ -170,7 +184,8 @@ public static void main(String[] args) throws InterruptedException {
170184 System .out .println (DASHES );
171185
172186 System .out .println (DASHES );
173- System .out .println ("13. Delete the Auto Scaling group" );
187+ System .out .println ("13. Delete the Auto Scaling group and cloud formation resources" );
188+ CloudFormationHelper .destroyCloudFormationStack (ROLES_STACK );
174189 deleteAutoScalingGroup (autoScalingClient , groupName );
175190 System .out .println (DASHES );
176191
@@ -181,6 +196,56 @@ public static void main(String[] args) throws InterruptedException {
181196 autoScalingClient .close ();
182197 }
183198
199+ public static String getVPC (Ec2Client ec2 ) {
200+ try {
201+ DescribeVpcsRequest request = DescribeVpcsRequest .builder ()
202+ .filters (f -> f .name ("isDefault" ).values ("true" ))
203+ .build ();
204+
205+ DescribeVpcsResponse response = ec2 .describeVpcs (request );
206+
207+ if (!response .vpcs ().isEmpty ()) {
208+ Vpc defaultVpc = response .vpcs ().get (0 );
209+ System .out .println ("Default VPC ID: " + defaultVpc .vpcId ());
210+ return defaultVpc .vpcId ();
211+ } else {
212+ System .out .println ("No default VPC found." );
213+ return null ; // Return null if no default VPC is found
214+ }
215+
216+ } catch (Ec2Exception e ) {
217+ System .err .println ("EC2 error: " + e .awsErrorDetails ().errorMessage ());
218+ return null ; // Return null in case of an error
219+ }
220+ }
221+
222+
223+ public static void updateTemlate (Ec2Client ec2 , String launchTemplateName ) {
224+ // Step 1: Create new launch template version
225+ String newAmiId = "ami-0025f0db847eb6254" ;
226+ RequestLaunchTemplateData launchTemplateData = RequestLaunchTemplateData .builder ()
227+ .imageId (newAmiId )
228+ .build ();
229+
230+ CreateLaunchTemplateVersionRequest createVersionRequest = CreateLaunchTemplateVersionRequest .builder ()
231+ .launchTemplateName (launchTemplateName )
232+ .versionDescription ("Updated with valid AMI" )
233+ .sourceVersion ("1" )
234+ .launchTemplateData (launchTemplateData )
235+ .build ();
236+
237+ CreateLaunchTemplateVersionResponse createResponse = ec2 .createLaunchTemplateVersion (createVersionRequest );
238+ int newVersionNumber = createResponse .launchTemplateVersion ().versionNumber ().intValue ();
239+
240+ // Step 2: Modify default version
241+ ModifyLaunchTemplateRequest modifyRequest = ModifyLaunchTemplateRequest .builder ()
242+ .launchTemplateName (launchTemplateName )
243+ .defaultVersion (String .valueOf (newVersionNumber ))
244+ .build ();
245+
246+ ec2 .modifyLaunchTemplate (modifyRequest );
247+ System .out .println ("Updated launch template to version " + newVersionNumber + " with AMI " + newAmiId );
248+ }
184249
185250
186251 // snippet-start:[autoscale.java2.describe_scaling_activites.main]
@@ -226,36 +291,55 @@ public static void setDesiredCapacity(AutoScalingClient autoScalingClient, Strin
226291
227292 // snippet-start:[autoscale.java2.create_autoscalinggroup.main]
228293 public static void createAutoScalingGroup (AutoScalingClient autoScalingClient ,
229- String groupName ,
230- String launchTemplateName ,
231- String vpcZoneId ) {
294+ Ec2Client ec2Client ,
295+ String groupName ,
296+ String launchTemplateName ,
297+ String vpcId ) {
232298 try {
233- AutoScalingWaiter waiter = autoScalingClient .waiter ();
299+ // Step 1: Get one subnet ID in the given VPC
300+ DescribeSubnetsRequest subnetRequest = DescribeSubnetsRequest .builder ()
301+ .filters (Filter .builder ().name ("vpc-id" ).values (vpcId ).build ())
302+ .build ();
303+
304+ DescribeSubnetsResponse subnetResponse = ec2Client .describeSubnets (subnetRequest );
305+
306+ if (subnetResponse .subnets ().isEmpty ()) {
307+ throw new RuntimeException ("No subnets found in VPC: " + vpcId );
308+ }
309+
310+ String subnetId = subnetResponse .subnets ().get (0 ).subnetId (); // Use first subnet
311+ System .out .println ("Using subnet: " + subnetId );
312+
313+ // Step 2: Create launch template reference
234314 LaunchTemplateSpecification templateSpecification = LaunchTemplateSpecification .builder ()
235315 .launchTemplateName (launchTemplateName )
236316 .build ();
237317
318+ // Step 3: Create Auto Scaling group
238319 CreateAutoScalingGroupRequest request = CreateAutoScalingGroupRequest .builder ()
239320 .autoScalingGroupName (groupName )
240- .availabilityZones ("us-east-1a" )
241321 .launchTemplate (templateSpecification )
242- .maxSize (1 )
243322 .minSize (1 )
244- .vpcZoneIdentifier (vpcZoneId )
323+ .maxSize (1 )
324+ .vpcZoneIdentifier (subnetId ) // Correct: subnet ID, not VPC ID
245325 .build ();
246326
247327 autoScalingClient .createAutoScalingGroup (request );
328+
329+ // Step 4: Wait until group is created
330+ AutoScalingWaiter waiter = autoScalingClient .waiter ();
248331 DescribeAutoScalingGroupsRequest groupsRequest = DescribeAutoScalingGroupsRequest .builder ()
249332 .autoScalingGroupNames (groupName )
250333 .build ();
251334
252- WaiterResponse <DescribeAutoScalingGroupsResponse > waiterResponse = waiter
253- .waitUntilGroupExists (groupsRequest );
335+ WaiterResponse <DescribeAutoScalingGroupsResponse > waiterResponse =
336+ waiter .waitUntilGroupExists (groupsRequest );
337+
254338 waiterResponse .matched ().response ().ifPresent (System .out ::println );
255339 System .out .println ("Auto Scaling Group created" );
256340
257- } catch (AutoScalingException e ) {
258- System .err .println (e .awsErrorDetails ().errorMessage ());
341+ } catch (Ec2Exception | AutoScalingException e ) {
342+ System .err .println ("Error: " + e .awsErrorDetails ().errorMessage ());
259343 System .exit (1 );
260344 }
261345 }
0 commit comments