I have been meaning to put together a Lambda function to create an AMI from a custom EC2 instance. It’s a pretty typical scenario, but I haven’t taken the time to roll my own. Recently, I ran across an article on StackOverflow which provides a CloudFormation template that:
- constructs an EC2 image,
- creates a Lambda execution role for AMI building,
- creates a Lambda function for constructing an AMI, and
- uses a custom resource to make an AMI from the instance via the Lambda function.
So, I modified both the template and Lambda function to make it a little more generic and reusable. Also, I fixed a logic error in a the original Lambda. Finally, I wanted to customize the name of both the image and AMI, so I created an InstanceName parameter. The only other parameter for the CF template is InstanceType, which I defaulted to t2.micro. Add your desired instance types to the list in that parameter’s AllowedValues attribute. The base AMI for the instance is a region-specific Amazon Linux image. Once the stack is deployed, simply update the template with your userdata changes to create new custom AMI’s. It’s a very helpful tool to have in your CloudFormation toolbox.
The template is available from my aws-mojo repo on GitHub in both JSON and YAML formats.