

# 在 AWS CLI 中启动、列出和删除 Amazon EC2 实例
<a name="cli-services-ec2-instances"></a>

您可以使用 AWS Command Line Interface（AWS CLI）启动、列出和删除 Amazon Elastic Compute Cloud（Amazon EC2）实例。如果您启动不在 AWS 免费套餐范围内的实例，那么在启动实例后您将需要付费，费用按实例的运行时间计算，即使实例处于闲置状态也需付费。

**注意**  
有关其他命令示例，请参阅[《AWS CLI 参考指南》](https://docs.aws.amazon.com/cli/latest/reference/index.html)。

**Topics**
+ [先决条件](#cli-services-ec2-instances-prereqs)
+ [启动实例](#launching-instances)
+ [向实例添加块储存设备](#block-device-mapping)
+ [向您的实例添加标签](#tagging-instances)
+ [连接到您的实例](#connecting-to-instances)
+ [列出您的实例](#listing-instances)
+ [删除实例](#terminating-instances)
+ [引用](#cli-services-ec2-instances-references)

## 先决条件
<a name="cli-services-ec2-instances-prereqs"></a>

要运行本主题中的 `ec2` 命令，您需要先完成以下操作：
+ 安装和配置 AWS CLI。有关更多信息，请参阅 [安装或更新最新版本的 AWS CLI](getting-started-install.md) 和 [AWS CLI 身份验证和访问凭证](cli-chap-authentication.md)。
+ 设置您的 IAM 权限以允许访问 Amazon EC2。有关 Amazon EC2 的 IAM 权限的更多信息，请参阅《Amazon EC2 用户指南》**中的 [Amazon EC2 的 IAM 策略](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html)。
+ 创建[密钥对](cli-services-ec2-keypairs.md)和[安全组](cli-services-ec2-sg.md)。
+ 选择 Amazon Machine Image（AMI）并记下 AMI ID。有关更多信息，请参阅《Amazon EC2 用户指南》**中的[查找适合的 AMI](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/finding-an-ami.html)。

## 启动实例
<a name="launching-instances"></a>

要使用所选的 AMI 启动单个 Amazon EC2 实例，请使用 `[aws ec2 run-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html)` 命令。您可以将实例启动到虚拟私有云（VPC）中。

最初，您的实例显示为 `pending` 状态，但在几分钟后将更改为 `running` 状态。

以下示例在 VPC 的指定子网中启动 `t2.micro` 实例。将*斜体*参数值替换为您自己的值。

```
$ aws ec2 run-instances --image-id ami-xxxxxxxx --count 1 --instance-type t2.micro --key-name MyKeyPair --security-group-ids sg-903004f8 --subnet-id subnet-6e7f829e
{
    "OwnerId": "123456789012",
    "ReservationId": "r-5875ca20",
    "Groups": [
        {
            "GroupName": "my-sg",
            "GroupId": "sg-903004f8"
        }
    ],
    "Instances": [
        {
            "Monitoring": {
                "State": "disabled"
            },
            "PublicDnsName": null,
            "Platform": "windows",
            "State": {
                "Code": 0,
                "Name": "pending"
            },
            "EbsOptimized": false,
            "LaunchTime": "2013-07-19T02:42:39.000Z",
            "PrivateIpAddress": "10.0.1.114",
            "ProductCodes": [],
            "VpcId": "vpc-1a2b3c4d",
            "InstanceId": "i-5203422c",
            "ImageId": "ami-173d747e",
            "PrivateDnsName": "ip-10-0-1-114.ec2.internal",
            "KeyName": "MyKeyPair",
            "SecurityGroups": [
                {
                    "GroupName": "my-sg",
                    "GroupId": "sg-903004f8"
                }
            ],
            "ClientToken": null,
            "SubnetId": "subnet-6e7f829e",
            "InstanceType": "t2.micro",
            "NetworkInterfaces": [
                {
                    "Status": "in-use",
                    "SourceDestCheck": true,
                    "VpcId": "vpc-1a2b3c4d",
                    "Description": "Primary network interface",
                    "NetworkInterfaceId": "eni-a7edb1c9",
                    "PrivateIpAddresses": [
                        {
                            "PrivateDnsName": "ip-10-0-1-114.ec2.internal",
                            "Primary": true,
                            "PrivateIpAddress": "10.0.1.114"
                        }
                    ],
                    "PrivateDnsName": "ip-10-0-1-114.ec2.internal",
                    "Attachment": {
                        "Status": "attached",
                        "DeviceIndex": 0,
                        "DeleteOnTermination": true,
                        "AttachmentId": "eni-attach-52193138",
                        "AttachTime": "2013-07-19T02:42:39.000Z"
                    },
                    "Groups": [
                        {
                            "GroupName": "my-sg",
                            "GroupId": "sg-903004f8"
                        }
                    ],
                    "SubnetId": "subnet-6e7f829e",
                    "OwnerId": "123456789012",
                    "PrivateIpAddress": "10.0.1.114"
                }              
            ],
            "SourceDestCheck": true,
            "Placement": {
                "Tenancy": "default",
                "GroupName": null,
                "AvailabilityZone": "us-west-2b"
            },
            "Hypervisor": "xen",
            "BlockDeviceMappings": [
                {
                    "DeviceName": "/dev/sda1",
                    "Ebs": {
                        "Status": "attached",
                        "DeleteOnTermination": true,
                        "VolumeId": "vol-877166c8",
                        "AttachTime": "2013-07-19T02:42:39.000Z"
                    }
                }              
            ],
            "Architecture": "x86_64",
            "StateReason": {
                "Message": "pending",
                "Code": "pending"
            },
            "RootDeviceName": "/dev/sda1",
            "VirtualizationType": "hvm",
            "RootDeviceType": "ebs",
            "Tags": [
                {
                    "Value": "MyInstance",
                    "Key": "Name"
                }
            ],
            "AmiLaunchIndex": 0
        }
    ]
}
```

## 向实例添加块储存设备
<a name="block-device-mapping"></a>

每个启动的实例都具有关联的根设备卷。您可以使用块储存设备映射来指定实例启动时要连接的其他 Amazon Elastic Block Store (Amazon EBS) 卷或实例存储卷。

要向实例添加块储存设备，请在使用 `--block-device-mappings` 时指定 `run-instances` 选项。

以下示例参数配置大小为 20 GB 的标准 Amazon EBS 卷，并使用标识符 `/dev/sdf` 将其映射到您的实例。

```
--block-device-mappings "[{\"DeviceName\":\"/dev/sdf\",\"Ebs\":{\"VolumeSize\":20,\"DeleteOnTermination\":false}}]"
```

以下示例基于现有快照添加映射到 `/dev/sdf` Amazon EBS 卷。快照表示加载到卷的镜像。指定快照时，无需指定卷大小；它的大小足够容纳您的镜像。但是，如果您确定指定大小，则大小必须大于或等于快照的大小。

```
--block-device-mappings "[{\"DeviceName\":\"/dev/sdf\",\"Ebs\":{\"SnapshotId\":\"snap-a1b2c3d4\"}}]"
```

以下示例向实例添加两个卷。可用于您的实例的卷的数目取决于其实例类型。

```
--block-device-mappings "[{\"DeviceName\":\"/dev/sdf\",\"VirtualName\":\"ephemeral0\"},{\"DeviceName\":\"/dev/sdg\",\"VirtualName\":\"ephemeral1\"}]"
```

以下示例创建映射 (`/dev/sdj`)，但未为实例预配置卷。

```
--block-device-mappings "[{\"DeviceName\":\"/dev/sdj\",\"NoDevice\":\"\"}]"
```

有关更多信息，请参阅《Amazon EC2 用户指南》**中的[块设备映射](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/block-device-mapping-concepts.html)。

## 向您的实例添加标签
<a name="tagging-instances"></a>

标签是为 AWS 资源分配的标记。它允许您向您可用于各种目的的资源添加元数据。有关更多信息，请参阅《Amazon EC2 用户指南》**中的[标记您的资源](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html)。

以下示例显示如何使用 `[aws ec2 create-tags](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-tags.html)` 命令，将带有密钥名称“`Name`”和值“`MyInstance`”的标签添加到指定的实例。

```
$ aws ec2 create-tags --resources i-5203422c --tags Key=Name,Value=MyInstance
```

## 连接到您的实例
<a name="connecting-to-instances"></a>

当您的实例运行时，您可以连接到该实例，然后像使用您面前的电脑一样使用该实例。有关更多信息，请参阅《Amazon EC2 用户指南》**中的[连接到您的 Amazon EC2 实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connect-to-linux-instance.html)。

## 列出您的实例
<a name="listing-instances"></a>

您可以使用 AWS CLI 列出您的实例并查看有关这些实例的信息。您可以列出所有实例，或根据您感兴趣的实例对结果进行筛选。

以下示例演示了如何使用 `[aws ec2 describe-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html)` 命令。

以下命令列出您的所有实例。

```
$ aws ec2 describe-instances
```

以下命令将列表筛选到只仅限您的 `t2.micro` 实例，并仅为每个匹配项输出 `InstanceId` 值。

```
$ aws ec2 describe-instances --filters "Name=instance-type,Values=t2.micro" --query "Reservations[].Instances[].InstanceId"
[
    "i-05e998023d9c69f9a"
]
```

以下命令列出具有标签 `Name=MyInstance` 的任何实例。

```
$ aws ec2 describe-instances --filters "Name=tag:Name,Values=MyInstance"
```

以下命令列出使用以下任何 AMI 启动的实例：`ami-x0123456`、`ami-y0123456` 和 `ami-z0123456`。

```
$ aws ec2 describe-instances --filters "Name=image-id,Values=ami-x0123456,ami-y0123456,ami-z0123456"
```

## 删除实例
<a name="terminating-instances"></a>

当您不再需要某个 Amazon EC2 实例时，可以使用 AWS CLI 来终止（删除）该实例。

**重要**  
**终止实例是永久且不可逆转的。**  
终止一个实例后，您将无法再连接到该实例，而且也无法对其进行恢复操作。被配置为在终止后删除的所有连接的 Amazon EBS 卷也将被永久删除并且无法恢复。实例存储卷中存储的所有数据将永久丢失。有关更多信息，请参阅[实例终止的工作原理](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/how-ec2-instance-termination-works.html)。  
在终止实例之前，请务必确保已将需要在终止后保留的所有数据备份到持久存储中。

一旦实例的状态变为 `shutting-down` 或 `terminated`，您即停止为该实例付费。如果您希望稍后重新连接到实例，请使用 [stop-instances](https://docs.aws.amazon.com/cli/v1/reference/ec2/stop-instances.html)，而不是 `terminate-instances`。有关更多信息，请参阅《Amazon EC2 用户指南》**中的[终止实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/terminating-instances.html)。

以下示例说明如何使用 `[aws ec2 terminate-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/terminate-instances.html)` 命令删除实例。

```
$ aws ec2 terminate-instances --instance-ids i-5203422c
{
    "TerminatingInstances": [
        {
            "InstanceId": "i-5203422c",
            "CurrentState": {
                "Code": 32,
                "Name": "shutting-down"
            },
            "PreviousState": {
                "Code": 16,
                "Name": "running"
            }
        }
    ]
}
```

## 引用
<a name="cli-services-ec2-instances-references"></a>

**AWS CLI 参考：**
+ `[aws ec2](https://docs.aws.amazon.com/cli/latest/reference/ec2/index.html)`
+ `[aws ec2 create-tags](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-tags.html)`
+ `[aws ec2 describe-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html)`
+ `[aws ec2 run-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html)`
+ `[aws ec2 terminate-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/terminate-instances.html)`

**其他参考资料：**
+ [Amazon Elastic Compute Cloud 文档](https://docs.aws.amazon.com/ec2/)
+ 要查看和贡献 AWS 开发工具包和 AWS CLI 代码示例，请参阅 *GitHub* 上的 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/)。