22"""Push AWS resources defined in JSON files to AWS."""
33
44import argparse
5+ import base64
56import json
67import logging
78from pathlib import Path
@@ -194,20 +195,37 @@ def push_job_definition(job_data: dict, batch_client) -> None:
194195 logger .info (f"✅ Successfully pushed job definition: { job_name } :{ revision } " )
195196
196197
198+ def _add_user_data_to_launch_template (template_data : dict , user_data_path : Path ) -> None :
199+ """Add user data from the specified path to the template data."""
200+ if user_data_path .exists ():
201+ logger .info (f"Adding user data from { user_data_path .name } " )
202+ user_data_script = user_data_path .read_text ()
203+ encoded_user_data = base64 .b64encode (user_data_script .encode ()).decode ()
204+ template_data ["LaunchTemplateData" ]["UserData" ] = encoded_user_data
205+ else :
206+ logger .warning (f"User data file not found: { user_data_path } " )
207+
208+
197209def _update_launch_template (template_data : dict , existing_template : dict , ec2_client ) -> None :
198- """Update existing launch template by creating a new version."""
210+ """Update existing launch template by creating a new version and setting it as default ."""
199211 template_name = template_data ["LaunchTemplateName" ]
212+ template_id = existing_template ["LaunchTemplateId" ]
200213 logger .info (f"Launch template { template_name } already exists, creating new version" )
201214
202215 create_params = {
203- "LaunchTemplateId" : existing_template [ "LaunchTemplateId" ] ,
216+ "LaunchTemplateId" : template_id ,
204217 "LaunchTemplateData" : template_data ["LaunchTemplateData" ],
205218 }
206219
207220 response = ec2_client .create_launch_template_version (** create_params )
208221 version = response ["LaunchTemplateVersion" ]["VersionNumber" ]
209222
210- logger .info (f"✅ Successfully created new version { version } for launch template: { template_name } " )
223+ # Set the new version as the default
224+ ec2_client .modify_launch_template (LaunchTemplateId = template_id , DefaultVersion = str (version ))
225+
226+ logger .info (
227+ f"✅ Successfully created new version { version } for launch template: { template_name } and set as default"
228+ )
211229
212230
213231def _create_launch_template (template_data : dict , ec2_client ) -> None :
@@ -227,10 +245,13 @@ def _create_launch_template(template_data: dict, ec2_client) -> None:
227245 logger .info (f"✅ Successfully created launch template: { template_name } " )
228246
229247
230- def push_launch_template (template_data : dict , ec2_client ) -> None :
248+ def push_launch_template (template_data : dict , ec2_client , * , user_data_path : Path | None = None ) -> None :
231249 """Push EC2 launch template to AWS."""
232250 template_name = template_data ["LaunchTemplateName" ]
233251
252+ if user_data_path is not None :
253+ _add_user_data_to_launch_template (template_data , user_data_path )
254+
234255 try :
235256 response = ec2_client .describe_launch_templates (LaunchTemplateNames = [template_name ])
236257 existing_template = response ["LaunchTemplates" ][0 ]
@@ -257,7 +278,8 @@ def push_file(json_path: Path, region: str) -> None:
257278 case "job_definition.json" :
258279 push_job_definition (data , boto3 .client ("batch" , region_name = region ))
259280 case "launch_template.json" :
260- push_launch_template (data , boto3 .client ("ec2" , region_name = region ))
281+ user_data_path = json_path .parent / "launch_template_user_data.sh"
282+ push_launch_template (data , boto3 .client ("ec2" , region_name = region ), user_data_path = user_data_path )
261283 case _:
262284 logger .error (f"Unknown filename: { filename } " )
263285 raise ValueError (f"Unknown filename: { filename } " )
0 commit comments