移动环境并对 Amazon EBS 卷调整大小或加密 - AWS Cloud9

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

移动环境并对 Amazon EBS 卷调整大小或加密

您可以将 AWS Cloud9 开发环境从一个 Amazon EC2 实例移动到另一个 Amazon EC2 实例。例如,您可以执行以下操作之一:

  • 从受损的或以意料之外(与正常运行的实例相比)方式运行的 Amazon EC2 实例中传输环境。

  • 将环境从现有的实例传输到已安装最新系统更新的实例。

  • 增加或减少实例的计算资源(由于该环境在当前实例上已过度使用或使用不充分)。

您可以通过迁移到新的 AWS Cloud9 EC2 环境从一个 AWS Cloud9 支持的 AMI 升级到另一个受支持的 AMI,同时保留项目文件。您可能需要升级到另一个版本的 AMI,因为:

  • 当前环境的 AMI 已达到 end-of-life ,不再受支持。

  • 您需要的软件包在当前 AMI 中已过时。

您还可以调整与用于环境的与 Amazon EC2 实例关联的 Amazon Elastic Block Store(Amazon EBS)卷的大小。例如,您可以执行以下操作之一或两个操作均执行:

  • 增加卷的大小,因为实例上的存储空间不足。

  • 减小卷的大小,因为您不希望为不使用的额外存储空间付费。

在移动环境或调整其大小之前,您可用尝试停止环境中一些正在运行的进程或向环境中添加交换文件。有关处理内存不足或 CPU 使用率高的更多信息,请参阅故障排除

注意

本主题仅介绍将从环境一个 Amazon EC2 实例移动到另一个实例或调整 Amazon EBS 卷的大小。要调整您自己的其中一个服务器中的环境,或者要更改您自己的其中一个服务器的存储空间,请参考服务器的文档。

最后,您可以加密 Amazon EBS 资源,以确保两者的安全, data-at-rest 以及实例 data-in-transit 与其连接的 EBS 存储之间的安全。

移动环境

在开始移动过程之前,请注意以下条件:

  • 您不能将环境移动到相同类型的 Amazon EC2 实例。在您进行移动时,必须为新实例选择不同的 Amazon EC2 实例类型。

    重要

    如果您将环境移至其他 Amazon EC2 实例类型,则当前版本 AWS Cloud9 中还必须支持该实例类型 AWS 区域。要查看每个区域中可用的实例类型,请转到 Configure settings(配置设置)页面,该页面在使用控制台创建 EC2 环境时显示。您在实例类型部分中的选择由控制台右上角的选择决定。 AWS 区域

  • 您必须先停止与环境关联的 Amazon EC2 实例,然后才能更改实例类型。当实例停止时,您和任何成员都不能使用与已停止实例关联的环境。

  • AWS 将实例移动到新硬件,但是,实例的 ID 不会改变。

  • 如果实例在 Amazon VPC 中运行且具有公有 IPv4 地址,则 AWS 释放该地址并为该实例提供新的公有 IPv4 地址。实例会保留其私有 IPv4 地址以及任何弹性 IP 地址或 IPv6 地址。

  • 当实例停止时,请计划停机时间。此过程可能需要几分钟时间。

移动环境
  1. (可选)如果新实例类型需要现有实例上未安装的驱动程序,则连接到您的实例并安装这些驱动程序。有关更多信息,请参阅适用于 Linux 实例的 Amazon EC2 用户指南中的调整实例大小的兼容性

  2. 关闭当前显示环境的所有 Web 浏览器选项卡。

    重要

    如果您不关闭当前显示环境的所有 Web 浏览器选项卡,则 AWS Cloud9 可能会干扰此过程的完成。具体而言, AWS Cloud9 可能会在此过程中尝试在错误的时间重启与环境关联的 Amazon EC2 实例。在此过程的最后一步完成之前,该实例必须保持停止状态。

  3. 如果你尚未登录 AWS Management Console,请通过 https://console.aws.amazon.com 登录。

    我们建议您使用自己的管理员级证书登录。 AWS 账户如果您无法执行此操作,请咨询您的 AWS 账户 管理员。

  4. 打开 Amazon EC2 控制台。为此,请在 Services(服务)列表中,选择 EC2

  5. 在 AWS 导航栏中,选择 AWS 区域 包含要移动的环境(例如,美国东部(俄亥俄州))。

  6. 在服务导航窗格中,展开 Instances(实例),然后选择 Instances(实例)

  7. 在实例列表中,选择与您要移动的环境关联的实例。对于 EC2 环境,实例名称以 aws-cloud9- 开头,后跟环境名称。例如,如果环境名为 my-demo-environment,实例名称以 aws-cloud9-my-demo-environment 开头。

  8. 如果实例状态未为 “已停止”,请选择操作实例状态停止。当屏幕上出现提示时,请选择 Yes, Stop(是,停止)。停止实例可能需要几分钟时间。

  9. Instance State(实例状态)stopped(已停止)且实例仍处于选中状态的情况下,选择 Actions(操作)> Instance Settings(实例设置)> Change Instance Type(更改实例类型)

  10. Change Instance Type(更改实例类型)对话框中,在 Instance Type(实例类型)处选择环境使用的新实例类型。

    注意

    如果列表中未显示您所需的实例类型,则说明它与实例的配置不兼容。例如,由于虚拟化类型,该实例可能不兼容。

  11. (可选)如果您选择的实例类型支持 EBS 优化,则选择 EBS-optimized(EBS 优化)以启用 EBS 优化,或取消选择 EBS-optimized(EBS 优化)以禁用 EBS 优化。

    注意

    如果您选择的实例类型默认情况下已经过 EBS 优化,则 EBS-optimized(EBS 优化)已选中,您无法清除它。

  12. 选择 Apply(应用)以接受新设置。

    注意

    如果您在本过程的前面部分没有对 Instance Type(实例类型)选择其他实例类型,则在您选择 Apply(应用)后不会有任何效果。

  13. 重新打开环境。有关更多信息,请参阅 在 AWS Cloud9 中打开环境

有关前述过程的更多信息,请参阅适用于 Linux 实例的 Amazon EC2 用户指南中的更改实例类型

AWS Cloud9 将 EC2 环境移至不同的亚马逊系统映像 (AMI)

本主题介绍如何将 AWS Cloud9 EC2 环境从一个亚马逊 Linux AMI 迁移到另一个 AWS Cloud9 受支持的 AMI。

注意

如果您想在不更新操作系统版本的情况下将环境迁移到新实例,请参阅移动环境

您可以使用以下过程之一在环境之间迁移数据:

通过将存档文件下载到本地计算机来移动环境
  1. 在同一个可用区中使用不同的基础映像创建新环境:

    1. 完成创建 EC2 环境部分中的步骤以创建新环境。

      注意

      在选择平台时,请选择要将环境迁移到的平台。

    2. 默认情况下,创建的环境的容量为 10 GiB。如果您没有足够的空间将档案上传或解压缩到新环境,请完成调整环境使用的 Amazon EBS 卷大小程序中的步骤来调整 Amazon EBS 卷的大小。

  2. 在 AWS Cloud9 IDE 中打开要迁移的环境。

  3. AWS Cloud9 IDE 加载后,从菜单中选择 “文件” > “下载项目”,下载包含环境项目目录内容的存档。

  4. 在新环境中打开 AWS Cloud9 IDE。

  5. 选择 “文件” > “上传本地文件...” 上传档案。

  6. (可选)要将旧.c9目录备份到.c9.backup,请在环境终端中运行以下命令:

    cp .c9 .c9.backup

    如果您想稍后恢复配置文件,则可能需要这些备份文件。

  7. 要解压缩档案,请运行以下命令:

    tar xzvf <old_environment_name>.tar.gz -C ~/
  8. 要从项目目录中删除档案,请运行以下命令:

    rm <old_environment_name>.tar.gz

    确保新环境按预期运行。

  9. 现在,您可以删除旧环境。

使用 Amazon EBS 卷移动环境

如果您无法下载档案,或者生成的档案太大,则可以使用 Amazon EBS 卷进行迁移。此外,此方法还允许您复制位于~/environment目录之外的文件。

  1. 关闭在现有环境中打开的所有 AWS Cloud9 IDE 选项卡。

  2. 完成以下步骤以停止现有实例:

    1. 在 AWS Cloud9 控制台中,选择要导航的环境以查看其详细信息。

    2. 环境详细信息页面的 EC2 实例选项卡下,选择管理 EC2 实例

    3. 在 EC2 控制台中,选择要导航到实例详细信息的实例。

    4. 确保实例状态设置为 “已停止”。如果不是,请从 “实例状态” 下拉列表中选择 “停止实例”。出现提示时,选择 “停止”。停止实例可能需要几分钟时间。

  3. 在同一个可用区中使用不同的基础映像创建新环境:

    1. 完成创建 EC2 环境部分中的步骤以创建新环境。

      注意

      在选择平台时,请选择要将环境迁移到的平台。

    2. 默认情况下,创建的环境的容量为 10 GiB。如果您没有足够的空间将文件从源卷移动到新环境,请完成调整环境使用的 Amazon EBS 卷大小过程中的步骤来调整 Amazon EBS 卷的大小。

  4. 完成以下步骤,将该卷与现有实例分离:

    1. 实例摘要页面上,选择存储选项卡并选择卷。所选卷的设备名称必须与根设备详细信息部分的根设备名称中指定的名称相同。

    2. 在卷详细信息页面上,选择操作 > 分离卷

    3. 成功分离卷后,选择操作 > 附加卷,然后从下拉列表中查找并选择新环境的实例。您选择的 Amazon EC2 实例的名称必须包含前缀aws-cloud9为的 AWS Cloud9 环境名称。

  5. 在新环境中打开 AWS Cloud9 IDE。

  6. 环境加载后,要识别新连接的卷的设备,请在终端中运行以下命令:

    lsblk

    在以下示例输出中,根nvme0n1设备的分区nvme0n1p1已挂载,因此还必须装载该nvme1n1p1分区。其设备的完整路径是/dev/nvme1n1p1

    Admin:~/environment $ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS nvme0n1 259:0 0 10G 0 disk ├─nvme0n1p1 259:2 0 10G 0 part / ├─nvme0n1p127 259:3 0 1M 0 part └─nvme0n1p128 259:4 0 10M 0 part /boot/efi nvme1n1 259:1 0 10G 0 disk ├─nvme1n1p1 259:5 0 10G 0 part └─nvme1n1p128 259:6 0 1M 0 part
    注意

    当您在终端中运行此命令时,输出会有所不同。

  7. 在环境终端中完成以下步骤以挂载现有卷:

    1. 要创建用于挂载卷分区的临时目录,请运行以下命令:

      MOUNT_POINT=$(mktemp -d)
    2. 根据lsblk命令的示例输出,指定要安装的设备的以下路径:

      MOUNT_DEVICE=/dev/nvme1n1p1
      注意

      当您在终端中运行此命令时,输出会有所不同。

    3. 要挂载现有卷,请运行以下命令:

      sudo mount $MOUNT_DEVICE $MOUNT_POINT
    4. 完成以下步骤以验证现有卷是否已正确装入:

      1. 要确保输出中包含该卷,请运行以下命令:

        df -h
      2. 要验证卷中的内容,请运行以下命令:

        ls $MOUNT_POINT/home/ec2-user/environment/
  8. (可选)要将旧.c9目录备份到.c9.backup,请在环境终端中运行以下命令:

    cp .c9 .c9.backup

    如果您想稍后恢复配置文件,则可能需要这些备份文件。

  9. 要从现有卷中复制旧环境,请运行以下命令:

    cp -R $MOUNT_POINT/home/ec2-user/environment ~
    注意

    如果需要,您还可以使用上述命令复制环境目录之外的文件或目录。

    确保新环境按预期运行。

  10. 要卸载以前的设备,请运行以下两个命令之一:

    sudo umount $MOUNT_DEVICE
    sudo umount $MOUNT_POINT
  11. 从 “操作” 下拉列表中选择 “分离卷”,以分离您在步骤 3 中连接的卷。

  12. 现在,您可以删除旧环境及其音量。

    注意

    由于该卷不再连接到环境的 Amazon EC2 实例,因此您需要手动将其删除。您可以通过在卷详细信息页面上选择删除来执行此操作。

调整环境使用的 Amazon EBS 卷大小

  1. 针对您要调整其大小的 Amazon EBS 卷,打开与 Amazon EC2 实例关联的环境。

  2. 在环境的 AWS Cloud9 IDE 中,创建一个包含以下内容的文件,然后使用扩展名保存该文件.sh(例如,resize.sh)。

    备注

    此脚本适用于连接到运行 AL2023、Amazon Linux 2、Amazon Linux 或 Ubuntu Server 并配置为使用 IMDSv2 的 EC2 实例的 Amazon EBS 卷。

    该脚本还调整在基于 Nitro 的实例上显示为 NVMe 块设备的 Amazon EBS 卷的大小。有关基于 Nitro 系统的实例列表,请参阅《适用于 Linux 实例的 Amazon EC2 用户指南》中的基于 Nitro 系统构建的实例

    #!/bin/bash # Specify the desired volume size in GiB as a command line argument. If not specified, default to 20 GiB. SIZE=${1:-20} # Get the ID of the environment host Amazon EC2 instance. TOKEN=$(curl -s -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 60") INSTANCEID=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/instance-id 2> /dev/null) REGION=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/placement/region 2> /dev/null) # Get the ID of the Amazon EBS volume associated with the instance. VOLUMEID=$(aws ec2 describe-instances \ --instance-id $INSTANCEID \ --query "Reservations[0].Instances[0].BlockDeviceMappings[0].Ebs.VolumeId" \ --output text \ --region $REGION) # Resize the EBS volume. aws ec2 modify-volume --volume-id $VOLUMEID --size $SIZE # Wait for the resize to finish. while [ \ "$(aws ec2 describe-volumes-modifications \ --volume-id $VOLUMEID \ --filters Name=modification-state,Values="optimizing","completed" \ --query "length(VolumesModifications)"\ --output text)" != "1" ]; do sleep 1 done # Check if we're on an NVMe filesystem if [[ -e "/dev/xvda" && $(readlink -f /dev/xvda) = "/dev/xvda" ]] then # Rewrite the partition table so that the partition takes up all the space that it can. sudo growpart /dev/xvda 1 # Expand the size of the file system. # Check if we're on AL2 or AL2023 STR=$(cat /etc/os-release) SUBAL2="VERSION_ID=\"2\"" SUBAL2023="VERSION_ID=\"2023\"" if [[ "$STR" == *"$SUBAL2"* || "$STR" == *"$SUBAL2023"* ]] then sudo xfs_growfs -d / else sudo resize2fs /dev/xvda1 fi else # Rewrite the partition table so that the partition takes up all the space that it can. sudo growpart /dev/nvme0n1 1 # Expand the size of the file system. # Check if we're on AL2 or AL2023 STR=$(cat /etc/os-release) SUBAL2="VERSION_ID=\"2\"" SUBAL2023="VERSION_ID=\"2023\"" if [[ "$STR" == *"$SUBAL2"* || "$STR" == *"$SUBAL2023"* ]] then sudo xfs_growfs -d / else sudo resize2fs /dev/nvme0n1p1 fi fi
  3. 从 IDE 中的终端会话中,切换到包含 resize.sh 文件的目录。然后,运行以下任一命令,同时将 20 替换为要将 Amazon EBS 卷调整至的期望大小(以 GiB 为单位):

    • bash resize.sh 20
    • chmod +x resize.sh ./resize.sh 20

加密使用的 Amazon EBS 卷 AWS Cloud9

Amazon EBS 加密可对以下数据进行加密:

  • 卷中的静态数据

  • 在卷和实例之间移动的所有数据

  • 从卷创建的所有快照

  • 从这些快照创建的所有卷

对于 AWS Cloud9 EC2 开发环境使用的 Amazon EBS 卷,您有两个加密选项:

  • 原定设置加密 – 您可以配置 AWS 账户 对您创建的新 EBS 卷和快照副本进行加密。原定设置情况下,在 AWS 区域级别启用加密。因此,您不能为该区域中的单个卷或快照启用加密。此外,Amazon EBS 对您启动实例时创建的卷进行加密。因此,在创建 EC2 环境之前,必须启用此设置。有关更多信息,请参阅适用于 Linux 实例的 Amazon EC2 用户指南中的默认加密

  • 加密 EC2 环境使用的现有 Amazon EBS 卷 – 您可以加密已为 EC2 实例创建的指定 Amazon EBS 卷。此选项涉及使用 AWS Key Management Service (AWS KMS) 来管理对加密卷的访问权限。有关相关步骤,请参阅 对 AWS Cloud9 使用的现有 Amazon EBS 卷进行加密

重要

如果您的 AWS Cloud9 IDE 使用默认加密的 Amazon EBS 卷,则 AWS Identity and Access Management 服务相关角色 AWS Cloud9 需要访问这些 EBS 卷 AWS KMS key 的。如果未提供访问权限, AWS Cloud9 IDE 可能无法启动,调试可能会很困难。

要提供访问权限,请将服务相关角色添加到 Amazon EBS 卷使用的 KMS 密钥中。 AWS Cloud9AWSServiceRoleForAWSCloud9有关此任务的更多信息,请参阅AWS 规范指导模式中的创建使用 Amazon EBS 卷和默认加密的 AWS Cloud9 IDE

对 AWS Cloud9 使用的现有 Amazon EBS 卷进行加密

加密现有 Amazon EBS 卷 AWS KMS 需要使用创建 KMS 密钥。创建要替换的卷的快照后,您可以使用 KMS 密钥对快照的副本进行加密。

接下来,使用该快照创建加密卷。然后,您可以通过将未加密卷从 EC2 实例中分离并附加已加密卷来替换未加密卷。

最后,您必须更新客户托管式密钥的密钥策略,以启用对 AWS Cloud9 服务角色的访问权限。

注意

以下过程重点介绍使用客户托管式密钥对卷进行加密。您也可以在您的账户 AWS 服务 中 AWS 托管式密钥 使用 for a。Amazon EBS 的别名为 aws/ebs。如果为加密选择此默认选项,请在创建客户托管式密钥时跳过步骤 1。此外,跳过在其中更新密钥策略的步骤 8。这是因为您无法更改的密钥策略 AWS 托管式密钥。

对现有 Amazon EBS 卷进行加密
  1. 在 AWS KMS 控制台中,创建对称 KMS 密钥。有关更多信息,请参阅 AWS Key Management Service 开发人员指南中的创建对称 KMS 密钥

  2. 在 Amazon EC2 控制台中,停止由环境使用的 Amazon EBS 支持的实例。您可以使用控制台或命令行停止实例

  3. 在 Amazon EC2 控制台的导航窗格中,选择 Snapshots(快照)来为您想要加密的现有卷创建快照

  4. 在 Amazon EC2 控制台的导航窗格中,选择 Snapshots(快照)复制快照。在 Copy snapshot(复制快照)对话框中,执行以下操作以启用加密:

    • 选择 Encrypt this snapshot(加密此快照)

    • Master Key(主密钥)中,选择您之前创建的 KMS 密钥。(如果您使用的是 AWS 托管式密钥,请保留(默认)aws/ebs 设置。)

  5. 从已加密快照创建新卷

    注意

    从加密快照创建的新 Amazon EBS 卷会自动加密。

  6. 将旧的 Amazon EBS 卷与 Amazon EC2 实例分离。

  7. 将新的加密卷附到 Amazon EC2 实例上。

  8. 使用 AWS Management Console 默认视图、策略视图或 AWS KMS API 更新 KMS 密钥的密钥 AWS Management Console 策略。添加以下密钥策略声明以允许 AWS Cloud9 服务访问 KMS 密钥。AWSServiceRoleForAWSCloud9

    注意

    如果您使用的是 AWS 托管式密钥,请跳过此步骤。

    { "Sid": "Allow use of the key", "Effect": "Allow", "Principal": { "AWS": "arn:{Partition}:iam::{AccountId}:role/aws-service-role/cloud9.amazonaws.com/AWSServiceRoleForAWSCloud9" }, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ], "Resource": "*" }, { "Sid": "Allow attachment of persistent resources", "Effect": "Allow", "Principal": { "AWS": "arn:{Partition}:iam::{AccountId}:role/aws-service-role/cloud9.amazonaws.com/AWSServiceRoleForAWSCloud9" }, "Action": [ "kms:CreateGrant", "kms:ListGrants", "kms:RevokeGrant" ], "Resource": "*", "Condition": { "Bool": { "kms:GrantIsForAWSResource": "true" } } }
  9. 重新启动 Amazon EC2 实例。有关重启 Amazon EC2 实例的更多信息,请参阅停止并启动您的实例