将EBS卷(非快照)挂载到Elastic Beanstalk EC2

时间:2015-08-17 19:02:38

标签: amazon-ec2 amazon-ebs amazon-elastic-beanstalk

我将旧版应用迁移到Elastic Beanstalk。它需要持久存储(暂时)。我想安装一个EBS卷。

我希望以下内容适用于.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

但遗憾的是我收到以下错误"(vol-XXXX)参数snapshotId无效。预期:' snap -...'。"

显然,此方法仅允许快照。任何人都可以建议修复或替代方法。

5 个答案:

答案 0 :(得分:10)

我找到了解决方案。可以通过删除睡眠10"来改善它。但不幸的是,这是必需的,因为aws ec2 attach-volume是异步的并且在附件发生之前立即返回。

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"

请注意。理想情况下,它将在commands部分而不是container_commands中运行,但环境变量未及时设置。

答案 1 :(得分:4)

添加@ Simon的回答(以避免陷入困惑的陷阱):

  • 如果挂载的持久存储最终将在Docker容器中使用(例如,如果您正在运行Jenkins并希望保留jenkins_home),则需要在运行挂载后重新启动docker容器。
  • 您需要拥有' ec2:AttachVolumes'允许针对EC假设角色策略中的EC2实例(或实例/ * ARN)和要附加的卷(或卷/ * ARN)的操作。如果没有这个,aws ec2 attach-volume命令就会失败。
  • 您还需要将--region传递给aws ec2 ...命令(至少在撰写本文时)

答案 2 :(得分:1)

这里是一个配置文件,您可以放入.ebextensions。您将需要提供要附加的VOLUME_ID。测试命令使它仅在需要时才进行连接和安装,因此您可以eb deploy反复进行而不会出错。

container_commands:
  00attach:
    command: |
      export REGION=$(/opt/aws/bin/ec2-metadata -z | awk '{print substr($2, 0, length($2)-1)}')
      export INSTANCE_ID=$(/opt/aws/bin/ec2-metadata -i | awk '{print $2}')
      export VOLUME_ID=$(aws ec2 describe-volumes --region ${REGION} --output text --filters Name=tag:Name,Values=tf-trading-prod --query 'Volumes[*].VolumeId')

      aws ec2 attach-volume --region ${REGION} --device /dev/sdh --instance-id ${INSTANCE_ID} --volume-id ${VOLUME_ID}
      aws ec2 wait volume-in-use --region ${REGION} --volume-ids ${VOLUME_ID}
      sleep 1
    test: "! file -E /dev/xvdh"
  01mkfs:
    command: "mkfs -t ext3 /dev/xvdh"
    test: "file -s /dev/xvdh | awk '{print $2}' | grep -q data"
  02mkdir:
    command: "mkdir -p /data"
  03mount:
    command: "mount /dev/xvdh /data"
    test: "! mountpoint /data"

答案 3 :(得分:0)

或者,您可以考虑使用弹性文件系统(EFS)存储,而不是使用EBS卷。 AWS已发布了一个脚本,介绍如何将EFS卷安装到Elastic Beanstalk EC2实例,并且它还可以同时附加到多个EC2实例(这对于EBS来说是不可能的)。

http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/services-efs.html

答案 4 :(得分:-1)

这是缺少配置:

commands:
  01mount:
    command: "export AWS_ACCESS_KEY_ID=<replace by your AWS key> && export AWS_SECRET_ACCESS_KEY=<replace by your AWS secret> && aws ec2 attach-volume --volume-id <replace by you volume id> --instance-id $(curl -s http://169.254.169.254/latest/meta-data/instance-id) --device /dev/xvdf --region <replace with your region>"
    ignoreErrors: true
  02wait:
    command: "sleep 10"
  03mkdir:
    command: "mkdir /home/lucene"
    test: "[ ! -d /home/lucene ]"
  04mount:
    command: "mount /dev/xvdf /home/lucene"
    test: "! mountpoint -q /dev/xvdf"