If you need to resize an EBS volume in AWS, you can do so using bash
.
Step 1 – Create a bash
file
Create a bash file called resize.sh
:
#!/bin/bash
SIZE=${1:-20}
INSTANCEID=$(curl http://169.254.169.254/latest/meta-data/instance-id)
REGION=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed 's/\(.*\)[a-z]/\1/')
VOLUMEID=$(aws ec2 describe-instances \
--instance-id $INSTANCEID \
--query "Reservations[0].Instances[0].BlockDeviceMappings[0].Ebs.VolumeId" \
--output text \
--region $REGION)
aws ec2 modify-volume --volume-id $VOLUMEID --size $SIZE
while [ \
"$(aws ec2 describe-volumes-modifications \
--volume-id $VOLUMEID \
--filters Name=modification-state,Values="optimizing","completed" \
--query "length(VolumesModifications)"\
--output text)" != "1" ]; do
sleep 1
done
if [[ -e "/dev/xvda" && $(readlink -f /dev/xvda) = "/dev/xvda" ]]
then
sudo growpart /dev/xvda 1
STR=$(cat /etc/os-release)
SUB="VERSION_ID=\"2\""
if [[ "$STR" == *"$SUB"* ]]
then
sudo xfs_growfs -d /
else
sudo resize2fs /dev/xvda1
fi
else
sudo growpart /dev/nvme0n1 1
STR=$(cat /etc/os-release)
SUB="VERSION_ID=\"2\""
if [[ "$STR" == *"$SUB"* ]]
then
sudo xfs_growfs -d /
else
sudo resize2fs /dev/nvme0n1p1
fi
fi
Step 2 – Run the bash
file specifying the new size
Now that you have the bash file, you can run the bash
file along with specifying the new size of the desired volume:
bash resize.sh 50
The above command will attempt to resize the EBS volume to 50GB
.
Additional Enhancements
As an alternative execution method, you can also change the bash
file to be executable. This will allow you to call it directly without having to pass bash
to the preceding command.
First you need to make the script and executable:
chmod +x resize.sh
Now you can simply run the file with the parameters required:
./resize.sh 20
This is possible because the first line of the file specifies the hashbang required to execute the code:
#!/bin/bash