追踪 AMI 后代的最佳方法是什么?

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

我们有几个黄金 AMI,团队已经根据(子级)构建了 AMI,一些 AMI 是根据这些(孙级)构建的,现在我们想弄清楚如何跟踪其父级黄金 AMI 的后代。 Amazon AMI 有一个

/etc/os-release
,这很有用,但它使查找之间的 AMI 变得更加困难。

可能的解决方案

  1. AMI 标记和后代 AMI 标记

    • 这可行,但需要对所有有人可能忘记包含的加壳器脚本使用这种标记方法。
      "tags": {
        "source_ami": "{{ .SourceAMI }}",
        "source_ami_name": "{{ .SourceAMIName }}",
        "source_ami_date": "{{ .SourceAMICreationDate }}"
      }
      
    • 除此之外,我们还可以创建一个云托管策略来注销任何新的 AMI(在特定日期之后),如果它不包含上述强制标签,则自动注销。
    • 此方法的另一个问题是,与其他帐户共享这些 AMI 会丢失这些共享帐户中的标签。此解决方案需要 Lambda 或packer 后处理器,它们可以在子账户中发挥作用,以便将 AMI 标签从主构建账户复制到子账户。
  2. Manifest json 文件示例)在启动时下载到 EC2

    • 这不会包含 AMI 本身的最终 AMI ID,因为在完成之前我们不知道 AMI 是什么。我们可以做的是使用清单后处理器输出
      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 文件移动到系统上的可用文件中。
    • 或者我们可以创建一个包含源 ami 而不是结果 ami 的文件。这可以使用点击元数据端点
      http://169.254.169.254/latest/meta-data/ami-id
      的脚本来在打包过程中获取当前 AMI,然后将该信息转储到
      /etc/os-0.json
      文件中。

我倾向于第一种方法,因为它看起来简单得多。

children amazon-ami packer
1个回答
0
投票

我解决这个问题的方法是创建一个在 CreateImage、CopyImage、RegisterImage 和 RunInstances 上触发的 EventBridge 规则。该规则会触发 lambda。该 lambda 只是将整个事件转发到 SQS 队列以进行进一步处理。您可以让一个队列从多个账户/区域中的多个 lambda 接收信息。在存储事件的中心位置,您可以使用数据进行分析。例如,通过 CopyImage 事件生成的图像具有源图像 ID。通过 CreateImage 创建的图像具有源实例 ID。通过 RunInstances 创建的实例具有源映像 ID。利用这些基本知识,您可以通过这种方式追踪任何实例或 AMI 一直追溯到源头。

我用这种方法解决了很多小细节。例如,CloudTrail 事件的消息大小限制为 100KB。因此,如果使用 RunInstances 一次启动 40 或 80 个实例,则所有这些信息实际上都会从事件中省略。因此需要进一步查找(DescribeInstances)来获取信息。此外,需要描述所看到的公开图像并需要存储该信息。这是因为供应商有时会删除旧的 AMI。

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