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

标签: amazon-web-servicesamazon-ec2aws-cliamazon-ami

解决方案


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

事实证明,使用

aws ec2 wait instance-running

不足以确保一切都已user-data完成并已完成。

您可能想使用

aws ec2 wait instance-status-ok

补充或替代。即使这样,您也可能想要偏执并添加sleep几分钟来确定!


推荐阅读