我将旧版应用迁移到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
但遗憾的是我收到以下错误"(vol-XXXX)参数snapshotId无效。预期:' snap -...'。"
显然,此方法仅允许快照。任何人都可以建议修复或替代方法。
答案 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的回答(以避免陷入困惑的陷阱):
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"