AWS code-library documentation change
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());