

# 在 AWS CLI 中使用 Amazon EC2
<a name="cli-services-ec2"></a>


| Amazon Elastic Compute Cloud 简介 | 
| --- | 
|  [![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/TsRBftzZsQo/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/TsRBftzZsQo)  | 

Amazon Elastic Compute Cloud（Amazon EC2）提供高度可扩展的灵活虚拟计算环境。Amazon EC2 允许您预置和管理虚拟服务器（称为 Amazon EC2 实例），以满足各种计算需求。

Amazon EC2 实例是虚拟机，可以使用不同的 CPU、内存、存储和联网能力配置对其进行自定义。根据您的应用程序要求，您可以从多种实例类型中进行选择，从轻量级、经济高效的选项到功能强大的高性能实例，不一而足。这种灵活性使您能够满足自己的计算需求，从而优化性能和成本效益。

此外，Amazon EC2 还提供了一套功能，使您能够有效地管理计算资源。其中包括快速启动新实例、创建用于快速部署的自定义机器映像（AMI），以及根据需要向上或向下扩展计算容量的功能。

您可以使用 AWS Command Line Interface（AWS CLI）访问 Amazon EC2 功能。要列出适用于 Amazon EC2 的 AWS CLI 命令，请使用以下命令。

```
aws ec2 help
```

在运行任何命令之前，请设置默认证书。有关更多信息，请参阅 [配置 AWS CLI 设置](cli-chap-configure.md)。

本主题展示了执行 Amazon EC2 常见任务的 AWS CLI 命令的短格式示例。

有关 AWS CLI 命令的长格式示例，请参阅 *GitHub* 上的 [AWS CLI 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/aws-cli)。

**Topics**
+ [在 AWS CLI 中创建、显示和删除 Amazon EC2 密钥对](cli-services-ec2-keypairs.md)
+ [在 AWS CLI 中创建、配置和删除 Amazon EC2 安全组](cli-services-ec2-sg.md)
+ [在 AWS CLI 中启动、列出和删除 Amazon EC2 实例](cli-services-ec2-instances.md)
+ [在 AWS CLI 中使用 bash 脚本更改 Amazon EC2 实例类型](cli-services-ec2-instance-type-script.md)

# 在 AWS CLI 中创建、显示和删除 Amazon EC2 密钥对
<a name="cli-services-ec2-keypairs"></a>

您可以使用 AWS Command Line Interface (AWS CLI) 创建、显示和删除 Amazon Elastic Compute Cloud (Amazon EC2) 密钥对。您可以使用密钥对连接 Amazon EC2 实例。在创建实例时您可以向 Amazon EC2 提供密钥对，然后在连接到实例时使用该密钥对进行身份验证。

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

**Topics**
+ [先决条件](#cli-services-ec2-keypairs-prereqs)
+ [创建密钥对](#creating-a-key-pair)
+ [显示您的密钥对](#displaying-a-key-pair)
+ [删除您的密钥对](#deleting-a-key-pair)
+ [引用](#cli-services-ec2-keypairs-references)

## 先决条件
<a name="cli-services-ec2-keypairs-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)。

## 创建密钥对
<a name="creating-a-key-pair"></a>

要创建密钥对，请使用 `[aws ec2 create-key-pair](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-key-pair.html)` 命令以及 `--query` 选项和 `--output text` 选项，以通过管道将私有密钥直接传输到文件。

```
$ aws ec2 create-key-pair --key-name MyKeyPair --query 'KeyMaterial' --output text > MyKeyPair.pem
```

对于 Windows PowerShell，`> file` 重定向会默认采用 UTF-8 编码，这种编码不能用于某些 SSH 客户端。因此，您必须通过管道将输出传输到 `out-file` 命令和显式将编码设置为 `ascii` 来转换输出。

```
PS C:\>aws ec2 create-key-pair --key-name MyKeyPair --query 'KeyMaterial' --output text | out-file -encoding ascii -filepath MyKeyPair.pem
```

生成的 `MyKeyPair.pem` 文件类似于以下内容。

```
-----BEGIN RSA PRIVATE KEY-----
EXAMPLEKEYKCAQEAy7WZhaDsrA1W3mRlQtvhwyORRX8gnxgDAfRt/gx42kWXsT4rXE/b5CpSgie/
vBoU7jLxx92pNHoFnByP+Dc21eyyz6CvjTmWA0JwfWiW5/akH7iO5dSrvC7dQkW2duV5QuUdE0QW
Z/aNxMniGQE6XAgfwlnXVBwrerrQo+ZWQeqiUwwMkuEbLeJFLhMCvYURpUMSC1oehm449ilx9X1F
G50TCFeOzfl8dqqCP6GzbPaIjiU19xX/azOR9V+tpUOzEL+wmXnZt3/nHPQ5xvD2OJH67km6SuPW
oPzev/D8V+x4+bHthfSjR9Y7DvQFjfBVwHXigBdtZcU2/wei8D/HYwIDAQABAoIBAGZ1kaEvnrqu
/uler7vgIn5m7lN5LKw4hJLAIW6tUT/fzvtcHK0SkbQCQXuriHmQ2MQyJX/0kn2NfjLV/ufGxbL1
mb5qwMGUnEpJaZD6QSSs3kICLwWUYUiGfc0uiSbmJoap/GTLU0W5Mfcv36PaBUNy5p53V6G7hXb2
bahyWyJNfjLe4M86yd2YK3V2CmK+X/BOsShnJ36+hjrXPPWmV3N9zEmCdJjA+K15DYmhm/tJWSD9
81oGk9TopEp7CkIfatEATyyZiVqoRq6k64iuM9JkA3OzdXzMQexXVJ1TLZVEH0E7bhlY9d8O1ozR
oQs/FiZNAx2iijCWyv0lpjE73+kCgYEA9mZtyhkHkFDpwrSM1APaL8oNAbbjwEy7Z5Mqfql+lIp1
YkriL0DbLXlvRAH+yHPRit2hHOjtUNZh4Axv+cpg09qbUI3+43eEy24B7G/Uh+GTfbjsXsOxQx/x
p9otyVwc7hsQ5TA5PZb+mvkJ5OBEKzet9XcKwONBYELGhnEPe7cCgYEA06Vgov6YHleHui9kHuws
ayav0elc5zkxjF9nfHFJRry21R1trw2Vdpn+9g481URrpzWVOEihvm+xTtmaZlSp//lkq75XDwnU
WA8gkn6O3QE3fq2yN98BURsAKdJfJ5RL1HvGQvTe10HLYYXpJnEkHv+Unl2ajLivWUt5pbBrKbUC
gYBjbO+OZk0sCcpZ29sbzjYjpIddErySIyRX5gV2uNQwAjLdp9PfN295yQ+BxMBXiIycWVQiw0bH
oMo7yykABY7Ozd5wQewBQ4AdSlWSX4nGDtsiFxWiI5sKuAAeOCbTosy1s8w8fxoJ5Tz1sdoxNeGs
Arq6Wv/G16zQuAE9zK9vvwKBgF+09VI/1wJBirsDGz9whVWfFPrTkJNvJZzYt69qezxlsjgFKshy
WBhd4xHZtmCqpBPlAymEjr/TOlbxyARmXMnIOWIAnNXMGB4KGSyl1mzSVAoQ+fqR+cJ3d0dyPl1j
jjb0Ed/NY8frlNDxAVHE8BSkdsx2f6ELEyBKJSRr9snRAoGAMrTwYneXzvTskF/S5Fyu0iOegLDa
NWUH38v/nDCgEpIXD5Hn3qAEcju1IjmbwlvtW+nY2jVhv7UGd8MjwUTNGItdb6nsYqM2asrnF3qS
VRkAKKKYeGjkpUfVTrW0YFjXkfcrR/V+QFL5OndHAKJXjW7a4ejJLncTzmZSpYzwApc=
-----END RSA PRIVATE KEY-----
```

您的私有密钥不存储在 AWS 中，并且***只有*** 在创建后才能检索。以后您无法恢复它。而如果您丢失了私有密钥，则必须创建新的密钥对。

如果您要从 Linux 电脑连接到您的实例，建议您使用以下命令设置您的私有密钥文件的权限，以确保只有您可以读取该文件。

```
$ chmod 400 MyKeyPair.pem
```

## 显示您的密钥对
<a name="displaying-a-key-pair"></a>

指纹是从密钥对生成的，您可以使用指纹验证您本地电脑上的私有密钥是否与 AWS 中存储的公有密钥匹配。

指纹是取自私有密钥的 DER 编码副本的 SHA1 哈希。在创建密钥对时将捕获此值，此值与公有密钥一起存储在 AWS 中。您可以在 Amazon EC2 控制台中或通过运行 AWS CLI 命令 `[aws ec2 describe-key-pairs](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-key-pairs.html)` 查看指纹。

以下示例显示 `MyKeyPair` 的指纹。

```
$ aws ec2 describe-key-pairs --key-name MyKeyPair
{
    "KeyPairs": [
        {
            "KeyName": "MyKeyPair",
            "KeyFingerprint": "1f:51:ae:28:bf:89:e9:d8:1f:25:5d:37:2d:7d:b8:ca:9f:f5:f1:6f"
        }
    ]
}
```

有关密钥和指纹的更多信息，请参阅《Amazon EC2 用户指南》**中的 [Amazon EC2 密钥对](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)。

## 删除您的密钥对
<a name="deleting-a-key-pair"></a>

要删除密钥对，请运行 `[aws ec2 delete-key-pair](https://docs.aws.amazon.com/cli/latest/reference/ec2/delete-key-pair.html)` 命令，将 *`MyKeyPair`* 替换为要删除的密钥对的名称。

```
$ aws ec2 delete-key-pair --key-name MyKeyPair
```

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

**AWS CLI 参考：**
+ `[aws ec2](https://docs.aws.amazon.com/cli/latest/reference/ec2/index.html)`
+ `[aws ec2 create-key-pair](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-key-pair.html)`
+ `[aws ec2 delete-key-pair](https://docs.aws.amazon.com/cli/latest/reference/ec2/delete-key-pair.html)`
+ `[aws ec2 describe-key-pairs](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-key-pairs.html)`

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

# 在 AWS CLI 中创建、配置和删除 Amazon EC2 安全组
<a name="cli-services-ec2-sg"></a>

您可以为您的 Amazon Elastic Compute Cloud（Amazon EC2）实例创建安全组，安全组本质上用作一个防火墙，具有可确定哪些网络流量可以进入和离开的规则。

使用 AWS Command Line Interface (AWS CLI) 创建一个安全组，向现有安全组添加规则，以及删除安全组。

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

**Topics**
+ [先决条件](#cli-services-ec2-sg-prereqs)
+ [创建安全组](#creating-a-security-group)
+ [为您的安全组添加规则](#configuring-a-security-group)
+ [删除您的安全组](#deleting-a-security-group)
+ [引用](#cli-services-ec2-sg-references)

## 先决条件
<a name="cli-services-ec2-sg-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)。

## 创建安全组
<a name="creating-a-security-group"></a>

您可以创建与虚拟私有云（VPC）关联的安全组。

以下 `[aws ec2 create-security-group](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-security-group.html)` 示例说明如何为指定的 VPC 创建安全组。

```
$ aws ec2 create-security-group --group-name my-sg --description "My security group" --vpc-id vpc-1a2b3c4d
{
    "GroupId": "sg-903004f8"
}
```

要查看安全组的初始信息，请运行 `[aws ec2 describe-security-groups](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html)` 命令。您不能仅通过其 `vpc-id` 而非其名称引用 EC2-VPC 安全组。

```
$ aws ec2 describe-security-groups --group-ids sg-903004f8
{
    "SecurityGroups": [
        {
            "IpPermissionsEgress": [
                {
                    "IpProtocol": "-1",
                    "IpRanges": [
                        {
                            "CidrIp": "0.0.0.0/0"
                        }
                    ],
                    "UserIdGroupPairs": []
                }
            ],
            "Description": "My security group"
            "IpPermissions": [],
            "GroupName": "my-sg",
            "VpcId": "vpc-1a2b3c4d",
            "OwnerId": "123456789012",
            "GroupId": "sg-903004f8"
        }
    ]
}
```

## 为您的安全组添加规则
<a name="configuring-a-security-group"></a>

运行 Amazon EC2 实例时，您必须启用安全组中的规则，以便为连接到镜像的方法允许入站网络流量。

例如，如果您要启动 Windows 实例，您通常会添加规则以允许 TCP 端口 3389 (RDP) 上的入站流量，从而支持远程桌面协议 (RDP)。如果您要启动 Linux 实例，则通常会添加规则以允许 TCP 端口 22 上的入站流量，从而支持 SSH 连接。

使用 `[aws ec2 authorize-security-group-ingress](https://docs.aws.amazon.com/cli/latest/reference/ec2/authorize-security-group-ingress.html)` 命令向安全组添加规则。此命令的必需参数是您电脑的公有 IP 地址，或您的电脑连接到的网络（以地址范围形式）（采用 [CIDR](https://wikipedia.org/wiki/Classless_Inter-Domain_Routing) 表示法）。

**注意**  
我们提供以下服务 [https://checkip.global.api.aws/](https://checkip.global.api.aws/)，使您可以确定您的公有 IP 地址。要查找可以帮助您识别 IP 地址的其他服务，请使用您的浏览器搜索“*what is my IP address*”。如果您使用动态 IP 地址通过 ISP 或从防火墙后面进行连接（通过私有网络的 NAT 网关），则您的地址可能会定期更改。在这种情况下，您必须找到客户端电脑使用的 IP 地址的范围。

以下示例说明如何使用 IP 地址将适用于 RDP 的规则（TCP 端口 3389）添加到 ID 为 `sg-903004f8` 的 EC2-VPC 安全组。

首先，确定您的 IP 地址。

```
$ curl https://checkip.amazonaws.com
x.x.x.x
```

然后，您可以运行 `[aws ec2 authorize-security-group-ingress](https://docs.aws.amazon.com/cli/latest/reference/ec2/authorize-security-group-ingress.html)` 命令以将 IP 地址添加到安全组。

```
$ aws ec2 authorize-security-group-ingress --group-id sg-903004f8 --protocol tcp --port 3389 --cidr x.x.x.x/x
```

以下命令添加另一个规则以对同一安全组中的实例启用 SSH。

```
$ aws ec2 authorize-security-group-ingress --group-id sg-903004f8 --protocol tcp --port 22 --cidr x.x.x.x/x
```

要查看对安全组所做的更改，请运行 `[aws ec2 describe-security-groups](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html)` 命令。

```
$ aws ec2 describe-security-groups --group-ids sg-903004f8
{
    "SecurityGroups": [
        {
            "IpPermissionsEgress": [
                {
                    "IpProtocol": "-1",
                    "IpRanges": [
                        {
                            "CidrIp": "0.0.0.0/0"
                        }
                    ],
                    "UserIdGroupPairs": []
                }
            ],
            "Description": "My security group"
            "IpPermissions": [
                {
                    "ToPort": 22,
                    "IpProtocol": "tcp",
                    "IpRanges": [
                        {
                            "CidrIp": "x.x.x.x/x"
                        }
                    ]
                    "UserIdGroupPairs": [],
                    "FromPort": 22
                }
            ],
            "GroupName": "my-sg",
            "OwnerId": "123456789012",
            "GroupId": "sg-903004f8"
        }
    ]
}
```

## 删除您的安全组
<a name="deleting-a-security-group"></a>

要删除安全组，请运行 `[aws ec2 delete-security-group](https://docs.aws.amazon.com/cli/latest/reference/ec2/delete-security-group.html)` 命令。

**注意**  
如果安全组当前已附加到环境，则无法删除。

以下命令示例删除 EC2-VPC 安全组。

```
$ aws ec2 delete-security-group --group-id sg-903004f8
```

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

**AWS CLI 参考：**
+ `[aws ec2](https://docs.aws.amazon.com/cli/latest/reference/ec2/index.html)`
+ `[aws ec2 authorize-security-group-ingress](https://docs.aws.amazon.com/cli/latest/reference/ec2/authorize-security-group-ingress.html)`
+ `[aws ec2 create-security-group](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-security-group.html)`
+ `[aws ec2 delete-security-group](https://docs.aws.amazon.com/cli/latest/reference/ec2/delete-security-group.html)`
+ `[aws ec2 describe-security-groups](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html)`

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

# 在 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/)。

# 在 AWS CLI 中使用 bash 脚本更改 Amazon EC2 实例类型
<a name="cli-services-ec2-instance-type-script"></a>

Amazon EC2 的这一 bash 脚本示例使用 AWS Command Line Interface (AWS CLI) 更改 Amazon EC2 实例的实例类型。如果实例正在运行，它会停止实例，更改实例类型，然后根据请求重启实例。Shell 脚本是专用于在命令行界面中运行的程序。

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

**Topics**
+ [开始之前](#cli-services-ec2-instance-type-script-prereqs)
+ [关于此示例](#cli-services-ec2-instance-type-script-about)
+ [参数](#cli-services-ec2-instance-type-script-params)
+ [文件](#cli-services-ec2-instance-type-script-files.title)
+ [引用](#cli-services-ec2-instance-type-script-references)

## 开始之前
<a name="cli-services-ec2-instance-type-script-prereqs"></a>

您需要先满足以下条件，才能运行下文中的任何示例代码。
+ 安装和配置 AWS CLI。有关更多信息，请参阅 [安装或更新最新版本的 AWS CLI](getting-started-install.md) 和 [AWS CLI 身份验证和访问凭证](cli-chap-authentication.md)。
+ 您使用的配置文件必须具有允许示例代码执行AWS操作的权限。
+ 在账户中有正在运行的 Amazon EC2 实例，并且您有权停止和修改该实例。如果您运行测试脚本，它会为您启动一个实例，测试更改类型，然后终止该实例。
+ 作为 AWS 的最佳实践，请授予此代码最低的权限，或者仅授予它执行任务所需的权限。有关更多信息，请参阅 *AWS Identity and Access Management (IAM) 用户指南*中的[授予最低权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)。
+ 此代码尚未在所有 AWS 区域中进行测试。有些 AWS 服务仅在特定区域中提供。有关更多信息，请参阅《AWS 一般参考指南》**中的[服务端点和配额](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)。
+ 运行此代码可能会导致您的 AWS 账户产生相关费用。您有责任确保在使用完由此脚本创建的任何资源后删除这些资源。

## 关于此示例
<a name="cli-services-ec2-instance-type-script-about"></a>

此示例是作为 shell 脚本文件 `change_ec2_instance_type.sh` 中的一个函数编写的，您可以通过其他脚本或命令行 `source` 该函数。每个脚本文件都包含了介绍每个函数的注释。一旦该函数进入内存，您就可以通过命令行调用它。例如，以下命令会将指定实例的类型更改为 `t2.nano`：

```
$ source ./change_ec2_instance_type.sh
$ ./change_ec2_instance_type -i *instance-id* -t new-type
```

有关完整示例和可下载的脚本文件，请参阅 *GitHub* 上的 *AWS 代码示例存储库* 中的[更改 Amazon EC2 实例类型](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/aws-cli/bash-linux/ec2/change-ec2-instance-type)。

## 参数
<a name="cli-services-ec2-instance-type-script-params"></a>

**-i** -*（字符串）*指定要修改的实例 ID。

**-t** -*（字符串）*指定要切换到的 Amazon EC2 实例类型。

**-r** -*（开关）*默认情况下，此参数未设置。如果设置了 `-r`，则在类型切换后将会重启实例。

**-f** -*（开关）*默认情况下，脚本在进行切换之前会提示用户确认关闭实例。如果设置了 `-f`，则函数在关闭实例以进行类型切换之前不会提示用户

**-v** -*（开关）*默认情况下，脚本会以静默方式运行，仅在出现错误时才显示输出。如果设置了 `-v`，则函数会在整个运行过程中显示状态。

## 文件
<a name="cli-services-ec2-instance-type-script-files.title"></a>

**`change_ec2_instance_type.sh`**  
该主脚本文件包含执行以下任务的 `change_ec2_instance_type()` 函数：  
+ 验证指定的 Amazon EC2 实例是否存在。
+ 除非选择了 `-f`，否则函数会在停止实例之前向用户发出警告。
+ 更改实例类型
+ 如果您设置了 `-r`，请重启实例并确认实例正在运行
在 *GitHub* 上查看 `[change\$1ec2\$1instance\$1type.sh](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/aws-cli/bash-linux/ec2/change-ec2-instance-type/change_ec2_instance_type.sh)` 的代码。

**`test_change_ec2_instance_type.sh`**  
脚本文件 `test_change_ec2_instance_type.sh` 会测试 `change_ec2_instance_type` 函数的各种代码路径。如果测试脚本中的所有步骤都正确完成，测试脚本将会删除它创建的所有资源。  
您可以使用以下参数运行该测试脚本：  
+ **-v** -*（开关）*每个测试在运行时都会显示通过/失败状态。默认情况下，测试以静默方式运行，输出仅包含最终的总体通过/失败状态。
+ **-i** -*（开关）*脚本会在每个测试后暂停，以便您能查看每个步骤的中间结果。让您能够使用 Amazon EC2 控制台检查实例的当前状态。您在系统提示符处按 *Enter* 后，脚本才会继续执行下一步。
在 *GitHub* 上查看 `[test\$1change\$1ec2\$1instance\$1type.sh](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/aws-cli/bash-linux/ec2/change-ec2-instance-type/test_change_ec2_instance_type.sh)` 的代码。

**`awsdocs_general.sh`**  
脚本文件 `awsdocs_general.sh` 中包含了在 AWS CLI 的高级示例中使用的通用函数。  
在 *GitHub* 上查看 `[awsdocs\$1general.sh](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/aws-cli/bash-linux/ec2/change-ec2-instance-type/awsdocs_general.sh)` 的代码。

## 引用
<a name="cli-services-ec2-instance-type-script-references"></a>

**AWS CLI 参考：**
+ `[aws ec2](https://docs.aws.amazon.com/cli/v1/reference/ec2/index.html)`
+ `[aws ec2 describe-instances](https://docs.aws.amazon.com/cli/v1/reference/ec2/describe-instances.html)`
+ `[aws ec2 modify-instance-attribute](https://docs.aws.amazon.com/cli/v1/reference/ec2/modify-instance-attribute.html)`
+ `[aws ec2 start-instances](https://docs.aws.amazon.com/cli/v1/reference/ec2/start-instances.html)`
+ `[aws ec2 stop-instances](https://docs.aws.amazon.com/cli/v1/reference/ec2/stop-instances.html)`
+ `[aws ec2 wait instance-running](https://docs.aws.amazon.com/cli/v1/reference/ec2/wait/instance-running.html)`
+ `[aws ec2 wait instance-stopped](https://docs.aws.amazon.com/cli/v1/reference/ec2/wait/instance-stopped.html)`

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