在构建过程中使用Packer附加EBS卷

5
我不确定这是否是正确的方法,但我想缩短使用Packer构建镜像的时间。其中一个必要步骤是复制大约10GB的数据并将其作为镜像的一部分。目前,我正在使用shell provisioner通过sftp将其传输到映像中,这需要很长时间。相反,我希望这些数据已经在EBS卷中,并且可以在构建时附加。由于它将作为块设备挂载在亚马逊自己的网络上,因此传输速度比sftp快得多。
我尝试搜索Packer中的此类方法,但没有找到太多相关信息。我将尝试使用amazon-ebs builder中的ami_block_device_mappings可选参数来附加EBS卷。
如果有更好的方法,请告诉我。谢谢。
2个回答

4
看起来shell provisioner是目前的最佳选择。像这样的事情,shell provisioner似乎是一个终极解决方案:)。在amazon-ebs builder中将来可能会有一个参数,比如"attach_ebs_volume"之类的东西,这将是很好的。无论如何,以下是我是如何做到的:
  1. 将AWS信息(例如ebs_volume、instance_id等)添加到模板的variables部分中。我从环境变量中提取访问和密钥,因此它们在模板中没有明确指定,但现在我只是定义了其余部分。
  2. 在模板中的provisioners块中使用“environment_vars”参数将变量传递给构建机器。
  3. 将{{.Vars}}添加到“execute_command”参数中,以便在脚本运行之前定义变量。
  4. 安装aws cli(作为要传递的脚本的一部分)。
  5. 通过wget从meta_data获取构建机器的instance_id并将其分配给env var。
  6. 发出aws cli命令以附加卷,并使用从模板传递的env vars填充命令选项以及wget命令获取的instance_id。
  7. 像平常一样挂载(在挂载之前暂停几秒钟,它需要一点时间才能附加。否则它将看不到它,挂载将失败。)
完成。
如果有更优雅的方式...请分享。
谢谢。

嗨,你能否提供一个完整的解决方案示例吗? - asdoylejr

1

谢谢。这确实让我有点明白了。但我仍然不知道如何指定要挂载的EBS卷。我认为这允许您创建和附加卷,但是如何附加现有卷呢?我没有看到指定卷ID的选项。类似于这样:{ "device_name": "/dev/sdg", "volume_id": "vol-xxxxx" } - Ryan B.
我没有看到这样的选项,但是如果您有该卷的快照,您可以创建一个带有附加EBS卷的AMI。在这种情况下,请使用“snapshot_id”选项。 - user1783757

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接