Short script for creating and attaching an EBS Volume to an EC2 instance. This is useful in cases where you want to dynamically create your EBS volumes outside of the cloud formation auto provisioning process.
#!/usr/bin/env bash
echo -e "Creating Disk \n\tDevice ID: $1 \n\tMount Point: $2 \n\tKMS-ID: $3 \n\tSize: $4 \n\tType: $5 \n\tTags: $6"
availability_zone=`curl http://169.254.169.254/latest/meta-data/placement/availability-zone`
region="`echo \"$availability_zone\" | sed -e 's:\([0-9][0-9]*\)[a-z]*\$:\\1:'`"
instanceId=`curl http://169.254.169.254/latest/meta-data/instance-id`
deviceId="$1"
mountPoint="$2"
kmsId="$3"
sizeGb=$4
volType="$5"
additionalTags="$6"
if [ ! -f /root/.aws/config ]; then
mkdir -p /root/.aws
echo -e "[default]\nregion = ${region}" > /root/.aws/config
fi;
tags="ResourceType=volume,Tags=[${additionalTags}]"
echo "Tags: ${tags}"
volumeCmd="aws ec2 create-volume --region ${region} --availability-zone ${availability_zone} --encrypted --kms-key-id ${kmsId} --size ${sizeGb} --volume-type ${volType} --tag-specifications ${tags}"
echo "Executing: ${volumeCmd}"
volume=`${volumeCmd}`
volumeId=`echo ${volume}|jq '.VolumeId'`
volumeId="${volumeId%\"}"
volumeId="${volumeId#\"}"
echo "Volume:ID ${volumeId}"
if [ -z ${volumeId+x} ]; then
echo "Could not create drive"
exit -1;
fi
echo "Executing: aws ec2 wait volume-available --volume-ids ${volumeId}"
aws ec2 wait volume-available --volume-ids ${volumeId}
echo "Executing: ec2 attach-volume --volume-id ${volumeId} --instance-id ${instanceId} --device ${deviceId}"
aws ec2 attach-volume --volume-id ${volumeId} --instance-id ${instanceId} --device ${deviceId}
echo "Executing: while [ ! -e ${deviceId} ]; do echo Waiting for EBS volume to attach; sleep 5; done"
while [ ! -e ${deviceId} ]; do echo Waiting for EBS volume to attach; sleep 5; done
echo "Executing: mkfs -t ext4 ${deviceId}"
mkfs -t ext4 ${deviceId}
echo "${deviceId} ${mountPoint} ext4 defaults,nofail 0 0" >> /etc/fstab
mkdir -p ${mountPoint}
mount ${mountPoint}
