【问题标题】:Mount a EBS volume (not snapshot) to Elastic Beanstalk EC2将 EBS 卷(不是快照)挂载到 Elastic Beanstalk EC2
【发布时间】:2015-11-10 12:39:27
【问题描述】:

我正在将旧版应用程序迁移到 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) for parameter snapshotId is invalid. Expected: 'snap-...'.”

显然这种方法只允许快照。任何人都可以建议修复或替代方法。

【问题讨论】:

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


    【解决方案1】:

    我找到了解决办法。可以通过删除“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"
    

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

    【讨论】:

    • 你可以用test: "[ ! -b /dev/sdh ]"代替ignoreErrors
    • 我不明白你的注释:什么环境变量?如果这是在 commands 而不是 container_commands 中,您是否不需要像 @hashinclude 提到的那样重新启动 docker 容器?
    • 不应该是test: "! mountpoint -q /dev/sdh"test: "! mountpoint -q /data"
    • 使用aws ec2 wait volume-in-use --region ${REGION} --volume-ids ${VOLUME_ID}等待附件。
    • 这是我一直在寻找的,但似乎需要将我的 API 密钥/秘密存储在 ec2 实例中......这暂停了另一个问题......我现在认为它可能是最好请求从快照创建新的 EBS 实例
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        这是一个配置文件,您可以将其放入.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"
        

        【讨论】:

          【解决方案5】:

          这里是缺少配置:

          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"
          

          【讨论】:

            猜你喜欢
            • 2020-10-23
            • 2012-11-30
            • 2012-03-10
            • 2014-08-03
            • 2014-09-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-05-16
            相关资源
            最近更新 更多