TL; DR:当启动使用CLI aws ec2 create-image
创建的AMI实例时,先前应用的user-data
消失了,而启动在控制台中创建的AMI则具有所有user-data
修改。
场景:
我想自动创建一个自定义AMI供我们使用,它本身基于定期更新的基础AMI。每当我收到通知时,我都会使用新的AMI ID,然后运行一个脚本,我将摘录它。
我启动了一个EC2实例,我添加了某种形式的user-data
。创建文件,添加包等。这一步是直截了当的。
# 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
进行测试,如上所示的实例ID ${ec2_id}
,这表明我所有的user-data
都在那里。
然后我在AMI上启动一个实例 - 你不知道它有我所有的修改!一切都在那里。
我已经检查过并且三重检查了,我只是看不出我做错了哪里/我做错了!我想也许在aws ec2 create-image
中有一些额外的命令行选项,它们在进行API调用时在控制台等效项中使用。如果有,我看不到它。
我错过了什么?!
这就像从控制台创建的AMI,相同的实例ID和CLI中的不同,但我比较了ID号,它们肯定是一样的。您会认为使用正确的实例ID意味着底层快照和/或卷将是相同的,因为--instance-id
是我可以为create-image提供的唯一值,对吧?
编辑:
按照@ Michael-sqlbot建议,我查看了CloudTrail日志。可悲的是,这让这更令人沮丧。
编辑编辑:我已经删除了CloudTrail日志,因为它们与问题及其解决方案无关,并且很可能只会混淆事情。
我发现了问题以及如何解决它,它可能会帮助其他人遇到同样的问题:
事实证明,使用
aws ec2 wait instance-running
不足以确保所有user-data
完整并已完成。
你可能想用
aws ec2 wait instance-status-ok
无论是另外还是相反。即便如此,你可能想要偏执,并添加一个简单的sleep
几分钟,以确定!