我们有几个黄金 AMI,团队已经根据(子级)构建了 AMI,一些 AMI 是根据这些(孙级)构建的,现在我们想弄清楚如何跟踪其父级黄金 AMI 的后代。 Amazon AMI 有一个
/etc/os-release
,这很有用,但它使查找之间的 AMI 变得更加困难。
可能的解决方案
AMI 标记和后代 AMI 标记
"tags": {
"source_ami": "{{ .SourceAMI }}",
"source_ami_name": "{{ .SourceAMIName }}",
"source_ami_date": "{{ .SourceAMICreationDate }}"
}
Manifest json 文件(示例)在启动时下载到 EC2
manifest.json
,根据其各自的 AMI 将其上传到前缀,例如aws s3 cp manifest.json s3://bucket-ami-output/<ami-id>/manifest.json
,然后让 EC2 启动使用 /etc/rc.local
脚本来访问其元数据以获取其 AMI,下载相应的 AMI manifest.json
,检查是否存在不存在的 /etc/os-<parent-id>.json
,例如/etc/os-0.json
。如果 os-0.json
已经存在,则增加父 id 直到有一个可用。最后,将 json 文件移动到系统上的可用文件中。http://169.254.169.254/latest/meta-data/ami-id
的脚本来在打包过程中获取当前 AMI,然后将该信息转储到 /etc/os-0.json
文件中。我倾向于第一种方法,因为它看起来简单得多。
我解决这个问题的方法是创建一个在 CreateImage、CopyImage、RegisterImage 和 RunInstances 上触发的 EventBridge 规则。该规则会触发 lambda。该 lambda 只是将整个事件转发到 SQS 队列以进行进一步处理。您可以让一个队列从多个账户/区域中的多个 lambda 接收信息。在存储事件的中心位置,您可以使用数据进行分析。例如,通过 CopyImage 事件生成的图像具有源图像 ID。通过 CreateImage 创建的图像具有源实例 ID。通过 RunInstances 创建的实例具有源映像 ID。利用这些基本知识,您可以通过这种方式追踪任何实例或 AMI 一直追溯到源头。
我用这种方法解决了很多小细节。例如,CloudTrail 事件的消息大小限制为 100KB。因此,如果使用 RunInstances 一次启动 40 或 80 个实例,则所有这些信息实际上都会从事件中省略。因此需要进一步查找(DescribeInstances)来获取信息。此外,需要描述所看到的公开图像并需要存储该信息。这是因为供应商有时会删除旧的 AMI。