Create own AMI from instanceΒΆ
Tested on AWS Ubuntu Xenial create-own-ami.sh
:
#!/bin/bash
set -e
instance_id=$(ec2metadata --instance-id)
instance_name=$(aws ec2 describe-tags --filters Name=resource-id,Values=$instance_id Name=key,Values=Name --query Tags[].Value --output text)
if [ -z $instance_name ]; then
ami_name="ec2-$instance_id-auto-created"
else
ami_name="$instance_name-auto-created"
fi
ami_description="AMI auto created by script from instance $instance_id"
function delete_snapshots_of_ami() {
array=($(aws ec2 describe-images --filters "Name=image-id,Values=$1" --query Images[0].BlockDeviceMappings[].Ebs.SnapshotId --output text))
for i in "${array[@]}"
do
aws ec2 delete-snapshot --snapshot-id $i
echo 'Deleted snapshot $i'
done
}
function delete_ami() {
ami_id=$1
snapshots=($(aws ec2 describe-images --filters "Name=image-id,Values=$ami_id" --query Images[0].BlockDeviceMappings[].Ebs.SnapshotId --output text))
aws ec2 deregister-image --image-id $ami_id
echo "Deregistered AMI $ami_id"
sleep 5.0
for snap_id in "${snapshots[@]}"
do
aws ec2 delete-snapshot --snapshot-id $snap_id
echo "Deleted snapshot $snap_id"
done
}
ami_last_id=$(aws ec2 describe-images --filters "Name=name,Values=$ami_name" --query Images[0].ImageId --output text)
if [ "$ami_last_id" = "None" ]; then
echo "Not exist previous AMI. Nothing to delete."
else
echo "Start deleting previous AMI $ami_name with id $ami_last_id"
delete_ami $ami_last_id
echo "Previous AMI and associated snapshots were deleted."
fi
echo "Start creating AMI $ami_name from $instance_id"
ami_new_id=$(aws ec2 create-image --instance-id $instance_id --name "$ami_name" --description "$ami_description" --output text)
echo "Created new AMI $ami_new_id"