您无法将密钥对应用于正在运行的实例。您只能使用新的密钥对来启动新实例。
对于恢复,如果它是 EBS 启动 AMI,您可以停止它,制作卷的快照。基于它创建一个新卷。并且能够用它来启动旧实例、创建新映像或恢复数据。
尽管临时存储中的数据将会丢失。
由于这个问题和答案很受欢迎,我想捕获罗德尼在其评论中发布的链接中的信息。
信用去往埃里克·哈蒙德 https://plus.google.com/111045584683584396225/about for 此信息 http://alestic.com/2011/02/ec2-fix-ebs-root.
修复 EC2 实例的根 EBS 卷上的文件
即使您处于您认为的灾难性情况,您也可以检查和编辑 EC2 实例上的根 EBS 卷上的文件,例如:
- 您丢失了 ssh 密钥或忘记了密码
- 您在编辑 /etc/sudoers 文件时犯了一个错误,并且无法再
使用 sudo 获得 root 访问权限来修复它
- 您长时间运行的实例因某种原因挂起,无法
已联系,但无法正常启动
- 您需要从实例恢复文件但无法访问它
在办公桌上的物理计算机上,您只需使用 CD 或 USB 记忆棒启动系统,安装硬盘驱动器,检查并修复文件,然后重新启动计算机即可恢复正常工作。
然而,当您处于其中一种情况时,远程 EC2 实例似乎很遥远并且无法访问。幸运的是,AWS 为我们提供了恢复此类系统的能力和灵活性,前提是我们运行的是 EBS 启动实例而不是实例存储。
EC2 上的方法有点类似于物理解决方案,但我们要将有故障的“硬盘驱动器”(根 EBS 卷)移动并安装到另一个实例,修复它,然后将其移回。
在某些情况下,启动一个新的 EC2 实例并扔掉坏的实例可能会更容易,但如果您确实想修复文件,以下是对许多人有效的方法:
Setup
识别包含损坏的根 EBS 卷以及您要查看和编辑的文件的原始实例 (A) 和卷。
instance_a=i-XXXXXXXX
volume=$(ec2-describe-instances $instance_a |
egrep '^BLOCKDEVICE./dev/sda1' | cut -f3)
确定将用于修复原始 EBS 卷上的文件的第二个 EC2 实例 (B)。此实例必须与实例 A 在同一可用区中运行,以便它可以附加 EBS 卷。如果您还没有正在运行的实例,请启动一个临时实例。
instance_b=i-YYYYYYYY
停止损坏的实例 A(等待其完全停止),从该实例分离根 EBS 卷(等待其分离),然后将该卷附加到未使用的设备上的实例 B。
ec2-stop-instances $instance_a
ec2-detach-volume $volume
ec2-attach-volume --instance $instance_b --device /dev/sdj $volume
ssh 到实例 B 并安装该卷,以便您可以访问其文件系统。
ssh ...instance b...
sudo mkdir -p 000 /vol-a
sudo mount /dev/sdj /vol-a
Fix It
此时,实例 A 中的整个根文件系统可在实例 B 上的 /vol-a 下查看和编辑。例如,您可能想要:
- 将正确的 ssh 密钥放入 /vol-a/home/ubuntu/.ssh/authorized_keys
- 编辑并修复 /vol-a/etc/sudoers
- 在 /vol-a/var/log/syslog 中查找错误消息
- 将重要文件复制出 /vol-a/...
注意:两个实例上的 uid 可能不相同,因此如果您要创建、编辑或复制属于非 root 用户的文件,请务必小心。例如,实例 A 上的 mysql 用户可能与实例 B 上的 postfix 用户具有相同的 UID,如果您 chown 具有一个名称的文件,然后将卷移回 A,则可能会导致问题。
Wrap Up
完成后并且您对 /vol-a 下的文件感到满意后,卸载文件系统(仍在实例 B 上):
sudo umount /vol-a
sudo rmdir /vol-a
现在,使用 ec2-api-tools 返回系统,继续将 EBS 卷移回原始实例 A 上的主目录,然后再次启动该实例:
ec2-detach-volume $volume
ec2-attach-volume --instance $instance_a --device /dev/sda1 $volume
ec2-start-instances $instance_a
希望您解决了问题,实例 A 运行良好,并且您可以完成您最初打算做的事情。如果没有,您可能需要继续重复这些步骤,直到它正常工作。
注意:如果您在停止实例 A 时为其分配了弹性 IP 地址,则需要在再次启动实例 A 后重新关联它。
记住!如果您的实例 B 只是为了此过程而临时启动的,请不要忘记立即终止它。