Skip to content

Instantly share code, notes, and snippets.

@crestonbunch
Last active June 16, 2022 03:47
Show Gist options
  • Save crestonbunch/5f5a2aed4f103da3a280147f6e7d730c to your computer and use it in GitHub Desktop.
Save crestonbunch/5f5a2aed4f103da3a280147f6e7d730c to your computer and use it in GitHub Desktop.
EC2 Mount EBS Volume
#!/bin/bash
set -e
REGION=$(curl -s http://169.254.169.254/latest/meta-data/placement/region)
INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
VOLUME_NAME=$1
VOLUME_DEVICE=$2
VOLUME_ID=$(aws ec2 describe-volumes --filters "Name=tag:Name,Values=${VOLUME_NAME}" --region "${REGION}" | jq -r .Volumes[0].VolumeId)
VOLUME_STATE=$(aws ec2 describe-volumes --filters "Name=tag:Name,Values=${VOLUME_NAME}" --region "${REGION}" | jq -r .Volumes[0].State)
if [[ "${VOLUME_STATE}" == "in-use" ]]; then
echo "Volume is already in use, skipping mount."
else
aws ec2 attach-volume --volume-id "${VOLUME_ID}" --instance-id "${INSTANCE_ID}" --device "${VOLUME_DEVICE}" --region=${REGION}
while sleep 5; do
echo "Waiting for volume state: in-use."
VOLUME_STATE=$(aws ec2 describe-volumes --filters "Name=tag:Name,Values=${VOLUME_NAME}" --region "${REGION}" | jq -r .Volumes[0].State)
echo "Volume state: ${VOLUME_STATE}"
if [[ "${VOLUME_STATE}" == "in-use" ]]; then
break
fi
done
echo "Volume mounted."
fi
mkdir -p "/mnt/${VOLUME_NAME}"
if mountpoint "/mnt/${VOLUME_NAME}"; then
echo "Filesystem is already mounted."
else
NVME_ID=$(echo ${VOLUME_ID} | sed 's/\-//g')
NVME_PATH=$(readlink -f "/dev/disk/by-id/nvme-Amazon_Elastic_Block_Store_${NVME_ID}")
if [[ $(file -s "${NVME_PATH}") == "${NVME_PATH}: data" ]]; then
echo "Creating filesystem"
mkfs -t ext4 "${NVME_PATH}"
fi
echo "Mounting ${NVME_PATH} to /mnt/${VOLUME_NAME}"
mount "${NVME_PATH}" "/mnt/${VOLUME_NAME}"
echo "Filesystem mounted."
fi
#!/bin/bash
set -e
REGION=$(curl -s http://169.254.169.254/latest/meta-data/placement/region)
VOLUME_NAME=$1
VOLUME_ID=$(aws ec2 describe-volumes --filters "Name=tag:Name,Values=${VOLUME_NAME}" --region "${REGION}" | jq -r .Volumes[0].VolumeId)
NVME_ID=$(echo ${VOLUME_ID} | sed 's/\-//g')
NVME_PATH=$(readlink -f "/dev/disk/by-id/nvme-Amazon_Elastic_Block_Store_${NVME_ID}")
if mountpoint "/mnt/${VOLUME_NAME}"; then
umount "/mnt/${VOLUME_NAME}"
else
echo "Path not mounted."
fi
VOLUME_STATE=$(aws ec2 describe-volumes --filters "Name=tag:Name,Values=${VOLUME_NAME}" --region "${REGION}" | jq -r .Volumes[0].State)
if [[ "${VOLUME_STATE}" == "in-use" ]]; then
aws ec2 detach-volume --volume-id "${VOLUME_ID}" --region "${REGION}"
while sleep 5; do
echo "Waiting for volume state: available"
VOLUME_STATE=$(aws ec2 describe-volumes --filters "Name=tag:Name,Values=${VOLUME_NAME}" --region "${REGION}" | jq -r .Volumes[0].State)
echo "Volume state: ${VOLUME_STATE}"
if [[ "${VOLUME_STATE}" == "available" ]]; then
break
fi
done
else
echo "Device not in use. State: ${VOLUME_STATE}"
fi

These scripts are intended to run on EC2 instances. They need jq and aws-cli and permission to mount/unmount volumes.

Tested on Ubuntu 20.04 AMIs.

# Mount an EBS volume with the name "my-volume-name"
# Format it as ext4 (if unformatted) and mount it at /mnt/my-volume-name
./mount-volume.sh my-volume-name /dev/xdvdaa
# Unmount an EBS volume
./unmount-volume.sh my-volume-name
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment