This is an example of a daemon process that monitors a filesystem mountpoint and automatically expands it when free space falls below a configured threshold. New Amazon EBS volumes are added to the instance as necessary and the underlying filesystem (BTRFS or LVM with ext4) expands as new devices are added.
- Code is running on an AWS EC2 instance
- The instance and AMI use HVM virtualization
- The instance AMI allows device names like
/dev/xvdb*
and will not remap them - The instance is using a Linux based OS with either upstart or systemd system initialization
- The instance has a IAM Instance Profile with appropriate permissions to create and attach new EBS volumes. See the IAM Instance Profile section below for more details
- That prerequisites are installed on the instance:
- jq
- btrfs-progs
- lvm2
- unzip
Provided in this repo are:
- A script that creates and attaches new EBS volumes to the current instance
- A daemon script that monitors disk space and expands the targeted filesystem using the above script to add EBS volumes as needed
- Service definitions for upstart and systemd
- Configuration files for the service and logrotate
- An installation script to configure and install all of the above
- An Uninstallation script to remove the service daemon, unmount the filesystem, and detach and delete any ebs volumes created by the daemon
- An example cloud-init script that can be used as EC2 instance user-data for automated installation
The easiest way to set up an instance is to provide a launch call with the userdata cloud-init script. Here is an example of launching the Amazon ECS-Optimized AMI in us-east-1 using this file:
aws ec2 run-instances --image-id ami-5253c32d \
--key-name MyKeyPair \
--user-data file://./templates/cloud-init-userdata.yaml \
--count 1 \
--security-group-ids sg-123abc123 \
--instance-type t2.micro \
--iam-instance-profile Name=MyInstanceProfileWithProperPermissions
that installs required packages and runs the initialization script. By default this creates a mount point of /scratch
on a encrypted 100GB EBS volume. To change the mount point, edit the cloud-init script file and supply additional options to the install script to suit your specific needs. Install options are shown below.
Install Amazon EBS Autoscale
install.sh [options] [[-m] <mount-point>]
Options
-d, --initial-device DEVICE
Initial device to use for mountpoint - e.g. /dev/xvdba.
(Default: none - automatically create and attaches a volume)
If provided --initial-size is ignored.
-f, --file-system btrfs | lvm.ext4
Filesystem to use (default: btrfs).
Options are btrfs or lvm.ext4
-h, --help
Print help and exit.
-m, --mountpoint MOUNTPOINT
Mount point for autoscale volume (default: /scratch)
-s, --initial-size SIZE
Initial size of the volume in GB. (Default: 200)
Only used if --initial-device is NOT specified.
-t, --volume-type VOLUMETYPE
EBS volume type to use. (Default: gp3)
In the above, we assume that the MyInstanceProfileWithProperPermissions
EC2 Instance Profile exists and has the following permissions:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:AttachVolume",
"ec2:DescribeVolumeStatus",
"ec2:DescribeVolumes",
"ec2:ModifyInstanceAttribute",
"ec2:DescribeVolumeAttribute",
"ec2:CreateVolume",
"ec2:DeleteVolume",
"ec2:CreateTags"
],
"Resource": "*"
}
]
}
This sample code is made available under the MIT license.