我在这里发现了类似的问题,但答案要么过时,要么来自命令行。
情况是这样的。我有一个使用实例存储的 EC2 实例(这是爱尔兰唯一可用于 Debian 6 的 AMI)。现在,通过 AWS GUI,我可以对实例卷进行快照和/或甚至创建卷。但从快照生成的映像无法启动。
最好的解决方案是什么?是克隆使用实例存储的 EC2 实例,还是从实例存储的创建快照启动新的 EBS 实例(相同克隆),从 gui aws 管理控制台而不是命令行?在拒绝之前,请考虑没有关于如何通过 aws 管理控制台执行此操作的类似问题。
暗示无法完成不是一个合适的答案。因为您可以创建实例存储支持的实例和/或卷的快照,并从该快照创建 AMI。
答案1
您无法通过 AWS 控制台对实例存储卷上的数据执行任何操作。这样做有充分的理由,稍后我会详细说明。
首先让我澄清一下你问题中的几点:
情况是这样的。我有一个使用实例存储的 EC2 实例(这是爱尔兰唯一可用于 Debian 6 的 AMI)。
EU-West-1 中有几个 EBS-root Debian 6 AMI(32 位和 64 位)。其中一些可以在Debian 维基。
现在,通过 AWS GUI,我可以对实例卷进行快照,甚至可以创建卷。但是,从快照生成的映像无法启动。
AWS 所指的“快照”只能从 EBS 卷制作(见图)。就其本质而言,实例存储卷是短暂的 - 临时的。捕获实例存储卷状态的唯一方法是将文件捆绑在其上(几乎就像您通过创建存档一样) - 这些不是块级的。AWS 控制台中提到的快照适用于 EBS 卷 - 这些是块级的。您创建的快照很可能是附加到实例的 EBS 卷的快照,并且由于这不是根卷,因此尝试从中运行实例会不断失败。
此外,您无法将实例存储卷添加到正在运行的实例中。实例存储是实例类型的一个特性 - 它以固定卷大小(例如,您无法添加 15GB 的实例存储卷)并且只能在启动实例时添加(作为命令的一部分ec2-run-instances
或内置于 AMI 中)。
一般来说,除非有非常好的理由(通常是高 io、瞬态任务),否则应该避免使用实例存储实例
现在,尝试回答您提出的一些问题:
最好的解决方案是什么?是克隆使用实例存储的 EC2 实例,还是从实例存储的创建快照启动新的 EBS 实例(相同克隆),从 gui aws 管理控制台而不是命令行?在拒绝之前,请考虑没有关于如何通过 aws 管理控制台执行此操作的类似问题。
使用命令行。在您认为我拒绝回答您的问题之前,请允许我解释一下。AWS 不会访问您的文件 - 您可以远程执行的任何操作都不需要了解您的实例上实际的内容。因此,创建 EBS 快照发生在块级别 - 它不需要了解文件系统或读取卷上包含的文件的权限(想象一下,如果 AWS 需要能够读取 Linux 操作系统上每个可以想象的文件系统,那将是一项不可能完成的任务)。另一方面,从实例存储卷创建“捆绑包”的过程需要对系统上的文件具有读取权限。您会注意到必须ec2-bundle-vol
从相关实例运行(与 ec2-create-snapshot 命令不同,后者可以在不访问实例的情况下运行)。
命令行和 API 存在的原因有多种。首先,它们对于自动化至关重要 - 您无法编写“AWS 控制台”脚本。但同样重要的是,它们提供了更广泛的选项。虽然 AWS 控制台一直在不断添加新功能,但出于某种原因,仍有许多事情只能通过命令行完成。选择最适合您的方法,但不要忽略命令行或 GUI 界面,因为两者都有其用途。
因此,由于控制台已被排除,您必须使用命令行来继续。
选项1:
从现有实例创建新的实例存储 AMI。您需要运行:
ec2-bundle-vol
创建 AMIec2-bundle-vol -d /mnt -k $EC2_PRIVATE_KEY -c $EC2_CERT -u USERID -s 大小
ec2-upload-bundle
保存到 S3ec2-upload-bundle -b 存储桶名称 -m 清单文件 -a 访问密钥 -s 机密密钥
ec2-register
注册 AMI(最后一个可以从 AWS 控制台完成)。
这绝对是最简单的方法,但就我个人而言,我不会采用这种方法。如果你要付出努力,你不妨全力以赴,转换为 EBS。
选项 2:
将您拥有的文件复制到 EBS 卷并基于该卷创建新的图像。
您需要首先创建一个新的 EBS 卷(在与现有实例相同的可用区域中),然后将该卷附加到该实例。
注意:如果您计划在不同实例类型上使用 AMI,最好从 /etc/fstab 中删除对临时存储的任何引用,因为每个实例类型上可用的临时存储各不相同(通常安装在 /mnt 上)。
有两种方法可以实现此目的,具体取决于您当前拥有的内容。
如果您有一个捆绑卷(例如来自'选项 1'),您可以解除该卷的捆绑,然后使用
dd
它将其复制到您的 EBS 卷上(您可能需要先使用 下载捆绑包ec2-download-bundle
):ec2-unbundle -m /local/path/to/manifest.xml -s 源目录 -d 目标目录 dd if=/path/to/image of=/dev/NAME
否则,您可以使用
rsync
将根卷上的文件复制到新的 EBS 卷。- 格式化你的 EBS 卷(例如
mkfs.ext3 /dev/sdf
) - 挂载 EBS 卷(例如
mkdir /mnt/ebs && mount /dev/sdf /mnt/ebs
) - 尽可能停止实例上运行的服务(以最大限度地降低不一致的风险)
- 刷新缓存:(例如
sync
) - 将文件复制到:(例如
rsync -aHAXxSP --exclude /mnt/ebs / /mnt/ebs
)。您也可以使用dd
,但对于已挂载的源文件系统,rsync 更合适。 - 刷新缓存:(例如
sync
) - 卸载EBS卷:(例如
umount /mnt/ebs
) - 检查文件系统:(例如
fsck /dev/sdf
)
从这里开始,您可以在 AWS 控制台中执行其余操作:制作 EBS 卷的快照并从该快照创建 AMI。启动您的新 AMI 以确保一切正常。
- 格式化你的 EBS 卷(例如