

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

# 将虚拟机映像导入 Snowball Edge 设备
<a name="ec2-ami-import-cli"></a>

您可以使用 AWS CLI 和虚拟机 Import/Export 服务将虚拟机 (VM) 映像作为亚马逊系统映像 (AMI) 导入到 Snowball Edge 设备。导入虚拟机映像后，将该映像注册为 AMI，然后将其作为 EC2与 Amazon 兼容的实例启动。

在创建订购 Snowball Edge 设备的任务时，您可以 AMIs 从亚马逊 EC2 向设备添加订购 Snowball Edge 设备。收到 Snowball Edge 设备后，请使用此步骤。有关更多信息，请参阅 [选择计算和存储选项](create-job-common.md#compute-storage)。

您也可以使用 AWS OpsHub 上传虚拟机映像文件。有关更多信息，请参阅本指南中的[将图像作为 EC2兼容 Amazon 的 AMI 导入到您的设备](https://docs.aws.amazon.com/snowball/latest/developer-guide/manage-ec2.html#ec2-ami-import)中。

**Topics**
+ [第 1 步：准备虚拟机镜像并将其上传到 Snowball Edge 设备](#prepare-image-cli)
+ [第 2 步：在 Snowball Edge 上设置所需的权限](#setup-permission-cli)
+ [第 3 步：将虚拟机映像作为快照导入 Snowball Edge](#import-snapshot-cli)
+ [步骤 4：在 Snowball Edge 上将快照注册为 AMI](#register-snapshot-cli)
+ [步骤 5：从 Snowball Edge 上的 AMI 启动实例](#launch-ami-cli)
+ [Snowball Edge 的其他 AMI 操作](#additional-ami-actions)

## 第 1 步：准备虚拟机镜像并将其上传到 Snowball Edge 设备
<a name="prepare-image-cli"></a>

通过从 Amazon EC2 AMI 或正在使用的虚拟机中的实例中导出虚拟机映像， Import/Export 或者 AWS 云 使用您选择的虚拟化平台在本地生成虚拟机映像，来准备虚拟机映像。

要使用虚拟机导入/导出将 Amazon EC2 实例导出为虚拟机映像，请参阅虚拟机用户[指南中的使用虚拟机导入/导出将实例导出为虚拟机](https://docs.aws.amazon.com/vm-import/latest/userguide/vmexport.html)。 Import/Export 要使用虚拟机导入/导出将 Amazon EC2 AMI 导出为虚拟机映像，请参阅[虚拟机 Import/Export 用户指南中的直接从亚马逊系统映像 (AMI) 导出虚拟机](https://docs.aws.amazon.com/vm-import/latest/userguide/vmexport_image.html)。

如果从本地环境生成虚拟机映像，请确保在 Snowball Edge 设备上将该映像配置为用作 AMI。您可能需要根据环境配置以下项。
+ 配置和更新操作系统。
+ 设置主机名。
+ 确保配置了网络时间协议（NTP）。
+ 如有必要，包括 SSH 公钥。制作密钥对的本地副本。有关更多信息，请参阅[在 Snowball Edge 上使用 SSH 连接到您的计算实例](https://docs.aws.amazon.com/snowball/latest/developer-guide/ssh-ec2-edge.html)。
+ 安装和配置您将在 Snowball Edge 设备上使用的任何软件。

**注意**  
在为 Snowball Edge 设备准备磁盘快照时，请注意以下限制。  
Snowball Edge 目前仅支持导入 RAW 图像格式的快照。
Snowball Edge 目前仅支持导入大小在 1 GB 到 1 TB 之间的快照。

### 将虚拟机映像上传到 Snowball Edge 设备上的 Amazon S3 存储桶
<a name="upload-images-to-your-device"></a>

准备好虚拟机映像后，将其上传到 Snowball Edge 设备或集群上的 S3 存储桶。你可以使用 Snowball Edge 上的 S3 适配器或兼容 Amazon S3 的存储空间来上传快照。

**使用 S3 Adapter 上传虚拟机映像**
+ 使用 `cp` 命令将虚拟机映像文件复制到设备上的存储桶。

  ```
  aws s3 cp image-path s3://S3-bucket-name --endpoint http://S3-object-API-endpoint:443 --profile profile-name
  ```

  有关更多信息，请参阅本指南中的[支持的 AWS CLI 命令](https://docs.aws.amazon.com/snowball/latest/developer-guide/using-adapter-cli.html)。

**在 Snowball Edge 上使用兼容 Amazon S3 的存储空间上传虚拟机映像**
+ 使用 `put-object` 命令将快照文件复制到设备上的存储桶。

  ```
  aws s3api put-object --bucket bucket-name --key path-to-snapshot-file --body snapshot-file --endpoint-url s3api-endpoint-ip --profile your-profile       
  ```

  有关更多信息，请参阅[在 Snowball Edge 设备上使用 S3 对象](https://docs.aws.amazon.com/snowball/latest/developer-guide/objects-s3-snow.html)。

## 第 2 步：在 Snowball Edge 上设置所需的权限
<a name="setup-permission-cli"></a>

要成功导入，您必须在 Snowball Edge 设备 EC2、Amazon 和用户 Import/Export 上为虚拟机设置权限。

**注意**  
提供这些权限的服务角色和策略位于 Snowball Edge 设备上。

### 在 Snowball Ed Import/Export ge 上使用虚拟机所需的权限
<a name="vmie-permissions"></a>

在开始导入过程之前，必须使用允许 Snowball Edge 设备 Import/Export 上的虚拟机担任该角色的信任策略创建 IAM 角色。向该角色授予了其他权限，允许设备 Import/Export 上的虚拟机访问存储在设备上 S3 存储桶中的映像。

**创建信任策略 json 文件**

以下是需要附加到角色的信任策略示例，这样 VM Import/Export 才能访问需要从 S3 存储桶导入的快照。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Effect":"Allow",
         "Principal":{
            "Service":"vmie.amazonaws.com"
         },
         "Action":"sts:AssumeRole"
      }
   ]
}
```

------

**通过信任策略 json 文件创建角色**

角色名称可以是 vmimport。您可以使用命令中的 --role-name 选项对其进行更改：

```
aws iam create-role --role-name role-name --assume-role-policy-document file:///trust-policy-json-path --endpoint http://snowball-ip:6078 --region snow  --profile profile-name
```

以下是 `create-role` 命令的示例输出。

```
{
   "Role":{
      "AssumeRolePolicyDocument":{
         "Version":"2012-10-17",
         "Statement":[
            {
               "Action":"sts:AssumeRole",
               "Effect":"Allow",
               "Principal":{
                  "Service":"vmie.amazonaws.com"
               }
            }
         ]
      },
      "MaxSessionDuration":3600,
      "RoleId":"AROACEMGEZDGNBVGY3TQOJQGEZAAAABQBB6NSGNAAAABPSVLTREPY3FPAFOLKJ3",
      "CreateDate":"2022-04-19T22:17:19.823Z",
      "RoleName":"vmimport",
      "Path":"/",
      "Arn":"arn:aws:iam::123456789012:role/vmimport"
   }
}
```

**为角色创建策略**

以下示例策略具有访问 Amazon S3 所需的最低权限。将 Amazon S3 存储桶名称更改为包含您映像的名称。对于独立的 Snowball Edge 设备，请*snow-id*更改您的作业 ID。对于设备集群，*snow-id*请更改为集群 ID。您还可以使用前缀进一步缩小虚拟机 Import/Export 可以从中导入快照的位置。创建类似的策略 json 文件。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "s3:GetBucketLocation",
            "s3:GetObject",
            "s3:ListBucket",
            "s3:GetMetadata"
         ],
         "Resource":[
            "arn:aws:s3:snow:account-id:snow/snow-id/bucket/import-snapshot-bucket-name",
            "arn:aws:s3:snow:account-id:snow/snow-id/bucket/import-snapshot-bucket-name/*"
            ]
      }
   ]
}
```

------

**使用策略文件创建策略：**

```
aws iam create-policy --policy-name policy-name --policy-document file:///policy-json-file-path --endpoint http://snowball-ip:6078 --region snow --profile profile-name
```

以下是 create-policy 命令的输出示例。

```
{
   "Policy":{
      "PolicyName":"vmimport-resource-policy",
      "PolicyId":"ANPACEMGEZDGNBVGY3TQOJQGEZAAAABOOEE3IIHAAAABWZJPI2VW4UUTFEDBC2R",
      "Arn":"arn:aws:iam::123456789012:policy/vmimport-resource-policy",
      "Path":"/",
      "DefaultVersionId":"v1",
      "AttachmentCount":0,
      "IsAttachable":true,
      "CreateDate":"2020-07-25T23:27:35.690000+00:00",
      "UpdateDate":"2020-07-25T23:27:35.690000+00:00"
   }
}
```

****将策略附加到角色****

将策略附加到上述角色并授予访问所需资源的权限。这允许本地虚拟机 Import/Export 服务从设备上的 Amazon S3 下载快照。

```
aws iam attach-role-policy --role-name role-name --policy-arn arn:aws:iam::123456789012:policy/policy-name --endpoint http://snowball-ip:6078 --region snow --profile profile-name
```

### 来电者在 Snowball Edge 上所需的权限
<a name="caller-permissions"></a>

除了 Snowball Edge 虚拟机 Import/Export 要扮演的角色外，您还必须确保用户拥有允许他们将角色传递给 VMIE 的权限。如果您使用默认根用户执行导入，根用户已拥有所需的所有权限，因此您可以跳过此步骤，转到第 3 步。

将以下两个 IAM 权限附加到正在进行导入的用户。
+ `pass-role`
+ `get-role`

**为角色创建策略**

以下是允许用户对 IAM 角色执行 `get-role` 和 `pass-role` 操作的示例策略。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",
   "Statement":[
        {
            "Effect":"Allow",
            "Action": "iam:GetRole",
            "Resource":"*"
        },
        {
            "Sid": "iamPassRole",
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "arn:aws:iam::*:role/snowball*",
            "Condition": {
                "StringEquals": {
                    "iam:PassedToService": "importexport.amazonaws.com"
                }
            }
        }
   ]
}
```

------

****使用策略文件创建策略：****

```
aws iam create-policy --policy-name policy-name --policy-document file:///policy-json-file-path --endpoint http://snowball-ip:6078 --region snow --profile profile-name
```

以下是 create-policy 命令的输出示例。

```
{
   "Policy":{
      "PolicyName":"caller-policy",
      "PolicyId":"ANPACEMGEZDGNBVGY3TQOJQGEZAAAABOOOTUOE3AAAAAAPPBEUM7Q7ARPUE53C6R",
      "Arn":"arn:aws:iam::123456789012:policy/caller-policy",
      "Path":"/",
      "DefaultVersionId":"v1",
      "AttachmentCount":0,
      "IsAttachable":true,
      "CreateDate":"2020-07-30T00:58:25.309000+00:00",
      "UpdateDate":"2020-07-30T00:58:25.309000+00:00"
   }
}
```

生成策略后，将该策略附加到将调用 Amazon EC2 API 或 CLI 操作导入快照的 IAM 用户。

```
aws iam attach-user-policy --user-name your-user-name --policy-arn arn:aws:iam::123456789012:policy/policy-name --endpoint http://snowball-ip:6078 --region snow --profile profile-name
```

### 在 Snowball Edge EC2 APIs 上致电亚马逊所需的权限
<a name="ec2-permissions"></a>

要导入快照，IAM 用户必须具有 `ec2:ImportSnapshot` 权限。如果不需要限制用户访问权限，则可以使用这些`ec2:*`权限授予完全的 Amazon EC2 访问权限。以下是可在您的设备上授予或限制Amaz EC2 on的权限。创建包含所示内容的策略文件：

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "ec2:ImportSnapshot",
            "ec2:DescribeImportSnapshotTasks",
            "ec2:CancelImportTask",
            "ec2:DescribeSnapshots",
            "ec2:DeleteSnapshot",
            "ec2:RegisterImage",
            "ec2:DescribeImages",
            "ec2:DeregisterImage"
         ],
         "Resource":"*"
      }
   ]
}
```

------

**使用策略文件创建策略：**

```
aws iam create-policy --policy-name policy-name --policy-document file:///policy-json-file-path --endpoint http://snowball-ip:6078 --region snow --profile profile-name
```

以下是 create-policy 命令的输出示例。

```
{ 
    "Policy": 
        {
            "PolicyName": "ec2-import.json",
            "PolicyId": "ANPACEMGEZDGNBVGY3TQOJQGEZAAAABQBGPDQC5AAAAATYN62UNBFYTF5WVCSCZS",
            "Arn": "arn:aws:iam::123456789012:policy/ec2-import.json",
            "Path": "/",
            "DefaultVersionId": "v1",
            "AttachmentCount": 0,
            "IsAttachable": true,
            "CreateDate": "2022-04-21T16:25:53.504000+00:00",
            "UpdateDate": "2022-04-21T16:25:53.504000+00:00"
        }
}
```

生成策略后，将该策略附加到将调用 Amazon EC2 API 或 CLI 操作导入快照的 IAM 用户。

```
aws iam attach-user-policy --user-name your-user-name --policy-arn arn:aws:iam::123456789012:policy/policy-name --endpoint http://snowball-ip:6078 --region snow --profile profile-name
```

## 第 3 步：将虚拟机映像作为快照导入 Snowball Edge
<a name="import-snapshot-cli"></a>

下一步是在设备上将虚拟机映像作为快照导入。`S3Bucket` 参数的值是包含虚拟机映像的存储桶的名称。`S3Key` 参数的值是该存储桶中虚拟机映像文件的路径。

```
aws ec2 import-snapshot --disk-container "Format=RAW,UserBucket={S3Bucket=bucket-name,S3Key=image-file}" --endpoint http://snowball-ip:8008 --region snow --profile profile-name
```

有关更多信息，请参阅《 AWS CLI 命令参考》中的 [import-snap](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/import-snapshot.html) shot。

此命令不支持以下开关。
+ [--client-data `value`] 
+ [--client-token `value`]
+ [--dry-run]
+ [--no-dry-run]
+ [--encrypted]
+ [--no-encrypted]
+ [--kms-key-id `value`]
+ [--tag-specifications `value`]

**Example `import-snapshot` 命令的输出**  

```
{
   "ImportTaskId":"s.import-snap-1234567890abc",
   "SnapshotTaskDetail":{
      "DiskImageSize":2.0,
      "Encrypted":false,
      "Format":"RAW",
      "Progress":"3",
      "Status":"active",
      "StatusMessage":"pending",
      "UserBucket":{
         "S3Bucket":"bucket",
         "S3Key":"vmimport/image01"
      }
   }
}
```
Snowball Edge 目前只允许每台设备一次运行一个活跃的导入作业。要启动新的导入任务，要么等待当前任务完成，要么在集群中选择另一个可用节点。如果需要，您也可以选择取消当前的导入。为防止延迟，请勿在导入过程中重启 Snowball Edge 设备。如果您重启设备，则导入将失败，并且进度将在设备可以访问时删除。要查看快照导入任务的状态，请使用以下命令：  

```
aws ec2 describe-import-snapshot-tasks --import-task-ids id --endpoint http://snowball-ip:8008 --region snow --profile profile-name
```

## 步骤 4：在 Snowball Edge 上将快照注册为 AMI
<a name="register-snapshot-cli"></a>

成功将快照导入设备后，您可以使用 `register-image` 命令对其进行注册。

**注意**  
只有当 AMI 的所有快照都可用时，您才能注册 AMI。

有关更多信息，请参阅《 AWS CLI 命令参考》中的 [register-image](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/register-image.html)。

**Example `register-image` 命令的**  

```
aws ec2 register-image \
--name ami-01 \
--description my-ami-01 \
--block-device-mappings "[{\"DeviceName\": \"/dev/sda1\",\"Ebs\":{\"Encrypted\":false,\"DeleteOnTermination\":true,\"SnapshotId\":\"snapshot-id\",\"VolumeSize\":30}}]" \
--root-device-name /dev/sda1 \
--endpoint http://snowball-ip:8008 \
--region snow \
--profile profile-name
```

以下是块设备映射 JSON 的示例。有关更多信息，请参阅《 AWS CLI 命令参考》中的 [register-image block-device-mapping 参数](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/register-image.html)。

```
[
    {
        "DeviceName": "/dev/sda",
        "Ebs": 
            {
                "Encrypted": false,
                "DeleteOnTermination": true,
                "SnapshotId": "snapshot-id",
                "VolumeSize": 30
            }
    }
]
```

**Example `register-image` 命令的**  

```
{
    "ImageId": "s.ami-8de47d2e397937318"
 }
```

## 步骤 5：从 Snowball Edge 上的 AMI 启动实例
<a name="launch-ami-cli"></a>

要启动实例，请参阅《 AWS CLI 命令参考》中的 [run-](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/run-instances.html) instances。

`image-id` 参数的值是作为 `register-image` 命令输出的 `ImageId` 名称的值。

```
aws ec2 run-instances --image-id image-id --instance-type instance-type --endpoint http://snowball-ip:8008 --region snow --profile profile-name
```

```
{
   "Instances":[
      {
         "SourceDestCheck":false,
         "CpuOptions":{
            "CoreCount":1,
            "ThreadsPerCore":2
         },
         "InstanceId":"s.i-12345a73123456d1",
         "EnaSupport":false,
         "ImageId":"s.ami-1234567890abcdefg",
         "State":{
            "Code":0,
            "Name":"pending"
         },
         "EbsOptimized":false,
         "SecurityGroups":[
            {
               "GroupName":"default",
               "GroupId":"s.sg-1234567890abc"
            }
         ],
         "RootDeviceName":"/dev/sda1",
         "AmiLaunchIndex":0,
         "InstanceType":"sbe-c.large"
      }
   ],
   "ReservationId":"s.r-1234567890abc"
}
```

**注意**  
您也可以 AWS OpsHub 使用启动实例。有关更多信息，请参阅本指南中的[启动 EC2与 Amazon 兼容的实例](https://docs.aws.amazon.com/snowball/latest/developer-guide/manage-ec2.html#launch-instance)。

## Snowball Edge 的其他 AMI 操作
<a name="additional-ami-actions"></a>

您可以使用其他 AWS CLI 命令来监控快照导入状态、获取已导入快照的详细信息、取消导入快照以及在快照导入后删除或取消注册快照。

### 在 Snowball Edge 上监控快照导入状态
<a name="decribe-import-task-cli"></a>

要查看导入进度的当前状态，您可以运行 Amazon EC2 `describe-import-snapshot-tasks` 命令。此命令支持在 `task-state` 上进行分页和筛选。

**Example `describe-import-snapshot-tasks` 命令的**  

```
aws ec2 describe-import-snapshot-tasks --import-task-ids id --endpoint http://snowball-ip:8008 --region snow --profile profile-name
```

**Example `describe-import-snapshot-tasks` 命令输出的**  

```
{
        "ImportSnapshotTasks": [
            {
                "ImportTaskId": "s.import-snap-8f6bfd7fc9ead9aca",                
                "SnapshotTaskDetail": {
                    "Description": "Created by AWS-Snowball-VMImport service for s.import-snap-8f6bfd7fc9ead9aca",                    
                    "DiskImageSize": 8.0,                    
                    "Encrypted": false,                    
                    "Format": "RAW",  
                    "Progress": "3",                  
                    "SnapshotId": "s.snap-848a22d7518ad442b",                    
                    "Status": "active", 
                    "StatusMessage": "pending",                   
                    "UserBucket": {
                        "S3Bucket": "bucket1",                        
                        "S3Key": "image1"                        
                    }
                }
            }
        ]
 }
```

**注意**  
此命令仅显示过去 7 天内成功完成或标记为已删除的任务的输出。筛选仅支持 `Name=task-state`，`Values=active | deleting | deleted | completed`

此命令不支持以下参数。
+ [--dry-run]
+ [--no-dry-run]

### 取消 Snowball Edge 上的导入任务
<a name="cancel-import-task-cli"></a>

要取消导入任务，请运行 `cancel-import-task` 命令。

**Example `cancel-import-task` 命令的**  

```
aws ec2 cancel-import-task --import-task-id import-task-id --endpoint http://snowball-ip:8008 --region snow --profile profile-name
```

**Example `cancel-import-task` 命令输出的**  

```
{
        "ImportTaskId": "s.import-snap-8234ef2a01cc3b0c6",
        "PreviousState": "active",
        "State": "deleting"
}
```
只能取消未处于已完成状态的任务。

此命令不支持以下参数。
+ [--dry-run]
+ [--no-dry-run]

### 描述 Snowball Edge 上的快照
<a name="describe-snapshots-cli"></a>

导入快照后，您可以使用此命令对其进行描述。要筛选快照，您可以使用先前导入任务响应中的快照 ID 传入 `snapshot-ids`。此命令支持在 `volume-id`、`status` 和 `start-time` 上进行分页和筛选。

**Example `describe-snapshots` 命令的**  

```
aws ec2 describe-snapshots --snapshot-ids snapshot-id --endpoint http://snowball-ip:8008 --region snow --profile profile-name
```

**Example `describe-snapshots` 命令输出的**  

```
{
    "Snapshots": [
        {
            "Description": "Created by AWS-Snowball-VMImport service for s.import-snap-8f6bfd7fc9ead9aca",
            "Encrypted": false,
            "OwnerId": "123456789012",
            "SnapshotId": "s.snap-848a22d7518ad442b",
            "StartTime": "2020-07-30T04:31:05.032000+00:00",
            "State": "completed",
            "VolumeSize": 8
        }
    ]
 }
```

此命令不支持以下参数。
+ [--restorable-by-user-ids `value`] 
+ [--dry-run]
+ [--no-dry-run]

### 从 Snowball Edge 设备中删除快照
<a name="delete-snapshot-cli"></a>

要删除您拥有但不再需要的快照，您可以使用 `delete-snapshot` 命令。

**Example `delete-snapshot` 命令的**  

```
aws ec2 delete-snapshot --snapshot-id snapshot-id --endpoint http://snowball-ip:8008 --region snow --profile profile-name
```

**注意**  
Snowball Edge 不支持删除处于**待处理**状态或被指定为 AMI 根设备的快照。

此命令不支持以下参数。
+ [--dry-run]
+ [--no-dry-run]

### 在 Snowball Edge 上注销 AMI
<a name="deregister-snapshot-cli"></a>

要取消不再需要 AMIs 的注册，可以运行`deregister-image`命令。目前不支持取消注册处于**待处理**状态的 AMI。

**Example `deregister-image` 命令的**  

```
aws ec2 deregister-image --image-id image-id --endpoint http://snowball-ip:8008 --region snow --profile profile-name
```

此命令不支持以下参数。
+ [--dry-run]
+ [--no-dry-run]