

# 使用公有 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
   ```

------