Amazon ec2 将EBS卷(非快照)装载到Elastic Beanstalk EC2
我正在将旧版应用程序迁移到Elastic Beanstalk。它需要持久性存储(暂时)。我想装载一个EBS卷 我希望以下内容可以在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
.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实例