Short script to create and attach an EBS Volume in AWS

1–2 minutes

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}