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

Sim*_*mon 7 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
Run Code Online (Sandbox Code Playgroud)

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

但不幸的是我收到以下错误"(vol-XXXX)参数snapshotId无效.预计:'snap -...'."

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

Sim*_*mon 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"
Run Code Online (Sandbox Code Playgroud)

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


小智 5

添加到@Simon 的答案中(以避免粗心的人陷入陷阱):

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