AWS Security ChangesHomeSearch

AWS code-library documentation change

Service: code-library · 2025-11-10 · Documentation low

File: code-library/latest/ug/auto-scaling_example_auto-scaling_Scenario_GroupsAndInstances_section.md

Summary

Updated Auto Scaling example to use CloudFormation for resource creation, dynamically retrieve VPC/subnet IDs, and improve launch template management. Removed hardcoded values and added proper resource cleanup.

Security assessment

The changes focus on improving infrastructure-as-code practices (using CloudFormation) and removing hardcoded resource identifiers, which reduces potential misconfiguration risks. However, there is no explicit evidence of addressing a specific security vulnerability or documenting new security features. The AMI update (ami-0025f0db847eb6254) appears to be an example value rather than a security patch.

Diff

diff --git a/code-library/latest/ug/auto-scaling_example_auto-scaling_Scenario_GroupsAndInstances_section.md b/code-library/latest/ug/auto-scaling_example_auto-scaling_Scenario_GroupsAndInstances_section.md
index 57ea6833b..d98b25d1a 100644
--- a//code-library/latest/ug/auto-scaling_example_auto-scaling_Scenario_GroupsAndInstances_section.md
+++ b//code-library/latest/ug/auto-scaling_example_auto-scaling_Scenario_GroupsAndInstances_section.md
@@ -1684 +1684 @@ There's more on GitHub. Find the complete example and learn how to set up and ru
-    
+        private static final String ROLES_STACK = "MyCdkAutoScaleStack";
@@ -1689 +1689 @@ There's more on GitHub. Find the complete example and learn how to set up and ru
-                        <groupName> <launchTemplateName> <vpcZoneId>
+                        <groupName>
@@ -1693,2 +1692,0 @@ There's more on GitHub. Find the complete example and learn how to set up and ru
-                        launchTemplateName - The name of the launch template.\s
-                        vpcZoneId - A subnet Id for a virtual private cloud (VPC) where instances in the Auto Scaling group can be created.
@@ -1697,9 +1695 @@ There's more on GitHub. Find the complete example and learn how to set up and ru
-            //if (args.length != 3) {
-            //    System.out.println(usage);
-            //    System.exit(1);
-           // }
-    
-            String groupName = "Scott250" ; //rgs[0];
-            String launchTemplateName = "MyTemplate5" ;//args[1];
-            String vpcZoneId = "subnet-0ddc451b8a8a1aa44" ; //args[2];
-    
+            String groupName = "MyAutoScalingGroup2";
@@ -1707 +1697 @@ There's more on GitHub. Find the complete example and learn how to set up and ru
-                    .region(Region.US_EAST_1)
+                    .region(Region.US_WEST_2)
@@ -1710 +1700,3 @@ There's more on GitHub. Find the complete example and learn how to set up and ru
-            Ec2Client ec2 = Ec2Client.create();
+            Ec2Client ec2 = Ec2Client.builder()
+                    .region(Region.US_WEST_2)
+                    .build();
@@ -1716,0 +1709,8 @@ There's more on GitHub. Find the complete example and learn how to set up and ru
+            System.out.println("First, we will create a launch template using a CloudFormation script");
+            CloudFormationHelper.deployCloudFormationStack(ROLES_STACK);
+            Map<String, String> stackOutputs = CloudFormationHelper.getStackOutputsAsync(ROLES_STACK).join();
+            String launchTemplateName = stackOutputs.get("LaunchTemplateNameOutput");
+            String vpcZoneId = getVPC(ec2);
+            updateTemlate(ec2, launchTemplateName );
+            System.out.println("The VPC zone id created by the CloudFormation stack is"+vpcZoneId);
+    
@@ -1718 +1718,2 @@ There's more on GitHub. Find the complete example and learn how to set up and ru
-            createAutoScalingGroup(autoScalingClient, groupName, launchTemplateName, vpcZoneId);
+            createAutoScalingGroup(autoScalingClient, ec2, groupName, launchTemplateName, vpcZoneId);
+    
@@ -1789 +1790,2 @@ There's more on GitHub. Find the complete example and learn how to set up and ru
-            System.out.println("13. Delete the Auto Scaling group");
+            System.out.println("13. Delete the Auto Scaling group and cloud formation resources");
+            CloudFormationHelper.destroyCloudFormationStack(ROLES_STACK);
@@ -1799,0 +1802,50 @@ There's more on GitHub. Find the complete example and learn how to set up and ru
+        public static String getVPC(Ec2Client ec2) {
+            try {
+                DescribeVpcsRequest request = DescribeVpcsRequest.builder()
+                        .filters(f -> f.name("isDefault").values("true"))
+                        .build();
+    
+                DescribeVpcsResponse response = ec2.describeVpcs(request);
+    
+                if (!response.vpcs().isEmpty()) {
+                    Vpc defaultVpc = response.vpcs().get(0);
+                    System.out.println("Default VPC ID: " + defaultVpc.vpcId());
+                    return defaultVpc.vpcId();
+                } else {
+                    System.out.println("No default VPC found.");
+                    return null; // Return null if no default VPC is found
+                }
+    
+            } catch (Ec2Exception e) {
+                System.err.println("EC2 error: " + e.awsErrorDetails().errorMessage());
+                return null; // Return null in case of an error
+            }
+        }
+    
+    
+        public static void updateTemlate(Ec2Client ec2, String launchTemplateName ) {
+            // Step 1: Create new launch template version
+            String newAmiId = "ami-0025f0db847eb6254";
+            RequestLaunchTemplateData launchTemplateData = RequestLaunchTemplateData.builder()
+                    .imageId(newAmiId)
+                    .build();
+    
+            CreateLaunchTemplateVersionRequest createVersionRequest = CreateLaunchTemplateVersionRequest.builder()
+                    .launchTemplateName(launchTemplateName)
+                    .versionDescription("Updated with valid AMI")
+                    .sourceVersion("1")
+                    .launchTemplateData(launchTemplateData)
+                    .build();
+    
+            CreateLaunchTemplateVersionResponse createResponse = ec2.createLaunchTemplateVersion(createVersionRequest);
+            int newVersionNumber = createResponse.launchTemplateVersion().versionNumber().intValue();
+    
+            // Step 2: Modify default version
+            ModifyLaunchTemplateRequest modifyRequest = ModifyLaunchTemplateRequest.builder()
+                    .launchTemplateName(launchTemplateName)
+                    .defaultVersion(String.valueOf(newVersionNumber))
+                    .build();
+    
+            ec2.modifyLaunchTemplate(modifyRequest);
+            System.out.println("Updated launch template to version " + newVersionNumber + " with AMI " + newAmiId);
+        }
@@ -1839,0 +1892 @@ There's more on GitHub. Find the complete example and learn how to set up and ru
+                                                  Ec2Client ec2Client,
@@ -1842 +1895 @@ There's more on GitHub. Find the complete example and learn how to set up and ru
-                String vpcZoneId) {
+                                                  String vpcId) {
@@ -1844 +1897,15 @@ There's more on GitHub. Find the complete example and learn how to set up and ru
-                AutoScalingWaiter waiter = autoScalingClient.waiter();
+                // Step 1: Get one subnet ID in the given VPC
+                DescribeSubnetsRequest subnetRequest = DescribeSubnetsRequest.builder()
+                        .filters(Filter.builder().name("vpc-id").values(vpcId).build())
+                        .build();
+    
+                DescribeSubnetsResponse subnetResponse = ec2Client.describeSubnets(subnetRequest);
+    
+                if (subnetResponse.subnets().isEmpty()) {
+                    throw new RuntimeException("No subnets found in VPC: " + vpcId);
+                }
+    
+                String subnetId = subnetResponse.subnets().get(0).subnetId(); // Use first subnet
+                System.out.println("Using subnet: " + subnetId);
+    
+                // Step 2: Create launch template reference
@@ -1848,0 +1916 @@ There's more on GitHub. Find the complete example and learn how to set up and ru
+                // Step 3: Create Auto Scaling group
@@ -1851 +1918,0 @@ There's more on GitHub. Find the complete example and learn how to set up and ru
-                        .availabilityZones("us-east-1a")
@@ -1853 +1919,0 @@ There's more on GitHub. Find the complete example and learn how to set up and ru
-                        .maxSize(1)
@@ -1855 +1921,2 @@ There's more on GitHub. Find the complete example and learn how to set up and ru
-                        .vpcZoneIdentifier(vpcZoneId)
+                        .maxSize(1)
+                        .vpcZoneIdentifier(subnetId)  // Correct: subnet ID, not VPC ID
@@ -1858,0 +1926,3 @@ There's more on GitHub. Find the complete example and learn how to set up and ru
+    
+                // Step 4: Wait until group is created
+                AutoScalingWaiter waiter = autoScalingClient.waiter();
@@ -1863,2 +1933,3 @@ There's more on GitHub. Find the complete example and learn how to set up and ru
-                WaiterResponse<DescribeAutoScalingGroupsResponse> waiterResponse = waiter
-                        .waitUntilGroupExists(groupsRequest);
+                WaiterResponse<DescribeAutoScalingGroupsResponse> waiterResponse =
+                        waiter.waitUntilGroupExists(groupsRequest);
+    
@@ -1868,2 +1939,2 @@ There's more on GitHub. Find the complete example and learn how to set up and ru
-            } catch (AutoScalingException e) {
-                System.err.println(e.awsErrorDetails().errorMessage());
+            } catch (Ec2Exception | AutoScalingException e) {
+                System.err.println("Error: " + e.awsErrorDetails().errorMessage());