Amazon ec2 将EBS卷(非快照)装载到Elastic Beanstalk EC2

Amazon ec2 将EBS卷(非快照)装载到Elastic Beanstalk EC2,amazon-ec2,amazon-ebs,amazon-elastic-beanstalk,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:launchconfig

我正在将旧版应用程序迁移到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

但不幸的是,参数snapshotId出现以下错误“(vol XXXX)无效。应为:'snap-…'


显然,这种方法只允许快照。谁能提出一个解决方案或替代方法。

我找到了一个解决方案。它可以通过删除“sleep 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"
注意。理想情况下,它将在
命令
部分非
容器_命令
中运行,但环境变量未及时设置。

添加到@Simon的答案中(以避免不小心的陷阱):

  • 如果要装载的持久性存储最终将在Docker容器内使用(例如,如果您正在运行Jenkins并希望将Jenkins_持久化为home),则需要在运行装载后重新启动Docker容器
  • 您需要允许对EB假定角色策略中的ec2实例(或实例/*ARN)和要附加的卷(或卷/*ARN)执行“ec2:AttachVolumes”操作。否则,
    aws ec2附加卷
    命令将失败
  • 您还需要将
    --region
    传递给
    aws ec2…
    命令(至少在撰写本文时是这样)

此处缺少配置:

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"
命令:
01安装:
命令:“export AWS\u ACCESS\u KEY\u ID=&&export AWS\u SECRET\u ACCESS\u KEY=&&AWS ec2 attach volume--volume ID--instance ID$(curl-shttp://169.254.169.254/latest/meta-data/instance-id)--device/dev/xvdf--region“
忽略错误:正确
02等待:
命令:“睡眠10”
03mkdir:
命令:“mkdir/home/lucene”
测试:“[!-d/home/lucene]”
04安装:
命令:“mount/dev/xvdf/home/lucene”
测试:“!挂载点-q/dev/xvdf”

备选地,您可以考虑使用弹性文件系统(EFS)存储,而不是使用EBS卷。AWS发布了一个关于如何将EFS卷装载到Elastic Beanstalk EC2实例的脚本,它还可以同时附加到多个EC2实例(这对于EBS是不可能的)


这是一个配置文件,您可以将其放入
.ebextensions
。您需要提供要附加的
卷ID
。测试命令使连接和安装仅在需要时进行,这样您就可以重复部署
eb
,而不会出现错误

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"

你可以测试:“[!-b/dev/sdh]”,而不是
ignoreErrors
。我不明白你的意思:什么环境变量?如果这是在
命令中,而不是在
容器\u命令中,您是否不需要像@hashinclude提到的那样重新启动docker容器?不应该
测试:“!mountpoint-q/dev/sdh”
测试:“!mountpoint-q/data”
?使用
aws ec2等待使用中的卷--region${region}--卷ID${volume\u ID}
等待附件。这是我一直在寻找的,但似乎需要将我的API密钥/机密存储在ec2实例中。。。这是另一个问题。。。我现在认为最好是请求从快照创建一个新的EBS实例