来自create-image的AMI不维护用户数据修改,但是控制台启动是

问题描述 投票:1回答:1

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日志,因为它们与问题及其解决方案无关,并且很可能只会混淆事情。

amazon-web-services amazon-ec2 aws-cli ami
1个回答
0
投票

我发现了问题以及如何解决它,它可能会帮助其他人遇到同样的问题:

事实证明,使用

aws ec2 wait instance-running

不足以确保所有user-data完整并已完成。

你可能想用

aws ec2 wait instance-status-ok

无论是另外还是相反。即便如此,你可能想要偏执,并添加一个简单的sleep几分钟,以确定!

© www.soinside.com 2019 - 2024. All rights reserved.