amazon-web-services - 来自 create-image 的 AMI 不维护用户数据修改,但控制台启动是
问题描述
TL;DR:当启动使用 CLI 创建的 AMI 实例时,aws ec2 create-image
之前应用user-data
的内容消失了,而启动在控制台中创建的 AMI 时会进行所有user-data
修改。
设想:
我想自动创建一个自定义 AMI 供我们使用,它本身基于定期更新的基础 AMI。每当我收到通知时,我都会获取新的 AMI ID,然后运行一个脚本,我将从中摘录。
我启动了一个我添加user-data
某种形式的 EC2 实例。创建文件,添加包等。这一步很简单,很有效。
# base_ami_id is set elsewhere
ec2_id=$(aws ec2 run-instances \
--image-id ${base_ami_id} \
--count 1 \
--instance-type t2.micro \
--key-name ${key_name} \
--security-group-ids ${security_group} \
--subnet-id ${subnet} \
--user-data file://user-data.sh \
--iam-instance-profile Name=${iamprof} \
--output text --query 'Instances[*].InstanceId' \
)
echo "Instance ID is ${ec2_id}"
echo "Waiting for instance ${ec2_id} to run"
aws ec2 wait instance-running --instance-ids ${ec2_id}
注意:此时,我可以ssh
进入创建的实例并验证是否正确cloud-init
应用了我的所有实例user-data
。一切都很好。
根据返回的实例 ID,我创建了一个 AMI 映像
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/creating-an-ami-ebs.html
echo Create image from instance ${ec2_id}
image_id=$(aws ec2 create-image --name ${image_name} --instance-id ${ec2_id} --output text --query 'ImageId')
echo "image ID is ${image_id}"
echo "Waiting for image ${image_id} to be available"
aws ec2 wait image-available --image-ids ${image_id}
echo "Image ${image_id} (${image_name}) available"
在控制台中观看,过了一会儿我看到了我的新 AMI。
为了进行测试,我在此步骤创建的 AMI 上启动了一个实例——我惊讶地发现我的修改不在实例中!就好像我已经启动了最初的AMI。这没有任何意义:如上所述,user-data
当我进行测试登录时,它就在那里。如上面的 shell 摘录所示,我使用$[ec2_id}
从aws ec2 run-instance
舞台上获得的返回值作为创建 AMI 的基础,而不是无意中使用了其他 ID。
让这更令人困惑的是,我使用控制台并通过Create Image
从那个正在运行的实例(具有${ec2_id}
上述实例 ID 的实例)进行测试,这表明我的一切都user-data
在那里。
然后我从那个AMI 上启动一个实例——你不知道它有我所有的修改!一切都在那里。
我已经检查并三重检查,但我只是看不出我在哪里/做错了什么!我想也许有一些额外的命令行选项aws ec2 create-image
在进行 API 调用时在控制台等效项中使用。如果有,我看不到。
我错过了什么?!
这就像从控制台创建的 AMI,相同的实例 ID 和 CLI 中的不同,但我比较了 ID 号,它们肯定是相同的。您会认为使用正确的实例 ID 意味着底层快照和/或卷是相同的,因为这是我可以提供给 create-image--instance-id
的唯一值,对吗?
编辑:
按照@Michael-sqlbot 的建议,我查看了 CloudTrail 日志。可悲的是,这让这更加令人沮丧。
编辑编辑:我删除了 CloudTrail 日志,因为它们与问题及其解决方案无关,而且很可能只会混淆事物。
解决方案
我发现了这个问题以及如何解决它,它可能会帮助其他遇到同样问题的人:
事实证明,使用
aws ec2 wait instance-running
不足以确保一切都已user-data
完成并已完成。
您可能想使用
aws ec2 wait instance-status-ok
补充或替代。即使这样,您也可能想要偏执并添加sleep
几分钟来确定!
推荐阅读
- python - 带有 Tensorflow 的 CNN,在 CIFAR-10 上的准确性低且没有改进
- c# - 将结果 convert.FromBase64String 存储到 postgres bytea
- laravel - Laravel Eloquent 插入/更新的正确语法
- tensorflow - 张量流中的循环
- php - 我的 if 函数(|| 和 &&)无法正常工作
- php - 将自定义表单数据添加到 ORDER 选项卡 (WooCommerce)!
- java - Spring Boot - 具有角色和权限的 OAuth
- php - 使用 load() 函数加载 Ajax php 页面和 url 更改而不刷新
- yii2 - Yii2 - UrlManager 和带有连字符的参数
- java - 无法运行 monkeyrunner 脚本