AWS Security ChangesHomeSearch

AWS code-library documentation change

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

File: code-library/latest/ug/java_2_auto-scaling_code_examples.md

Summary

Updated Auto Scaling code examples to use CloudFormation for resource creation, added VPC/subnet handling, and improved launch template management

Security assessment

The changes focus on infrastructure management patterns (CloudFormation integration, dynamic subnet selection) and code quality improvements. While the updateTemplate() method specifies a concrete AMI ID, there's no evidence this addresses a security vulnerability. The removal of hardcoded values improves security hygiene but doesn't directly mitigate an active security issue.

Diff

diff --git a/code-library/latest/ug/java_2_auto-scaling_code_examples.md b/code-library/latest/ug/java_2_auto-scaling_code_examples.md
index da284dc15..fc571bcbf 100644
--- a//code-library/latest/ug/java_2_auto-scaling_code_examples.md
+++ b//code-library/latest/ug/java_2_auto-scaling_code_examples.md
@@ -142 +142 @@ There's more on GitHub. Find the complete example and learn how to set up and ru
-    
+        private static final String ROLES_STACK = "MyCdkAutoScaleStack";
@@ -147 +147 @@ There's more on GitHub. Find the complete example and learn how to set up and ru
-                        <groupName> <launchTemplateName> <vpcZoneId>
+                        <groupName>
@@ -151,2 +150,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.
@@ -155,9 +153 @@ 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";
@@ -165 +155 @@ 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)
@@ -168 +158,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();
@@ -174,0 +167,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);
+    
@@ -176 +176,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);
+    
@@ -247 +248,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);
@@ -257,0 +260,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);
+        }
@@ -297,0 +350 @@ There's more on GitHub. Find the complete example and learn how to set up and ru
+                                                  Ec2Client ec2Client,
@@ -300 +353 @@ There's more on GitHub. Find the complete example and learn how to set up and ru
-                String vpcZoneId) {
+                                                  String vpcId) {
@@ -302 +355,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
@@ -306,0 +374 @@ There's more on GitHub. Find the complete example and learn how to set up and ru
+                // Step 3: Create Auto Scaling group
@@ -309 +376,0 @@ There's more on GitHub. Find the complete example and learn how to set up and ru
-                        .availabilityZones("us-east-1a")
@@ -311 +377,0 @@ There's more on GitHub. Find the complete example and learn how to set up and ru
-                        .maxSize(1)
@@ -313 +379,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
@@ -316,0 +384,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();
@@ -321,2 +391,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);
+    
@@ -326,2 +397,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());