

# 连接到您的 EC2 实例
<a name="connect"></a>

Amazon EC2 实例是 AWS 云中的虚拟服务器。要登录实例，必须先与实例建立连接。连接实例的方式取决于实例的操作系统，以及用于连接实例的计算机上的操作系统。下表详细说明了每种连接方法的要求。


| 连接选项 | 实例操作系统 | 入站流量规则 | IAM 权限 | 实例配置文件角色 | 实例上的软件 | 连接系统上的软件 | 密钥对 | 
| --- | --- | --- | --- | --- | --- | --- | --- | 
|  SSH 客户端  |  Linux  |  是  |  否  |  否  |  否  |  是  |  是  | 
|  EC2 Instance Connect  |  Linux  |  支持  |  是  |  否  |  是¹  |  否  |  否  | 
| PuTTY |  Linux  |  是  |  否  |  否  |  否  |  是  |  是  | 
| RDP 客户端 |  Windows  |  是  |  否  |  否  |  否  |  是  |  是²  | 
| Fleet Manager |  Windows  |  否  |  是  |  是  |  是¹  |  否  |  是  | 
| 会话管理器 |  Linux、Windows  |  否  |  是  |  是  |  是¹  |  否  |  否  | 
| EC2 Instance Connect Endpoint |  Linux、Windows  |  支持  |  是  |  否  |  否  |  否  |  否 ³  | 

¹ 仅某些 AMI 会预装必需的软件。您可以根据需要在支持的操作系统上手动安装所需的软件。

² 只有在使用随机生成的本地管理员用户账户密码时，才需要此密钥对。

³ 如果使用 SSH 连接方法，则需要密钥对。

有关详细信息，请参阅要使用的连接选项的文档。

**连接选项**
+ [使用 SSH 客户端连接到 Linux 实例](connect-linux-inst-ssh.md)
+ [使用 PuTTY 连接到 Linux 实例](connect-linux-inst-from-windows.md)
+ [使用 RDP 客户端连接到 Windows 实例](connect-rdp.md)
+ [使用 Fleet Manager 连接到 Windows 实例](connect-rdp-fleet-manager.md)
+ [使用会话管理器进行连接](connect-with-systems-manager-session-manager.md)
+ [使用公有 IP 和 EC2 Instance Connect 进行连接](connect-linux-inst-eic.md)
+ [使用私有 IP 和 EC2 Instance Connect Endpoint 进行连接](connect-with-ec2-instance-connect-endpoint.md)

# 通用连接先决条件
<a name="connection-prereqs-general"></a>

连接到实例时需要满足的通用先决条件如下。请注意，可能存在与所选连接选项相关的特定先决条件。

**一般先决条**
+ 检查您的实例是否通过了状态检查。可能需要花几分钟时间，实例才能准备好接受连接请求。有关更多信息，请参阅 [查看状态检查](viewing_status.md)。
+ [获取所需的实例详细信息](#connection-prereqs-get-info-about-instance).
+ [查找私有密钥并设置权限](#connection-prereqs-private-key).
+ [（可选）获取实例指纹](#connection-prereqs-fingerprint).

## 获取所需的实例详细信息
<a name="connection-prereqs-get-info-about-instance"></a>

要做好连接到实例的准备工作，请通过 Amazon EC2 控制台或使用命令行来获取以下信息。

![\[Amazon EC2 控制台的实例窗格。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/connection-prereqs-console2.png)

+ **获取实例的公有 DNS 名称。**

  您可以从 Amazon EC2 控制台获取实例的公有 DNS。查看**实例**窗格的**公有 IPv4 DNS** 列。如果此列已隐藏，请选择屏幕右上角的设置图标（![\[The gear icon.\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/settings-icon.png)），然后选择**公有 IPv4 DNS**。您也可以在**实例**窗格的实例信息部分找到公有 DNS。在 Amazon EC2 控制台的**实例**窗格中选择实例时，有关该实例的信息将显示在页面的下半部分。在**详细信息**选项卡下，查找**公有 IPv4 DNS**。

  如果您愿意，也可以使用 [describe-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html)（AWS CLI）或 [Get-EC2Instance](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Instance.html)（AWS Tools for Windows PowerShell）命令。

  如果未显示**公有 IPv4 DNS**，请验证**实例状态**是否**正在运行**，并确保您没有在私有子网中启动实例。如果您使用[启动实例向导](ec2-launch-instance-wizard.md)来启动实例，则可能已编辑**网络设置**下的**自动分配公有 IP** 字段，并且已将值更改为**禁用**。如果您禁用**自动分配公有 IP** 选项，则启动实例后不会为其分配公有 IP 地址。
+ **（仅适用于 IPv6）获取实例的 IPv6 地址。**

  如果您已为实例分配 IPv6 地址，则可以选择使用 IPv6 地址代替公有 IPv4 地址或公有 IPv4 DNS 主机名，以连接到实例。您的本地计算机必须拥有 IPv6 地址，且必须配置为使用 IPv6。您可以从 Amazon EC2 控制台获取实例的 IPv6 地址。请查看**实例**窗格的 **IPv6 IP** 列。或者，您可以在实例信息部分找到 IPv6 地址。在 Amazon EC2 控制台的**实例**窗格中选择实例时，有关该实例的信息将显示在页面的下半部分。在**详细信息**选项卡下，查找 **IPv6 地址**。

  如果您愿意，也可以使用 [describe-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html)（AWS CLI）或 [Get-EC2Instance](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Instance.html)（AWS Tools for Windows PowerShell）命令。有关 IPv6 的更多信息，请参阅 [IPv6 地址](using-instance-addressing.md#ipv6-addressing)。
+ **（Linux 实例）获取实例的用户名。**

  您可以使用用户账户的用户名或用于启动实例的 AMI 的默认用户名连接到实例。
  + **获取用户账户的用户名。**

    有关如何创建用户账户的更多信息，请参阅[管理 Amazon EC2 Linux 实例上的系统用户](managing-users.md)。
  + **获取用于启动实例的 AMI 的默认用户名。**
    + **Amazon Linux** – `ec2-user`
    + **CentOS** – `centos` 或 `ec2-user`
    + **Debian** – `admin`
    + **Fedora** – `fedora` 或 `ec2-user`
    + **FreeBSD** – `ec2-user`
    + **RHEL** – `ec2-user` 或 `root`
    + **SUSE** – `ec2-user` 或 `root`
    + **Ubuntu** – `ubuntu`
    + **Oracle** – `ec2-user`
    + **Bitnami** – `bitnami`
    + **Rocky Linux** – `rocky`
    + **Other** – 检查 AMI 提供程序

## 查找私有密钥并设置权限
<a name="connection-prereqs-private-key"></a>

必须清楚私有密钥文件的位置，才能使用 SSH 建立与 Linux 实例的初始连接，或者使用 RDP 建立与 Windows 实例的初始连接。对于 SSH 连接，必须设置文件权限，确保只有您可以读取私有密钥。

有关使用 Amazon EC2 时密钥对工作原理的信息，请参阅 [Amazon EC2 密钥对和 Amazon EC2 实例](ec2-key-pairs.md)。
+ **查找私有密钥。**

  获取适用于启用实例时所指定密钥对的 `.pem` 文件在电脑上的全限定路径。有关更多信息，请参阅 [确定启动时指定的公有密钥](describe-keys.md#identify-key-pair-specified-at-launch)。

  如果无法找到私有密钥文件，则请参阅 [我丢失了私有密钥。如何连接到我的实例？](TroubleshootingInstancesConnecting.md#replacing-lost-key-pair)

  （Linux 实例）如果您使用 PuTTY 连接到实例并且需要将 `.pem` 文件转换为 `.ppk`，请参阅[使用 PuTTYgen 转换私有密钥](connect-linux-inst-from-windows.md#putty-private-key)。
+ **（Linux 实例）设置私有密钥的权限，确保只有您可以读取该密钥。**
  + **从 macOS 或 Linux 进行连接**

    如果您计划在 macOS 或 Linux 计算机上使用 SSH 客户端连接到 Linux 实例，请使用以下命令设置私有密钥文件的权限，以确保只有您可以读取该文件。

    ```
    chmod 400 key-pair-name.pem
    ```

    如果不设置这些权限，则无法使用此密钥对连接到实例。有关更多信息，请参阅 [错误：未保护的私有密钥文件](TroubleshootingInstancesConnecting.md#troubleshoot-unprotected-key)。
  + **从 Windows 进行连接**

    打开“文件资源管理器”，然后右键单击 `.pem` 文件。依次选择**属性** > **安全选项卡**，然后选择**高级**。选择**禁用继承**。删除对所有用户（当前用户除外）的访问权限。

## （可选）获取实例指纹
<a name="connection-prereqs-fingerprint"></a>

若要保护自己免遭中间人攻击，您可以通过验证显示的指纹，确认将要连接的实例的真实性。如果您从第三方提供的公有 AMI 启动实例，验证指纹将很有用。

**任务概述**  
首先，从实例获取实例指纹。然后，当您连接到实例并收到验证指纹的提示时，请将在此过程中获取的指纹与显示的指纹进行比较。如果指纹不匹配，则表示有人可能在试图实施中间人攻击。如果二者匹配，则您可以放心地连接到您的实例。

**获取实例指纹的先决条件**
+ 实例不能处于 `pending` 状态。只有在第一次引导实例完成后，才能使用指纹。
+ 您必须为实例拥有者，才能获取控制台输出。
+ 可以采用多种方法获取实例指纹。如果要使用 AWS CLI，则必须将其安装在本地计算机上。有关安装 AWS CLI 的信息，请参阅《AWS Command Line Interface 用户指南》**中的[开始使用 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html)。

**获取实例指纹**

在步骤 1 中，您将获得控制台输出，其中包括实例指纹。在步骤 2 中，您可以在控制台输出中找到实例指纹。

1. 使用以下方法之一获取控制台输出。

------
#### [ Console ]

   1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

   1. 从左侧导航窗格中选择**实例**。

   1. 选择实例，然后依次选择**操作**、**监控和故障排除**、**获取系统日志**、

------
#### [ AWS CLI ]

   在本地计算机上（而不是正在连接的实例上），使用 [get-console-output](https://docs.aws.amazon.com/cli/latest/reference/ec2/get-console-output.html) 命令。如果输出过大，[可将输出通过管道传输到文本文件](https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-output-format.html)，文本形式可能更易于阅读。

   ```
   aws ec2 get-console-output \
       --instance-id i-1234567890abcdef0 \
       --query Output \
       --output text > temp.txt
   ```

------
#### [ PowerShell ]

   在本地计算机上使用以下 [Get-EC2ConsoleOutput](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2ConsoleOutput.html) cmdlet。

   ```
   $encodedOutput = (Get-EC2ConsoleOutput -InstanceId i-1234567890abcdef0).Output
   [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($encodedOutput))
   ```

------

1. 在控制台输出中，找到位于 `BEGIN SSH HOST KEY FINGERPRINTS` 下方的实例（主机）指纹。可能有多个实例指纹。当您连接到实例时，它将仅显示其中一个指纹。

   确切的输出可能因操作系统、AMI 版本以及是否是由 AWS 创建密钥对而异。下面是示例输出。

   ```
   ec2:#############################################################
   ec2: -----BEGIN SSH HOST KEY FINGERPRINTS-----
   ec2: 256 SHA256:l4UB/neBad9tvkgJf1QZWxheQmR59WgrgzEimCG6kZY no comment (ECDSA)
   ec2: 256 SHA256:kpEa+rw/Uq3zxaYZN8KT501iBtJOIdHG52dFi66EEfQ no comment (ED25519)
   ec2: 2048 SHA256:L8l6pepcA7iqW/jBecQjVZClUrKY+o2cHLI0iHerbVc no comment (RSA)
   ec2: -----END SSH HOST KEY FINGERPRINTS-----
   ec2: #############################################################
   ```
**注意**  
连接到实例时，您将引用此指纹。

# 使用 SSH 连接到 Linux 实例
<a name="connect-to-linux-instance"></a>

有许多方法可以使用 SSH 连接到 Linux 实例。有些方法会因发起连接的本地计算机的操作系统而有所不同。其他方法基于浏览器，例如 EC2 Instance Connect 或 AWS Systems Manager Session Manager，可以在任何计算机上使用。您可以使用 SSH 连接到 Linux 实例并运行命令，也可以使用 SSH 在本地计算机和实例之间传输文件。

在使用 SSH 连接到 Linux 实例之前，请先完成以下先决条件：
+ 检查您的实例是否通过了状态检查。可能需要花几分钟时间，实例才能准备好接受连接请求。有关更多信息，请参阅 [查看状态检查](viewing_status.md)。
+ 确保与您的实例关联的安全组允许来自您的 IP 地址的入站 SSH 流量。有关更多信息，请参阅 [用于从您的计算机连接到实例的规则](security-group-rules-reference.md#sg-rules-local-access)。
+ [获取所需的实例详细信息](connection-prereqs-general.md#connection-prereqs-get-info-about-instance).
+ [查找私有密钥并设置权限](connection-prereqs-general.md#connection-prereqs-private-key).
+ [（可选）获取实例指纹](connection-prereqs-general.md#connection-prereqs-fingerprint).

然后，选择以下某个选项来使用 SSH 连接到 Linux 实例。
+ [使用 SSH 客户端进行连接](connect-linux-inst-ssh.md)
+ [使用 PuTTY 进行连接](connect-linux-inst-from-windows.md) 
+ [使用 SCP 传输文件](linux-file-transfer-scp.md)

如果无法连接到实例，并且需要进行问题排查，请参阅[排查 Amazon EC2 Linux 实例的连接问题](TroubleshootingInstancesConnecting.md)。

# 使用 SSH 客户端连接到 Linux 实例
<a name="connect-linux-inst-ssh"></a>

使用 Secure Shell（SSH）可以从本地计算机连接到 Linux 实例。有关其他选项的更多信息，请参阅[连接到您的 EC2 实例](connect.md)。

**注意**  
如果您在尝试连接到您的实例时收到错误，请确保您的实例满足所有 [SSH 连接先决条件](#ssh-prereqs-linux-from-linux-macos) 要求。如果它满足所有先决条件，但您仍然无法连接到 Linux 实例，请参阅[排查 Amazon EC2 Linux 实例的连接问题](TroubleshootingInstancesConnecting.md)。

**Topics**
+ [SSH 连接先决条件](#ssh-prereqs-linux-from-linux-macos)
+ [使用 SSH 客户端连接到 Linux 实例](#connect-linux-inst-sshClient)

## SSH 连接先决条件
<a name="ssh-prereqs-linux-from-linux-macos"></a>

使用 SSH 连接到 Linux 实例之前，请先完成以下任务。

**完成一般先决条件。**  
+ 检查您的实例是否通过了状态检查。可能需要花几分钟时间，实例才能准备好接受连接请求。有关更多信息，请参阅 [查看状态检查](viewing_status.md)。
+ [获取所需的实例详细信息](connection-prereqs-general.md#connection-prereqs-get-info-about-instance).
+ [查找私有密钥并设置权限](connection-prereqs-general.md#connection-prereqs-private-key).
+ [（可选）获取实例指纹](connection-prereqs-general.md#connection-prereqs-fingerprint).

**允许来自您 IP 地址的入站 SSH 流量。**  
确保与您的实例关联的安全组允许来自您的 IP 地址的入站 SSH 流量。有关更多信息，请参阅 [用于从您的计算机连接到实例的规则](security-group-rules-reference.md#sg-rules-local-access)。

**在本地计算机上安装 SSH 客户端（如果需要）。**  
您的本地计算机可能已默认安装了 SSH 客户端。在终端窗口输入以下命令可以验证该情况。如果计算机无法识别该命令，则必须安装 SSH 客户端。  

```
ssh
```
以下是适用于 Windows 的一些可能选项。如果计算机运行别的操作系统，请参阅相应操作系统的文档来了解 SSH 客户端选项。

## 在 Windows 系统上安装 OpenSSH
<a name="openssh"></a>

在 Windows 上安装 OpenSSH 后，即可使用 SSH 从 Windows 计算机连接到 Linux 实例。开始操作之前，务必确认已满足以下要求。

**Windows 版本**  
计算机上的 Windows 版本必须是 Windows Server 2019 或更高版本。  
若为较早版本的 Windows，请改为下载并安装 [Win32-OpenSSH](https://github.com/PowerShell/Win32-OpenSSH/wiki)。

**PowerShell 要求**  
若要在 Windows 操作系统上使用 PowerShell 安装 OpenSSH，您必须运行 PowerShell 版本 5.1 或更高版本，并且您的账户必须是内置管理员组的成员。在 PowerShell 中运行 `$PSVersionTable.PSVersion` 以查看 PowerShell 版本。  
若要查看您是否是内置管理员组的成员，请运行以下 PowerShell 命令：  

```
(New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
```
如果您是内置管理员组的成员，则输出为 `True`。

若要使用 PowerShell 安装适用于 Windows 的 OpenSSH，请运行以下 PowerShell 命令。

```
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
```

下面是示例输出。

```
Path          :
Online        : True
RestartNeeded : False
```

若要使用 PowerShell 将 OpenSSH 从 Windows 卸载，请运行以下 PowerShell 命令。

```
Remove-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
```

下面是示例输出。

```
Path          :
Online        : True
RestartNeeded : True
```

## 安装适用于 Linux 的 Windows 子系统（WSL）
<a name="WSL"></a>

在 Windows 上安装 WSL 后，即可使用 Linux 命令行工具（例如 SSH 客户端）从 Windows 计算机连接到 Linux 实例。

按照[在 EC2 Windows 实例上安装适用于 Linux 的 Windows 子系统](install-wsl-on-ec2-windows-instance.md)中的说明进行操作。如果您按照 Microsoft 安装指南中的说明进行操作，他们会安装 Linux 的 Ubuntu 发行版。如果愿意，您可以安装不同的 Linux 发行版。

在 WSL 终端窗口中，将 `.pem` 文件（适用于您在启动时为实例指定的密钥对）从 Windows 复制到 WSL。记下在连接到实例时要使用的 WSL 上的 `.pem` 文件的完全限定路径。有关如何指定 Windows 硬盘的路径的信息，请参阅[如何访问我的 C 驱动器？](https://learn.microsoft.com/en-us/windows/wsl/faq#how-do-i-access-my-c--drive-)。

```
cp /mnt/<Windows drive letter>/path/my-key-pair.pem ~/WSL-path/my-key-pair.pem
```

有关卸载 Windows Subsystem for Linux 的信息，请参阅[如何卸载 WSL 发行版？](https://learn.microsoft.com/en-us/windows/wsl/faq#how-do-i-uninstall-a-wsl-distribution-)

## 使用 SSH 客户端连接到 Linux 实例
<a name="connect-linux-inst-sshClient"></a>

通过以下过程使用 SSH 客户端连接到您的 Linux 实例。

**使用 SSH 客户端连接到实例**

1. 在计算机上打开终端窗口。

1. 使用 **ssh** 命令连接到实例。此时需要用到在先决条件中收集的有关实例的详细信息。例如，您需要私有密钥（`.pem` 文件）的位置、用户名以及公有 DNS 名称或 IPv6 地址。以下是命令示例。
   + （公有 DNS）要使用公有 DNS 名称，请输入以下命令。

     ```
     ssh -i /path/key-pair-name.pem instance-user-name@instance-public-dns-name
     ```
   + （IPv6）或者，如果实例具有 IPv6 地址，请输入以下命令来使用 IPv6 地址。

     ```
     ssh -i /path/key-pair-name.pem instance-user-name@2001:db8::1234:5678:1.2.3.4
     ```

   以下为响应示例。

   ```
   The authenticity of host 'ec2-198-51-100-1.compute-1.amazonaws.com (198-51-100-1)' can't be established.
   ECDSA key fingerprint is l4UB/neBad9tvkgJf1QZWxheQmR59WgrgzEimCG6kZY.
   Are you sure you want to continue connecting (yes/no)?
   ```

1. （可选）验证安全警报中的指纹是否与该指纹相匹配。如果这些指纹不匹配，则表示有人可能在试图实施中间人攻击。如果匹配，请继续到下一步。有关更多信息，请参阅[获取实例指纹](connection-prereqs-general.md#connection-prereqs-fingerprint)。

1. 输入 **yes**。

   您会看到如下响应：

   ```
   Warning: Permanently added 'ec2-198-51-100-1.compute-1.amazonaws.com' (ECDSA) to the list of known hosts.
   ```

# 使用 PuTTY 连接到 Linux 实例
<a name="connect-linux-inst-from-windows"></a>

适用于 Windows 的免费 SSH 客户端 PuTTY 可用于连接 Linux 实例。

如果运行的是 Windows Server 2019 或更高版本，建议使用 OpenSSH（这是一款使用 SSH 协议进行远程登录的开源连接工具）。

**注意**  
如果您在尝试连接到您的实例时收到错误，请确保您的实例满足所有 [SSH 连接先决条件](connect-linux-inst-ssh.md#ssh-prereqs-linux-from-linux-macos) 要求。如果它满足所有先决条件，但您仍然无法连接到 Linux 实例，请参阅[排查 Amazon EC2 Linux 实例的连接问题](TroubleshootingInstancesConnecting.md)。

**Topics**
+ [前提条件](#putty-prereqs)
+ [使用 PuTTYgen 转换私有密钥](#putty-private-key)
+ [连接到您的 Linux 实例](#putty-ssh)

## 前提条件
<a name="putty-prereqs"></a>

使用 PuTTY 连接到 Linux 实例之前，请先完成以下任务。

**完成一般先决条件。**  
+ 检查您的实例是否通过了状态检查。可能需要花几分钟时间，实例才能准备好接受连接请求。有关更多信息，请参阅 [查看状态检查](viewing_status.md)。
+ [获取所需的实例详细信息](connection-prereqs-general.md#connection-prereqs-get-info-about-instance).
+ [查找私有密钥并设置权限](connection-prereqs-general.md#connection-prereqs-private-key).
+ [（可选）获取实例指纹](connection-prereqs-general.md#connection-prereqs-fingerprint).

**允许来自您 IP 地址的入站 SSH 流量。**  
确保与您的实例关联的安全组允许来自您的 IP 地址的入站 SSH 流量。有关更多信息，请参阅 [用于从您的计算机连接到实例的规则](security-group-rules-reference.md#sg-rules-local-access)。

**在本地计算机上安装 PuTTY（如果需要）。**  
从 [PuTTY 下载页面](https://www.chiark.greenend.org.uk/~sgtatham/putty/)下载 PuTTY 并安装。如果您安装的是早期版本的 PuTTY，建议您下载最新版本。确保安装整个套件。

**使用 PuTTYgen 将私有密钥转换为 PPK 格式。**  
必须指定启动实例时指定的密钥对的私有密钥。如果创建了.pem 格式的私有密钥，则必须将其转换为 PPK 文件，才能与 PuTTY 一起使用。找到私有密钥（.pem 文件），然后按照[使用 PuTTYgen 转换私有密钥](#putty-private-key)中的步骤操作。

## （可选）使用 PuTTYgen 转换私有密钥
<a name="putty-private-key"></a>

PuTTY 自身并不支持适用于 SSH 密钥的 PEM 格式。PuTTY 提供一种名为 PuTTYgen 的工具，该工具可以将 PEM 密钥转换为 PuTTY 所需的 PPK 格式。如果使用 PEM 格式而非 PPK 格式创建了密钥，则必须将私有密钥（.pem 文件）转换为此格式（.ppk 文件），才能与 PuTTY 一起使用。

**将私有密钥 从 PEM 格式转换为 PPK 格式**

1. 从 **Start (开始)** 菜单中，依次选择 **All Programs (所有程序)**、**PuTTY**、**PuTTYgen**。

1. 在 **Type of key to generate** 下，选择 ** RSA**。如果您的 PuTTYgen 版本不包含此选项，请选择 **SSH-2 RSA**。  
![\[PuTTYgen 中的 RSA 密钥。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/puttygen-key-type.png)

1. 选择 **Load**。默认情况下，PuTTYgen 仅显示扩展名为 `.ppk` 的文件。要找到您的 `.pem` 文件，请选择显示所有类型的文件的选项。  
![\[选择所有文件类型。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/puttygen-load-key.png)

1. 选择在启动实例时指定的密钥对的 `.pem` 文件，然后选择**打开**。PuTTYgen 显示一个通知，即 `.pem` 文件已导入成功。选择 **OK (确定)**。

1. 要以 PuTTY 可以使用的格式保存密钥，请选择 **Save private key (保存私有密钥)**。PuTTYgen 显示一条关于在没有密码的情况下保存密钥的警告。选择**是**。
**注意**  
私有密钥上的密码提供额外一层保护。即使发现了您的私有密钥，也不能在没有密码的情况下使用该密钥。使用密码的缺点是自动化更难实现，因为需要人工干预以登录到实例或将文件复制到实例中。

1. 为密钥指定您用于密钥对的相同名称（例如 `key-pair-name`）并选择 **Save (保存)**。PuTTY 会自动添加 `.ppk` 文件扩展名。

您的私有密钥格式现在是正确的 PuTTY 使用格式了。您现在可以使用 PuTTY 的 SSH 客户端连接到实例。

## 连接到您的 Linux 实例
<a name="putty-ssh"></a>

通过以下过程使用 PuTTY 连接到您的 Linux 实例。您需要使用为私有密钥创建的 `.ppk` 文件。有关更多信息，请参阅上一个部分中的[（可选）使用 PuTTYgen 转换私有密钥](#putty-private-key)。如果您在尝试连接到实例时收到错误，请参阅 [排查 Amazon EC2 Linux 实例的连接问题](TroubleshootingInstancesConnecting.md)。

**最后测试版本** – PuTTY .78

**使用 PuTTY 连接到您的实例**

1. 启动 PuTTY（从**开始**菜单中，搜索 **PuTTY**，然后选择**打开**）。

1. 在 **Category** 窗格中，选择 **Session** 并填写以下字段：

   1. 在**主机名**框中，执行以下操作之一：
      + （公有 DNS）要使用实例的公有 DNS 名称进行连接，请输入 *instance-user-name*@*instance-public-dns-name*。
      + （IPv6）或者，如果实例具有 IPv6 地址，要使用实例的 IPv6 地址进行连接，请输入 *instance-user-name*@*2001:db8::1234:5678:1.2.3.4*。

      有关如何获取实例的用户名以及实例的公有 DNS 名称或 IPv6 地址的信息，请参阅[获取所需的实例详细信息](connection-prereqs-general.md#connection-prereqs-get-info-about-instance)。

   1. 确保**端口**值为 22。

   1. 在**连接类型**下，选择 **SSH**。  
![\[PuTTY 配置 – 会话。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/putty-session-config.png)

1. (可选) 您可以配置 PuTTY 以定期自动发送“保持连接”数据以将会话保持活动状态。要避免由于会话处于不活动状态而与实例断开连接，这是非常有用的。在**类别** 窗格中，选择**连接**，然后在 **keepalives 之间的秒数**中输入所需的间隔。例如，如果您的会话在处于不活动状态 10 分钟后断开连接，请输入 180 以将 PuTTY 配置为每隔 3 分钟发送一次保持活动数据。

1. 在**类别**窗格中，依次展开**连接**、**SSH** 和 **Auth**。选择**凭证**。

1. 在**用于身份验证的私有密钥文件**旁，选择**浏览**。在**选择私有密钥文件**对话框中，选择您为密钥对生成的 `.ppk` 文件。您可以双击该文件，也可以在**选择私有密钥文件**对话框中选择**打开**。

1. （可选）如果打算在此会话后再次连接到此实例，则可以保存此会话信息以便日后使用。在**类别**窗格中，选择**会话**。在**已保存的会话**中输入会话名称，然后选择**保存**。

1. 要连接到实例，请选择**打开**。

1. 如果这是第一次连接到该实例，PuTTY 将显示安全警报对话框，以询问您是否信任要连接到的主机。

   1. (可选) 验证安全警报对话框中的指纹是否与您之前在 [（可选）获取实例指纹](connection-prereqs-general.md#connection-prereqs-fingerprint) 中获得的指纹相匹配。如果这些指纹不匹配，则表示有人可能在试图实施“中间人”攻击。如果匹配，请继续到下一步。

   1. 选择 **Accept (接受)**。将打开一个窗口，并且您连接到实例。
**注意**  
如果您在将私有密钥转换成 PuTTY 格式时指定了密语，当您登录到实例时，您必须提供该密语。

如果您在尝试连接到实例时收到错误，请参阅 [排查 Amazon EC2 Linux 实例的连接问题](TroubleshootingInstancesConnecting.md)。

# 使用 SCP 将文件传输到 Linux 实例
<a name="linux-file-transfer-scp"></a>

在您的本地计算机与 Linux 实例之间传输文件的一种方法是使用安全复制协议 (SCP)。SCP 非常适合简单的操作，例如一次性文件副本。SCP 用来保护文件传输的 .pem 文件与您用来通过 SSH 连接到实例的文件相同。如果需要保持文件同步，或者文件很大，则 **rsync** 比 SCP 更快、更高效。为安全起见，请通过 SSH 使用 **rsync**，因为 **rsync** 默认情况下会使用明文传输数据。

在使用 SCP 连接到 Linux 实例之前，请先完成以下任务：
+ **完成一般先决条件。**
  + 检查您的实例是否通过了状态检查。可能需要花几分钟时间，实例才能准备好接受连接请求。有关更多信息，请参阅 [查看状态检查](viewing_status.md)。
  + [获取所需的实例详细信息](connection-prereqs-general.md#connection-prereqs-get-info-about-instance).
  + [查找私有密钥并设置权限](connection-prereqs-general.md#connection-prereqs-private-key).
  + [（可选）获取实例指纹](connection-prereqs-general.md#connection-prereqs-fingerprint).
+ **允许来自您 IP 地址的入站 SSH 流量。**

  确保与您的实例关联的安全组允许来自您的 IP 地址的入站 SSH 流量。有关更多信息，请参阅 [用于从您的计算机连接到实例的规则](security-group-rules-reference.md#sg-rules-local-access)。
+ **安装 SCP 客户端。**

  默认情况下，大多数 Linux、Unix 和 Apple 计算机都包含 SCP 客户端。如果您的计算机不含 SSH 客户端，OpenSSH 项目提供了整套 SSH 工具免费使用的功能，包括 SCP 客户端。有关更多信息，请参阅 [https://www.openssh.com](https://www.openssh.com)。

以下过程将指导您使用实例的公有 DNS 名称或 IPv6 地址（如果实例具有该地址），通过 SCP 传输文件。

**使用 SCP 在您的计算机和实例之间传输文件**

1. 确定源文件在计算机上的位置以及在实例上的目标路径。在以下示例中，私有密钥文件的名称是 `key-pair-name.pem`，要传输的文件是 `my-file.txt`，实例的用户名是 ec2-user，实例的公有 DNS 名称是 `instance-public-dns-name`，实例的 IPv6 地址是 `2001:db8::1234:5678:1.2.3.4`。
   + （公有 DNS）要将文件传输到实例上的目标位置，请在计算机中输入以下命令。

     ```
     scp -i /path/key-pair-name.pem /path/my-file.txt ec2-user@instance-public-dns-name:path/
     ```
   + (IPv6) 如果实例具有 IPv6 地址，要将文件传输到实例上的目标位置，请在计算机中输入以下命令。IPv6 地址必须用方括号 (`[ ]`) 括起来，并且必须对方括号进行转义 (`\`)。

     ```
     scp -i /path/key-pair-name.pem /path/my-file.txt ec2-user@\[2001:db8::1234:5678:1.2.3.4\]:path/
     ```

1. 如果您尚未使用 SSH 连接到实例，则会看到如下响应：

   ```
   The authenticity of host 'ec2-198-51-100-1.compute-1.amazonaws.com (10.254.142.33)'
   can't be established.
   RSA key fingerprint is 1f:51:ae:28:bf:89:e9:d8:1f:25:5d:37:2d:7d:b8:ca:9f:f5:f1:6f.
   Are you sure you want to continue connecting (yes/no)?
   ```

   （可选）您可以选择验证安全警报中的指纹是否与实例指纹匹配。有关更多信息，请参阅[（可选）获取实例指纹](connection-prereqs-general.md#connection-prereqs-fingerprint)。

   输入 **yes**。

1. 如果传输成功，则响应的形式与下方类似：

   ```
   Warning: Permanently added 'ec2-198-51-100-1.compute-1.amazonaws.com' (RSA) 
   to the list of known hosts.
   my-file.txt                                100%   480     24.4KB/s   00:00
   ```

1. 要在另一个方向上传输文件（从 Amazon EC2 实例中传输到计算机），请颠倒主机参数的顺序。例如，您可以将 `my-file.txt` 从 EC2 实例传输到本地计算机上的目标位置，保存为 `my-file2.txt`，如以下示例所示。
   + （公有 DNS）要将文件传输到计算机中的目标位置，请在计算机中输入以下命令。

     ```
     scp -i /path/key-pair-name.pem ec2-user@instance-public-dns-name:path/my-file.txt path/my-file2.txt
     ```
   + (IPv6) 如果实例具有 IPv6 地址，要将文件传输到计算机中的目标位置，请在计算机中输入以下命令。IPv6 地址必须用方括号 (`[ ]`) 括起来，并且必须对方括号进行转义 (`\`)。

     ```
     scp -i /path/key-pair-name.pem ec2-user@\[2001:db8::1234:5678:1.2.3.4\]:path/my-file.txt path/my-file2.txt
     ```

# 管理 Amazon EC2 Linux 实例上的系统用户
<a name="managing-users"></a>

每个 Linux 实例均以默认的 Linux 系统用户启动。您可以向实例添加用户，也可以删除用户。

对于默认用户，[默认用户名](#ami-default-user-names)由您在启动实例时指定的 AMI 决定。

**注意**  
默认情况下，密码身份验证和根用户登录将被禁用，而 sudo 将会启用。要登录您的实例，必须使用密钥对。有关日志记录的更多信息，请参阅 [使用 SSH 连接到 Linux 实例](connect-to-linux-instance.md)。  
您可以允许对您的实例进行密码身份验证和根用户登录。有关更多信息，请参阅您的操作系统文档。

**注意**  
Linux 系统用户不应与 IAM 用户混淆。有关更多信息，请参阅 *IAM 用户指南*中的 [IAM 用户](https://docs.aws.amazon.com/IAM/latest/UserGuide/id.html#id_iam-users)。

**Topics**
+ [默认用户名](#ami-default-user-names)
+ [注意事项](#add-user-best-practice)
+ [创建用户](#create-user-account)
+ [删除用户](#delete-user-account)

## 默认用户名
<a name="ami-default-user-names"></a>

EC2 实例的默认用户名由您在启动实例时指定的 AMI 决定。

默认用户名为：
+ 对于 Amazon Linux AMI，用户名是 `ec2-user`。
+ 对于 CentOS AMI，用户名是 `centos` 或 `ec2-user`。
+ 对于 Debian AMI，用户名是 `admin`。
+ 对于 Fedora AMI，用户名是 `fedora` 或 `ec2-user`。
+ 对于 FreeBSD AMI，用户名是 `ec2-user`。
+ 对于 RHEL AMI，用户名是 `ec2-user` 或 `root`。
+ 对于 SUSE AMI，用户名是 `ec2-user` 或 `root`。
+ 对于 Ubuntu AMI，用户名为 `ubuntu`。
+ 对于 Oracle AMI，用户名是 `ec2-user`。
+ 对于 Bitnami AMI，用户名是 `bitnami`。

**注意**  
要查找其他 Linux 发行版的默认用户名，请咨询 AMI 提供商。

## 注意事项
<a name="add-user-best-practice"></a>

对于许多应用程序来说，使用默认用户是适当的。但是，您可以选择添加用户，以便个人能够拥有自己的文件和工作区。此外，为新用户创建用户比向多个（可能缺乏经验的）用户授予对默认用户的访问权限更安全，因为如果使用不当，该默认用户可能对系统造成严重破坏。有关更多信息，请参阅[有关保护您的 EC2 实例的提示](https://aws.amazon.com/articles/tips-for-securing-your-ec2-instance/)。

要使用 Linux 系统用户启用对 EC2 实例的用户 SSH 访问，您必须与用户分享 SSH 密钥。此外，您可以使用 EC2 Instance Connect 来向用户提供访问权限而无需共享和管理 SSH 密钥。有关更多信息，请参阅 [使用公有 IP 地址和 EC2 Instance Connect 连接到 Linux 实例](connect-linux-inst-eic.md)。

## 创建用户
<a name="create-user-account"></a>

先创建用户，然后添加允许用户连接并登录实例的 SSH 公有密钥。

**重要**  
在此过程的步骤 1 中，创建新的密钥对。由于密钥对的功能类似于密码，因此安全处理至关重要。如果您为用户创建密钥对，则必须确保将私有密钥安全地发送给这些用户。或者，用户可以通过创建自己的密钥对来完成步骤 1 和步骤 2，确保其计算机上的私有密钥安全，然后将公有密钥发送给您以完成步骤 3 中的过程。

**创建用户**

1. [创建新的密钥对](create-key-pairs.md#having-ec2-create-your-key-pair)。您必须将 `.pem` 文件提供给要为其创建用户的用户。他们必须使用此文件来连接到实例。

1. 从您在上一步中创建的密钥对中检索公有密钥。

   ```
   $ ssh-keygen -y -f /path_to_key_pair/key-pair-name.pem
   ```

   该命令返回公有密钥，如以下示例所示。

   ```
   ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQClKsfkNkuSevGj3eYhCe53pcjqP3maAhDFcvBS7O6Vhz2ItxCih+PnDSUaw+WNQn/mZphTk/a/gU8jEzoOWbkM4yxyb/wB96xbiFveSFJuOp/d6RJhJOI0iBXrlsLnBItntckiJ7FbtxJMXLvvwJryDUilBMTjYtwB+QhYXUMOzce5Pjz5/i8SeJtjnV3iAoG/cQk+0FzZqaeJAAHco+CY/5WrUBkrHmFJr6HcXkvJdWPkYQS3xqC0+FmUZofz221CBt5IMucxXPkX4rWi+z7wB3RbBQoQzd8v7yeb7OzlPnWOyN0qFU0XA246RA8QFYiCNYwI3f05p6KLxEXAMPLE
   ```

1. 连接到实例。

1. 使用 **adduser** 命令创建用户并将其添加到系统（`/etc/passwd` 文件中会有一个条目）。该命令还可以为用户创建一个组和一个主目录。在此示例中，用户名为 `newuser`。
   + AL2023 和 Amazon Linux 2

     对于 AL2023 和 Amazon Linux 2，创建用户时将默认禁用密码身份验证。

     ```
     [ec2-user ~]$ sudo adduser newuser
     ```
   + Ubuntu

     添加 `--disabled-password` 参数以创建用户并禁用密码身份验证。

     ```
     [ubuntu ~]$ sudo adduser newuser --disabled-password
     ```

1. 切换到新用户，以便所创建的目录和文件具有适当的所有权。

   ```
   [ec2-user ~]$ sudo su - newuser
   ```

   如果提示从 `ec2-user` 变为 `newuser`，则表示您已将 Shell 会话切换到新用户。

1. 将 SSH 公有密钥添加到用户。首先在 SSH 密钥文件对应的用户主目录中创建一个目录，然后创建密钥文件，最后将公有密钥粘贴到该密钥文件中，如以下分步说明中所述。

   1. 在 `newuser` 主目录中创建一个 `.ssh` 目录，并将其权限更改为 `700` (只有文件所有者能够读取、写入或打开该目录。)

      ```
      [newuser ~]$ mkdir .ssh
      ```

      ```
      [newuser ~]$ chmod 700 .ssh
      ```
**重要**  
如果没有这些确切的文件权限，用户将无法登录。

   1. 在 `.ssh` 目录中，创建一个名为 `authorized_keys` 的文件，并将该文件权限更改为 `600`（只有文件所有者才能够读取或写入此文件)。

      ```
      [newuser ~]$ touch .ssh/authorized_keys
      ```

      ```
      [newuser ~]$ chmod 600 .ssh/authorized_keys
      ```
**重要**  
如果没有这些确切的文件权限，用户将无法登录。

   1. <a name="edit_auth_keys"></a>使用您常用的文本编辑器 (如 **vim** 或 **nano**) 打开 `authorized_keys` 文件。

      ```
      [newuser ~]$ nano .ssh/authorized_keys
      ```

      将您在**步骤 2** 中检索到的公有密钥粘贴到文件中并保存更改。
**重要**  
确保将公有密钥粘贴到一个连续行中。不得将公有密钥拆分为多行。

      用户现在能够使用添加到 `newuser` 文件的公有密钥所对应的私有密钥登录实例上的 `authorized_keys` 用户。有关连接到 Linux 实例的不同方法的更多信息，请参阅[使用 SSH 连接到 Linux 实例](connect-to-linux-instance.md)。

## 删除用户
<a name="delete-user-account"></a>

如果不再需要某个用户，可以将其删除，使它不再可用。

使用 **userdel** 命令从系统中删除用户。当您指定 `-r` 参数时，用户的主目录和邮件后台打印将被删除。要保留用户的主目录和邮件后台打印，请省略 `-r` 参数。

```
[ec2-user ~]$ sudo userdel -r olduser
```

# 使用 RDP 连接到 Windows 实例
<a name="connecting_to_windows_instance"></a>

您可以通过远程桌面，连接到从大多数 Windows 亚马逊机器映像（AMI）创建的 Amazon EC2 实例。远程桌面使用远程桌面协议 (RDP)，并且可让您像使用您面前的电脑一样（本地电脑），来连接并使用您的实例。它在大多数的 Windows 版本上可用，并且也适用于 Mac OS。

借助适用于 Windows Server 操作系统的许可证，可以同时进行两个远程连接以进行管理。适用于 Windows Server 的许可证包含在您的 Windows 实例的价格中。如果您需要同时进行两个以上的远程连接，则必须购买远程桌面服务 (RDS) 许可证。如果尝试第三个连接，将产生错误。

**提示**  
如果需要连接到您的实例，以排查基于 [AWS Nitro System](https://aws.amazon.com/ec2/nitro/) 构建的实例的启动、网络配置和其他问题，您可以使用 [适用于实例的 EC2 Serial Console](ec2-serial-console.md)。

**Topics**
+ [使用 RDP 客户端连接到 Windows 实例](connect-rdp.md)
+ [使用 Fleet Manager 连接到 Windows 实例](connect-rdp-fleet-manager.md)
+ [使用 RDP 将文件传输到 Windows 实例](connect-to-linux-instanceWindowsFileTransfer.md)

# 使用 RDP 客户端连接到 Windows 实例
<a name="connect-rdp"></a>

您可以使用 RDP 客户端连接到 Windows 实例，如下所示。

**提示**  
或者，您可以使用 [Systems Manager Fleet Manager](connect-rdp-fleet-manager.md) 或 [EC2 Instance Connect Endpoint](connect-with-ec2-instance-connect-endpoint.md) 连接到 Windows 实例。

## 先决条件
<a name="rdp-prereqs"></a>

必须满足以下先决条件，才能使用 RDP 客户端连接到 Windows 实例。
+ **完成一般先决条件。**
  + 检查您的实例是否通过了状态检查。可能需要花几分钟时间，实例才能准备好接受连接请求。有关更多信息，请参阅 [查看状态检查](viewing_status.md)。
  + [获取所需的实例详细信息](connection-prereqs-general.md#connection-prereqs-get-info-about-instance).
  + [查找私有密钥并设置权限](connection-prereqs-general.md#connection-prereqs-private-key).
  + [（可选）获取实例指纹](connection-prereqs-general.md#connection-prereqs-fingerprint).
+ **安装 RDP 客户端。**
  + （Windows）默认情况下，Windows 包含一个 RDP 客户端。要进行验证，请在命令提示符窗口键入 **mstsc**。如果您的计算机不能识别此命令，请从 Microsoft Store 下载 [Microsoft Remote Desktop 应用程序](https://apps.microsoft.com/detail/9wzdncrfj3ps)。
  + （macOS X）从 Mac App Store 下载 [Windows App for Mac（此前名为 Microsoft Remote Desktop）](https://apps.apple.com/us/app/windows-app/id1295203466?mt=12)。
  + （Linux）使用 [Remmina](https://remmina.org/)。
+ **允许来自您 IP 地址的入站 RDP 流量。**

  确保与实例关联的安全组允许来自您 IP 地址的传入 RDP 流量。有关更多信息，请参阅 [用于从您的计算机连接到实例的规则](security-group-rules-reference.md#sg-rules-local-access)。

## 检索管理员密码
<a name="retrieve-initial-admin-password"></a>

如果您已将实例加入域，则可以使用 Directory Service 中的域凭证来连接自己的实例。在远程桌面登录屏幕上，将完全限定用户名用于管理员（例如 **corp.example.com\$1Admin**），将密码用于此账户，而不是使用本地计算机名称和生成的密码。

要使用 RDP 连接到 Windows 实例，您必须检索初始管理员密码，然后在连接到实例时输入此密码。此密码在实例启动几分钟之后才可用。您的账户必须拥有调用 [GetPasswordData](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetPasswordData.html) 操作的权限。有关更多信息，请参阅 [用于控制访问 Amazon EC2 API 的示例策略](ExamplePolicies_EC2.md)。

管理员账户的默认用户名取决于 AMI 中包含的操作系统（OS）的语言。要确定正确的用户名，请识别操作系统的语言，然后选择相应的用户名。例如，对于英语操作系统，用户名是 `Administrator`；对于法语操作系统，用户名是 `Administrateur`；对于葡萄牙语操作系统，则是 `Administrador`。如果某个语言版本的操作系统没有相同语言的用户名，请选择用户名 `Administrator (Other)`。有关更多信息，请参阅 Microsoft 网站中的 [Localized Names for Administrator Account in Windows](https://learn.microsoft.com/en-us/archive/technet-wiki/13813.localized-names-for-administrator-account-in-windows)。

**检索初始管理员密码**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择 **Instances (实例)**。

1. 选择该实例，然后选择 **Connect** (连接)。

1. 在**连接到实例**页面上，选择 **RDP 客户端**选项卡。

1. 在**用户名**中，选择管理员账户的默认用户名。您选择的用户名必须与用于启动实例的 AMI 中包含的操作系统（OS）语言相匹配。如果没有与操作系统相同语言的用户名，请选择**管理员（其他）**。

1. 选择**获取密码**。

1. 在**获取 Windows 密码**页面上，执行以下操作：

   1. 选择**上传私有密钥文件**，然后导航至您启动实例时指定的私有密钥（`.pem`）文件。选择文件并选择 **Open**（打开），以便将文件的全部内容复制到此窗口。

   1. 选择**解密密码**。**获取 Windows 密码**页面将关闭，实例的默认管理员密码将显示在**密码**下，替换先前显示的**获取密码**链接。

   1. 复制密码并将其保存在安全的位置。需要使用此密码连接实例。

## 连接到 Windows 实例
<a name="connecting-to-windows-instance-rdp-client"></a>

以下过程使用适用于 Windows 的远程桌面连接客户端（MSTSC）。如果使用的是其他 RDP 客户端，请下载 RDP 文件，然后查看 RDP 客户端的文档，了解建立 RDP 连接的步骤。

**使用 RDP 客户端连接到 Windows 实例**

1. 在**连接到实例**页面上，选择**下载远程桌面文件**。完成文件下载后，选择**取消**，然后返回**实例**页面。RDP 文件已下载到 `Downloads` 文件夹。

1. 运行 `mstsc.exe` 来打开 RDP 客户端。

1. 展开**显示选项**，选择**打开**，然后从 `Downloads` 文件夹中选择.rdp 文件。

1. 默认情况下，**计算机**是实例的公有 IPv4 DNS 名称，**用户名**是管理员账户。要改用 IPv6 连接到实例，请将实例的公有 IPv4 DNS 名称替换为其 IPv6 地址。查看默认设置并根据需要进行更改。

1. 选择**连接**。如果收到一条警告，指出远程连接发布者未知，请选择**连接**继续进行操作。

1. 输入之前保存的密码，然后选择**确定**。

1. 由于自签名证书的固有特性，您可能会看到一条警告，指出无法验证该安全证书。请执行以下操作之一：
   + 如果您信任该证书，则请选择**是**连接到您的实例。
   + [Windows] 在继续操作之前，请将证书的指纹与系统日志中的值进行比较，以确认远程计算机的身份。选择**查看证书**，然后从**详细信息**选项卡选择**指纹**。将此值与**操作**、**监控和故障排除**、**获取系统日志**中的 `RDPCERTIFICATE-THUMBPRINT` 值进行比较。
   + [Mac OS X] 在继续操作之前，请将证书的指纹与系统日志中的值进行比较，以确认远程计算机的身份。选择**显示证书**，展开**详细信息**，然后选择 **SHA1 指纹**。将此值与**操作**、**监控和故障排除**、**获取系统日志**中的 `RDPCERTIFICATE-THUMBPRINT` 值进行比较。

1. 如果 RDP 连接成功，RDP 客户端会先显示 Windows 登录屏幕，再显示 Windows 桌面。如果收到错误消息，请参阅[远程桌面无法连接到远程计算机](troubleshoot-connect-windows-instance.md#rdp-issues)。完成 RDP 连接后，可以关闭 RDP 客户端。

## 配置用户账户
<a name="configure-admin-accounts"></a>

通过 RDP 连接到实例之后，建议执行以下任务：
+ 更改默认的管理员密码。您可以[在登录实例本身后更改密码](https://support.microsoft.com/en-us/windows/change-or-reset-your-windows-password-8271d17c-9f9e-443f-835a-8318c8f68b9c)，其做法与任何电脑运行的 Windows Server 上的做法类似。
+ 在实例上创建另一个具有管理员权限的用户。这是一种保护措施，以防止您万一忘记管理员密码或管理员账户出现问题。新用户必须拥有远程访问实例的权限。通过右键单击 Windows 桌面上或文件资源管理器中的**此电脑**图标并选择**属性**，打开**系统属性**。选择**远程设置**，然后选择**选择用户**以将用户添加到**远程桌面用户**组。  
![\[“系统属性”窗口。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/windows-connect-properties-rdp.png)

# 使用 Fleet Manager 连接到 Windows 实例
<a name="connect-rdp-fleet-manager"></a>

您可以使用 Fleet Manager（AWS Systems Manager 的一项功能）通过远程桌面协议（RDP）连接到 Windows 实例，并在 AWS 管理控制台 中的同一页面上显示最多四个 Windows 实例。您可以直接从 Amazon EC2 控制台中的**实例**页面连接到 Fleet Manager 远程桌面中的第一个实例。有关 Fleet Manager 的更多信息，请参阅《AWS Systems Manager 用户指南》**中的[使用 Remote Desktop 连接到托管式实例](https://docs.aws.amazon.com/systems-manager/latest/userguide/fleet-manager-remote-desktop-connections.html)。

如果您使用 Fleet Manager 进行连接，则无需特别允许来自您 IP 地址的传入 RDP 流量。Fleet Manager 会进行处理。

**先决条件**  
在尝试使用 Fleet Manager 连接到实例之前，必须先设置环境。有关更多信息，请参阅《AWS Systems Manager 用户指南》中的[设置环境](https://docs.aws.amazon.com/systems-manager/latest/userguide/fleet-manager-remote-desktop-connections.html#rdp-prerequisites)。**

**使用 Fleet Manager 连接到 Windows 实例**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 从导航窗格中选择 **Instances**（实例）。

1. 选择该实例，然后选择 **Connect** (连接)。

1. 在 **RDP 客户端**选项卡的**连接类型**中，选择**使用 Fleet Manager 进行连接**。

1. 选择 **Fleet Manager 远程桌面**。此操作将打开 AWS Systems Manager 控制台中的 **Fleet Manager Remote Desktop**（Fleet Manager 远程桌面）页面。

1. 输入凭证，然后选择**连接**。

1. 如果 RDP 连接成功，Fleet Manager 会显示 Windows 桌面。完成会话后，依次选择**操作**、**结束会话**。

有关更多信息，请参阅《AWS Systems Manager 用户指南》中的[使用 Remote Desktop 连接到 Windows Server 托管式实例](https://docs.aws.amazon.com/systems-manager/latest/userguide/fleet-manager-remote-desktop-connections.html)。**

# 使用 RDP 将文件传输到 Windows 实例
<a name="connect-to-linux-instanceWindowsFileTransfer"></a>

您可以像操作任何 Windows 服务器那样操作您的 Windows 实例。例如，您可以使用 Microsoft 远程桌面连接（RDP）软件的本地文件共享功能，在 Windows 实例与您的本地计算机之间传输文件。您可以访问硬盘驱动器、DVD 驱动器、便携式媒体驱动器和映射网络驱动器上的本地文件。

要从 Windows 实例访问本地文件，必须通过将远程会话驱动器映射到本地驱动器来启用本地文件共享功能。这些步骤略有不同，具体取决于您的本地电脑操作系统是 Windows 还是 macOS X。

要详细了解使用 RDP 进行连接的先决条件，请参阅[先决条件](connect-rdp.md#rdp-prereqs)。

------
#### [ Windows ]

**在本地 Windows 电脑上将远程会话驱动器映射到本地驱动器**

1. 打开远程桌面连接客户端。

1. 选择 **Show Options**。

1. 将实例主机名添加到**计算机**字段，将用户名添加到**用户名**字段，如下所示：

   1. 在 **Connection settings**（连接设置）项下，选择 **Open...**（打开…），然后浏览到您从 Amazon EC2 控制台下载的 RDP 快捷方式文件。该文件包含公有 IPv4 DNS 主机名（用于标识实例）和管理员用户名。

   1. 选择文件，然后选择 **Open**（打开）。使用 RDP 快捷方式文件中的值填充 **Computer**（电脑）和 **User name**（用户名）字段。

   1. 选择**保存**。

1. 选择 **Local Resources (本地资源)** 选项卡。

1. 在 **Local Devices and resources (本地设备和资源)** 项下，选择 **More...**（更多…）。  
![\[“RDP 本地资源”窗口。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/windows-connect-rdp-local-resources.png)

1. 打开 **Drives (驱动器)** 并选择要映射到 Windows 实例的本地驱动器。

1. 选择 **OK (确定)**。  
![\[RDP 本地设备和资源窗口。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/windows-connect-rdp-drives.png)

1. 选择 **Connect (连接)** 以连接到您的 Windows 实例。

------
#### [ macOS X ]

**在本地 macOS X 电脑上将远程会话驱动器映射到本地文件夹**

1. 打开远程桌面连接客户端。

1. 浏览到从 Amazon EC2 控制台下载的 RDP 文件（初次连接到实例时），然后将其拖到远程桌面连接客户端上。

1. 右键单击该 RDP 文件并选择 **Edit**（编辑）。

1. 选择**文件夹**选项卡，然后选择**重定向文件夹**复选框。  
![\[Microsoft 远程桌面编辑 PC 窗口。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/mac-map-folder-1.png)

1. 选择左下角的 **\$1** 图标，浏览到要映射的文件夹，然后选择 **Open**（打开）。对要映射的每个文件夹重复此步骤。

1. 选择**保存**。

1. 选择 **Connect (连接)** 以连接到您的 Windows 实例。系统将提示您输入密码。

1. 在实例的文件资源管理器中，展开 **This PC**（此电脑），然后找到您可以从中访问本地文件的共享文件夹。在以下屏幕截图中，本地电脑上的 **Desktop**（桌面）文件夹已映射到实例上的远程会话驱动器。  
![\[Microsoft 远程桌面编辑 PC 窗口。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/mac-map-folder-2.png)

有关使本地设备可用于 Mac 电脑上远程会话的更多信息，请参阅[开始使用 macOS 客户端](https://learn.microsoft.com/en-us/windows-server/remote/remote-desktop-services/clients/remote-desktop-mac)。

------

# 使用 Session Manager 连接到 Amazon EC2 实例
<a name="connect-with-systems-manager-session-manager"></a>

会话管理器是一项完全托管的 AWS Systems Manager 功能，可让您通过基于浏览器的交互一键式 Shell 或通过 AWS CLI 管理 Amazon EC2 实例。您可以使用会话管理器通过您账户中的实例来开启会话。开启会话后，您可以像对任何其他连接类型一样在实例上运行交互式命令。有关会话管理器的更多信息，请参阅 *AWS Systems Manager 用户指南* 中的 [AWS Systems Manager 会话管理器](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager.html)。

**先决条件**  
在尝试使用 Session Manager 连接到实例之前，必须先完成必要的设置步骤。例如，实例必须由 SSM 托管且具有附加了 **AmazonSSMManagedInstanceCore** 策略的 IAM 角色。有关更多信息，请参阅[设置 Session Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-getting-started.html)。

**在 Amazon EC2 控制台上通过会话管理器连接到 Amazon EC2 实例**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择**实例**。

1. 选择实例，然后选择**连接**。

1. 对于连接方法，请选择 **Session Manager**。

1. 选择**连接**来启动会话。  
![\[“Session Manager”选项卡上的“连接”按钮。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/connect-method-session-manager.png)

**故障排除**  
如果您收到一个错误，该错误指示您无权执行一个或多个 Systems Manager 操作 (`ssm:command-name`)，则必须更新策略，以便允许您从 Amazon EC2 控制台开始会话。有关更多信息和说明，请参阅《AWS Systems Manager 用户指南》中的 [Session Manager 快速入门默认 IAM policy](https://docs.aws.amazon.com/systems-manager/latest/userguide/getting-started-restrict-access-quickstart.html)。

# 使用公有 IP 地址和 EC2 Instance Connect 连接到 Linux 实例
<a name="connect-linux-inst-eic"></a>

Amazon EC2 Instance Connect 提供了一种安全的方法，可使用 Secure Shell（SSH）连接到 Linux 实例。借助 EC2 Instance Connect，您可以使用 AWS Identity and Access Management (IAM) [策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html)和[主体](https://docs.aws.amazon.com/IAM/latest/UserGuide/intro-structure.html#intro-structure-principal)来控制对实例的 SSH 访问，无需共享和管理 SSH 密钥。使用 EC2 Instance Connect 的所有连接请求将[记录到 AWS CloudTrail 中](monitor-with-cloudtrail.md#ec2-instance-connect-cloudtrail)，以便您可以审核连接请求。

您可以通过 Amazon EC2 控制台或所选的 SSH 客户端使用 EC2 Instance Connect 连接到实例。

在使用 EC2 Instance Connect 连接到实例时，EC2 Instance Connect API 会将一个 SSH 公有密钥推送到[实例元数据](ec2-instance-metadata.md)并在其中保留 60 秒。附加到用户的 IAM policy 会授权用户将公有密钥推送到实例元数据。SSH 进程守护程序使用在安装 EC2 Instance Connect 时配置的 `AuthorizedKeysCommand` 和 `AuthorizedKeysCommandUser`，从实例元数据中查找公有密钥以进行身份验证，并将您连接到实例。

**提示**  
EC2 Instance Connect 是连接到 Linux 实例的选项之一。有关其他选项，请参阅 [使用 SSH 连接到 Linux 实例](connect-to-linux-instance.md)。要连接到 Windows 实例，请参阅 [使用 RDP 连接到 Windows 实例](connecting_to_windows_instance.md)。

**定价**  
EC2 Instance Connect 无需额外付费。

**区域可用性**  
除亚太地区（台北）区域外，EC2 Instance Connect 已在所有 AWS 区域推出。但在本地区中不受支持。

**Topics**
+ [教程](ec2-instance-connect-tutorial.md)
+ [先决条件](ec2-instance-connect-prerequisites.md)
+ [权限](ec2-instance-connect-configure-IAM-role.md)
+ [安装 EC2 Instance Connect](ec2-instance-connect-set-up.md)
+ [连接到实例](ec2-instance-connect-methods.md)
+ [卸载 EC2 Instance Connect](ec2-instance-connect-uninstall.md)

有关讨论如何使用 EC2 Instance Connect 提高堡垒主机安全性的博客文章，请参阅[使用 Amazon EC2 Instance Connect 保护您的堡垒主机](https://aws.amazon.com/blogs/infrastructure-and-automation/securing-your-bastion-hosts-with-amazon-ec2-instance-connect/)。

# 教程：完成使用 EC2 Instance Connect 连接到实例所需的配置
<a name="ec2-instance-connect-tutorial"></a>

要在 Amazon EC2 控制台中使用 EC2 Instance Connect 连接到实例，首先需要完成让您能够成功连接到实例的先决条件配置。本教程旨在引导您完成各项任务以完成先决条件配置。

**教程概述**

在本教程中，您将完成以下四项任务：
+ [任务 1：授予使用 EC2 Instance Connect 所需的权限](#eic-tut1-task1)

  首先，您将创建一个 IAM 策略，其中包含允许您将公有密钥推送到实例元数据的 IAM 权限。您将此策略附加到您的 IAM 身份（用户、用户组或角色），以便您的 IAM 身份能够获得这些权限。
+ [任务 2：允许从 EC2 Instance Connect 服务到实例的入站流量](#eic-tut1-task2)

  然后，您将创建一个安全组，以允许从 EC2 Instance Connect 服务到实例的流量。当您在 Amazon EC2 控制台中使用 EC2 Instance Connect 连接到实例时，将需要此安全组。
+ [任务 3：启动实例](#eic-tut1-task3)

  然后，您将使用预装了 EC2 Instance Connect 的 AMI 启动一个 EC2 实例，然后添加上一步中创建的安全组。
+ [任务 4：连接到实例](#eic-tut1-task4)

  最后，您将在 Amazon EC2 控制台中使用 EC2 Instance Connect 连接到您的实例。如果可以连接，则可以确定在任务 1、2 和 3 中完成的先决条件配置已经成功。

## 任务 1：授予使用 EC2 Instance Connect 所需的权限
<a name="eic-tut1-task1"></a>

在使用 EC2 Instance Connect 连接到实例时，EC2 Instance Connect API 会将一个 SSH 公有密钥推送到[实例元数据](ec2-instance-metadata.md)并在其中保留 60 秒。您需要将一个 IAM 策略附加到您的 IAM 身份（用户、用户组或角色），以授予您将公有密钥推送到实例元数据的必要权限。

**任务目标**

您要创建 IAM 策略来授予将公有密钥推送到实例的权限。要允许的具体操作是 `ec2-instance-connect:SendSSHPublicKey`。您还必须允许 `ec2:DescribeInstances` 操作，以确保您能够在 Amazon EC2 控制台中查看和选择您的实例。

创建好策略后，将此策略附加到 IAM 身份（用户、用户组或角色），以便 IAM 身份能够获得相关权限。

您将创建一个配置如下的策略：

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [{
            "Effect": "Allow",
            "Action": "ec2-instance-connect:SendSSHPublicKey",
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "ec2:DescribeInstances",
            "Resource": "*"
        }
    ]
}
```

------

**重要**  
本教程中创建的 IAM 策略是一个权限十分宽松的策略；它允许您使用任何 AMI 用户名连接到任何实例。我们使用这种高度宽松的策略来确保教程的简单性，并侧重于本教程所讲授的具体配置。但在生产环境中，我们建议您将 IAM 策略配置为提供[最低权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)。有关示例 IAM 策略，请参阅 [为 EC2 Instance Connect 授予 IAM 权限](ec2-instance-connect-configure-IAM-role.md)。

**创建并附加一个允许您使用 EC2 Instance Connect 连接到实例的 IAM 策略**

1. **首先创建 IAM 策略**

   1. 打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

   1. 在导航窗格中，选择**策略**。

   1. 选择**创建策略**。

   1. 在**指定权限**页面中，请执行以下操作：

      1. 对于**服务**，选择 **EC2 Instance Connect**。

      1. 在**允许的操作**下，在搜索字段中开始键入 **send** 以显示相关操作，然后选择 **SendSSHPublicKey**。

      1. 在**资源**下，选择**全部**。对于生产环境，我们建议用 ARN 来指定实例，但在本教程中，您会允许所有实例。

      1. 选择**添加更多权限**。

      1. 对于**服务**，选择 **EC2**。

      1. 在**允许的操作**下，在搜索字段中开始键入 **describein** 以显示相关操作，然后选择 **DescribeInstances**。

      1. 选择**下一步**。

   1. 在**查看和创建**页面中，请执行以下操作：

      1. 对于 **Policy name**（策略名称），输入此策略的名称。

      1. 选择**创建策略**。

1. **然后将该策略附加到您的身份**

   1. 在 IAM 控制台的导航窗格中，选择 **Policies**（策略）。

   1. 在策略列表中，选中要附加的策略名称旁边的选项按钮。您可以使用搜索框筛选策略列表。

   1. 依次选择**操作**、**附加**。

   1. 在 **IAM 实体**下，选择您的身份（用户、用户组或角色）旁的复选框。您可以使用搜索框筛选实体列表。

   1. 选择**附加策略**。

### 观看动画：创建 IAM 策略
<a name="eic-tut1-task1-animation1"></a>

![\[此动画将演示如何创建 IAM 策略。要查看此动画的文字版，请参阅前面过程中的步骤。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/eic-tut1-task1-create-iam-policy.gif)


### 观看动画：附加 IAM 策略
<a name="eic-tut1-task1-animation2"></a>

![\[此动画演示如何将 IAM 策略附加到 IAM 身份。要查看此动画的文字版，请参阅前面过程中的步骤。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/eic-tut1-task1-attach-iam-policy.gif)


## 任务 2：允许从 EC2 Instance Connect 服务到实例的入站流量
<a name="eic-tut1-task2"></a>

在 Amazon EC2 控制台中使用 EC2 Instance Connect 连接到实例时，必须允许来自 EC2 Instance Connect 服务的流量到达实例。这与从本地计算机连接到实例不同；对于后者，您必须允许从本地计算机到实例的流量。要允许来自 EC2 Instance Connect 服务的流量，您必须创建一个安全组，以允许来自 EC2 Instance Connect 服务的 IP 地址范围的入站 SSH 流量。

AWS 使用前缀列表来管理 IP 地址范围。EC2 Instance Connect 前缀列表的名称如下，请将 *region* 替换为区域代码：
+ IPv4 前缀列表名称：`com.amazonaws.region.ec2-instance-connect`
+ IPv6 前缀列表名称：`com.amazonaws.region.ipv6.ec2-instance-connect`

**任务目标**

您将创建一个安全组，以允许来自实例所在区域的 IPv4 前缀列表的入站 SSH 流量通过端口 22。

**创建一个安全组，以允许从 EC2 Instance Connect 服务到实例的入站流量**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择 **Security Groups**（安全组）。

1. 选择**创建安全组**。

1. 在**基本详细信息**下面，执行以下操作：

   1. 对于**安全组名称**，为您的安全组输入一个有意义的名称。

   1. 对于**描述**，为您的安全组输入一个有意义的描述。

1. 在**入站规则**下，执行以下操作：

   1. 选择**添加规则**。

   1. 对于 **Type**，选择 **SSH**。

   1. 对于**源**，请保留**自定义**。

   1. 在**来源**旁的字段中，选择 EC2 Instance Connect 的前缀列表。

      例如，假设实例位于美国东部（弗吉尼亚州北部）(`us-east-1`) 区域，并且用户将连接到其公有 IPv4 地址，则选择以下前缀列表：**com.amazonaws.us-east-1.ec2-instance-connect**

1. 选择**创建安全组**。

### 观看动画：创建安全组
<a name="eic-tut1-task2-animation"></a>

![\[此动画将演示如何配置安全组。要查看此动画的文字版，请参阅前面过程中的步骤。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/tut1-task2-eic-security-group.gif)


## 任务 3：启动实例
<a name="eic-tut1-task3"></a>

启动实例时，必须指定包含启动实例所需信息的 AMI。您可以选择启动已预装或未预装 EC2 Instance Connect 的实例。在本任务中，我们将指定一个预装了 EC2 Instance Connect 的 AMI。

如果您启动未预装 EC2 Instance Connect 的实例，同时又需要使用 EC2 Instance Connect 连接到实例，则需要执行额外的配置步骤。这些步骤不在本教程的介绍范围之内。

**任务目标**

您要使用预装了 EC2 Instance Connect 的 Amazon Linux 2023 AMI 来启动实例。您还需要指定之前创建的安全组，以便能够在 Amazon EC2 控制台中使用 EC2 Instance Connect 连接到实例。由于您将使用 EC2 Instance Connect 连接到实例，这会将一个公有密钥推送到实例元数据中，因此在启动实例时无需指定 SSH 密钥。

**启动可以在 Amazon EC2 控制台中使用 EC2 Instance Connect 进行连接的实例**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 屏幕顶部的导航栏中会显示当前所在 AWS 区域（例如，**爱尔兰**）。选择要在其中启动实例的区域。这一选择十分重要，因为您创建了一个允许特定区域流量的安全组，因此必须选择在同一区域启动实例。

1. 从 Amazon EC2 控制台控制面板中，选择**启动实例**。

1. （可选）在 **Name and tags**（名称与标签）下，为 **Name**（名称）输入实例的描述性名称。

1. 在**应用程序和操作系统映像（亚马逊机器映像）**下，选择**快速启动**。默认会选择 **Amazon Linux**。在**亚马逊机器映像（AMI）**下，已默认选择了 **Amazon Linux 2023 AMI**。对于此任务，请保留默认选择。

1. 对于**实例类型**下的**实例类型**，请保留默认选择，也可选择其他实例类型。

1. 在**密钥对（登录）**下的**密钥对名称**，请选择**继续操作但不提供密钥对（不推荐）**。使用 EC2 Instance Connect 连接到实例时，EC2 Instance Connect 会将一个密钥对推送到该实例的元数据，该密钥正是要用于连接的密钥对。

1. 在 **Network settings**（网络设置）下，执行以下操作：

   1. 对于**自动分配公有 IP**，请保留**启用**。
**注意**  
要在 Amazon EC2 控制台中使用 EC2 Instance Connect 连接到实例，实例必须具有一个公有 IPv4 或 IPv6 地址。

   1. 对于**防火墙（安全组）**，请选择**选择现有安全组**。

   1. 在**常用安全组**下，选择您之前创建的安全组。

1. 在 **Summary**（摘要）面板中，选择 **Launch instance**（启动实例）。

### 观看动画：启动实例
<a name="eic-tut1-task3-animation"></a>

![\[此动画将演示如何启动实例。要查看此动画的文字版，请参阅前面过程中的步骤。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/tut1-task3-launch-an-instance.gif)


## 任务 4：连接到实例
<a name="eic-tut1-task4"></a>

在使用 EC2 Instance Connect 连接到实例时，EC2 Instance Connect API 会将一个 SSH 公有密钥推送到[实例元数据](ec2-instance-metadata.md)并在其中保留 60 秒。SSH 进程守护程序使用 `AuthorizedKeysCommand` 和 `AuthorizedKeysCommandUser` 来查找实例元数据的公有密钥以用于身份验证，然后将您连接到实例。

**任务目标**

在此任务中，您将在 Amazon EC2 控制台中使用 EC2 Instance Connect 连接到实例。如果您完成了前提任务 1、2 和 3，则连接应该会成功。

**连接到实例的步骤**

使用以下步骤连接到实例。要观看这些步骤的动画，请参阅 [观看动画：连接到实例](#eic-tut1-task4-animation)。

**在 Amazon EC2 控制台中使用 EC2 Instance Connect 连接实例**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 屏幕顶部的导航栏中会显示当前所在 AWS 区域（例如，**爱尔兰**）。选择实例所在的区域。

1. 在导航窗格中，选择 **Instances (实例)**。

1. 选择您的实例，然后选择**连接**。

1. 选择 **EC2 Instance Connect** 选项卡。

1. 选择**使用公有 IP 连接**。

1. 选择**连接**。

   这时将在浏览器中打开一个终端窗口，并且您已连接到实例。

### 观看动画：连接到实例
<a name="eic-tut1-task4-animation"></a>

![\[此动画将演示如何使用 EC2 Instance Connect 连接实例。要查看此动画的文字版，请参阅前面过程中的步骤。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/eic-tut1-task4-connect.gif)


# EC2 Instance Connect 的先决条件
<a name="ec2-instance-connect-prerequisites"></a>

**Topics**
+ [安装 EC2 Instance Connect](#eic-prereqs-install-eic-on-instance)
+ [保障网络连接质量](#eic-prereqs-network-access)
+ [允许入站 SSH 流量](#ec2-instance-connect-setup-security-group)
+ [授予权限](#eic-prereqs-grant-permissions)
+ [在本地计算机上安装 SSH 客户端](#eic-prereqs-install-ssh-client)
+ [满足用户名要求](#eic-prereqs-username)

## 安装 EC2 Instance Connect
<a name="eic-prereqs-install-eic-on-instance"></a>

要使用 EC2 Instance Connect 连接到实例，该实例必须安装 EC2 Instance Connect。您可以使用预装 EC2 Instance Connect 的 AMI 启动实例，也可以在使用支持的 AMI 启动的实例上安装 EC2 Instance Connect。有关更多信息，请参阅 [在您的 EC2 实例上安装 EC2 Instance Connect](ec2-instance-connect-set-up.md)。

## 保障网络连接质量
<a name="eic-prereqs-network-access"></a>

可以将实例配置为允许用户通过互联网或通过实例的私有 IP 地址连接到您的实例。根据您的用户使用 EC2 Instance Connect 连接到实例的方式，您必须配置以下网络访问：
+ 如果用户通过互联网连接到您的实例，则实例必须具有一个公有 IPv4 或 IPv6 地址，并且位于具有互联网路由的公有子网中。如果您尚未修改默认的公有子网，则其包含的互联网路由仅适用于 IPv4，而不适用于 IPv6。有关更多信息，请参阅《Amazon VPC 用户指南》中的[使用互联网网关启用 VPC 互联网访问](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Internet_Gateway.html#vpc-igw-internet-access)**。
+ 如果用户要通过实例的私有 IPv4 地址连接到您的实例，则必须建立与您的 VPC 的私有网络连接，例如使用 AWS Direct Connect、AWS Site-to-Site VPN 或 VPC 对等连接，以便用户能够访问实例的私有 IP 地址。

如果您的实例没有公有 IPv4 或 IPv6 地址，并且您不希望按照上述方式配置网络访问权限，则可以考虑将 EC2 Instance Connect 端点作为 EC2 Instance Connect 的替代方案。借助 EC2 Instance Connect 端点，您可以通过 SSH 或 RDP 连接到实例，即使实例没有公有 IPv4 或 IPv6 地址。有关更多信息，请参阅 [使用 Amazon EC2 控制台连接到您的 Linux 实例](connect-using-eice.md#connect-using-the-ec2-console)。

## 允许入站 SSH 流量
<a name="ec2-instance-connect-setup-security-group"></a>

**使用 Amazon EC2 控制台连接到实例时**  
当用户使用 Amazon EC2 控制台连接到实例时，必须允许到达实例的流量是来自 EC2 Instance Connect 服务的流量。该服务由特定的 IP 地址范围标识，AWS 通过前缀列表来管理这些地址范围。您必须创建一个安全组，以允许来自 EC2 Instance Connect 服务的入站 SSH 流量。要进行此配置，对于入站规则，请在**来源**旁的字段中，选择 EC2 Instance Connect 前缀列表。

AWS 为每个区域的 IPv4 和 IPv6 地址提供了不同的托管前缀列表。EC2 Instance Connect 前缀列表的名称如下，请将 *region* 替换为区域代码：
+ IPv4 前缀列表名称：`com.amazonaws.region.ec2-instance-connect`
+ IPv6 前缀列表名称：`com.amazonaws.region.ipv6.ec2-instance-connect`

有关创建安全组的说明，请参阅 [任务 2：允许从 EC2 Instance Connect 服务到实例的入站流量](ec2-instance-connect-tutorial.md#eic-tut1-task2)。有关更多信息，请参阅《Amazon VPC 用户指南》中的[可用的 AWS 托管前缀列表](https://docs.aws.amazon.com/vpc/latest/userguide/working-with-aws-managed-prefix-lists.html#available-aws-managed-prefix-lists)**。

**使用 CLI 或 SSH 连接到实例时**  
确保与您实例关联的安全组[允许来自您 IP 地址端口 22 或您网络上的传入 SSH 流量](security-group-rules-reference.md#sg-rules-local-access)。默认情况下，VPC 的默认安全组不允许传入 SSH 流量。默认情况下，启动实例向导创建的安全组允许传入的 SSH 流量。有关更多信息，请参阅 [用于从您的计算机连接到实例的规则](security-group-rules-reference.md#sg-rules-local-access)。

## 授予权限
<a name="eic-prereqs-grant-permissions"></a>

您必须向使用 EC2 Instance Connect 连接到实例的每个 IAM 用户授予所需的权限。有关更多信息，请参阅 [为 EC2 Instance Connect 授予 IAM 权限](ec2-instance-connect-configure-IAM-role.md)。

## 在本地计算机上安装 SSH 客户端
<a name="eic-prereqs-install-ssh-client"></a>

如果您的用户使用 SSH 进行连接，他们必须确保其本地计算机具有 SSH 客户端。

用户的本地计算机可能已默认安装 SSH 客户端。他们可以通过在命令行键入 **ssh** 来检查 SSH 客户端。如果他们的本地计算机无法识别该命令，可安装 SSH 客户端。有关在 Linux 或 macOS X 上安装 SSH 客户端的信息，请参阅 [http://www.openssh.com](http://www.openssh.com/)。有关在 Windows 10 上安装 SSH 客户端的信息，请参阅 [Windows 中的 OpenSSH](https://learn.microsoft.com/en-us/windows-server/administration/OpenSSH/openssh-overview)。

如果用户仅使用 Amazon EC2 控制台连接到实例，则无需在本地计算机上安装 SSH 客户端。

## 满足用户名要求
<a name="eic-prereqs-username"></a>

使用 EC2 Instance Connect 连接到实例时，用户名必须满足以下要求：
+ 第一个字符：必须是字母（`A-Z`、`a-z`）、数字（`0-9`）或下划线（`_`）
+ 后续字符：可以是字母（`A-Z`、`a-z`）、数字 (`0-9`) 或以下字符：`@ . _ -`
+ 最小长度是 1 个字符
+ 最大长度为 31 个字符

# 为 EC2 Instance Connect 授予 IAM 权限
<a name="ec2-instance-connect-configure-IAM-role"></a>

要使用 EC2 Instance Connect 连接到实例，您必须创建 IAM policy，从而向您的用户授予以下操作和条件的权限：
+ `ec2-instance-connect:SendSSHPublicKey` 操作 - 授予将公有密钥推送到实例的权限。
+ `ec2:osuser` 条件 - 指定可以将公有密钥推送到实例的操作系统用户的名称。使用用于启动实例的 AMI 的默认用户名。对于 AL2023 和 Amazon Linux 2，默认用户名为 `ec2-user`；对于 Ubuntu 则为 `ubuntu`。
+ `ec2:DescribeInstances` 操作 - 使用 EC2 控制台时是必需的，因为包装程序会调用此操作。用户可能已经拥有从另一个策略调用此操作的权限。
+ `ec2:DescribeVpcs` 操作 – 连接到 IPv6 地址时为必填项。

考虑限制对特定 EC2 实例的访问。否则，具有适用于 `ec2-instance-connect:SendSSHPublicKey` 操作的权限的所有 IAM 主体可以连接到所有 EC2 实例。您可以通过指定资源 ARN 或使用资源标签作为[条件键](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonec2instanceconnect.html#amazonec2instanceconnect-policy-keys)来限制访问。

有关更多信息，请参阅 [Amazon EC2 Instance Connect 的操作、资源和条件键](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonec2instanceconnect.html)。

有关如何创建 IAM policy 的信息，请参阅 *IAM 用户指南*中的[创建 IAM policy](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)。

## 允许用户连接到特定实例
<a name="eic-permissions-allow-users-to-connect-to-specific-instances"></a>

以下 IAM policy 授予连接到特定实例的权限，这些实例由其资源 ARN 标识。

在以下示例 IAM policy 中，指定了以下操作和条件：
+ `ec2-instance-connect:SendSSHPublicKey` 操作向用户授予连接到两个实例的权限，这两个实例由资源 ARN 指定。要向用户授予连接到*所有* EC2 实例的权限，请将资源 ARN 替换为 `*` 通配符。
+ 只有在连接时指定 *ami-username* 时，`ec2:osuser` 条件才会授予连接到实例的权限。
+ 指定 `ec2:DescribeInstances` 操作向使用控制台连接到您的实例的用户授予权限。如果您的用户仅使用 SSH 客户端连接到您的实例，可以省略 `ec2:DescribeInstances`。注意，`ec2:Describe*` API 操作不支持资源级权限。因此，`Resource` 元素中需要 `*` 通配符。
+ 指定 `ec2:DescribeVpcs` 操作向使用 IPv6 地址从控制台连接到实例的用户授予权限。如果用户仅使用公有 IPv4 地址，则可以忽略 `ec2:DescribeVpcs`。注意，`ec2:Describe*` API 操作不支持资源级权限。因此，`Resource` 元素中需要 `*` 通配符。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [{
            "Effect": "Allow",
            "Action": "ec2-instance-connect:SendSSHPublicKey",
            "Resource": [
                "arn:aws:ec2:us-east-1:111122223333:instance/i-1234567890abcdef0",
                "arn:aws:ec2:us-east-1:111122223333:instance/i-0598c7d356eba48d7"
            ],
            "Condition": {
                "StringEquals": {
                    "ec2:osuser": "ami-username"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstances",
                "ec2:DescribeVpcs"
            ],
            "Resource": "*"
        }
    ]
}
```

------

## 允许用户连接到具有特定标签的实例
<a name="eic-permissions-allow-users-to-connect-to-instances-with-specific-tags"></a>

基于属性的访问权限控制（ABAC）是一种授权策略，该策略根据可附加到用户和 AWS 资源的标签来定义权限。您可以使用资源标签来控制对实例的访问。有关使用标签控制对AWS资源的访问的更多信息，请参阅 *IAM 用户指南*中的[控制对AWS资源的访问](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_tags.html#access_tags_control-resources)。

在以下示例 IAM policy 中，`ec2-instance-connect:SendSSHPublicKey` 操作向用户授予连接到任何实例的权限（由资源 ARN 中的 `*` 通配符指示），条件是该实例的资源标签带有 key=`tag-key` 和 value=`tag-value`。

指定 `ec2:DescribeInstances` 操作向使用控制台连接到您的实例的用户授予权限。如果用户仅使用 SSH 客户端连接到实例，可以省略 `ec2:DescribeInstances`。注意，`ec2:Describe*` API 操作不支持资源级权限。因此，`Resource` 元素中需要 `*` 通配符。

指定 `ec2:DescribeVpcs` 操作向使用 IPv6 地址从控制台连接到实例的用户授予权限。如果用户仅使用公有 IPv4 地址，则可以忽略 `ec2:DescribeVpcs`。注意，`ec2:Describe*` API 操作不支持资源级权限。因此，`Resource` 元素中需要 `*` 通配符。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [{
            "Effect": "Allow",
            "Action": "ec2-instance-connect:SendSSHPublicKey", 
            "Resource": "arn:aws:ec2:us-east-1:111122223333:instance/*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/tag-key": "tag-value"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstances",
                "ec2:DescribeVpcs"
            ],
            "Resource": "*"
        }
    ]
}
```

------

# 在您的 EC2 实例上安装 EC2 Instance Connect
<a name="ec2-instance-connect-set-up"></a>

要使用 EC2 Instance Connect 连接到 Linux 实例，该实例必须安装 EC2 Instance Connect。安装 EC2 Instance Connect 将在实例上配置 SSH 进程守护程序。

有关 EC2 Instance Connect 程序包的更多信息，请参阅 GitHub 网站上的 [aws/aws-ec2-instance-connect-config](https://github.com/aws/aws-ec2-instance-connect-config)。

**注意**  
如果为 SSH 身份验证配置了 `AuthorizedKeysCommand` 和 `AuthorizedKeysCommandUser` 设置，则 EC2 Instance Connect 安装不会更新它们。因此，无法使用 EC2 Instance Connect。

## 安装必备组件
<a name="ec2-instance-connect-install-prerequisites"></a>

安装 EC2 Instance Connect 之前，务必确认已满足以下先决条件。
+ **验证实例使用了以下某一项：**
  + 版本 2.0.20190618 之前的 Amazon Linux 2 \$1
  + AL2023 AMI 最低版本或经 Amazon ECS 优化的 AMI
  + CentOS Stream 8 和 9
  + 14.2.1 之前的 macOS Sonoma、13.6.3 之前的 Ventura 和 12.7.2 之前的 Monterey \$1
  + Red Hat Enterprise Linux（RHEL）8 和 9
  + Ubuntu 16.04 和 18.04 \$1
**提示**  
\$1 对于 Amazon Linux 2、macOS 和 Ubuntu：如果使用比上述版本更高的版本启动实例，则会预装 EC2 Instance Connect，无需手动安装。
+ **验证 EC2 Instance Connect 的一般先决条件。**

  有关更多信息，请参阅 [EC2 Instance Connect 的先决条件](ec2-instance-connect-prerequisites.md)。
+ **确认满足使用本地计算机上的 SSH 客户端连接到实例的先决条件。**

  有关更多信息，请参阅 [使用 SSH 连接到 Linux 实例](connect-to-linux-instance.md)。
+ **获取实例 ID。**

  您可以使用 Amazon EC2 控制台获取实例 ID（从 **Instance ID (实例 ID)** 列）。如果您愿意，可以使用 [describe-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html) (AWS CLI) 或 [Get-EC2Instance](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Instance.html) (AWS Tools for Windows PowerShell) 命令。

## 手动安装 EC2 Instance Connect
<a name="ec2-instance-connect-install"></a>

**注意**  
如果使用以下某一项 AMI 启动了实例，则该实例已预安装 EC2 Instance Connect，因此可以跳过此过程：  
AL2023 标准 AMI
Amazon Linux 2 2.0.20190618 或更高版本
macOS Sonoma 14.2.1 或更高版本
macOS Ventura 13.6.3 或更高版本
macOS Monterey 12.7.2 或更高版本
Ubuntu 20.04 或更高版本

根据实例的操作系统，使用以下过程之一安装 EC2 Instance Connect。

------
#### [ Amazon Linux 2 ]

**在使用 Amazon Linux 2 启动的实例上安装 EC2 Instance Connect**

1. 使用 SSH 连接到您的实例。

   在以下命令中，将示例值替换为自己的值。可以使用在启动实例时为其分配的 SSH 密钥对以及用于启动实例的 AMI 的默认用户名。对于 Amazon Linux 2，默认用户名为 `ec2-user`。

   ```
   $ ssh -i my_ec2_private_key.pem ec2-user@ec2-a-b-c-d.us-west-2.compute.amazonaws.com
   ```

   有关连接到实例的更多信息，请参阅[使用 SSH 客户端连接到 Linux 实例](connect-linux-inst-ssh.md)。

1. 在实例上安装 EC2 Instance Connect 程序包。

   ```
   [ec2-user ~]$ sudo yum install ec2-instance-connect
   ```

   您将会在 `/opt/aws/bin/` 文件夹中看到三个新脚本：

   ```
   eic_curl_authorized_keys
   eic_parse_authorized_keys
   eic_run_authorized_keys
   ```

1. （可选）验证是否在实例上成功安装了 EC2 Instance Connect。

   ```
   [ec2-user ~]$ sudo less /etc/ssh/sshd_config
   ```

   如果 `AuthorizedKeysCommand` 和 `AuthorizedKeysCommandUser` 行包含以下值，则成功安装 EC2 Instance Connect：

   ```
   AuthorizedKeysCommand /opt/aws/bin/eic_run_authorized_keys %u %f
   AuthorizedKeysCommandUser ec2-instance-connect
   ```
   + `AuthorizedKeysCommand` 设置 `eic_run_authorized_keys` 文件以从实例元数据中查找密钥
   + `AuthorizedKeysCommandUser` 将系统用户设置为 `ec2-instance-connect`
**注意**  
如果以前配置了 `AuthorizedKeysCommand` 和 `AuthorizedKeysCommandUser`，则 EC2 Instance Connect 安装不会更改这些值，并且无法使用 EC2 Instance Connect。

------
#### [ CentOS ]

**在通过 CentOS 启动的实例上安装 EC2 Instance Connect**

1. 使用 SSH 连接到实例。

   在以下命令中，将示例值替换为自己的值。可以使用在启动实例时为其分配的 SSH 密钥对以及用于启动实例的 AMI 的默认用户名。对于 CentOS，默认用户名为 `centos` 或 `ec2-user`。

   ```
   $ ssh -i my_ec2_private_key.pem centos@ec2-a-b-c-d.us-west-2.compute.amazonaws.com
   ```

   有关连接到实例的更多信息，请参阅[使用 SSH 客户端连接到 Linux 实例](connect-linux-inst-ssh.md)。

1. 如果使用 HTTP 或 HTTPS 代理，则必须在当前 Shell 会话中设置 `http_proxy` 或 `https_proxy` 环境变量。

   如果不使用代理，则可跳过此步骤。
   + 对于 HTTP 代理服务器，请运行以下命令：

     ```
     $ export http_proxy=http://hostname:port
     $ export https_proxy=http://hostname:port
     ```
   + 对于 HTTPS 代理服务器，请运行以下命令：

     ```
     $ export http_proxy=https://hostname:port
     $ export https_proxy=https://hostname:port
     ```

1. 运行以下命令，在实例上安装 EC2 Instance Connect 软件包。

   适用于 CentOS 的 EC2 Instance Connect 配置文件在 Red Hat Package Manager（RPM）包中提供，适用于 CentOS 8 和 CentOS 9，以及在 Intel/AMD（x86\$164）或 ARM（AArch64）上运行的实例类型有不同的 RPM 包。

   使用适用于操作系统和 CPU 架构的命令块。
   + CentOS 8

     Intel/AMD（x86\$164）

     ```
     [ec2-user ~]$ mkdir /tmp/ec2-instance-connect
     [ec2-user ~]$ curl https://amazon-ec2-instance-connect-us-west-2.s3.us-west-2.amazonaws.com/latest/linux_amd64/ec2-instance-connect-2.0.0-5.rhel8.x86_64.rpm -o /tmp/ec2-instance-connect/ec2-instance-connect.rpm
     [ec2-user ~]$ curl https://amazon-ec2-instance-connect-us-west-2.s3.us-west-2.amazonaws.com/latest/linux_amd64/ec2-instance-connect-selinux-2.0.0-5.noarch.rpm -o /tmp/ec2-instance-connect/ec2-instance-connect-selinux.rpm
     [ec2-user ~]$ sudo yum install -y /tmp/ec2-instance-connect/ec2-instance-connect.rpm /tmp/ec2-instance-connect/ec2-instance-connect-selinux.rpm
     ```

     ARM（AArch64）

     ```
     [ec2-user ~]$ mkdir /tmp/ec2-instance-connect
     [ec2-user ~]$ curl https://amazon-ec2-instance-connect-us-west-2.s3.us-west-2.amazonaws.com/latest/linux_arm64/ec2-instance-connect-2.0.0-5.rhel8.aarch64.rpm -o /tmp/ec2-instance-connect/ec2-instance-connect.rpm
     [ec2-user ~]$ curl https://amazon-ec2-instance-connect-us-west-2.s3.us-west-2.amazonaws.com/latest/linux_arm64/ec2-instance-connect-selinux-2.0.0-5.noarch.rpm -o /tmp/ec2-instance-connect/ec2-instance-connect-selinux.rpm
     [ec2-user ~]$ sudo yum install -y /tmp/ec2-instance-connect/ec2-instance-connect.rpm /tmp/ec2-instance-connect/ec2-instance-connect-selinux.rpm
     ```
   + CentOS 9

     Intel/AMD（x86\$164）

     ```
     [ec2-user ~]$ mkdir /tmp/ec2-instance-connect
     [ec2-user ~]$ curl https://amazon-ec2-instance-connect-us-west-2.s3.us-west-2.amazonaws.com/latest/linux_amd64/ec2-instance-connect-2.0.0-5.rhel9.x86_64.rpm -o /tmp/ec2-instance-connect/ec2-instance-connect.rpm
     [ec2-user ~]$ curl https://amazon-ec2-instance-connect-us-west-2.s3.us-west-2.amazonaws.com/latest/linux_amd64/ec2-instance-connect-selinux-2.0.0-5.noarch.rpm -o /tmp/ec2-instance-connect/ec2-instance-connect-selinux.rpm
     [ec2-user ~]$ sudo yum install -y /tmp/ec2-instance-connect/ec2-instance-connect.rpm /tmp/ec2-instance-connect/ec2-instance-connect-selinux.rpm
     ```

     ARM（AArch64）

     ```
     [ec2-user ~]$ mkdir /tmp/ec2-instance-connect
     [ec2-user ~]$ curl https://amazon-ec2-instance-connect-us-west-2.s3.us-west-2.amazonaws.com/latest/linux_arm64/ec2-instance-connect-2.0.0-5.rhel9.aarch64.rpm -o /tmp/ec2-instance-connect/ec2-instance-connect.rpm
     [ec2-user ~]$ curl https://amazon-ec2-instance-connect-us-west-2.s3.us-west-2.amazonaws.com/latest/linux_arm64/ec2-instance-connect-selinux-2.0.0-5.noarch.rpm -o /tmp/ec2-instance-connect/ec2-instance-connect-selinux.rpm
     [ec2-user ~]$ sudo yum install -y /tmp/ec2-instance-connect/ec2-instance-connect.rpm /tmp/ec2-instance-connect/ec2-instance-connect-selinux.rpm
     ```

   在 `/opt/aws/bin/` 文件夹中会看到以下新脚本：

   ```
   eic_run_authorized_keys
   ```

1. （可选）验证是否在实例上成功安装了 EC2 Instance Connect。
   + 对于 CentOS 8：

     ```
     [ec2-user ~]$ sudo less /lib/systemd/system/sshd.service.d/ec2-instance-connect.conf
     ```
   + 对于 CentOS 9：

     ```
     [ec2-user ~]$ sudo less /etc/ssh/sshd_config.d/60-ec2-instance-connect.conf
     ```

   如果 `AuthorizedKeysCommand` 和 `AuthorizedKeysCommandUser` 行包含以下值，则成功安装 EC2 Instance Connect：

   ```
   AuthorizedKeysCommand /opt/aws/bin/eic_run_authorized_keys %u %f
   AuthorizedKeysCommandUser ec2-instance-connect
   ```
   + `AuthorizedKeysCommand` 设置 `eic_run_authorized_keys` 文件以从实例元数据中查找密钥
   + `AuthorizedKeysCommandUser` 将系统用户设置为 `ec2-instance-connect`
**注意**  
如果以前配置了 `AuthorizedKeysCommand` 和 `AuthorizedKeysCommandUser`，则 EC2 Instance Connect 安装不会更改这些值，并且无法使用 EC2 Instance Connect。

------
#### [ macOS ]

**在使用 macOS 启动的实例上安装 EC2 Instance Connect**

1. 使用 SSH 连接到实例。

   在以下命令中，将示例值替换为自己的值。可以使用在启动实例时为其分配的 SSH 密钥对以及用于启动实例的 AMI 的默认用户名。对于 macOS 实例，默认用户名为 `ec2-user`。

   ```
   $ ssh -i my_ec2_private_key.pem ec2-user@ec2-a-b-c-d.us-west-2.compute.amazonaws.com
   ```

   有关连接到实例的更多信息，请参阅[使用 SSH 客户端连接到 Linux 实例](connect-linux-inst-ssh.md)。

1. 使用以下命令更新 Homebrew。更新将列出 Homebrew 了解的软件。通过 Homebrew，在 macOS 实例上提供 EC2 Instance Connect 包。有关更多信息，请参阅 [更新 Amazon EC2 Mac 实例上的操作系统和软件](mac-instance-updates.md)。

   ```
   [ec2-user ~]$ brew update
   ```

1. 在实例上安装 EC2 Instance Connect 程序包。将安装软件并配置 sshd 以进行使用。

   ```
   [ec2-user ~]$ brew install ec2-instance-connect
   ```

   在 `/opt/aws/bin/` 文件夹中会看到以下新脚本：

   ```
   eic_run_authorized_keys
   ```

1. （可选）验证是否在实例上成功安装了 EC2 Instance Connect。

   ```
   [ec2-user ~]$ sudo less /etc/ssh/sshd_config.d/60-ec2-instance-connect.conf
   ```

   如果 `AuthorizedKeysCommand` 和 `AuthorizedKeysCommandUser` 行包含以下值，则成功安装 EC2 Instance Connect：

   ```
   AuthorizedKeysCommand /opt/aws/bin/eic_run_authorized_keys %u %f
   AuthorizedKeysCommandUser ec2-instance-connect
   ```
   + `AuthorizedKeysCommand` 设置 `eic_run_authorized_keys` 文件以从实例元数据中查找密钥
   + `AuthorizedKeysCommandUser` 将系统用户设置为 `ec2-instance-connect`
**注意**  
如果以前配置了 `AuthorizedKeysCommand` 和 `AuthorizedKeysCommandUser`，则 EC2 Instance Connect 安装不会更改这些值，并且无法使用 EC2 Instance Connect。

------
#### [ RHEL ]

**在使用 Red Hat Enterprise Linux（RHEL）启动的实例上安装 EC2 Instance Connect**

1. 使用 SSH 连接到实例。

   在以下命令中，将示例值替换为自己的值。可以使用在启动实例时为其分配的 SSH 密钥对以及用于启动实例的 AMI 的默认用户名。对于 RHEL，默认用户名为 `ec2-user` 或 `root`。

   ```
   $ ssh -i my_ec2_private_key.pem ec2-user@ec2-a-b-c-d.us-west-2.compute.amazonaws.com
   ```

   有关连接到实例的更多信息，请参阅[使用 SSH 客户端连接到 Linux 实例](connect-linux-inst-ssh.md)。

1. 如果使用 HTTP 或 HTTPS 代理，则必须在当前 Shell 会话中设置 `http_proxy` 或 `https_proxy` 环境变量。

   如果不使用代理，则可跳过此步骤。
   + 对于 HTTP 代理服务器，请运行以下命令：

     ```
     $ export http_proxy=http://hostname:port
     $ export https_proxy=http://hostname:port
     ```
   + 对于 HTTPS 代理服务器，请运行以下命令：

     ```
     $ export http_proxy=https://hostname:port
     $ export https_proxy=https://hostname:port
     ```

1. 运行以下命令，在实例上安装 EC2 Instance Connect 软件包。

   在 Red Hat Package Manager（RPM）包中提供适用于 RHEL 的 EC2 Instance Connect 配置文件，适用于 RHEL 8 和 RHEL 9，以及在 Intel/AMD（x86\$164）或 ARM（AArch64）上运行的实例类型有不同的 RPM 包。

   使用适用于操作系统和 CPU 架构的命令块。
   + RHEL 8

     Intel/AMD（x86\$164）

     ```
     [ec2-user ~]$ mkdir /tmp/ec2-instance-connect
     [ec2-user ~]$ curl https://amazon-ec2-instance-connect-us-west-2.s3.us-west-2.amazonaws.com/latest/linux_amd64/ec2-instance-connect-2.0.0-5.rhel8.x86_64.rpm -o /tmp/ec2-instance-connect/ec2-instance-connect.rpm
     [ec2-user ~]$ curl https://amazon-ec2-instance-connect-us-west-2.s3.us-west-2.amazonaws.com/latest/linux_amd64/ec2-instance-connect-selinux-2.0.0-5.noarch.rpm -o /tmp/ec2-instance-connect/ec2-instance-connect-selinux.rpm
     [ec2-user ~]$ sudo yum install -y /tmp/ec2-instance-connect/ec2-instance-connect.rpm /tmp/ec2-instance-connect/ec2-instance-connect-selinux.rpm
     ```

     ARM（AArch64）

     ```
     [ec2-user ~]$ mkdir /tmp/ec2-instance-connect
     [ec2-user ~]$ curl https://amazon-ec2-instance-connect-us-west-2.s3.us-west-2.amazonaws.com/latest/linux_arm64/ec2-instance-connect-2.0.0-5.rhel8.aarch64.rpm -o /tmp/ec2-instance-connect/ec2-instance-connect.rpm
     [ec2-user ~]$ curl https://amazon-ec2-instance-connect-us-west-2.s3.us-west-2.amazonaws.com/latest/linux_arm64/ec2-instance-connect-selinux-2.0.0-5.noarch.rpm -o /tmp/ec2-instance-connect/ec2-instance-connect-selinux.rpm
     [ec2-user ~]$ sudo yum install -y /tmp/ec2-instance-connect/ec2-instance-connect.rpm /tmp/ec2-instance-connect/ec2-instance-connect-selinux.rpm
     ```
   + RHEL 9

     Intel/AMD（x86\$164）

     ```
     [ec2-user ~]$ mkdir /tmp/ec2-instance-connect
     [ec2-user ~]$ curl https://amazon-ec2-instance-connect-us-west-2.s3.us-west-2.amazonaws.com/latest/linux_amd64/ec2-instance-connect-2.0.0-5.rhel9.x86_64.rpm -o /tmp/ec2-instance-connect/ec2-instance-connect.rpm
     [ec2-user ~]$ curl https://amazon-ec2-instance-connect-us-west-2.s3.us-west-2.amazonaws.com/latest/linux_amd64/ec2-instance-connect-selinux-2.0.0-5.noarch.rpm -o /tmp/ec2-instance-connect/ec2-instance-connect-selinux.rpm
     [ec2-user ~]$ sudo yum install -y /tmp/ec2-instance-connect/ec2-instance-connect.rpm /tmp/ec2-instance-connect/ec2-instance-connect-selinux.rpm
     ```

     ARM（AArch64）

     ```
     [ec2-user ~]$ mkdir /tmp/ec2-instance-connect
     [ec2-user ~]$ curl https://amazon-ec2-instance-connect-us-west-2.s3.us-west-2.amazonaws.com/latest/linux_arm64/ec2-instance-connect-2.0.0-5.rhel9.aarch64.rpm -o /tmp/ec2-instance-connect/ec2-instance-connect.rpm
     [ec2-user ~]$ curl https://amazon-ec2-instance-connect-us-west-2.s3.us-west-2.amazonaws.com/latest/linux_arm64/ec2-instance-connect-selinux-2.0.0-5.noarch.rpm -o /tmp/ec2-instance-connect/ec2-instance-connect-selinux.rpm
     [ec2-user ~]$ sudo yum install -y /tmp/ec2-instance-connect/ec2-instance-connect.rpm /tmp/ec2-instance-connect/ec2-instance-connect-selinux.rpm
     ```

   在 `/opt/aws/bin/` 文件夹中会看到以下新脚本：

   ```
   eic_run_authorized_keys
   ```

1. （可选）验证是否在实例上成功安装了 EC2 Instance Connect。
   + 对于 RHEL 8：

     ```
     [ec2-user ~]$ sudo less /lib/systemd/system/sshd.service.d/ec2-instance-connect.conf
     ```
   + 对于 RHEL 9：

     ```
     [ec2-user ~]$ sudo less /etc/ssh/sshd_config.d/60-ec2-instance-connect.conf
     ```

   如果 `AuthorizedKeysCommand` 和 `AuthorizedKeysCommandUser` 行包含以下值，则成功安装 EC2 Instance Connect：

   ```
   AuthorizedKeysCommand /opt/aws/bin/eic_run_authorized_keys %u %f
   AuthorizedKeysCommandUser ec2-instance-connect
   ```
   + `AuthorizedKeysCommand` 设置 `eic_run_authorized_keys` 文件以从实例元数据中查找密钥
   + `AuthorizedKeysCommandUser` 将系统用户设置为 `ec2-instance-connect`
**注意**  
如果以前配置了 `AuthorizedKeysCommand` 和 `AuthorizedKeysCommandUser`，则 EC2 Instance Connect 安装不会更改这些值，并且无法使用 EC2 Instance Connect。

------
#### [ Ubuntu ]

**在使用 Ubuntu 16.04 或更高版本启动的实例上安装 EC2 Instance Connect**

1. 使用 SSH 连接到实例。

   在以下命令中，将示例值替换为自己的值。可以使用在启动实例时为其分配的 SSH 密钥对以及用于启动实例的 AMI 的默认用户名。对于 Ubuntu AMI，用户名为 `ubuntu`。

   ```
   $ ssh -i my_ec2_private_key.pem ubuntu@ec2-a-b-c-d.us-west-2.compute.amazonaws.com
   ```

   有关连接到实例的更多信息，请参阅[使用 SSH 客户端连接到 Linux 实例](connect-linux-inst-ssh.md)。

1. （可选）确保您的实例具有最新 Ubuntu AMI。

   使用以下命令更新实例上的所有程序包。

   ```
   ubuntu:~$ sudo apt-get update
   ```

   ```
   ubuntu:~$ sudo apt-get upgrade
   ```

1. 在实例上安装 EC2 Instance Connect 程序包。

   ```
   ubuntu:~$ sudo apt-get install ec2-instance-connect
   ```

   您将会在 `/usr/share/ec2-instance-connect/` 文件夹中看到三个新脚本：

   ```
   eic_curl_authorized_keys
   eic_parse_authorized_keys
   eic_run_authorized_keys
   ```

1. （可选）验证是否在实例上成功安装了 EC2 Instance Connect。

   ```
   ubuntu:~$ sudo less /lib/systemd/system/ssh.service.d/ec2-instance-connect.conf
   ```

   如果 `AuthorizedKeysCommand` 和 `AuthorizedKeysCommandUser` 行包含以下值，则成功安装 EC2 Instance Connect：

   ```
   AuthorizedKeysCommand /usr/share/ec2-instance-connect/eic_run_authorized_keys %%u %%f
   AuthorizedKeysCommandUser ec2-instance-connect
   ```
   + `AuthorizedKeysCommand` 设置 `eic_run_authorized_keys` 文件以从实例元数据中查找密钥
   + `AuthorizedKeysCommandUser` 将系统用户设置为 `ec2-instance-connect`
**注意**  
如果以前配置了 `AuthorizedKeysCommand` 和 `AuthorizedKeysCommandUser`，则 EC2 Instance Connect 安装不会更改这些值，并且无法使用 EC2 Instance Connect。

------

# 使用 EC2 Instance Connect 连接到 Linux 实例
<a name="ec2-instance-connect-methods"></a>

以下说明旨在介绍如何通过 Amazon EC2 控制台、AWS CLI 或 SSH 客户端使用 EC2 Instance Connect 连接到 Linux 实例。

在使用 EC2 Instance Connect 通过控制台或 AWS CLI 连接到实例时，EC2 Instance Connect API 会将一个 SSH 公有密钥推送到[实例元数据](ec2-instance-metadata.md)并在其中保留 60 秒。附加到用户的 IAM 策略负责授权此操作。如果您更喜欢使用自己的 SSH 密钥，则可以使用 SSH 客户端，并使用 EC2 Instance Connect 将您的 SSH 密钥显式推送到实例。

**注意事项**  
使用 EC2 Instance Connect 连接到实例后，连接会一直持续到 SSH 会话终止。连接的持续时间并不是由 IAM 凭证的持续时间决定的。如果您的 IAM 凭证过期，连接将继续保持。使用 EC2 Instance Connect 控制台体验时，如果 IAM 凭证过期，请关闭浏览器页面终止连接。使用自己的 SSH 客户端和 EC2 Instance Connect 推送密钥时，可以设置 SSH 超时值来自动终止 SSH 会话。

**要求**  
开始操作之前，务必查看[先决条件](ec2-instance-connect-prerequisites.md)。

**Topics**
+ [使用 Amazon EC2 控制台连接](#ec2-instance-connect-connecting-console)
+ [使用 AWS CLI进行连接](#connect-linux-inst-eic-cli-ssh)
+ [使用您自己的密钥和 SSH 客户端进行连接](#ec2-instance-connect-connecting-aws-cli)
+ [故障排除](#ic-troubleshoot)

## 使用 Amazon EC2 控制台连接
<a name="ec2-instance-connect-connecting-console"></a>

您可以通过 Amazon EC2 控制台使用 EC2 Instance Connect 连接到实例。

**要求**  
要使用 Amazon EC2 控制台进行连接，实例必须具有一个公有 IPv4 或 IPv6 地址。如果实例只有私有 IPv4 地址，则可使用 [ec2-instance-connect AWS CLI](#connect-linux-inst-eic-cli-ssh) 命令进行连接。

**使用 Amazon EC2 控制台连接到实例**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择**实例**。

1. 选择实例，然后选择**连接**。

1. 选择 **EC2 Instance Connect** 选项卡。

1. 选择**使用公有 IP 连接**。

1. 如果可以选择，请选择要连接到的 IP 地址。否则，系统会自动选择 IP 地址。

1. 对于**用户名**，请验证用户名。

1. 选择**连接**以建立连接。浏览器内终端窗口随即打开。

## 使用 AWS CLI进行连接
<a name="connect-linux-inst-eic-cli-ssh"></a>

可以使用 [ec2-instance-connect](https://docs.aws.amazon.com/cli/latest/reference/ec2-instance-connect/index.html) AWS CLI 命令，通过 SSH 客户端连接到实例。EC2 Instance Connect 尝试根据指定的连接类型，按预定义顺序使用可用的 IP 地址建立连接。如果 IP 地址不可用，它会自动尝试顺序中的下一个 IP 地址。连接类型

`auto`（默认）  
EC2 Instance Connect 尝试按以下顺序使用实例的 IP 地址并使用相应的连接类型进行连接：  

1. 公有 IPv4：`direct`

1. 私有 IPv4：`eice`

1. IPv6：`direct`

`direct`  
EC2 Instance Connect 尝试按以下顺序使用实例的 IP 地址进行连接：  

1. 公有 IPv4

1. IPv6

1. 私有 IPv4（不通过 EC2 Instance Connect 端点进行连接）

`eice`  
EC2 Instance Connect 尝试使用实例的私有 IPv4 地址和 [EC2 Instance Connect 端点](connect-with-ec2-instance-connect-endpoint.md)进行连接。

**注意**  
将来，我们可能会更改 `auto` 连接类型的行为。为确保使用所需的连接类型，我们建议您将 `--connection-type` 明确设置为 `direct` 或 `eice`。

**要求**  
您必须使用 AWS CLI 版本 2。有关更多信息，请参阅 [Install or update to the latest version of the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)。

**要使用实例 ID 连接到实例**  
如果只知道实例 ID，并想让 EC2 Instance Connect 确定连接到实例时要使用的连接类型，请使用 [ec2-instance-connect ssh](https://docs.aws.amazon.com/cli/latest/reference/ec2-instance-connect/ssh.html) CLI 命令及实例 ID。

```
aws ec2-instance-connect ssh --instance-id i-1234567890example
```

**要使用实例 ID 和 EC2 Instance Connect Endpoint 连接到实例**  
如果您想通过 [EC2 Instance Connect Endpoint](connect-with-ec2-instance-connect-endpoint.md) 连接到您的实例，请使用前面的命令并通过 `eice` 值指定 `--connection-type` 参数。

```
aws ec2-instance-connect ssh --instance-id i-1234567890example --connection-type eice
```

**要使用实例 ID 和您自己的私有密钥文件连接到实例**  
如果您想使用自己的私有密钥通过 EC2 Instance Connect Endpoint 连接到您的实例，请指定实例 ID 和私有密钥文件的路径。不要在路径中包含 *file://*；以下示例将会失败：*file:///path/to/key*。

```
aws ec2-instance-connect ssh --instance-id i-1234567890example --private-key-file /path/to/key.pem
```

**提示**  
如果使用这些命令时出现错误，务必确保使用的是 AWS CLI 版本 2，因为 `ssh` 命令仅在此主要版本中可用。我们还建议定期更新到 AWS CLI 版本 2 的最新次要版本，以便使用最新功能。有关更多信息，请参阅《*AWS Command Line Interface 开发人员指南*》中的[关于 AWS CLI 版本 2](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html#welcome-versions-v2)。

## 使用您自己的密钥和 SSH 客户端进行连接
<a name="ec2-instance-connect-connecting-aws-cli"></a>

您可以使用自己的 SSH 密钥，并在使用 EC2 Instance Connect API 时从您选择的 SSH 客户端连接到您的实例。这使您能够从将公有密钥推送到实例的 EC2 Instance Connect 功能中受益。此连接方法适用于具有公有和私有 IP 地址的实例。

**要求**
+ 密钥对的要求
  + 支持的类型：RSA（OpenSSH 和 SSH2）和 ED25519
  + 支持的长度：2048 和 4096
  + 有关更多信息，请参阅 [使用第三方工具创建密钥对，并将公有密钥导入 Amazon EC2](create-key-pairs.md#how-to-generate-your-own-key-and-import-it-to-aws)。
+ 当连接到仅具有私有 IP 地址的实例时，启动 SSH 会话的本地计算机必须连接到 EC2 Instance Connect 服务端点（以便将 SSH 公有密钥推送到实例）且与实例的私有 IP 地址有网络连接，才能建立 SSH 会话。EC2 Instance Connect 服务终端节点可以通过互联网或 Direct Connect 公共虚拟接口访问。要连接到实例的私有 IP 地址，您可以利用 [Direct Connect](https://aws.amazon.com/directconnect/)、[AWS Site-to-Site VPN](https://aws.amazon.com/vpn/) 或 [VPC 对等连接](https://docs.aws.amazon.com/vpc/latest/peering/what-is-vpc-peering.html)等服务。

**使用您自己的密钥和任何 SSH 客户端连接到实例**

1. 

**（可选）生成新的 SSH 私有密钥和公有密钥**

   您可以使用以下命令生成新的 SSH 私有密钥和公有密钥（`my_key` 和 `my_key.pub`）：

   ```
   ssh-keygen -t rsa -f my_key
   ```

1. 

**将 SSH 公有密钥推送到实例**

   使用 [https://docs.aws.amazon.com/cli/latest/reference/ec2-instance-connect/send-ssh-public-key.html](https://docs.aws.amazon.com/cli/latest/reference/ec2-instance-connect/send-ssh-public-key.html) 命令可将 SSH 公有密钥推送到实例。如果使用 AL2023 或 Amazon Linux 2 启动实例，则 AMI 的默认用户名为 `ec2-user`。如果使用 Ubuntu 启动实例，则 AMI 的默认用户名为 `ubuntu`。

   以下示例将公有密钥推送到指定的可用区中的指定实例，以对 `ec2-user` 进行身份验证。

   ```
   aws ec2-instance-connect send-ssh-public-key \
       --region us-west-2 \
       --availability-zone us-west-2b \
       --instance-id i-001234a4bf70dec41EXAMPLE \
       --instance-os-user ec2-user \
       --ssh-public-key file://my_key.pub
   ```

1. 

**使用私有密钥连接到实例**

   从实例元数据中删除公有密钥之前，可以使用 **ssh** 命令通过私有密钥连接到实例（在 60 秒后删除）。指定与公有密钥对应的私有密钥、用于启动实例的 AMI 的默认用户名以及实例的公有 DNS 名称（如果通过私有网络连接，请指定私有 DNS 名称或 IP 地址）。添加 `IdentitiesOnly=yes` 选项以确保仅使用 ssh config 中的文件和指定的密钥进行连接。

   ```
   ssh -o "IdentitiesOnly=yes" -i my_key ec2-user@ec2-198-51-100-1.compute-1.amazonaws.com
   ```

   以下示例使用 `timeout 3600` 将 SSH 会话设置为 1 小时后终止。会话终止后，会话期间启动的进程可能会继续在您的实例上运行。

   ```
   timeout 3600 ssh -o “IdentitiesOnly=yes” -i my_key ec2-user@ec2-198-51-100-1.compute-1.amazonaws.com
   ```

## 故障排除
<a name="ic-troubleshoot"></a>

如果您在尝试连接到实例时遇到错误，请参阅下文：
+ [排查 Amazon EC2 Linux 实例的连接问题](TroubleshootingInstancesConnecting.md)
+ [如何排查使用 EC2 Instance Connect 连接 EC2 实例时遇到的问题？](https://repost.aws/knowledge-center/ec2-instance-connect-troubleshooting)

# 卸载 EC2 Instance Connect
<a name="ec2-instance-connect-uninstall"></a>

要禁用 EC2 Instance Connect，请连接到 Linux 实例并卸载操作系统上安装的 `ec2-instance-connect` 程序包。如果 `sshd` 配置与您安装 EC2 Instance Connect 时设置的配置匹配，卸载 `ec2-instance-connect` 还会删除 `sshd` 配置。如果在安装 EC2 Instance Connect 后修改了 `sshd` 配置，您必须手动更新该配置。

------
#### [ Amazon Linux ]

您可以在 AL2023 和 Amazon Linux 2 2.0.20190618 或更高版本上卸载 EC2 Instance Connect，其中预配置了 EC2 Instance Connect。

**在使用 Amazon Linux 启动的实例上卸载 EC2 Instance Connect**

1. 使用 SSH 连接到实例。指定启动实例时用于实例的 SSH 密钥对，以及 AL2023 和 Amazon Linux 2 AMI 的默认用户名 (`ec2-user`)。

   例如，以下 **ssh** 命令使用密钥对 `ec2-a-b-c-d.us-west-2.compute.amazonaws.com` 连接到具有公有 DNS 名称 `my_ec2_private_key.pem` 的实例。

   ```
   $ ssh -i my_ec2_private_key.pem ec2-user@ec2-a-b-c-d.us-west-2.compute.amazonaws.com
   ```

1. 使用 `ec2-instance-connect` 命令卸载 **yum** 软件包。

   ```
   [ec2-user ~]$ sudo yum remove ec2-instance-connect
   ```

------
#### [ Ubuntu ]

**在使用 Ubuntu AMI 启动的实例上卸载 EC2 Instance Connect**

1. 使用 SSH 连接到实例。指定在启动实例时用于实例的 SSH 密钥对以及 Ubuntu AMI 的默认用户名，即 `ubuntu`。

   例如，以下 **ssh** 命令使用密钥对 `ec2-a-b-c-d.us-west-2.compute.amazonaws.com` 连接到具有公有 DNS 名称 `my_ec2_private_key.pem` 的实例。

   ```
   $ ssh -i my_ec2_private_key.pem ubuntu@ec2-a-b-c-d.us-west-2.compute.amazonaws.com
   ```

1. 使用 `ec2-instance-connect` 命令卸载 **apt-get** 软件包。

   ```
   ubuntu:~$ sudo apt-get remove ec2-instance-connect
   ```

------

# 使用私有 IP 地址和 EC2 Instance Connect Endpoint 连接到您的实例
<a name="connect-with-ec2-instance-connect-endpoint"></a>

借助 EC2 Instance Connect 端点，您可以通过互联网安全地连接到实例，无需使用堡垒主机，也不需要您的虚拟私有云（VPC）直接连接到互联网。

**优势**
+ 您可以连接到实例，而实例无需具有公有 IPv4 或 IPv6 地址。AWS 对所有公有 IPv4 地址收费，包括与正在运行的实例关联的公有 IPv4 地址，以及弹性 IP 地址。有关更多信息，请参阅 [Amazon VPC 定价页面](https://aws.amazon.com/vpc/pricing/)中的**公有 IPv4 地址定价**选项卡。
+ 您可以通过互联网连接到实例，并且您的 VPC 也无需通过[互联网网关](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Internet_Gateway.html)直接建立互联网连接。
+ 您可以使用 [IAM 策略和权限](permissions-for-ec2-instance-connect-endpoint.md)来控制创建 EC2 Instance Connect 端点以及使用此端点连接到实例的权限。
+ 所有连接到实例的尝试，无论成功还是失败，都将记录到 [CloudTrail](log-ec2-instance-connect-endpoint-using-cloudtrail.md)。

**定价**  
使用 EC2 Instance Connect 端点不会产生额外的成本。如果您使用 EC2 Instance Connect 端点连接到位于其他可用区的实例，则将产生跨可用区[传输数据的额外费用](https://aws.amazon.com/ec2/pricing/on-demand/#Data_Transfer_within_the_same_AWS_Region)。

**Topics**
+ [工作原理](#how-eice-works)
+ [注意事项](#ec2-instance-connect-endpoint-prerequisites)
+ [权限](permissions-for-ec2-instance-connect-endpoint.md)
+ [安全组](eice-security-groups.md)
+ [创建 EC2 Instance Connect Endpoint](create-ec2-instance-connect-endpoints.md)
+ [修改 EC2 Instance Connect Endpoint](modify-ec2-instance-connect-endpoint.md)
+ [删除 EC2 Instance Connect 端点](delete-ec2-instance-connect-endpoint.md)
+ [连接到实例](connect-using-eice.md)
+ [日志连接](log-ec2-instance-connect-endpoint-using-cloudtrail.md)
+ [服务相关角色](eice-slr.md)
+ [配额](eice-quotas.md)

## 工作原理
<a name="how-eice-works"></a>

EC2 Instance Connect 端点是一种身份感知型 TCP 代理。EC2 Instance Connect 端点服务将使用您的 IAM 实体的凭证，建立从您的计算机到该端点的私有隧道。流量在到达您的 VPC 之前已通过身份验证和授权。

您可以[配置其他安全组规则](eice-security-groups.md)来限制实例的入站流量。例如，您可以使用入站规则仅允许来自 EC2 Instance Connect 端点的流量通过管理端口。

您可以配置路由表规则来允许该端点连接到 VPC 的任何子网中的任何实例。

下图显示了用户如何使用 EC2 Instance Connect 端点从互联网连接到实例。首先，在子网 A 中创建一个 **EC2 Instance Connect 端点**。我们为子网中为该端点创建一个网络接口，以作为发往 VPC 中实例的流量的入口点。如果子网 B 的路由表允许来自子网 A 的流量，则可以使用该端点连接到子网 B 中的实例。

![\[EC2 Instance Connect Endpoint 流程概述。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/ec2-instance-connect-endpoint.png)


## 注意事项
<a name="ec2-instance-connect-endpoint-prerequisites"></a>

开始之前，请注意以下因素：
+ EC2 Instance Connect 端点专用于管理流量应用场景，不适用于大容量数据传输。大容量数据传输将被节流。
+ 您可以创建一个 EC2 Instance Connect 端点，以支持访问具有私有 IPv4 地址或 IPv6 地址的实例的流量。端点的 IP 地址类型必须与实例的 IP 地址匹配。您可以创建支持所有 IP 地址类型的端点。
+ （Linux 实例）如果您使用自己的密钥对，则可以使用任何 Linux AMI。否则，实例必须已经安装了 EC2 Instance Connect。有关哪些 AMI 包含 EC2 Instance Connect 以及如何将其安装在其他支持的 AMI 上的信息，请参阅 [安装 EC2 Instance Connect](ec2-instance-connect-set-up.md)。
+ 您可以为 EC2 Instance Connect 端点分配一个安全组。如果未分配安全组，则将使用 VPC 的默认安全组。EC2 Instance Connect 端点的安全组必须允许指向目标实例的出站流量。有关更多信息，请参阅 [EC2 Instance Connect Endpoint 安全组](eice-security-groups.md)。
+ 您可以将 EC2 Instance Connect 端点配置为在将请求路由到实例时保留客户端的源 IP 地址。否则，网络接口的 IP 地址将成为所有传入流量的客户端 IP 地址。
  + 如果您开启了客户端 IP 保留功能，则实例的安全组必须允许来自客户端的流量。此外，这些实例必须与 EC2 Instance Connect 端点位于同一 VPC 中。
  + 如果您关闭了客户端 IP 保留功能，则实例的安全组必须允许来自 VPC 的流量。这是默认值。
  + 只有 IPv4 EC2 Instance Connect 端点支持客户端 IP 保留。要使用客户端 IP 保留，EC2 Instance Connect 端点的 IP 地址类型必须为 IPv4。当 IP 地址类型为双堆栈或 IPv6 时，不支持客户端 IP 保留。
  + 以下实例类型不支持客户端 IP 保留：C1、CC1、CG2、G1、HI1、M1、M2、M3 和 T1。如果您开启了客户端 IP 保留功能并尝试使用 EC2 Instance Connect 端点连接到属于上述任何实例类型的实例，则连接将会失败。
  + 当流量通过中转网关路由时，不支持客户端 IP 保留功能。
+ 当您创建 EC2 Instance Connect Endpoint 时，系统将为 AWS Identity and Access Management（IAM）中的 Amazon EC2 服务自动创建服务相关的角色。Amazon EC2 使用服务相关的角色在您的账户中预置配网络接口，这是创建 EC2 Instance Connect Endpoint 时所必需的。有关更多信息，请参阅 [EC2 Instance Connect Endpoint 的服务相关角色](eice-slr.md)。
+ 每个 VPC 和每个子网只能创建一个 EC2 Instance Connect Endpoint。有关更多信息，请参阅 [EC2 Instance Connect 端点的限额](eice-quotas.md)。如需在同一 VPC 内的不同可用区中创建另一个 EC2 Instance Connect Endpoint，则必须先删除现有的 EC2 Instance Connect Endpoint。否则，您会收到限额错误。
+ 每个 EC2 Instance Connect 端点最多可支持 20 个并发连接。
+ 已建立 TCP 连接的最长持续时间为 1 小时（3,600 秒）。您可以在 IAM 策略中指定允许的最大持续时间，最长可以为 3,600 秒。有关更多信息，请参阅 [使用 EC2 Instance Connect 端点连接到实例的权限](permissions-for-ec2-instance-connect-endpoint.md#iam-OpenTunnel)。

  连接的持续时间并不是由 IAM 凭证的持续时间决定的。如果您的 IAM 凭证过期，连接将继续保持，直到达到指定的最长持续时间。当您使用 EC2 Instance Connect Endpoint 控制台体验连接到实例时，将**最大隧道持续时间（秒）**设置为小于 IAM 凭证持续时间的值。如果您的 IAM 凭证提前过期，请关闭浏览器页面以终止与实例的连接。

# 授予使用 EC2 Instance Connect 端点的权限
<a name="permissions-for-ec2-instance-connect-endpoint"></a>

默认情况下，IAM 实体没有创建、描述或修改 EC2 Instance Connect 端点的权限。IAM 管理员必须创建授予所需权限的 IAM 策略，才能对所需资源执行特定的操作。

有关如何创建 IAM 策略 的信息，请参阅 *IAM 用户指南*中的[创建 IAM 策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)。

以下示例策略演示了如何控制用户对 EC2 Instance Connect 端点的权限。

**Topics**
+ [创建、描述、修改和删除 EC2 Instance Connect 端点的权限](#iam-CreateInstanceConnectEndpoint)
+ [使用 EC2 Instance Connect 端点连接到实例的权限](#iam-OpenTunnel)
+ [仅从特定 IP 地址范围进行连接的权限](#iam-sourceip)

## 创建、描述、修改和删除 EC2 Instance Connect 端点的权限
<a name="iam-CreateInstanceConnectEndpoint"></a>

要创建和修改 EC2 Instance Connect Endpoint，用户需要具有执行以下操作的权限：
+ `ec2:CreateInstanceConnectEndpoint`
+ `ec2:CreateNetworkInterface`
+ `ec2:CreateTags`
+ `ec2:ModifyInstanceConnectEndpoint`
+ `iam:CreateServiceLinkedRole`

要描述和删除 EC2 Instance Connect Endpoint，用户需要具有执行以下操作的权限：
+ `ec2:DescribeInstanceConnectEndpoints` 
+ `ec2:DeleteInstanceConnectEndpoint`

您可以创建一个策略，授予在所有子网中创建、描述、修改和删除 EC2 Instance Connect Endpoint 的权限。或者，您只能通过将子网 ARN 指定为允许的 `Resource` 或使用 `ec2:SubnetID` 条件键来限制对指定子网的操作。您还可以使用 `aws:ResourceTag` 条件键明确允许或拒绝使用特定标签创建端点。有关更多信息，请参阅*《IAM 用户指南》*中的 [IAM 中的策略和权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html)。

**示例 IAM policy**

在以下示例 IAM 策略中，`Resource` 部分授予在所有子网中创建、修改和删除端点的权限，由星号 (`*`) 指定。`ec2:Describe*` API 操作不支持资源级权限。因此，`Resource` 元素中需要 `*` 通配符。

## 使用 EC2 Instance Connect 端点连接到实例的权限
<a name="iam-OpenTunnel"></a>

`ec2-instance-connect:OpenTunnel` 操作授予建立 TCP 连接到实例的权限，以通过 EC2 Instance Connect Endpoint 进行连接。您可以指定要使用的 EC2 Instance Connect Endpoint。或者，带有星号 (`*`) 的 `Resource` 允许用户使用任何可用的 EC2 Instance Connect Endpoint。您还可以根据是否存在作为条件键的资源标签来限制对实例的访问。

**Conditions**
+ `ec2-instance-connect:remotePort` - 实例上可用于建立 TCP 连接的端口。使用此条件键时，尝试连接到策略中指定的端口以外的任何其他端口上的实例都会导致失败。
+ `ec2-instance-connect:privateIpAddress` - 与要建立 TCP 连接的实例关联的目标私有 IP 地址。您可以指定单个 IP 地址（例如 `10.0.0.1/32`），也可以通过 CIDR 指定一系列 IP （例如 `10.0.1.0/28`）。使用此条件键时，尝试连接到具有不同私有 IP 地址或 CIDR 范围之外的实例会导致失败。
+ `ec2-instance-connect:maxTunnelDuration` - 已建立的 TCP 连接的最长持续时间。单位是秒，持续时间范围从最小 1 秒到最大 3600 秒（1 小时）。如果未指定条件，则将默认持续时间设置为 3600 秒（1 小时）。尝试连接到实例的时间超过 IAM policy 中指定的持续时间或超过默认最大值会导致失败。在指定的持续时间过后，连接将断开。

  如果在 IAM policy 中指定 `maxTunnelDuration` 且指定的值小于 3600 秒（默认值），则在连接到实例时必须在命令中指定 `--max-tunnel-duration`。有关如何连接到实例的信息，请参阅 [使用 EC2 Instance Connect 端点连接到 Amazon EC2 实例](connect-using-eice.md)。

还可以根据 EC2 Instance Connect 端点上是否存在资源标签来授予用户建立实例连接的权限。有关更多信息，请参阅*《IAM 用户指南》*中的 [IAM 中的策略和权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html)。

对于 Linux 实例，`ec2-instance-connect:SendSSHPublicKey` 操作授予将公有密钥推送到实例的权限。`ec2:osuser` 条件指定可以将公有密钥推送到实例的 OS（操作系统）用户的名称。使用用于启动实例的 [AMI 的默认用户名](connection-prereqs-general.md#connection-prereqs-get-info-about-instance)。有关更多信息，请参阅 [为 EC2 Instance Connect 授予 IAM 权限](ec2-instance-connect-configure-IAM-role.md)。

**示例 IAM 策略**

以下示例 IAM 策略允许 IAM 主体仅使用指定的 EC2 Instance Connect Endpoint（由指定的端点 ID `eice-123456789abcdef` 标识）连接到实例。只有满足所有条件，才能成功建立连接。

**注意**  
`ec2:Describe*` API 操作不支持资源级权限。因此，`Resource` 元素中需要 `*` 通配符。

------
#### [ Linux ]

此示例评估与实例的连接是否在端口 22（SSH）上建立，实例的私有 IP 地址是否在 `10.0.1.0/31` 范围内（`10.0.1.0` 与 `10.0.1.1` 之间），并且 `maxTunnelDuration` 小于或等于 `3600` 秒。`3600` 秒（1 小时）后连接断开。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [{
            "Sid": "EC2InstanceConnect",
            "Action": "ec2-instance-connect:OpenTunnel",
            "Effect": "Allow",
            "Resource": "arn:aws:ec2:us-east-1:111122223333:instance-connect-endpoint/eice-123456789abcdef",
            "Condition": {
                "NumericEquals": {
                    "ec2-instance-connect:remotePort": "22"
                },
                "IpAddress": {
                    "ec2-instance-connect:privateIpAddress": "10.0.1.0/31"
                },
                "NumericLessThanEquals": {
                    "ec2-instance-connect:maxTunnelDuration": "3600"
                }
            }
        },
        {
            "Sid": "SSHPublicKey",
            "Effect": "Allow",
            "Action": "ec2-instance-connect:SendSSHPublicKey",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "ec2:osuser": "ami-username"
                }
            }
        },
        {
            "Sid": "Describe",
            "Action": [
                "ec2:DescribeInstances",
                "ec2:DescribeInstanceConnectEndpoints"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}
```

------

------
#### [ Windows ]

此示例评估与实例的连接是否在端口 3389（RDP）上建立，实例的私有 IP 地址是否在 `10.0.1.0/31` 范围内（`10.0.1.0` 与 `10.0.1.1` 之间），并且 `maxTunnelDuration` 小于或等于 `3600` 秒。`3600` 秒（1 小时）后连接断开。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [{
            "Sid": "EC2InstanceConnect",
            "Action": "ec2-instance-connect:OpenTunnel",
            "Effect": "Allow",
            "Resource": "arn:aws:ec2:us-east-1:111122223333:instance-connect-endpoint/eice-123456789abcdef",
            "Condition": {
                "NumericEquals": {
                    "ec2-instance-connect:remotePort": "3389"
                },
                "IpAddress": {
                    "ec2-instance-connect:privateIpAddress": "10.0.1.0/31"
                },
                "NumericLessThanEquals": {
                    "ec2-instance-connect:maxTunnelDuration": "3600"
                }
            }
        },
        {
            "Sid": "Describe",
            "Action": [
                "ec2:DescribeInstances",
                "ec2:DescribeInstanceConnectEndpoints"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}
```

------

------

## 仅从特定 IP 地址范围进行连接的权限
<a name="iam-sourceip"></a>

以下示例 IAM policy 允许 IAM 主体连接到实例，条件是它们从策略中指定的 IP 地址范围内的 IP 地址进行连接。如果 IAM 主体从不在 `192.0.2.0/24`（本策略中的示例 IP 地址范围）内的 IP 地址调用 `OpenTunnel`，则响应为 `Access Denied`。有关更多信息，请参阅《IAM 用户指南》**中的 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceip](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceip)。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [{
            "Effect": "Allow",
            "Action": "ec2-instance-connect:OpenTunnel",
            "Resource": "arn:aws:ec2:us-east-1:111122223333:instance-connect-endpoint/eice-123456789abcdef",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "192.0.2.0/24"
                },
                "NumericEquals": {
                    "ec2-instance-connect:remotePort": "22"
                }
            }
        },
        {
            "Sid": "SSHPublicKey",
            "Effect": "Allow",
            "Action": "ec2-instance-connect:SendSSHPublicKey",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "ec2:osuser": "ami-username"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstances",
                "ec2:DescribeInstanceConnectEndpoints"
            ],
            "Resource": "*"
        }
    ]
}
```

------

# EC2 Instance Connect Endpoint 安全组
<a name="eice-security-groups"></a>

安全组控制允许到达和离开与其关联资源的流量。例如，除非与 Amazon EC2 实例关联的安全组特别允许，否则我们会拒绝进出该实例的流量。

以下示例演示了如何为 EC2 Instance Connect 端点和目标实例配置安全组规则。

**Topics**
+ [EC2 Instance Connect 端点安全组规则](#eice-security-group-rules)
+ [目标实例安全组规则](#resource-security-group-rules)

## EC2 Instance Connect 端点安全组规则
<a name="eice-security-group-rules"></a>

EC2 Instance Connect 端点的安全组规则必须允许离开该端点并指向目标实例的出站流量。您可以将实例安全组或 VPC 的 IPv4 或 IPv6 地址范围指定为目标。

由于指向端点的流量来自 EC2 Instance Connect 端点服务，因此无论端点安全组的入站规则如何，该流量都会被允许。要控制谁可以使用 EC2 Instance Connect 端点连接到实例，请使用 IAM 策略。有关更多信息，请参阅 [使用 EC2 Instance Connect 端点连接到实例的权限](permissions-for-ec2-instance-connect-endpoint.md#iam-OpenTunnel)。

**示例出站规则：安全组引用**  
以下示例使用了安全组引用，这意味着目标是一个与目标实例关联的安全组。此规则允许从该端点到使用此安全组的所有实例的出站流量。


| 协议 | 目标 | 端口范围 | Comment | 
| --- | --- | --- | --- | 
| TCP | 实例安全组的 ID | 22 | 允许指向与实例安全组关联的所有实例的出站 SSH 流量 | 

**示例出站规则：IPv4 地址范围**  
以下示例允许指向指定 IPv4 地址范围的出站流量。实例的 IPv4 地址是从其子网分配的，因此可以使用 VPC 的 IPv4 地址范围。


| 协议 | 目标 | 端口范围 | Comment | 
| --- | --- | --- | --- | 
| TCP | VPC IPv4 CIDR | 22 | 允许指向 VPC 的出站 SSH 流量 | 

**示例出站规则：IPv6 地址范围**  
以下示例允许指向指定 IPv6 地址范围的出站流量。实例的 IPv6 地址是从其子网分配的，因此可以使用 VPC 的 IPv6 地址范围。


| 协议 | 目标 | 端口范围 | Comment | 
| --- | --- | --- | --- | 
| TCP | VPC IPv6 CIDR | 22 | 允许指向 VPC 的出站 SSH 流量 | 

## 目标实例安全组规则
<a name="resource-security-group-rules"></a>

目标实例安全组规则必须允许来自该 EC2 Instance Connect 端点的入站流量。您可以将端点安全组或 IPv4 或 IPv6 地址范围指定为源。如果指定 IPv4 地址范围，则源取决于关闭还是开启了客户端 IP 保留功能。有关更多信息，请参阅 [注意事项](connect-with-ec2-instance-connect-endpoint.md#ec2-instance-connect-endpoint-prerequisites)。

由于安全组是有状态的，因此无论实例安全组的出站规则如何，都将允许响应流量离开 VPC。

**示例入站规则：安全组引用**  
以下示例使用了安全组引用，这意味着源是与该端点关联的安全组。此规则允许从端点到使用此安全组的所有实例的入站 SSH 流量，无论客户端 IP 保留功能处于开启还是关闭状态。如果 SSH 没有其他入站安全组规则，则实例仅接受来自该端点的 SSH 流量。


| 协议 | 来源 | 端口范围 | Comment | 
| --- | --- | --- | --- | 
| TCP | 端点安全组的 ID | 22 | 允许来自与端点安全组关联的资源的入站 SSH 流量 | 

**示例入站规则：客户端 IP 保留功能已关闭**  
以下示例允许来自指定 IPv4 地址范围的入站 SSH 流量。因为客户端 IP 保留功能已关闭，因此源 IPv4 地址是端点网络接口的地址。端点网络接口的地址由其子网分配，因此您可以使用 VPC 的 IPv4 地址范围来允许连接到 VPC 中的所有实例。


| 协议 | 来源 | 端口范围 | Comment | 
| --- | --- | --- | --- | 
| TCP | VPC IPv4 CIDR | 22 | 允许来自 VPC 的入站 SSH 流量 | 

**示例入站规则：客户端 IP 保留功能已开启**  
以下示例允许来自指定 IPv4 地址范围的入站 SSH 流量。因为客户端 IP 保留功能已开启，因此源 IPv4 地址是客户端的地址。


| 协议 | 来源 | 端口范围 | Comment | 
| --- | --- | --- | --- | 
| TCP | 公有 IPv4 地址范围 | 22 | 允许来自指定客户端 IPv4 地址范围的入站流量 | 

# 创建 EC2 Instance Connect Endpoint
<a name="create-ec2-instance-connect-endpoints"></a>

您可以创建 EC2 Instance Connect 端点来确保安全连接到实例。

**注意事项**
+ **共享子网**：您可以在与您共享的子网中创建 EC2 Instance Connect 端点。但您无法使用 VPC 所有者在与您共享的子网中创建的 EC2 Instance Connect 端点。
+ **IP 地址类型**：EC2 Instance Connect 端点支持以下地址类型，这些地址类型必须与您的子网兼容：
  + `ipv4`：仅连接到具有私有 IPv4 地址的 EC2 实例。
  + `dualstack`：连接到具有私有 IPv4 地址或 IPv6 地址的 EC2 实例。
  + `ipv6`：仅连接到具有 IPv6 地址的 EC2 实例。

**先决条件**  
您必须拥有创建 EC2 Instance Connect Endpoint 所需的 IAM 权限。有关更多信息，请参阅 [创建、描述、修改和删除 EC2 Instance Connect 端点的权限](permissions-for-ec2-instance-connect-endpoint.md#iam-CreateInstanceConnectEndpoint)。

------
#### [ Console ]

**创建 EC2 实例连接端点**

1. 通过 [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/) 打开 Amazon VPC 控制台。

1. 在左侧导航窗格中，选择**终端节点**。

1. 选择**创建端点**，然后按如下所示指定端点设置：

   1. （可选）对于**名称标签**，输入端点的名称。

   1. 对于**类型**，选择 **EC2 Instance Connect Endpoint**。

   1. 在**网络设置**下，对于 **VPC**，选择具有目标实例的 VPC。

   1. （可选）要保留客户端 IP 地址，请展开**其他设置**，然后选中**保留客户端 IP** 复选框。否则会默认将端点网络接口用作客户端 IP 地址。
**注意**  
仅当端点的 IP 地址类型配置为 IPv4 时，此选项才可用。

   1. （可选）对于**安全组**，请选择要与端点关联的安全组。否则会默认使用 VPC 的默认安全组。有关更多信息，请参阅 [EC2 Instance Connect Endpoint 安全组](eice-security-groups.md)。

   1. 对于**子网**，选择要在其中创建端点的子网。

   1. 对于 **IP 地址类型**，选择端点的 IP 地址类型。如果需要同时支持实例的 IPv4 和 IPv6 连接，则请选择**双堆栈**。如果需要支持客户端 IP 保留，则请选择 **IPv4**。

   1. （可选）若要添加标签，请选择**添加新标签**，然后输入该标签的键和值。

1. 检查您的设置，然后选择**创建端点**。

   端点的初始状态为**待处理**。您必须等待端点状态变为**可用**后，才能使用此端点连接到实例。这可能需要几分钟的时间。

1. 要使用端点连接到实例，请参阅 [连接到实例](connect-using-eice.md)。

------
#### [ AWS CLI ]

**创建 EC2 实例连接端点**  
使用 [https://docs.aws.amazon.com/cli/latest/reference/ec2/create-instance-connect-endpoint.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-instance-connect-endpoint.html) 命令。

```
aws ec2 create-instance-connect-endpoint \
    --subnet-id subnet-0123456789example
```

要指定端点支持的流量类型，请包含 `--ip-address-type` 参数。有效值为 `ipv4`、`dualstack` 或 `ipv6`。子网必须支持您指定的 IP 地址类型。省略 `--ip-address-type` 参数时，默认值由子网支持的 IP 地址类型决定。

```
aws ec2 create-instance-connect-endpoint \
    --subnet-id subnet-0123456789example \
    --ip-address-type ipv4
```

下面是示例输出。

```
{
        "OwnerId": "111111111111",
        "InstanceConnectEndpointId": "eice-0123456789example",
        "InstanceConnectEndpointArn": "arn:aws:ec2:us-east-1:111111111111:instance-connect-endpoint/eice-0123456789example",
        "State": "create-complete",
        "StateMessage": "",
        "DnsName": "eice-0123456789example.0123abcd.ec2-instance-connect-endpoint.us-east-1.amazonaws.com",
        "FipsDnsName": "eice-0123456789example.0123abcd.fips.ec2-instance-connect-endpoint.us-east-1.amazonaws.com",
        "NetworkInterfaceIds": [
            "eni-0123abcd"
        ],
        "VpcId": "vpc-0123abcd",
        "AvailabilityZone": "us-east-1a",
        "AvailabilityZoneId": "use1-az4",
        "CreatedAt": "2023-04-07T15:43:53.000Z",
        "SubnetId": "subnet-0123abcd",
        "PreserveClientIp": false,
        "SecurityGroupIds": [
            "sg-0123abcd"
        ],
        "Tags": [],
        "IpAddressType": "ipv4"
}
```

**监控创建状态**  
`State` 字段的初始值为 `create-in-progress`。在使用此端点连接到实例之前，请等待状态变为 `create-complete`。使用 [https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instance-connect-endpoints.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instance-connect-endpoints.html) 命令监控 EC2 Instance Connect 端点的状态。`--query` 参数会将结果筛选到 `State` 字段。

```
aws ec2 describe-instance-connect-endpoints --instance-connect-endpoint-ids eice-0123456789example --query InstanceConnectEndpoints[*].State --output text
```

下面是示例输出。

```
create-complete
```

------
#### [ PowerShell ]

**创建 EC2 Instance Connect Endpoint**  
使用 [https://docs.aws.amazon.com/powershell/latest/reference/items/New-EC2InstanceConnectEndpoint.html](https://docs.aws.amazon.com/powershell/latest/reference/items/New-EC2InstanceConnectEndpoint.html) cmdlet。

```
New-EC2InstanceConnectEndpoint -SubnetId subnet-0123456789example
```

要指定端点支持的流量类型，请包含 `-IpAddressType` 参数。有效值为 `ipv4`、`dualstack` 或 `ipv6`。子网必须支持您指定的 IP 地址类型。省略 `-IpAddressType` 参数时，默认值由子网支持的 IP 地址类型决定。

```
New-EC2InstanceConnectEndpoint -SubnetId subnet-0123456789example -IpAddressType ipv4
```

下面是示例输出。

```
OwnerId                     : 111111111111
InstanceConnectEndpointId   : eice-0123456789example
InstanceConnectEndpointArn  : arn:aws:ec2:us-east-1:111111111111:instance-connect-endpoint/eice-0123456789example
State                       : create-complete
StateMessage                : 
DnsName                     : eice-0123456789example.0123abcd.ec2-instance-connect-endpoint.us-east-1.amazonaws.com
FipsDnsName                 : eice-0123456789example.0123abcd.fips.ec2-instance-connect-endpoint.us-east-1.amazonaws.com
NetworkInterfaceIds         : {eni-0123abcd}
VpcId                       : vpc-0123abcd
AvailabilityZone            : us-east-1a
AvailabilityZoneId          : use1-az4
CreatedAt                   : 4/7/2023 3:43:53 PM
SubnetId                    : subnet-0123abcd
PreserveClientIp            : False
SecurityGroupIds            : {sg-0123abcd}
Tags                        : {}
IpAddressType               : ipv4
```

**监控创建状态**  
`State` 字段的初始值为 `create-in-progress`。在使用此端点连接到实例之前，请等待状态变为 `create-complete`。使用 [https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2InstanceConnectEndpoint.html](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2InstanceConnectEndpoint.html) cmdlet 监控 EC2 Instance Connect Endpoint 的状态。`.State.Value` 将结果筛选到 `State` 字段。

```
(Get-EC2InstanceConnectEndpoint -InstanceConnectEndpointId "eice-0123456789example").State.Value
```

下面是示例输出。

```
create-complete
```

------

# 修改 EC2 Instance Connect Endpoint
<a name="modify-ec2-instance-connect-endpoint"></a>

可使用 AWS CLI 或 SDK 修改现有 EC2 Instance Connect Endpoint。Amazon EC2 控制台不支持修改端点。

在开始之前，您必须具备所需的 IAM 权限。有关更多信息，请参阅 [创建、描述、修改和删除 EC2 Instance Connect 端点的权限](permissions-for-ec2-instance-connect-endpoint.md#iam-CreateInstanceConnectEndpoint)。

## 可修改的参数
<a name="eice-modify-parameters"></a>

可修改以下 EC2 Instance Connect Endpoint 参数：

**安全组**  
可以为 EC2 Instance Connect Endpoint 指定新的安全组。新的安全组将取代当前的安全组。  
修改安全组时，必须指定：  
+ 至少一个安全组，即使只是 VPC 中的默认安全组。
+ 安全组的 ID，而不是名称。

**IP 地址类型**  
可以为 EC2 Instance Connect Endpoint 指定新的 IP 地址。  
有效值：`ipv4` \$1`dualstack` \$1`ipv6`

**保留客户端 IP 设置**  
可指定是否保留客户端 IP 地址作为源。  
只有 IPv4 EC2 Instance Connect Endpoint 支持保留客户端 IP。启用 `PreserveClientIp` 后，端点的现有 IP 地址类型必须为 `ipv4`，或者如果修改相同请求中的 IP 地址类型，则新值必须为 `ipv4`。

------
#### [ AWS CLI ]

**修改 EC2 Instance Connect Endpoint**  
使用 [https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-connect-endpoint.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-connect-endpoint.html) 命令并指定要修改的 EC2 Instance Connect Endpoint 和参数。修改单个请求中的所有参数见以下示例。

```
aws ec2 modify-instance-connect-endpoint \
    --instance-connect-endpoint-id eice-0123456789example \
    --security-group-ids sg-0123456789example \
    --ip-address-type dualstack \
    --no-preserve-client-ip
```

下面是示例输出。

```
{
    "Return": true
}
```

**监视更新状态**  
在修改期间，EC2 Instance Connect Endpoint 状态更改为 `update-in-progress`。更新过程异步运行，完成时状态为 `update-complete` 或 `update-failed`。在状态更改为 `update-complete` 之前，端点将使用其旧配置。

使用 [https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instance-connect-endpoints.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instance-connect-endpoints.html) 命令监视更新状态。`--query` 参数会将结果筛选到 `State` 字段。

```
aws ec2 describe-instance-connect-endpoints \
    --instance-connect-endpoint-ids eice-0123456789example \
    --query InstanceConnectEndpoints[*].State --output text
```

下面是示例输出。

```
update-complete
```

------
#### [ PowerShell ]

**修改 EC2 Instance Connect Endpoint**  
使用 [https://docs.aws.amazon.com/powershell/latest/reference/items/Edit-EC2InstanceConnectEndpoint.html](https://docs.aws.amazon.com/powershell/latest/reference/items/Edit-EC2InstanceConnectEndpoint.html) cmdlet 并指定要修改的 EC2 Instance Connect Endpoint 和参数。修改单个请求中的所有参数见以下示例。

```
Edit-EC2InstanceConnectEndpoint `
    -InstanceConnectEndpointId eice-0123456789example `
    -SecurityGroupIds sg-0123456789example `
    -IpAddressType dualstack `
    -PreserveClientIp $false
```

下面是示例输出。

```
True
```

**监视更新状态**  
在修改期间，EC2 Instance Connect Endpoint 状态更改为 `update-in-progress`。更新过程异步运行，完成时状态为 `update-complete` 或 `update-failed`。在状态更改为 `update-complete` 之前，端点将使用其旧配置。

使用 [https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2InstanceConnectEndpoint.html](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2InstanceConnectEndpoint.html) 命令监视更新状态。`.State.Value` 将结果筛选到 `State` 字段。

```
(Get-EC2InstanceConnectEndpoint -InstanceConnectEndpointId "eice-0123456789example").State.Value
```

下面是示例输出。

```
update-complete
```

------

# 删除 EC2 Instance Connect 端点
<a name="delete-ec2-instance-connect-endpoint"></a>

用完 EC2 Instance Connect 端点后，您可以将其删除。

您必须拥有创建 EC2 Instance Connect Endpoint 所需的 IAM 权限。有关更多信息，请参阅 [创建、描述、修改和删除 EC2 Instance Connect 端点的权限](permissions-for-ec2-instance-connect-endpoint.md#iam-CreateInstanceConnectEndpoint)。

使用控制台删除 EC2 Instance Connect 端点时，该端点首先会进入**正在删除**状态。如果删除成功，已删除的端点不会再出现。如果删除失败，则状态为 **delete-failed**，同时**状态消息**会提供失败原因。

使用 AWS CLI 删除 EC2 Instance Connect 端点时，该端点会进入 `delete-in-progress` 状态。如果删除成功，则会进入 `delete-complete` 状态。如果删除失败，则状态为 `delete-failed`，同时 `StateMessage` 会提供失败原因。

------
#### [ Console ]

**要删除 EC2 Instance Connect Endpoint**

1. 通过 [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/) 打开 Amazon VPC 控制台。

1. 在左侧导航窗格中，选择**终端节点**。

1. 选择端点。

1. 选择**操作**、**删除 VPC 端点**。

1. 当系统提示进行确认时，输入 **delete**。

1. 选择**删除**。

------
#### [ AWS CLI ]

**要删除 EC2 Instance Connect Endpoint**  
使用 [https://docs.aws.amazon.com/cli/latest/reference/ec2/delete-instance-connect-endpoint.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/delete-instance-connect-endpoint.html) 命令并指定要删除的 EC2 Instance Connect Endpoint 的 ID。

```
aws ec2 delete-instance-connect-endpoint --instance-connect-endpoint-id eice-03f5e49b83924bbc7
```

下面是示例输出。

```
{
    "InstanceConnectEndpoint": {
        "OwnerId": "111111111111",
        "InstanceConnectEndpointId": "eice-0123456789example",
        "InstanceConnectEndpointArn": "arn:aws:ec2:us-east-1:111111111111:instance-connect-endpoint/eice-0123456789example",
        "State": "delete-in-progress",
        "StateMessage": "",
        "NetworkInterfaceIds": [],
        "VpcId": "vpc-0123abcd",
        "AvailabilityZone": "us-east-1d",
        "AvailabilityZoneId": "use1-az2",
        "CreatedAt": "2023-02-07T12:05:37+00:00",
        "SubnetId": "subnet-0123abcd"
    }
}
```

------
#### [ PowerShell ]

**删除 EC2 实例连接端点**  
使用 [https://docs.aws.amazon.com/cli/latest/reference/ec2/delete-instance-connect-endpoint.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/delete-instance-connect-endpoint.html) cmdlet 并指定要删除的 EC2 Instance Connect Endpoint 的 ID。

```
Remove-EC2InstanceConnectEndpoint -InstanceConnectEndpointId eice-03f5e49b83924bbc7
```

下面是示例输出。

```
@{
    InstanceConnectEndpoint = @{
        OwnerId = "111111111111"
        InstanceConnectEndpointId = "eice-0123456789example"
        InstanceConnectEndpointArn = "arn:aws:ec2:us-east-1:111111111111:instance-connect-endpoint/eice-0123456789example"
        State = "delete-in-progress"
        StateMessage = ""
        NetworkInterfaceIds = @()
        VpcId = "vpc-0123abcd"
        AvailabilityZone = "us-east-1d"
        AvailabilityZoneId = "use1-az2"
        CreatedAt = "2023-02-07T12:05:37+00:00"
        SubnetId = "subnet-0123abcd"
    }
}
```

------

# 使用 EC2 Instance Connect 端点连接到 Amazon EC2 实例
<a name="connect-using-eice"></a>

您可以使用 EC2 Instance Connect 端点连接到支持 SSH 或 RDP 的 Amazon EC2 实例。

**先决条件**
+ 您必须拥有连接到 EC2 Instance Connect Endpoint 所需的 IAM 权限。有关更多信息，请参阅 [使用 EC2 Instance Connect 端点连接到实例的权限](permissions-for-ec2-instance-connect-endpoint.md#iam-OpenTunnel)。
+ EC2 Instance Connect 端点必须处于以下状态之一：
  + 对于新端点为 **create-complete**
  + 对于进行修改的现有端点为 **update-in-progress**、**update-complete** 或 **update-failed**。修改端点时，该端点继续使用其原来的配置，直到状态更改为 **update-complete**。

    如果 VPC 没有 EC2 Instance Connect 端点，您可以创建一个。有关更多信息，请参阅 [创建 EC2 Instance Connect Endpoint](create-ec2-instance-connect-endpoints.md)。
+ EC2 Instance Connect 端点 IP 地址类型必须与实例的 IP 地址类型兼容。如果您的端点 IP 地址类型为双堆栈，则其可以同时适用于 IPv4 和 IPv6 地址。
+ （Linux 实例）要使用 Amazon EC2 控制台连接到您的实例，或者要使用 CLI 进行连接并让 EC2 Instance Connect 处理临时密钥，您的实例必须安装 EC2 Instance Connect。有关更多信息，请参阅 [安装 EC2 Instance Connect](ec2-instance-connect-set-up.md)。
+ 确保实例安全组允许来自 EC2 Instance Connect 端点的入站 SSH 流量。有关更多信息，请参阅 [目标实例安全组规则](eice-security-groups.md#resource-security-group-rules)。

**Topics**
+ [使用 Amazon EC2 控制台连接到您的 Linux 实例](#connect-using-the-ec2-console)
+ [使用 SSH 连接到 Linux 实例](#eic-connect-using-ssh)
+ [使用 AWS CLI 通过其实例 ID 连接到 Linux 实例](#eic-connect-using-cli)
+ [使用 RDP 连接到 Windows 实例](#eic-connect-using-rdp)
+ [故障排除](#troubleshoot-eice)

## 使用 Amazon EC2 控制台连接到您的 Linux 实例
<a name="connect-using-the-ec2-console"></a>

可以使用 Amazon EC2 控制台（基于浏览器的客户端）连接到实例，如下所示。

**使用 Amazon EC2 控制台连接到实例**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择 **Instances (实例)**。

1. 选择该实例，然后选择**连接**。

1. 选择 **EC2 Instance Connect** 选项卡。

1. 对于**连接类型**，选择**使用私有 IP 进行连接**。

1. 选择**私有 IPv4 地址**或 **IPv6 地址**。这些选项的可用性取决于分配给实例的 IP 地址。如果某个选项显示为灰色，则表示您的实例没有为其分配该类型的 IP 地址。

1. 对于 **EC2 Instance Connect 端点**，选择该 EC2 Instance Connect 端点的 ID。
**注意**  
EC2 Instance Connect 端点必须与您在上一步中选择的 IP 地址兼容。如果您的端点 IP 地址类型为双堆栈，则其可以同时适用于 IPv4 和 IPv6 地址。有关更多信息，请参阅 [创建 EC2 Instance Connect Endpoint](create-ec2-instance-connect-endpoints.md)。

1. 对于**用户名**，如果您用于启动实例的 AMI 使用的用户名不是 `ec2-user`，请输入正确的用户名。

1. 对于**最大隧道持续时间（秒）**，输入 SSH 连接允许的最大持续时间。

   该持续时间必须符合 IAM 策略中指定的任何 `maxTunnelDuration` 条件。如果您无权访问该 IAM 策略，请联系您的管理员。

1. 选择**连接**。这将为您的实例打开一个终端窗口。

## 使用 SSH 连接到 Linux 实例
<a name="eic-connect-using-ssh"></a>

您可以使用 SSH 连接到您的 Linux 实例，然后使用 `open-tunnel` 命令建立私有隧道。可在单连接或多连接模式下使用 `open-tunnel`。您可以指定实例 ID、私有 IPv4 地址或 IPv6 地址。

有关如何使用 AWS CLI 通过 SSH 连接到您的 Linux 实例，请参阅 [使用 AWS CLI进行连接](ec2-instance-connect-methods.md#connect-linux-inst-eic-cli-ssh)。

下面的示例使用了 [OpenSSH](https://www.openssh.com/)。您可以使用任何其他支持代理模式的 SSH 客户端。

### 单一 连接
<a name="ssh-single-connection"></a>

**仅允许使用 SSH 和 `open-tunnel` 命令建立到实例的单一连接**

按照如下所示使用 `ssh` 和 [https://docs.aws.amazon.com/cli/latest/reference/ec2-instance-connect/open-tunnel.html](https://docs.aws.amazon.com/cli/latest/reference/ec2-instance-connect/open-tunnel.html) AWS CLI 命令。`-o` 代理命令包含创建通往实例的私有隧道的 `open-tunnel` 命令。

```
ssh -i my-key-pair.pem ec2-user@i-1234567890abcdef0 \
    -o ProxyCommand='aws ec2-instance-connect open-tunnel --instance-id i-1234567890abcdef0'
```

对于：
+ `-i` - 指定用于启动实例的密钥对。
+ `ec2-user@i-1234567890abcdef0` - 指定用于启动实例的 AMI 的用户名和实例 ID。对于具有 IPv6 地址的实例，您必须指定 IPv6 地址而不是实例 ID。
+ `--instance-id` - 指定要连接到的实例的 ID。或者，指定 `%h`，它从用户那里提取实例 ID。对于具有 IPv6 地址的实例，请将 `--instance-id i-1234567890abcdef0` 替换为 `--private-ip-address 2001:db8::1234:5678:1.2.3.4`。

### 多连接
<a name="ssh-multi-connection"></a>

要允许与一个实例建立多连接，请先运行 [https://docs.aws.amazon.com/cli/latest/reference/ec2-instance-connect/open-tunnel.html](https://docs.aws.amazon.com/cli/latest/reference/ec2-instance-connect/open-tunnel.html) AWS CLI 命令开始侦听新的 TCP 连接，然后使用 `ssh` 创建到实例的新 TCP 连接和私有隧道。

**要使用 SSH 和 `open-tunnel` 命令允许建立到实例的多连接**

1. 运行以下命令开始侦听本地机器上指定端口上的新 TCP 连接。

   ```
   aws ec2-instance-connect open-tunnel \
       --instance-id i-1234567890abcdef0 \
       --local-port 8888
   ```

   预期输出：

   ```
   Listening for connections on port 8888.
   ```

1. 在*新的终端窗口*中，运行以下 `ssh` 命令以创建到实例的新 TCP 连接和私有隧道。

   ```
   ssh -i my-key-pair.pem ec2-user@localhost -p 8888
   ```

   预期输出 - 在*第一个*终端窗口中，您将看到以下内容：

   ```
   [1] Accepted new tcp connection, opening websocket tunnel.
   ```

   您可能还会看到以下内容：

   ```
   [1] Closing tcp connection.
   ```

## 使用 AWS CLI 通过其实例 ID 连接到 Linux 实例
<a name="eic-connect-using-cli"></a>

如果仅知道实例 ID，则可以使用 [ec2-instance-connect ssh](https://docs.aws.amazon.com/cli/latest/reference/ec2-instance-connect/ssh.html) AWS CLI 命令通过 SSH 客户端连接到实例。有关更多信息，请参阅 [使用 AWS CLI进行连接](ec2-instance-connect-methods.md#connect-linux-inst-eic-cli-ssh)。

**先决条件**
+ 安装 AWS CLI 版本 2 并使用您的凭证对其进行配置。有关更多信息，请参阅《AWS Command Line Interface 用户指南》中的 [Install or update to the latest version of the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) 和 [Configure the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)**。
+ 或者，在其预先经过身份验证的 shell 中打开 AWS CloudShell 并运行 AWS CLI 命令。

**要使用实例 ID 和 EC2 Instance Connect Endpoint 连接到实例**  
如果仅知道实例 ID，请使用 [ec2-instance-connect ssh](https://docs.aws.amazon.com/cli/latest/reference/ec2-instance-connect/ssh.html) CLI 命令，并指定 `ssh` 命令、实例 ID 和 `--connection-type` 参数及 `eice` 值，以使用 EC2 Instance Connect 端点。如果实例只有 IPv6 地址，您还必须包含 `--instance-ip` 参数和 IPv6 地址。
+ 如果实例有私有 IPv4 地址（也可以有 IPv6 地址），则请使用以下命令和参数：

  ```
  aws ec2-instance-connect ssh \
      --instance-id i-1234567890example \
      --os-user ec2-user \
      --connection-type eice
  ```
+ 如果实例只有 IPv6 地址，则请包含 `--instance-ip` 参数和 IPv6 地址：

  ```
  aws ec2-instance-connect ssh \
      --instance-id i-1234567890example \
      --instance-ip 2001:db8::1234:5678:1.2.3.4 \
      --os-user ec2-user \
      --connection-type eice
  ```

**提示**  
如果出现错误，则请确保使用的是 AWS CLI 版本 2。`ssh` 参数仅适用于 AWS CLI 版本 2。有关更多信息，请参阅《*AWS Command Line Interface 开发人员指南*》中的[关于 AWS CLI 版本 2](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html#welcome-versions-v2)。

## 使用 RDP 连接到 Windows 实例
<a name="eic-connect-using-rdp"></a>

您可以在 EC2 Instance Connect Endpoint 上使用远程桌面协议（RDP）连接到没有公有 IPv4 地址或公有 DNS 名称的 Windows 实例。

**使用 RDP 客户端连接到 Windows 实例**

1. 完成[使用 RDP 连接到 Windows 实例](connect-rdp.md)中的步骤 1 至 8。在步骤 8 中下载 RDP 桌面文件后，您将收到**无法连接**的消息，这是意料之中的，因为您的实例没有公有 IP 地址。

1. 运行以下命令，建立到实例所在 VPC 的私有隧道。`--remote-port` 必须是 `3389`，因为 RDP 默认使用端口 3389。

   ```
   aws ec2-instance-connect open-tunnel \
       --instance-id i-1234567890abcdef0 \
       --remote-port 3389 \
       --local-port any-port
   ```

1. 在**下载**文件夹中，找到您下载的 RDP 桌面文件，然后将其拖到 RDP 客户端窗口中。

1. 右键单击该 RDP 桌面文件并选择**编辑**。

1. 在**编辑 PC** 窗口中，对于 **PC 名称**（要连接到的实例），输入 `localhost:local-port`，其中 `local-port` 使用的值与在步骤 2 中指定的值相同，然后选择**保存**。

   请注意，以下**编辑 PC** 窗口的屏幕截图来自 Mac 上的 Microsoft 远程桌面。如果您使用的是 Windows 客户端，窗口可能会有所不同。  
![\[RDP 客户端的 PC 名称字段中包含示例“localhost:5555”。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/ec2-instance-connect-endpoint-rdp.png)

1. 在 RDP 客户端中，右键单击您刚才配置的 PC，然后选择**连接**来连接到您的实例。

1. 根据提示，输入管理员账户的解密密码。

## 故障排除
<a name="troubleshoot-eice"></a>

使用以下信息帮助您诊断和修复您在使用 EC2 Instance Connect Endpoint 连接实例时可能遇到的问题。

### 无法连接到您的实例
<a name="troubleshoot-eice-1"></a>

以下是您可能无法连接到实例的常见原因：
+ 安全组 – 检查分配给 EC2 Instance Connect Endpoint 和您的实例的安全组。有关所需安全组规则的更多信息，请参阅 [EC2 Instance Connect Endpoint 安全组](eice-security-groups.md)。
+ 实例状态 – 验证您的实例是否处于 `running` 状态。
+ 密钥对 – 如果您用于连接的命令需要私钥，请确认您的实例是否有公钥，以及您是否拥有相应的私钥。
+ IAM 权限 – 验证您是否拥有所需的 IAM 权限。有关更多信息，请参阅 [授予使用 EC2 Instance Connect 端点的权限](permissions-for-ec2-instance-connect-endpoint.md)。

有关 Linux 实例的更多故障排除技巧，请参阅 [排查 Amazon EC2 Linux 实例的连接问题](TroubleshootingInstancesConnecting.md)。有关 Windows 实例的故障排除技巧，请参阅 [排查连接到 Amazon EC2 Windows 实例时遇到的问题](troubleshoot-connect-windows-instance.md)。

### ErrorCode: AccessDeniedException
<a name="troubleshoot-eice-2"></a>

如果您收到 `AccessDeniedException` 错误，并且 IAM policy 中已指定 `maxTunnelDuration` 条件，确保当您连接到实例时指定 `--max-tunnel-duration` 参数。有关该参数的更多信息，请参阅 *AWS CLI 命令参考*中的 [https://docs.aws.amazon.com/cli/latest/reference/ec2-instance-connect/open-tunnel.html](https://docs.aws.amazon.com/cli/latest/reference/ec2-instance-connect/open-tunnel.html)。

# 通过 EC2 Instance Conect Endpoint 建立的日志连接
<a name="log-ec2-instance-connect-endpoint-using-cloudtrail"></a>

您可以使用日志记录资源操作并使用 AWS CloudTrail 日志审核通过 EC2 Instance Connect Endpoint 建立的连接。

有关将 AWS CloudTrail 与 Amazon EC2 结合使用的更多信息，请参阅 [使用 AWS CloudTrail 记录 Amazon EC2 API 调用](monitor-with-cloudtrail.md)。

## 使用 AWS CloudTrail 记录 EC2 Instance Connect Endpoint API 调用日志
<a name="ec2-instance-connect-endpoint-api-calls-cloudtrail"></a>

EC2 Instance Connect Endpoint 资源操作将作为管理事件记录到 CloudTrail。当进行以下 API 调用时，该活动将在**事件历史记录**中作为 CloudTrail 事件记录：
+ `CreateInstanceConnectEndpoint`
+ `DescribeInstanceConnectEndpoints`
+ `DeleteInstanceConnectEndpoint`

您可以在 AWS 账户中查看、搜索和下载最新事件。有关更多信息，请参阅 *AWS CloudTrail 用户指南*中的[使用 CloudTrail 事件历史记录查看事件](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/view-cloudtrail-events.html)。

## 使用 AWS CloudTrail 审核使用 EC2 Instance Connect Endpoint 连接到实例的用户
<a name="ec2-instance-connect-endpoint-audit-users-cloudtrail"></a>

通过 EC2 Instance Connect Endpoint 对实例的连接尝试将记录在 CloudTrail 的**事件历史记录**中。当通过 EC2 Instance Connect Endpoint 启动对实例的连接时，该连接将被记录为带有 `OpenTunnel` 的 `eventName` 的 CloudTrail 管理事件。

您可以创建将 CloudTrail 事件路由到目标的 Amazon EventBridge 规则。有关更多信息，请参阅 [Amazon EventBridge 用户指南](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-what-is.html)。

以下是在 CloudTrail 中记录的 `OpenTunnel` 管理事件示例。

```
{
     "eventVersion": "1.08",
     "userIdentity": {
         "type": "IAMUser",
         "principalId": "ABCDEFGONGNOMOOCB6XYTQEXAMPLE",
         "arn": "arn:aws:iam::1234567890120:user/IAM-friendly-name",
         "accountId": "123456789012",
         "accessKeyId": "ABCDEFGUKZHNAW4OSN2AEXAMPLE",
         "userName": "IAM-friendly-name"
     },
     "eventTime": "2023-04-11T23:50:40Z",
     "eventSource": "ec2-instance-connect.amazonaws.com",
     "eventName": "OpenTunnel",
     "awsRegion": "us-east-1",
     "sourceIPAddress": "1.2.3.4",
     "userAgent": "aws-cli/1.15.61 Python/2.7.10 Darwin/16.7.0 botocore/1.10.60",
     "requestParameters": {
         "instanceConnectEndpointId": "eici-0123456789EXAMPLE",
         "maxTunnelDuration": "3600",
         "remotePort": "22",
         "privateIpAddress": "10.0.1.1"
     },
     "responseElements": null,
     "requestID": "98deb2c6-3b3a-437c-a680-03c4207b6650",
     "eventID": "bbba272c-8777-43ad-91f6-c4ab1c7f96fd",
     "readOnly": false,
     "resources": [{
         "accountId": "123456789012",
         "type": "AWS::EC2::InstanceConnectEndpoint",
         "ARN": "arn:aws:ec2:us-east-1:123456789012:instance-connect-endpoint/eici-0123456789EXAMPLE"
     }],
     "eventType": "AwsApiCall",
     "managementEvent": true,
     "recipientAccountId": "123456789012",
     "eventCategory": "Management"
}
```

# EC2 Instance Connect Endpoint 的服务相关角色
<a name="eice-slr"></a>

Amazon EC2 使用 AWS Identity and Access Management（IAM）[服务相关角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html#iam-term-service-linked-role)。服务相关角色是一种独特类型的 IAM 角色，它与 Amazon EC2 直接相关。服务相关角色由 Amazon EC2 预定义，并包含 Amazon EC2 代表您调用其他 AWS 服务 所需的一切权限。有关更多信息，请参阅《IAM 用户指南》**中的[服务相关角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create-service-linked-role.html)。

## EC2 Instance Connect 端点的服务相关角色
<a name="slr-permissions"></a>

Amazon EC2 使用 **AWSServiceRoleForEC2InstanceConnect** 在您的账户中创建和管理 EC2 Instance Connect 端点需要的网络接口。

**AWSServiceRoleForEC2InstanceConnect** 服务相关角色信任以下服务来担任该角色：
+ `ec2-instance-connect.amazonaws.com`

**AWSServiceRoleForEC2InstanceConnect** 服务相关角色使用以下托管式策略：
+ **Ec2InstanceConnectEndpoint**

要查看托管式策略的权限，请参阅《AWS 托管式策略参考》**中的 [Ec2InstanceConnectEndpoint](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/Ec2InstanceConnectEndpoint.html)。

## 创建 EC2 Instance Connect 端点的服务相关角色
<a name="create-slr"></a>

您无需手动创建该服务相关角色。创建 EC2 Instance Connect 端点时，Amazon EC2 将为您创建该服务相关角色。

## 编辑 EC2 Instance Connect 端点的服务相关角色
<a name="edit-slr"></a>

EC2 Instance Connect Endpoint 不允许您编辑 **AWSServiceRoleForEC2InstanceConnect** 服务相关角色。

## 删除 EC2 Instance Connect 端点的服务相关角色
<a name="delete-slr"></a>

如果您不再需要使用 EC2 Instance Connect Endpoint，我们建议您删除 **AWSServiceRoleForEC2InstanceConnect** 服务相关角色。

必须首先删除所有 EC2 Instance Connect 端点资源后，然后才能删除该服务相关角色。

要删除服务相关角色，请参阅《IAM 用户指南》**中的[删除服务相关角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_manage_delete.html#id_roles_manage_delete-slr)。

您必须配置权限，允许 IAM 实体（用户、组或角色）创建、编辑或删除服务相关角色。有关更多信息，请参阅*《IAM 用户指南》*中的[服务关联角色权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create-service-linked-role.html#service-linked-role-permissions)。

# EC2 Instance Connect 端点的限额
<a name="eice-quotas"></a>

对于每项 AWS 服务，您的 AWS 账户都具有默认配额（以前称为限制）。除非另有说明，否则，每个配额是区域特定的。

您的 AWS 账户具有以下与 EC2 Instance Connect 端点相关的限额。


| 名称 | 默认值 | 可调整 | 
| --- | --- | --- | 
| 在每个 AWS 区域 中，每个 AWS 账户 的最大 EC2 Instance Connect 端点数量 | 5 | 否 | 
| 每个 VPC 的最大 EC2 Instance Connect 端点数量 | 1 | 否 | 
| 每个子网的最大 EC2 Instance Connect 端点数量 | 1 | 否 | 
| 每个 EC2 Instance Connect Endpoint 的最大并发连接数 | 20 | 否 | 