-
Notifications
You must be signed in to change notification settings - Fork 4.3k
Description
Support generation of MIME multipart format user data scripts via the CDK UserData class/implementations.
Use Case
We are using user data (via launch templates) to configure our AWS Batch instances. This has to be in MIME multi-part archive format as stated here: https://docs.aws.amazon.com/batch/latest/userguide/launch-templates.html
However, that format does not seem to be supported by the current UserData implementations. We currently end up using a combination of CustomUserData to define the MIME multi-part format and LinuxUserData with addS3DownloadCommand to pull in Assets (reusable parts of the user data).
This quickly gets and looks messy.
Proposed Solution
Add support for properly MIME multi-part archive formatted user data that can be used in LaunchTemplates
Other
Note that we are quite new to AWS CDK, so if we have missed something or there are alternative better approaches, we'd be more than happy to hear about it!
Our current approach looks something like this:
umccrise_wrapper_asset = assets.Asset(
self,
'UmccriseWrapperAsset',
path=os.path.join(dirname, '..', 'assets', "umccrise-wrapper.sh")
)
umccrise_wrapper_asset.grant_read(batch_instance_role)
user_data_asset = assets.Asset(
self,
'UserDataAsset',
path=os.path.join(dirname, '..', 'assets', "batch-user-data.sh")
)
user_data_asset.grant_read(batch_instance_role)
user_data = ec2.UserData.for_linux()
local_path = user_data.add_s3_download_command(
bucket=user_data_asset.bucket,
bucket_key=user_data_asset.s3_object_key
)
user_data.add_execute_file_command(
file_path=local_path,
arguments=f"s3://{umccrise_wrapper_asset.bucket.bucket_name}/{umccrise_wrapper_asset.s3_object_key}"
)
# create wrapper for MIME multi-part archive format
user_data_wrapper = ec2.UserData.custom('MIME-Version: 1.0')
user_data_wrapper.add_commands('Content-Type: multipart/mixed; boundary="==MYBOUNDARY=="')
user_data_wrapper.add_commands('')
user_data_wrapper.add_commands('--==MYBOUNDARY==')
user_data_wrapper.add_commands('Content-Type: text/x-shellscript; charset="us-ascii"')
user_data_wrapper.add_commands('')
user_data_wrapper.add_commands(user_data.render())
user_data_wrapper.add_commands('--==MYBOUNDARY==--')
launch_template = ec2.CfnLaunchTemplate(
self,
'UmccriseBatchComputeLaunchTemplate',
launch_template_name='UmccriseBatchComputeLaunchTemplate',
launch_template_data={
'userData': core.Fn.base64(user_data_wrapper.render())
}
)This is a 🚀 Feature Request