Search code examples
amazon-ec2amazon-ebsamazon-elastic-beanstalk

Mount a EBS volume (not snapshot) to Elastic Beanstalk EC2


I'm migrating a legacy app to Elastic Beanstalk. It needs persistent storage (for the time being). I want to mount a EBS volume.

I was hoping the following would work in .ebextensions/ebs.config:

commands:
  01mkdir:
    command: "mkdir /data"
  02mount:
    command: "mount /dev/sdh /data"

option_settings:
  - namespace: aws:autoscaling:launchconfiguration
    option_name: BlockDeviceMappings
    value: /dev/sdh=vol-XXXXX

https://blogs.aws.amazon.com/application-management/post/Tx224DU59IG3OR9/Customize-Ephemeral-and-EBS-Volumes-in-Elastic-Beanstalk-Environments

But unfortunately I get the following error "(vol-XXXX) for parameter snapshotId is invalid. Expected: 'snap-...'."

Clearly this method only allows snapshots. Can anyone suggest a fix or an alternative method.


Solution

  • I have found a solution. It could be improved by removing the "sleep 10" but unfortunately that required because aws ec2 attach-volume is async and returns straight away before the attachment takes place.

    container_commands:
      01mount:
        command: "aws ec2 attach-volume --volume-id vol-XXXXXX --instance-id $(curl -s http://169.254.169.254/latest/meta-data/instance-id) --device /dev/sdh"
        ignoreErrors: true
      02wait:
        command: "sleep 10"
      03mkdir:
        command: "mkdir /data"
        test: "[ ! -d /data ]"
      04mount:
        command: "mount /dev/sdh /data"
        test: "! mountpoint -q /dev/sdh"
    

    Note. Ideally it would be run in commands section not container_commands but the environment variables are not set in time.