From 909855490384d1f42926c12d277b03ea7b8c4d36 Mon Sep 17 00:00:00 2001 From: Timothy Klopotoski Date: Thu, 21 Dec 2023 05:33:42 -0500 Subject: [PATCH] CloudFormation: Update AWS::EC2::LaunchTemplate by physical ID rather than by name (#7149) --- moto/ec2/models/launch_templates.py | 3 +- .../test_launch_templates_cloudformation.py | 81 +++++++++++++++++++ 2 files changed, 82 insertions(+), 2 deletions(-) diff --git a/moto/ec2/models/launch_templates.py b/moto/ec2/models/launch_templates.py index 16db8d79d..47243440a 100644 --- a/moto/ec2/models/launch_templates.py +++ b/moto/ec2/models/launch_templates.py @@ -167,11 +167,10 @@ class LaunchTemplate(TaggedEC2Resource, CloudFormationModel): properties = cloudformation_json["Properties"] - name = properties.get("LaunchTemplateName") data = properties.get("LaunchTemplateData") description = properties.get("VersionDescription") - launch_template = backend.get_launch_template_by_name(name) + launch_template = backend.get_launch_template(original_resource.id) launch_template.create_version(data, description) diff --git a/tests/test_ec2/test_launch_templates_cloudformation.py b/tests/test_ec2/test_launch_templates_cloudformation.py index ede997e20..b80361671 100644 --- a/tests/test_ec2/test_launch_templates_cloudformation.py +++ b/tests/test_ec2/test_launch_templates_cloudformation.py @@ -297,3 +297,84 @@ def test_two_launch_templates(): launch_templates["LaunchTemplates"][0]["LaunchTemplateName"] != launch_templates["LaunchTemplates"][1]["LaunchTemplateName"] ) + + +@mock_autoscaling +@mock_cloudformation +@mock_ec2 +def test_launch_template_unnamed_update(): + cf_client = boto3.client("cloudformation", region_name="us-west-1") + ec2_client = boto3.client("ec2", region_name="us-west-1") + + stack_name = str(uuid4()) + + template_json = json.dumps( + { + "AWSTemplateFormatVersion": "2010-09-09", + "Description": "AWS CloudFormation Template to create a LaunchTemplate", + "Resources": { + "LaunchTemplate": { + "Type": "AWS::EC2::LaunchTemplate", + "Properties": { + "LaunchTemplateData": { + "ImageId": EXAMPLE_AMI_ID, + "InstanceType": "t3.small", + "UserData": "", + }, + }, + }, + }, + } + ) + + cf_client.create_stack( + StackName=stack_name, + TemplateBody=template_json, + Capabilities=["CAPABILITY_NAMED_IAM"], + OnFailure="DELETE", + ) + + launch_template_resource = cf_client.describe_stack_resources( + StackName=stack_name, LogicalResourceId="LaunchTemplate" + )["StackResources"][0] + launch_template_id = launch_template_resource["PhysicalResourceId"] + launch_template = ec2_client.describe_launch_templates( + LaunchTemplateIds=[launch_template_id] + )["LaunchTemplates"][0] + assert launch_template["LatestVersionNumber"] == 1 + + template_json = json.dumps( + { + "AWSTemplateFormatVersion": "2010-09-09", + "Description": "AWS CloudFormation Template to create a LaunchTemplate", + "Resources": { + "LaunchTemplate": { + "Type": "AWS::EC2::LaunchTemplate", + "Properties": { + "LaunchTemplateData": { + "ImageId": EXAMPLE_AMI_ID, + "InstanceType": "t3.medium", + "UserData": "", + }, + }, + }, + }, + } + ) + + cf_client.update_stack( + StackName=stack_name, + TemplateBody=template_json, + Capabilities=["CAPABILITY_NAMED_IAM"], + ) + + updated_launch_template_resource = cf_client.describe_stack_resources( + StackName=stack_name, LogicalResourceId="LaunchTemplate" + )["StackResources"][0] + updated_launch_template_id = updated_launch_template_resource["PhysicalResourceId"] + updated_launch_template = ec2_client.describe_launch_templates( + LaunchTemplateIds=[updated_launch_template_id] + )["LaunchTemplates"][0] + + assert launch_template_id == updated_launch_template_id + assert updated_launch_template["LatestVersionNumber"] == 2