Skip to content

Support MIME multipart format in UserData #8315

@reisingerf

Description

@reisingerf

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

Metadata

Metadata

Assignees

Labels

@aws-cdk/aws-ec2Related to Amazon Elastic Compute Cloudeffort/mediumMedium work item – several days of effortfeature-requestA feature should be added or improved.p2

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions