

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

# 配置指南
<a name="configuration-guide"></a>

本配置指南为技术受众提供了部署后指导，说明如何在 AWS 产品上进一步定制和与研究与工程工作室集成。

**Topics**
+ [身份管理](manage-users.md)
+ [创建子域名](create-subdomains.md)
+ [创建 ACM 证书](acm-certificate.md)
+ [Amazon CloudWatch 日志](log-groups.md)
+ [设置自定义权限边界](permission-boundaries.md)
+ [配置 RES-ready AMIs](res-ready-ami.md)
+ [可配置的 DCV 会话验证阈值](dcv-session-validation-thresholds.md)
+ [安装 RES 后设置自定义域名](setup-custom-domain-after-install.md)

# 身份管理
<a name="manage-users"></a>

研究与工程工作室可以使用任何符合 SAML 2.0 标准的身份提供商。要使用 Amazon Cognito 作为本机用户目录，允许用户使用 Co VDIs gnito 用户身份登录门户网站和 Linux，请参阅。[设置亚马逊 Cognito 用户](setting-up-cognito-users.md)如果您使用外部资源部署 RES 或计划使用 IAM 身份中心，请参阅[使用 IAM 身份中心设置单点登录 (SSO)](sso-idc.md)。如果您有自己的符合 SAML 2.0 标准的身份提供商，请参阅[为单点登录 (SSO) 配置您的身份提供商](configure-id-federation.md)。

**Topics**
+ [设置亚马逊 Cognito 用户](setting-up-cognito-users.md)
+ [活动目录同步](active-directory-sync.md)
+ [使用 IAM 身份中心设置单点登录 (SSO)](sso-idc.md)
+ [为单点登录 (SSO) 配置您的身份提供商](configure-id-federation.md)
+ [为用户设置密码](setting-user-passwords.md)

# 设置亚马逊 Cognito 用户
<a name="setting-up-cognito-users"></a>

研究与工程工作室 (RES) 允许您将 Amazon Cognito 设置为本机用户目录。这允许用户使用 Amazon Cognito 用户身份登录门户网站和基于 Linux VDIs 的门户。管理员可以使用 AWS 控制台中的 csv 文件将多个用户导入用户池。有关批量用户导入的更多详情，请参阅 *Amazon Cognito 开发者*指南中的[从 CSV 文件将用户导入用户池](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-using-import-tool.html)。RES 支持同时使用基于 Amazon Cognito 的本地用户目录和 SSO。

## 管理设置
<a name="setting-up-cognito-users-admin"></a>

**作为 RES 管理员，要将 RES 环境配置为使用 Amazon Cognito 作为用户目录，请在**身份**管理页面上切换**使用 Amazon Cognito 作为用户**目录按钮，该页面可从 “环境管理” 页面访问。**要允许用户自行注册，请在同一页面上切换**用户自助注册**按钮。

![\[显示 cognito 目录设置的身份管理页面\]](http://docs.aws.amazon.com/zh_cn/res/latest/ug/images/id-management-cognito-directory.png)


## 用户 up/sign 登录流程
<a name="setting-up-cognito-users-user-signin"></a>

如果启用了**用户自助注册**，则可以向用户提供您的 Web 应用程序的 URL。在那里，用户会找到一个选项，上面写着 “**还不是用户？” 在这里注册**。

![\[用户登录页面，可选择自行注册\]](http://docs.aws.amazon.com/zh_cn/res/latest/ug/images/user-sign-up.png)


## 注册流程
<a name="setting-up-cognito-users-signup"></a>

选择 “**还不是用户” 的用户？ 在此处注册**将被要求输入他们的电子邮件和密码以创建帐户。

![\[为用户自行注册创建账户页面\]](http://docs.aws.amazon.com/zh_cn/res/latest/ug/images/create-account.png)


作为注册流程的一部分，系统将要求用户输入电子邮件中收到的验证码以完成注册过程。

![\[验证码输入页面\]](http://docs.aws.amazon.com/zh_cn/res/latest/ug/images/verify-email.png)


如果禁用了自助注册，用户将看不到注册链接。管理员必须在 RES 之外的 Amazon Cognito 中配置用户。（请参阅 *Amazon Cognito 开发者指南*中的以[管理员身份创建用户账户](https://docs.aws.amazon.com/cognito/latest/developerguide/how-to-create-user-accounts.html)。）

![\[验证码输入页面\]](http://docs.aws.amazon.com/zh_cn/res/latest/ug/images/user-sign-in.png)


## 登录页面选项
<a name="setting-up-cognito-users-login"></a>

如果同时启用 SSO 和 Amazon Cognito，则会出现一个**使用组织 SSO 登录的**选项。当用户单击该选项时，它会将他们重新定向到其 SSO 登录页面。默认情况下，如果启用 Amazon Cognito，则用户将使用 Amazon Cognito 进行身份验证。

![\[用户登录页面，提供注册、验证账户或使用组织 SSO 登录的选项\]](http://docs.aws.amazon.com/zh_cn/res/latest/ug/images/org-sso-sign-in.png)


## 约束
<a name="setting-up-cognito-users-constraints"></a>
+ 您的 Amazon Cognito **群组名称**最多可以包含六个字母；只接受小写字母。
+ Amazon Cognito 注册不允许使用两个用户名相同但域名不同的电子邮件地址。
+ 如果同时启用 Active Directory 和 Amazon Cognito，并且系统检测到用户名重复，则只允许活动目录用户进行身份验证。管理员应采取措施避免在 Amazon Cognito 及其活动目录之间配置重复的用户名。
+ 由于 RES 不支持基于 Amazon Cognito 的 Windows 实例进行基于亚马逊 Cognito 的身份验证， VDIs 因此不允许 Cognito 用户启动基于 Windows 的身份验证。

## Amazon Cognito 用户的管理员群组
<a name="admin-group-cognito-users-sync"></a>

默认情况下，RES 授予`admins`组内的 Cognito 用户管理员权限。要将用户添加到 Cognito `admins` 群组，请执行以下操作：

1. 导航到 [Amazon Cognito 控制台](https://console.aws.amazon.com/cognito/home)，然后选择用于 RES 的现有用户池。

1. 导航到 “**用户管理**” 下的 “**群组**”，然后选择 “**创建群组”。**

1. 在**创建群组**页面的群**组名称中，**输入`admins`。

1. 选择您创建的`admins`群组，然后选择**将用户添加到群组以**添加 Cognito 用户。

1. 按照以下步骤手动启动 Cognito 同步。[同步](#setting-up-cognito-users-sync)

成功同步 Amazon Cognito 后，添加到`admins`群组的用户将获得管理员权限。

## 同步
<a name="setting-up-cognito-users-sync"></a>

RES 每小时都会将其数据库与来自 Amazon Cognito 的用户和群组信息同步。任何属于 “管理员” 组的用户都将获得其中的sudo权限。 VDIs

您也可以从 Lambda 控制台手动启动同步。

**手动启动同步过程：**

1. 打开 [Lambda 控制台](https://console.aws.amazon.com/lambda)。

1. 搜索 Cognito 同步 Lambda。此 Lambda 遵循以下命名约定:. `{RES_ENVIRONMENT_NAME}_cognito-sync-lambda` 

1. 选择 “**测试**”。

1. 在 “**测试事件**” 部分，选择右上角的 “**测试**” 按钮。事件正文格式无关紧要。

## Cognito 的安全注意事项
<a name="setting-up-cognito-users-security"></a>

在 2024.12 版本之前，默认启用了作为 Amazon Cognito Plus 计划功能一部分的[用户活动记录](https://docs.aws.amazon.com/cognito/latest/developerguide/feature-plans-features-plus.html)。此功能已从基准部署中删除，以便为想要试用 RES 的客户节省成本。您可以根据需要重新启用此功能，以与贵组织的云安全设置保持一致。

# 活动目录同步
<a name="active-directory-sync"></a>



## 运行时配置
<a name="active-directory-sync-runtime"></a>

在安装过程中，所有与活动目录 (AD) 相关的 AWS CloudFormation 参数都是可选的。

![\[活动目录可选细节\]](http://docs.aws.amazon.com/zh_cn/res/latest/ug/images/active-directory-details.png)


对于运行时提供的任何密钥 ARN（例如，`ServiceAccountCredentialsSecretArn`或`DomainTLSCertificateSecretArn`），请务必在密钥中添加以下标签，以便 RES 获得读取密钥值的权限：
+ 键：`res:EnvironmentName`，值：`<your RES environment name>`
+ 键：`res:ModuleName`，值：`directoryservice`

门户网站中的任何 AD 配置更新都将在下一次预定广告同步（每小时）期间自动获取。用户在更改 AD 配置后可能需要重新配置 SSO（例如，如果他们切换到其他 AD）。

初始安装后，管理员可以在**身份管理**页面下的 RES Web 门户中查看或编辑 AD 配置：

![\[活动目录域配置设置详细信息\]](http://docs.aws.amazon.com/zh_cn/res/latest/ug/images/res-active-directory-domain.png)


![\[活动目录同步弹出窗口\]](http://docs.aws.amazon.com/zh_cn/res/latest/ug/images/active-directory-synchronization.png)


### 自动加入活动目录
<a name="toggle-join-active-directory"></a>

管理员可以配置 “**自动加入 Active** Directory” 设置，以控制 VDI 启动期间的目录域加入行为。

 **配置选项：**
+  **已启用**-在启动期间自动将 Windows 和 Linux VDIs 加入你的目录域。
+  **已禁用**-关闭自动加入域名。无论是否加入域，Linux 实例都可以启动。Windows 实例需要加入域才能成功启动，因此管理员必须在其自定义启动脚本中包含域加入逻辑。

**重要**  
 如果您禁用此设置，请验证您的 Windows 实例自定义启动脚本是否包含必要的域加入逻辑。

### 其他设置
<a name="active-directory-sync-addl-settings"></a>

**筛选条件**

管理员可以使用 “用户筛选器” 和 “群组筛选器” 选项**筛选要同步的用户****或群组**。筛选器必须遵循 [LDAP 筛选器语法](https://ldap.com/ldap-filters/)。过滤器示例如下：

```
(sAMAccountname=<user>)
```

**自定义 SSSD 参数**

管理员可以提供包含 SSSD 参数和值的键值对字典，以写入集群实例上的 SSSD 配置文件`[domain_type/DOMAIN_NAME]`部分。RES 会自动应用 SSSD 更新，它会在集群实例上重新启动 SSSD 服务并触发 AD 同步过程。

一些常见的自定义 SSSD 设置有：
+ `enumerate`-设置为 “true” 以缓存目录服务中的所有用户和组条目。禁用此功能可能会缩短用户首次登录的延迟。
+ `ldap_id_mapping`-设置为 “true” 以将 LDAP/AD 用户和组映射 IDs 到本地 UIDs 和 Linux 系统 GIDs 上。启用此功能可以提高与现有 POSIX 脚本和应用程序的兼容性。

有关 SSSD 配置文件的完整描述，请参阅 Linux 手册页。`SSSD`

![\[其他 SSSD 配置\]](http://docs.aws.amazon.com/zh_cn/res/latest/ug/images/res-additional-sssd-config1.png)


SSSD 参数和值必须与 RES SSSD 配置兼容，如下所述：
+ `id_provider`由 RES 内部设置，不得修改。
+ AD 相关配置（包括`ldap_uri``ldap_search_base`、`ldap_default_bind_dn`和）`ldap_default_authtok`是根据提供的其他 AD 配置设置的，不得修改。

以下示例启用 SSSD 日志的调试级别：

![\[显示输入的新密钥和值对的其他 SSSD 配置\]](http://docs.aws.amazon.com/zh_cn/res/latest/ug/images/res-additional-sssd-config2.png)


## 初始广告同步后的电子邮件更新（版本 2025.09 及更高版本）
<a name="ad-sync-update-email"></a>

如果 Active Directory 用户的电子邮件地址已更改，管理员可以手动启动 AD 同步，或者等待下一次预定的 AD 同步，以获取更改并将其同步到 RES。

## 如何手动启动或停止同步（版本 2025.03 及更高版本）
<a name="active-directory-sync-start-stop"></a>

导航到**身份管理**页面，然后在 A **ctive Directory 域**容器中选择 “**启动 AD 同步**” 按钮，按需触发 AD 同步。

![\[活动目录域配置\]](http://docs.aws.amazon.com/zh_cn/res/latest/ug/images/res-ad-directory-sync1.png)


要停止正在进行的 AD 同步，请在 Ac **tive Directory 域**容器中选择 “**停止 AD 同步**” 按钮。

![\[显示停止同步选项的 Active Directory 域配置页面\]](http://docs.aws.amazon.com/zh_cn/res/latest/ug/images/res-ad-directory-sync2.png)


您还可以在 Act **ive Directory 域**容器中查看 AD 同步状态和最新同步时间。

![\[显示最新同步时间的活动目录域配置页面\]](http://docs.aws.amazon.com/zh_cn/res/latest/ug/images/res-ad-directory-sync3.png)


## 如何手动运行同步（版本 2024.12 和 2024.12.01）
<a name="active-directory-sync-manually"></a>

Active Directory 同步过程已从集群管理器基础设施主机转移到后台的一次性亚马逊弹性容器服务 (ECS) 任务。该过程计划每小时运行一次，您可以在`<res-environment-name>-ad-sync-cluster`集群下的 Amazon ECS 控制台中找到正在运行的 ECS 任务。

**要手动启动它，请执行以下操作：**

1. 导航到 [Lambda 控制台](https://console.aws.amazon.com/lambda)并搜索名为的 lambda。`<res-environment>-scheduled-ad-sync`

1. **打开 Lambda 函数并转到测试** 

1. 在**事件 JSON** 中输入以下内容：

   ```
   {
       "detail-type": "Scheduled Event"
   }
   ```

1. 选择**测试**。

1. 在 → 日志**组 **CloudWatch**→ 下查看正在运行的 AD Sync 任务的日志**`/<environment-name>/ad-sync`。您将看到每个正在运行的 ECS 任务的日志。选择最新的，查看日志。

**注意**  
如果您更改 AD 参数或添加 AD 过滤器，RES 将根据新指定的参数添加新用户，并删除之前已同步但不再包含在 LDAP 搜索空间中的用户。
RES 无法移除主动分配给项目的用户或群组。要让 RES 将用户从环境中移除，必须将其从项目中移除。

## SSO 配置
<a name="active-directory-sync-sso-config"></a>

提供 AD 配置后，用户必须设置单点登录 (SSO)，才能以 AD 用户身份登录 RES Web 门户。SSO 配置已从 **“常规设置”** 页面移至新的**身份管理**页面。有关设置 SSO 的更多信息，请参阅[身份管理](manage-users.md)。

# 使用 IAM 身份中心设置单点登录 (SSO)
<a name="sso-idc"></a>

如果您还没有将身份中心连接到托管 Active Directory，请从开始[步骤 1：设置身份中心](#set-up-identity-center)。如果您已经将身份中心与托管的 Active Directory 连接在一起，请从开始[步骤 2：Connect 连接到身份中心](#connect-identity-center)。

**注意**  
如果您要部署到某个 GovCloud 区域，请在部署 Research and Engineering Studio 的 AWS GovCloud (US) 分区账户中设置 SSO。

## 步骤 1：设置身份中心
<a name="set-up-identity-center"></a>

### 启用 IAM Identity Center
<a name="enabling-identity-center"></a>

1. 登录 [AWS Identity and Access Management 控制台](https://console.aws.amazon.com/iam)。

1. 打开**身份中心**。

1. 请选择**启用**。

1. 选择 “**启用方式**” AWS Organizations。

1. 选择**继续**。

**注意**  
请确保您所在的区域与托管活动目录所在的区域相同。

### 将 IAM 身份中心连接到托管活动目录
<a name="connecting-identity-center-ad"></a>

启用 IAM Identity Center 后，请完成以下推荐的设置步骤：

1. 在导航窗格中，选择**设置**。

1. 在 “**身份来源**” 下，选择 “**操作**”，然后选择 “**更改身份来源**”。

1. 在 “**现有目录**” 下，选择您的目录。

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

1. 查看您的更改并在确认框**ACCEPT**中输入。

1. 选择**更改身份源**。

### 将用户和群组同步到身份中心
<a name="syncing-identity-center"></a>

所做的更改完成后，将出现一个绿色的确认横幅。[将 IAM 身份中心连接到托管活动目录](#connecting-identity-center-ad)

1. 在确认横幅中，选择**启动引导式设置**。

1. 在**配置属性映射**中，选择**下一步**。

1. 在 “**用户**” 部分下，输入要同步的用户。

1. 选择**添加**。

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

1. 查看您的更改，然后选择**保存配置**。

1. 同步过程可能需要几分钟。如果您收到有关用户未同步的警告消息，请选择**恢复同步**。

### 启用用户
<a name="enabling-users"></a>

1. 从菜单中选择 “**用户**”。

1. 选择要为其启用访问权限的用户。

1. 选择**启用用户访问权限**。

## 步骤 2：Connect 连接到身份中心
<a name="connect-identity-center"></a>

### 在 IAM 身份中心设置应用程序
<a name="setup-application-identity-center"></a>

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

1. 选择**应用程序**。

1. 选择**添加应用程序**。

1. 在 “**设置” 偏好设置**下，选择 “**我有要设置的应用程序**”。

1. 在**应用程序类型**下，选择 **SAML 2.0**。

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

1. 输入您要使用的显示名称和描述。

1. 在 **IAM 身份中心元数据**下，复制 **IAM 身份中心 SAML 元数据**文件的链接。在使用 RES 门户配置 IAM 身份中心时，您将需要这个。

1. 在 “**应用程序属性**” 下，输入您的**应用程序起始 URL**。例如 `<your-portal-domain>/sso`。

1. 在 “**应用程序 ACS URL**” 下，输入来自 RES 门户的重定向 URL。要找到这个：

   1. 在 “**环境管理**” 下，选择 “**常规设置”**。

   1. 选择 “**身份提供商**” 选项卡。

   1. 在 “**单点登录**” 下，您将找到 **SAML 重定向网址**。

1. 在 “**应用程序 SAML 受众**” 下，输入 Amazon Cognito URN。

   要创建骨灰盒，请执行以下操作：

   1. 在 RES 门户中，打开 **“常规设置”**。

   1. 在 “**身份提供商**” 选项卡下，找到**用户池 ID**。

   1. 将**用户池 ID** 添加到以下字符串：

      ```
      urn:amazon:cognito:sp:<user_pool_id>
      ```

1. **输入亚马逊 Cognito URN 后，选择提交。**

### 为应用程序配置属性映射
<a name="configure-attribute-mappings"></a>

1. 在**身份中心**中，打开您创建的应用程序的详细信息。

1. 选择**操作**，然后选择**编辑属性映射**。

1. 在**主题**下，输入 **\$1\$1user:email\$1**。

1. 在 “**格式**” 下，选择 “**电子邮件地址**”。

1. 选择**添加新属性映射**。

1. **在应用程序的用户属性**下，输入 “电子邮件”。

1. 在 **IAM Identity Center 中映射到此字符串值或用户属性**下，输入**\$1\$1user:email\$1**。

1. 在 “**格式**” 下，输入 “未指定”。

1. 选择**保存更改**。

### 在 IAM 身份中心向应用程序添加用户
<a name="add-users-to-application"></a>

1. 在 Identity Center 中，为你创建的应用程序打开**分配的用户**，然后选择**分配用户**。

1. 选择要分配应用程序访问权限的用户。

1. 选择 **分配用户**。

### 在 RES 环境中设置 IAM 身份中心
<a name="setup-sso-environment"></a>

1. 在 “研究与工程工作室” 环境中，在 “**环境管理**” 下，打开 **“常规设置”**。

1. 打开 “**身份提供商**” 选项卡。

1. 在 “**单点登录**” 下，选择 “**编辑”（在 “****状态**” 旁边）。

1. 在表格中填写以下信息：

   1. 选择 **SAML**。

   1. 在**提供商名称**下，输入用户友好的名称。

   1. 选择**输入元数据文档端点 URL**。

   1. 输入您在期间复制的 URL [在 IAM 身份中心设置应用程序](#setup-application-identity-center)。

   1. 在**提供商电子邮件属性**下，输入 “电子邮件”。

   1. 选择**提交**。

1. 刷新页面并检查**状态**是否显示为已启用。

# 为单点登录 (SSO) 配置您的身份提供商
<a name="configure-id-federation"></a>

Research and Engineering Studio 与任何 SAML 2.0 身份提供商集成，以验证用户对 RES 门户 这些步骤提供了与您选择的 SAML 2.0 身份提供商集成的指导。如果您打算使用 IAM 身份中心，请参阅[使用 IAM 身份中心设置单点登录 (SSO)](sso-idc.md)。

**注意**  
在 IDP SAML 断言和 Active Directory 中，用户的电子邮件地址必须匹配。您需要将您的身份提供商与 Active Directory 连接起来，并定期同步用户。

**Topics**
+ [配置您的身份提供商](#configure-id-federation_config-idp)
+ [将 RES 配置为使用您的身份提供商](#configure-id-federation_config-res)
+ [在非生产环境中配置您的身份提供商](#configure-id-federation-demo-env)
+ [调试 SAML IdP 问题](#configure-id-federation_debug)

## 配置您的身份提供商
<a name="configure-id-federation_config-idp"></a>

本节提供了使用 RES Amazon Cognito 用户池中的信息配置身份提供商的步骤。

1. RES 假设您有一个 AD（AWS 托管 AD 或自配置 AD），其用户身份允许访问 RES 门户和项目。将您的 AD 连接到您的身份服务提供商并同步用户身份。请查看您的身份提供商的文档，了解如何连接您的 AD 和同步用户身份。例如，请参阅《*AWS IAM Identity Center 用户指南》*中的[使用 Active Directory 作为身份源](https://docs.aws.amazon.com/singlesignon/latest/userguide/gs-ad.html)。

1. 在您的身份提供商 (IdP) 中为 RES 配置 SAML 2.0 应用程序。此配置需要以下参数：
   + **SAML 重定向网址** — 您的 IdP 用来向服务提供商发送 SAML 2.0 响应的网址。
**注意**  
根据 IdP 的不同，SAML 重定向网址可能有不同的名称：  
应用程序 URL
断言消费者服务 (ACS) 网址
ACS POST 绑定网址

**获取网址**

     1. 以**管理员或**集群**管理员**身份登录 RES。

     1. 导航到 “**环境管理**” ⇒ **“常规设置” ⇒ “****身份提供者**”。

     1. 选择 **SAML 重定向网址**。
   + **SAML 受众 URI** — 服务提供商方面 SAML 受众实体的唯一 ID。
**注意**  
根据 IdP 的不同，SAML 受众 URI 的名称可能有所不同：  
ClientID
应用程序 SAML 受众
SP 实体 ID

     按以下格式提供输入。

     ```
     urn:amazon:cognito:sp:user-pool-id
     ```

**要查找您的 SAML 受众 URI**

     1. 以**管理员或**集群**管理员**身份登录 RES。

     1. 导航到 “**环境管理**” ⇒ **“常规设置” ⇒ “****身份提供者**”。

     1. 选择**用户池 ID**。

1. 发布到 RES 的 SAML 断言必须将以下内容 fields/claims 设置为用户的电子邮件地址：
   + SAML 主题或姓名 ID
   + SAML 电子邮件

1. 根据配置，您的 IdP 会添加 fields/claims 到 SAML 断言中。RES 需要这些字段。默认情况下，大多数提供商会自动填写这些字段。如果必须对其进行配置，请参阅以下字段输入和值。

   
   + **AudienceRestriction**：设置为 `urn:amazon:cognito:sp:user-pool-id`。*user-pool-id*替换为您的 Amazon Cognito 用户池的 ID。

     ```
     <saml:AudienceRestriction>
         <saml:Audience> urn:amazon:cognito:sp:user-pool-id
     </saml:AudienceRestriction>
     ```
   + **响应**-设置`InResponseTo`为`https://user-pool-domain/saml2/idpresponse`。*user-pool-domain*替换为您的 Amazon Cognito 用户池的域名。

     ```
     <saml2p:Response 
       Destination="https://user-pool-domain/saml2/idpresponse"
       ID="id123" 
       InResponseTo="_dd0a3436-bc64-4679-a0c2-cb4454f04184" 
       IssueInstant="Date-time stamp" 
       Version="2.0" 
       xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema">
     ```
   + **SubjectConfirmationData**— 设置`Recipient`为您的用户池`saml2/idpresponse`终端节点和`InResponseTo`原始 SAML 请求 ID。

     ```
     <saml2:SubjectConfirmationData 
       InResponseTo="_dd0a3436-bc64-4679-a0c2-cb4454f04184" 
       NotOnOrAfter="Date-time stamp" 
       Recipient="https://user-pool-domain/saml2/idpresponse"/>
     ```
   + **AuthnStatement**— 按以下方式进行配置：

     ```
     <saml2:AuthnStatement AuthnInstant="2016-10-30T13:13:28.152TZ"
       SessionIndex="32413b2e54db89c764fb96ya2k" SessionNotOnOrAfter="2016-10-30T13:13:28">
         <saml2:SubjectLocality />
         <saml2:AuthnContext>
             <saml2:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:Password</saml2:AuthnContextClassRef>
         </saml2:AuthnContext>
     </saml2:AuthnStatement>
     ```

1. 如果您的 SAML 应用程序有注销 URL 字段，请将其设置为:。`<domain-url>/saml2/logout`

**获取域名网址**

   1. 以**管理员或**集群**管理员**身份登录 RES。

   1. 导航到 “**环境管理**” ⇒ **“常规设置” ⇒ “****身份提供者**”。

   1. 选择**域名网址**。

1. 如果您的 IdP 接受签名证书以建立与 Amazon Cognito 的信任，请下载亚马逊 Cognito 签名证书并将其上传到您的 IdP 中。

**获取签名证书**

   1. 打开 [Amazon Cognito 控制台](https://console.aws.amazon.com/cognito/v2/idp/user-pools/)。

   1. 选择您的用户池。您的用户池应该是`res-<environment name>-user-pool`。

   1. 选择 “**登录体验**” 选项卡。

   1. 在**联合身份提供商登录**部分，选择**查看签名证书**。  
![\[Amazon Cognito 控制台，在所选用户池的联合身份提供者登录部分中带有查看签名证书按钮。\]](http://docs.aws.amazon.com/zh_cn/res/latest/ug/images/cognito-user-pool-signing-cert.png)

      您可以使用此证书在该信赖方上设置 Active Directory IDP `relying party trust`、添加和启用 SAML 支持。
**注意**  
这不适用于 Keycloak 和 IDC。

   1. 应用程序设置完成后，下载 SAML 2.0 应用程序元数据 XML 或 URL。你将在下一节中使用它。

## 将 RES 配置为使用您的身份提供商
<a name="configure-id-federation_config-res"></a>

**完成 RES 的单点登录设置**

1. 以**管理员或**集群**管理员**身份登录 RES。

1. 导航到 “**环境管理**” ⇒ **“常规设置” ⇒ “****身份提供者**”。  
![\[RES 中的环境设置用户界面，包括单点登录部分。\]](http://docs.aws.amazon.com/zh_cn/res/latest/ug/images/environment-settings.png)

1. 在 “**单点登录**” 下，选择状态指示器旁边的编辑图标以打开 “**单点登录配置**” 页面。  
![\[RES 中的单点登录配置用户界面。\]](http://docs.aws.amazon.com/zh_cn/res/latest/ug/images/sso-config.png)

   1. 对于**身份提供商**，请选择 **SAML**。

   1. 在提供**商名称**中，输入您的身份提供商的唯一名称。
**注意**  
不允许使用以下名称：  
Cognito
IdentityCenter

   1. 在 “**元数据文档来源**” 下，选择相应的选项并上传元数据 XML 文档或提供身份提供商提供的 URL。

   1. 在 “提供**商电子邮件属性”** 中，输入文本值`email`。

   1. 选择**提交**。

1. 重新加载**环境设置**页面。如果配置正确，则启用单点登录。

## 在非生产环境中配置您的身份提供商
<a name="configure-id-federation-demo-env"></a>

如果您使用提供的[外部资源](prerequisites.md#external-resources)创建了非生产 RES 环境，并将 IAM Identity Center 配置为身份提供商，则可能需要配置其他身份提供商，例如 Okta。RES SSO 启用表单要求提供三个配置参数：

1. 提供商名称-无法修改

1. 元数据文档或 URL-可以修改

1. 提供商电子邮件属性-可以修改

**要修改元数据文档和提供者电子邮件属性，请执行以下操作：**

1.  转到 Amazon Cognito 控制台。

1. 从导航栏中选择 “**用户池**”。

1. 选择您的用户池以查看**用户池概述**。

1. 在**登录体验**选项卡中，前往**联合身份提供商登录，然后打开您配置的身份提供商**。

1. 通常，您只需要更改元数据并保持属性映射不变。要更新**属性映射**，请选择**编辑**。要更新**元数据文档**，请选择**替换元数据**。  
![\[Amazon Cognito 用户池概述。\]](http://docs.aws.amazon.com/zh_cn/res/latest/ug/images/res-attributemetadata.png)

1. 如果您编辑了属性映射，则需要在 DynamoDB 中更新`<environment name>.cluster-settings`表。

   1. 打开 DynamoDB 控制台，然后从导航栏中**选择 “表”**。

   1. 查找并选择`<environment name>.cluster-settings`表格，然后从 “**操作**” 菜单中选择 “**浏览项目**”。

   1. 在 “**扫描或查询项目**” 下，转至 “**筛选**” 并输入以下参数：
      + **属性名称** — `key`
      + **价值** — `identity-provider.cognito.sso_idp_provider_email_attribute`

   1. 选择**运行**。

1. 在 “**已退回的商品**” 下，找到该`identity-provider.cognito.sso_idp_provider_email_attribute`字符串并选择 “**编辑”**，修改字符串以匹配您在 Amazon Cognito 中所做的更改。  
![\[Amazon Cognito 更新了 DynamoDB 中返回的筛选条件和项目。\]](http://docs.aws.amazon.com/zh_cn/res/latest/ug/images/res-scanqueryitems.png)

## 调试 SAML IdP 问题
<a name="configure-id-federation_debug"></a>

**SAML-tracer** — 你可以在 Chrome 浏览器中使用这个扩展程序来跟踪 SAML 请求并检查 SAML 断言值。如需了解更多信息，请参阅 Chrome [网上应用店中的 SAML-Tracer](https://chromewebstore.google.com/detail/saml-tracer/mpdajninpobndbfcldcmbpnnbhibjmch?pli=1)。

**SAML 开发人员工具** — OneLogin 提供可用于解码 SAML 编码值和检查 SAML 断言中必填字段的工具。有关更多信息，请参阅 OneLogin 网站上的 [Base 64 Decode \$1 Inflate](https://www.samltool.com/decode.php)。

**Amazon CloudWatch 日志** — 您可以在 “日志” 中查看 RES CloudWatch 日志中是否有错误或警告。您的日志位于名称格式为的日志组中`/res-environment-name/cluster-manager`。

**Amazon Cognito 文档** *— 有关 SAML 与 Amazon Cognito 集成的更多信息，请参阅《亚马逊 Cognito 开发者指南[》中的将 SAML 身份提供商添加到](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-saml-idp.html)用户池。*

# 为用户设置密码
<a name="setting-user-passwords"></a>

1. 在[Directory Service 控制台中，](https://console.aws.amazon.com/directoryservicev2/)为创建的堆栈选择目录。

1. 在 “**操作**” 菜单下，选择 “**重置用户密码**”。

1. 选择用户并输入新密码。

1. 选择**重置密码**。

# 创建子域名
<a name="create-subdomains"></a>

如果您使用的是自定义域名，则需要设置子域名以支持门户的 Web 和 VDI 部分。

**注意**  
如果您要部署到某个 GovCloud 区域，请在托管该域公共托管区域的商业分区账户中设置 Web 应用程序和 VDI 子域。

1. 打开 [Route 53 控制台](https://console.aws.amazon.com/route53/)。

1. 找到您创建的域名，然后选择**创建记录**。

1. 输入 “web” 作为**记录名称**。

1. 选择 **CNAME** 作为**记录类型**。

1. 在 “**值**” 栏中，输入您在初始电子邮件中收到的链接。

1. 选择**创建记录**。

1. 要为 VDC 创建记录，请检索 NLB 地址。

   1. 打开 [AWS CloudFormation 控制台](https://console.aws.amazon.com/cloudformation)。

   1. 选择 `<environment-name>-vdc`。

   1. 选择**资源**并打开`<environmentname>-vdc-external-nlb`。

   1. 从 NLB 中复制 DNS 名称。

1. 打开 [Route 53 控制台](https://console.aws.amazon.com/route53/)。

1. 找到您的域名并选择**创建记录**。

1. 在 “**记录名称**” 下输入`vdc`。

1. 在**记录类型**下，选择 **CNAME**。

1. 对于 NLB，请输入 DNS。

1. 选择**创建记录**。

# 创建 ACM 证书
<a name="acm-certificate"></a>

默认情况下，RES 使用域 amazonaws.com 将门户网站托管在应用程序负载均衡器下。要使用自己的域，您需要配置由您提供或请求自 AWS Certificate Manager (ACM) 的公共 SSL/TLS 证书。如果您使用 ACM，您将收到一个 AWS 资源名称，您需要将其作为参数提供，以加密客户端和 Web 服务主机之间的 SSL/TLS 通道。

**提示**  
如果您要部署外部资源演示包，则需要在中部署外部资源堆栈`PortalDomainName`时在中输入您选择的域[创建外部资源](create-external-resources.md)。

**要为自定义域创建证书，请执行以下操作：**

1. 在控制台中，打开[AWS Certificate Manager](https://console.aws.amazon.com/acm/home#/certificates/request)以请求公共证书。如果您要在某个 GovCloud 地区进行部署，请在您的 GovCloud 分区账户中创建证书。

1. 选择 “**申请公共证书**”，然后选择 “**下一步**”。

1. 在 “**域名**” 下，为`*.PortalDomainName`和请求证书`PortalDomainName`。

1. 在 “**验证方法**” 下，选择 **DNS 验证**。

1. 选择**请求**。

1. 在**证书**列表中，打开您请求的证书。每个证书的状态都将为 “**待验证**”。
**注意**  
如果您看不到您的证书，请刷新列表。

1. 请执行以下操作之一：
   + **商业部署：**

     从每个请求的**证书的证书详细信息**中，选择在 R **oute 53 中创建记录**。证书的状态应更改为 “**已签发**”。
   + **GovCloud 部署：**

     如果您在某个 GovCloud 区域中部署，请复制 CNAME 密钥和值。在商业分区账户中，使用这些值在公共托管区域中创建新记录。证书的状态应更改为 “**已签发**”。

1. 复制要输入的新证书 ARN 作为参数。`ACMCertificateARNforWebApp`

# Amazon CloudWatch 日志
<a name="log-groups"></a>

研究与工程工作室在安装 CloudWatch 过程中会创建以下日志组。有关默认保留的内容，请参见下表：


| CloudWatch 日志组 | 保留 | 
| --- | --- | 
| /aws/lambda/<installation-stack-name>-cluster-endpoints | 永不过期 | 
| /aws/lambda/<installation-stack-name>-cluster-manager-scheduled-ad-sync | 永不过期 | 
| /aws/lambda/<installation-stack-name>-cluster-settings | 永不过期 | 
| /aws/lambda/<installation-stack-name>-oauth-credentials | 永不过期 | 
| /aws/lambda/<installation-stack-name>-self-signed-certificate | 永不过期 | 
| /aws/lambda/<installation-stack-name>-update-cluster-prefix-list | 永不过期 | 
| /aws/lambda/<installation-stack-name>-vdc-scheduled-event-transformer | 永不过期 | 
| /aws/lambda/<installation-stack-name>-vdc-update-cluster-manager-client-scope | 永不过期 | 
| /<installation-stack-name>/cluster-manager | 3 个月 | 
| /<installation-stack-name>/vdc/controller | 3 个月 | 
| /<installation-stack-name>/vdc/dcv-broker | 3 个月 | 
| /<installation-stack-name>/vdc/dcv-connection-gateway | 3 个月 | 

如果您想更改日志组的默认保留期，可以转到[CloudWatch 控制台](https://console.aws.amazon.com/cloudwatch)并按照[更改日志中的 CloudWatch 日志数据保留期](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html#SettingLogRetention)的说明进行操作。

# 设置自定义权限边界
<a name="permission-boundaries"></a>

 从 2024.04 开始，您可以选择通过附加自定义权限边界来修改 RES 创建的角色。通过在 Boundary 参数中提供权限边界的 ARN，可以将自定义权限边界定义为 RES CloudFormation 安装的一部分。 IAMPermission如果将此参数留空，则不会对任何 RES 角色设置权限边界。以下是 RES 角色操作所需的操作列表。确保您计划使用的任何权限边界都明确允许执行以下操作：

```
[
    {
        "Effect": "Allow",
        "Resource": "*",
        "Sid": "ResRequiredActions",
        "Action": [
            "access-analyzer:*",
            "account:GetAccountInformation",
            "account:ListRegions",
            "acm:*",
            "airflow:*",
            "amplify:*",
            "amplifybackend:*",
            "amplifyuibuilder:*",
            "aoss:*",
            "apigateway:*",
            "appflow:*",
            "application-autoscaling:*",
            "appmesh:*",
            "apprunner:*",
            "aps:*",
            "athena:*",
            "auditmanager:*",
            "autoscaling-plans:*",
            "autoscaling:*",
            "backup-gateway:*",
            "backup-storage:*",
            "backup:*",
            "batch:*",
            "bedrock:*",
            "budgets:*",
            "ce:*",
            "cloud9:*",
            "cloudformation:*",
            "cloudfront:*",
            "cloudtrail-data:*",
            "cloudtrail:*",
            "cloudwatch:*",
            "codeartifact:*",
            "codebuild:*",
            "codeguru-profiler:*",
            "codeguru-reviewer:*",
            "codepipeline:*",
            "codestar-connections:*",
            "codestar-notifications:*",
            "codestar:*",
            "cognito-identity:*",
            "cognito-idp:*",
            "cognito-sync:*",
            "comprehend:*",
            "compute-optimizer:*",
            "cur:*",
            "databrew:*",
            "datapipeline:*",
            "datasync:*",
            "dax:*",
            "detective:*",
            "devops-guru:*",
            "dlm:*",
            "dms:*",
            "drs:*",
            "dynamodb:*",
            "ebs:*",
            "ec2-instance-connect:*",
            "ec2:*",
            "ec2messages:*",
            "ecr:*",
            "ecs:*",
            "eks:*",
            "elastic-inference:*",
            "elasticache:*",
            "elasticbeanstalk:*",
            "elasticfilesystem:*",
            "elasticloadbalancing:*",
            "elasticmapreduce:*",
            "elastictranscoder:*",
            "es:*",
            "events:*",
            "firehose:*",
            "fis:*",
            "fms:*",
            "forecast:*",
            "fsx:*",
            "geo:*",
            "glacier:*",
            "glue:*",
            "grafana:*",
            "guardduty:*",
            "health:*",
            "iam:*",
            "identitystore:*",
            "imagebuilder:*",
            "inspector2:*",
            "inspector:*",
            "internetmonitor:*",
            "iot:*",
            "iotanalytics:*",
            "kafka:*",
            "kafkaconnect:*",
            "kinesis:*",
            "kinesisanalytics:*",
            "kms:*",
            "lambda:*",
            "lightsail:*",
            "logs:*",
            "memorydb:*",
            "mgh:*",
            "mobiletargeting:*",
            "mq:*",
            "neptune-db:*",
            "organizations:DescribeOrganization",
            "osis:*",
            "personalize:*",
            "pi:*",
            "pipes:*",
            "polly:*",
            "quicksight:*",
            "rds-data:*",
            "rds:*",
            "redshift-data:*",
            "redshift-serverless:*",
            "redshift:*",
            "rekognition:*",
            "resiliencehub:*",
            "resource-groups:*",
            "route53:*",
            "route53domains:*",
            "route53resolver:*",
            "rum:*",
            "s3:*",
            "sagemaker:*",
            "scheduler:*",
            "schemas:*",
            "sdb:*",
            "secretsmanager:*",
            "securityhub:*",
            "serverlessrepo:*",
            "servicecatalog:*",
            "servicequotas:*",
            "ses:*",
            "signer:*",
            "sns:*",
            "sqs:*",
            "ssm:*",
            "ssmmessages:*",
            "states:*",
            "storagegateway:*",
            "sts:*",
            "support:*",
            "tag:GetResources",
            "tag:GetTagKeys",
            "tag:GetTagValues",
            "textract:*",
            "timestream:*",
            "transcribe:*",
            "transfer:*",
            "translate:*",
            "vpc-lattice:*",
            "waf-regional:*",
            "waf:*",
            "wafv2:*",
            "wellarchitected:*",
            "wisdom:*",
            "xray:*"
        ]
    }
]
```

# 配置 RES-ready AMIs
<a name="res-ready-ami"></a>

借助可重置的 Amazon 系统映像 (AMI)，您可以在自定义 AMI 上预安装虚拟桌面实例 (VDI) 的 RES 依赖项。使用 RES-ready AMI 可以缩短使用预烘焙映像的 VDI 实例的启动时间。使用 EC2 Image Builder，您可以构建自己的软件堆栈并将其注册 AMIs 为新的软件堆栈。有关 Image Builder 的更多信息，请参阅 [Image Builder 用户指南](https://docs.aws.amazon.com/imagebuilder/latest/userguide/what-is-image-builder.html)。

在开始之前，必须[部署最新版本的 RES](update-the-product.md)。

**重要**  
在 RES 2025.06.01 之前 AMIs 创建的 Res-ready 与 RES 2025.06.01 和所有后续版本不兼容。将 RES 环境从 2025.06.01 之前的版本升级到最新版本时，必须重建所有 RES就绪。 AMIs

**Topics**
+ [准备一个 IAM 角色以访问 RES 环境](#prepare-role)
+ [创建 EC2 Image Builder 组件](#image-builder-component)
+ [准备好您的 EC2 Image Builder 配方](#prepare-recipe)
+ [配置 EC2 Image Builder 基础架构](#configure-ib-infrastructure)
+ [配置 Image Builder 图像管道](#image-builder-pipeline)
+ [运行 Image Builder 图像管道](#run-image-pipeline)
+ [在 RES 中注册新的软件堆栈](#register-res-ready-stack)

## 准备一个 IAM 角色以访问 RES 环境
<a name="prepare-role"></a>

要从 EC2 Image Builder 访问 RES 环境服务，您必须创建或修改名为 RES-的 IAM 角色EC2InstanceProfileForImageBuilder。有关配置在 Image Builder 中使用的 IAM 角色的信息，请参阅 Imag *e Builder 用户指南*[中的AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/imagebuilder/latest/userguide/image-builder-setting-up.html#image-builder-IAM-prereq)。

**你的角色需要：**
+ 包括 Amazon EC2 服务的信任关系。
+ AmazonS3 ReadOnlyAccess、亚马逊SSMManagedInstanceCore 和 EC2InstanceProfileForImageBuilder 政策。

## 创建 EC2 Image Builder 组件
<a name="image-builder-component"></a>

按照《Image [Builder *用户指南》中的说明使用 Image Builder* 控制台创建组件](https://docs.aws.amazon.com/imagebuilder/latest/userguide/create-component-console.html)。

**输入您的组件详细信息：**

1. 对于 “**类型**”，选择 “**构建**”。

1. 对于**映像操作系统 (OS)**，请选择 Linux 或 Windows。

1. 在 “**组件名称**” 中，输入一个有意义的名称，例如**research-and-engineering-studio-vdi-<operating-system>**。

1. 输入组件的版本号，也可以添加描述。

   ```
   key : value 
   ```

1. 在**定义文档**中，输入以下定义文件。如果您遇到任何错误，那么 YAML 文件对空间很敏感，很可能是原因。
**重要**  
在定义文件中，如果您的 RES 环境版本不是最新版本，请将下载 URI (`- source: 's3://research-engineering-studio-us-east-1/releases/latest/res-installation-scripts.tar.gz'`**2025.06**) **latest** 中的替换为确切的版本号（例如）。

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

   ```
   #  Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   #
   #  Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance
   #  with the License. A copy of the License is located at
   #
   #      http://www.apache.org/licenses/LICENSE-2.0
   #
   #  or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES
   #  OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions
   #  and limitations under the License.
   name: research-and-engineering-studio-vdi-linux
   description: An RES EC2 Image Builder component to install required RES software dependencies for Linux VDI.
   schemaVersion: 1.0
   parameters:
     - GPUFamily:
         type: string
         description: GPU family (NONE, NVIDIA, or AMD)
         default: NONE
   phases:
     - name: build
       steps:
         - name: PrepareRESBootstrap
           action: ExecuteBash
           onFailure: Abort
           maxAttempts: 3
           inputs:
             commands:
               - "mkdir -p /root/bootstrap/logs"
               - "mkdir -p /root/bootstrap/latest"
         - name: DownloadRESLinuxInstallPackage
           action: S3Download
           onFailure: Abort
           maxAttempts: 3
           inputs:
             - source: "s3://research-engineering-studio-us-east-1/releases/latest/res-installation-scripts.tar.gz"
               destination: "/root/bootstrap/res-installation-scripts/res-installation-scripts.tar.gz"
         - name: RunInstallScript
           action: ExecuteBash
           onFailure: Abort
           maxAttempts: 3
           inputs:
             commands:
               - "cd /root/bootstrap/res-installation-scripts"
               - "tar -xf res-installation-scripts.tar.gz"
               - "cd scripts/virtual-desktop-host/linux"
               - "/bin/bash install.sh -g {{ GPUFamily }}"
         - name: RebootAfterInstall
           action: Reboot
           onFailure: Abort
           maxAttempts: 3
           inputs:
               delaySeconds: 0
         - name: RunInstallPostRebootScript
           action: ExecuteBash
           onFailure: Abort
           maxAttempts: 3
           inputs:
             commands:
               - "cd /root/bootstrap/res-installation-scripts/scripts/virtual-desktop-host/linux"
               - 'sed -i ''/^export AWS_DEFAULT_PROFILE="bootstrap_profile"$/d'' install_post_reboot.sh'
               - "/bin/bash install_post_reboot.sh -g {{ GPUFamily }}"
         - name: PreventAL2023FromUninstallingCronie
           action: ExecuteBash
           onFailure: Abort
           maxAttempts: 3
           inputs:
             commands:
               - "rm -f /tmp/imagebuilder_service/crontab_installed"
   ```

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

   ```
   #  Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   #
   #  Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance
   #  with the License. A copy of the License is located at
   #
   #      http://www.apache.org/licenses/LICENSE-2.0
   #
   #  or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES
   #  OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions
   #  and limitations under the License.
   name: research-and-engineering-studio-vdi-windows
   description: An RES EC2 Image Builder component to install required RES software dependencies for Windows VDI.
   schemaVersion: 1.0
   
   phases:
     - name: build
       steps:
          - name: CreateRESBootstrapFolder
            action: CreateFolder
            onFailure: Abort
            maxAttempts: 3
            inputs:
               - path: 'C:\Users\Administrator\RES\Bootstrap'
                 overwrite: true
          - name: DownloadRESWindowsInstallPackage
            action: S3Download
            onFailure: Abort
            maxAttempts: 3
            inputs:
               - source: 's3://research-engineering-studio-us-east-1/releases/latest/res-installation-scripts.tar.gz'
                 destination: '{{ build.CreateRESBootstrapFolder.inputs[0].path }}\res-installation-scripts.tar.gz'
          - name: RunInstallScript
            action: ExecutePowerShell
            onFailure: Abort
            maxAttempts: 3
            inputs:
               commands:
                   - 'cd {{ build.CreateRESBootstrapFolder.inputs[0].path }}'
                   - 'tar -xf res-installation-scripts.tar.gz'
                   - 'Import-Module .\scripts\virtual-desktop-host\windows\Install.ps1'
                   - 'Install-WindowsEC2Instance -PrebakeAMI'
   ```

------

1. 创建任何可选标签，然后选择**创建组件**。

## 准备好您的 EC2 Image Builder 配方
<a name="prepare-recipe"></a>

EC2 Image Builder 配方定义了作为创建新映像起点的基础映像，以及定义了您添加的一组用于自定义映像并验证一切是否按预期运行的组件。您必须创建或修改配方才能构造具有必要的 RES 软件依赖项的目标 AMI。有关食谱的更多信息，请参阅[管理食谱](https://docs.aws.amazon.com/imagebuilder/latest/userguide/manage-recipes.html)。

RES 支持以下镜像操作系统：
+ 亚马逊 Linux 2 (x86 和 ARM64)
+ 亚马逊 Linux 2023 (x86 和 ARM64) 
+ RHEL 8 (x86) 和 9 (x86)
+ Rocky Linux 9 (x86)
+ Ubuntu 22.04.3 (x86)
+ Ubuntu 24.04.3 (x86)
+ Windows Server 2019、2022 (x86)
+ Windows 10、11 (x86)

**注意**  
从 2026.03 版本开始，亚马逊 Linux 2 和 RHEL 8 不再包含在默认软件堆栈中。如果需要，仍然可以注册带有这些操作系统的自定义软件堆栈。

------
#### [ Create a new recipe ]

1. 打开 EC2 Image Builder 控制台，网址为[https://console.aws.amazon.com/imagebuilder](https://console.aws.amazon.com/imagebuilder)。

1. 在 “**已保存的资源**” 下，选择**图片配方**。

1. 选择**创建映像配方**。

1. 输入唯一的名称和版本号。

1. 选择 RES 支持的基础镜像。

1. 在 “**实例配置”** 下，如果未预安装 SSM 代理，请安装。在**用户数据**和任何其他需要的用户数据中输入信息。
**注意**  
有关如何安装 SSM 代理的信息，请参阅：  
在@@ [适用于 Linux 的 EC2 实例上手动安装 SSM 代理](https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-manual-agent-install.html)。
在 [Windows 服务器的 EC2 实例上手动安装和卸载 SSM 代理。](https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-install-win.html)

1. 对于基于 Linux 的配方，请将亚马逊管理的`aws-cli-version-2-linux`构建组件添加到配方中。对于基于 Windows 的配方，请将亚马逊管理的`aws-cli-version-2-windows`构建组件添加到配方中。RES 安装脚本使用提供对 DynamoDB 集群设置配置值的 VDI 访问权限。 AWS CLI 

1. 添加为您的 Linux 或 Windows 环境创建的 EC2 Image Builder 组件。
**重要**  
必须按顺序添加这些组件，并首先添加`aws-cli-version-2-linux`（对于 Linux）或` aws-cli-version-2-windows`（对于 Windows）构建组件。  

![\[显示已添加构建组件的 “组件” 页面\]](http://docs.aws.amazon.com/zh_cn/res/latest/ug/images/res-ami-build-components.png)


1. （推荐）添加亚马逊管理的`simple-boot-test-<linux-or-windows>`测试组件以验证 AMI 是否可以启动。这是最低限度的建议。您可以选择其他符合您要求的测试组件。

1. 如果需要，请完成所有可选部分，添加任何其他所需的组件，然后选择 “**创建配方**”。

------
#### [ Modify a recipe ]

如果您已有 EC2 Image Builder 配方，则可以通过添加以下组件来使用它：

1. 对于基于 Linux 的配方，请将亚马逊管理的`aws-cli-version-2-linux`构建组件添加到配方中。对于基于 Windows 的配方，请将亚马逊管理的`aws-cli-version-2-windows`构建组件添加到配方中。RES 安装脚本使用提供对 DynamoDB 集群设置配置值的 VDI 访问权限。 AWS CLI 

1. 添加为您的 Linux 或 Windows 环境创建的 EC2 Image Builder 组件。
**重要**  
必须按顺序添加这些组件，并首先添加`aws-cli-version-2-linux`（对于 Linux）或` aws-cli-version-2-windows`（对于 Windows）构建组件。  

![\[显示已添加构建组件的 “组件” 页面\]](http://docs.aws.amazon.com/zh_cn/res/latest/ug/images/res-ami-build-components.png)


1. 如果需要，请完成所有可选部分，添加任何其他所需的组件，然后选择 “**创建配方**”。

------

## 配置 EC2 Image Builder 基础架构
<a name="configure-ib-infrastructure"></a>

您可以使用基础设施配置来指定 Image Builder 用来构建和测试您的映像生成器映像的 Amazon EC2 基础架构。要与 RES 配合使用，您可以选择创建新的基础架构配置，也可以选择使用现有基础架构配置。
+ 要创建新的基础架构配置，请参阅[创建基础架构配置](https://docs.aws.amazon.com/imagebuilder/latest/userguide/create-infra-config.html)。
+ 要使用现有基础架构配置，[请更新基础架构配置](https://docs.aws.amazon.com/imagebuilder/latest/userguide/update-infra-config.html)。

**要配置 Image Builder 基础设施，请执行以下操作：**

1. 对于 **IAM 角色**，请输入您之前在中配置的角色[准备一个 IAM 角色以访问 RES 环境](#prepare-role)。

1. 对于**实例类型**，请选择内存至少 4 GB 且支持所选基本 AMI 架构的类型。参见 [Amazon EC2 实例类型](https://aws.amazon.com/ec2/instance-types/)。

1. 对于 **VPC、子网和安全组**，您必须允许互联网访问才能下载软件包。还必须允许访问 RES 环境的 `cluster-settings` DynamoDB 表和 Amazon S3 集群存储桶。

## 配置 Image Builder 图像管道
<a name="image-builder-pipeline"></a>

Image Builder 映像管道汇集了基础映像、用于构建和测试的组件、基础架构配置和分发设置。要将图像管道配置为 RES-ready AMIs，您可以选择创建新管道或使用现有管道。有关更多信息，请参阅 Image *Builder 用户指南中的创建和更新 AMI 图像*[管道](https://docs.aws.amazon.com/imagebuilder/latest/userguide/ami-image-pipelines.html)。

------
#### [ Create a new Image Builder pipeline ]

1. 打开 Image Builder 控制台，网址为[https://console.aws.amazon.com/imagebuilder](https://console.aws.amazon.com/imagebuilder)。

1. 在导航窗格中，选择**图像管道**。

1. 选择 “**创建图像管道**”。

1. 通过输入唯一名称、可选描述、计划和频率来指定您的管道详细信息。

1. **在 “选择食谱**” 中，选择 “**使用现有食谱**”，然后选择在中创建的配方[准备好您的 EC2 Image Builder 配方](#prepare-recipe)。验证您的食谱详细信息是否正确。

1. 对于**定义图像创建流程**，请根据用例选择默认或自定义工作流程。在大多数情况下，默认工作流程就足够了。有关更多信息，请参阅[为您的 EC2 Image Builder 管道配置图像工作流程](https://docs.aws.amazon.com/imagebuilder/latest/userguide/pipeline-workflows.html)。

1. 对于**定义基础架构配置**，选择**选择现有基础架构配置**，然后选择在中创建的基础架构配置[配置 EC2 Image Builder 基础架构](#configure-ib-infrastructure)。验证您的基础架构详细信息是否正确。

1. 在 “**定义分发设置” 中**，选择 “**使用服务默认值创建分发设置”**。输出图像必须与您的 RES 环境 AWS 区域 相同。使用服务默认值，将在使用 Image Builder 的区域创建图像。

1. 查看管道详细信息并选择**创建管道**。

------
#### [ Modify an existing Image Builder pipeline ]

1. 要使用现有管道，请修改详细信息以使用中创建的配方[准备好您的 EC2 Image Builder 配方](#prepare-recipe)。

1. 选择**保存更改**。

------

## 运行 Image Builder 图像管道
<a name="run-image-pipeline"></a>

要生成配置的输出图像，必须启动图像管道。构建过程可能需要长达一个小时，具体取决于图像配方中组件的数量。

**要运行图像管道，请执行以下操作：**

1. 从**图像管道**中，选择在中创建的管道[配置 Image Builder 图像管道](#image-builder-pipeline)。

1. 从 “**操作**” 中选择 “**运行管道**”。

## 在 RES 中注册新的软件堆栈
<a name="register-res-ready-stack"></a>

1. 按照中的[软件堆栈 () AMIs](software-stacks.md)说明注册软件堆栈。

1. 对于 **AMI ID**，请输入内置输出映像的 AMI ID [运行 Image Builder 图像管道](#run-image-pipeline)。

# 可配置的 DCV 会话验证阈值
<a name="dcv-session-validation-thresholds"></a>

当 VDI 会话恢复或启动时，RES 会反复检查 DCV 会话是否已进入就绪状态。如果会话在一定重试次数内未准备就绪，则会将其标记为错误。

这些重试阈值可通过 Dynamo `<env-name>.cluster-settings` DB 表进行配置，允许管理员根据自己的环境对其进行调整。这对于由于自定义 AMI 配置、额外软件安装或其他 VDI 设置逻辑而导致引导时间较长的环境特别有用。


| Key | 说明 | 默认 值 | 
| --- | --- | --- | 
| vdc.validation\$1request\$1threshold | 将未就绪的会话标记为错误之前的最大重试次数 | 50 | 
| vdc.session\$1deleted\$1threshold | 将已删除的会话标记为错误之前的最大重试次数 | 15 | 

# 安装 RES 后设置自定义域名
<a name="setup-custom-domain-after-install"></a>

**注意**  
*先决条件*：在执行这些步骤之前，必须将证书和 PrivateKey 内容存储在 Secrets Manager 密钥中。

**将证书添加到 Web 客户端**

1. 更新附加到外部 alb 负载均衡器侦听器的证书：

   1. 在 AWS 控制台的 **EC2** > 负载平衡 > 负载均衡器下导航到 RES 外部**负**载均衡**器**。

   1. 搜索遵循命名约定的负载均衡器`<env-name>-external-alb`。

   1. 检查连接到负载均衡器的侦听器。

   1. 更新带有新证书详细信息的默认 SSL/TLS 证书的侦听器。

   1. 保存更改。

1. 在集群设置表中：

   1. 在 DynamoDB-> 表格-> 中找到集群设置表。`<env-name>.cluster-settings`

   1. 转到**浏览项目**并**按属性筛选** — 名称 “键”、“字符串”、条件 “包含” 和值 “external\$1alb”。

   1. 设置`cluster.load_balancers.external_alb.certificates.provided`为 True。

   1. 更新的值`cluster.load_balancers.external_alb.certificates.custom_dns_name`。这是 Web 用户界面的自定义域名。

   1. 更新的值`cluster.load_balancers.external_alb.certificates.acm_certificate_arn`。这是存储在亚马逊证书管理器 (ACM) 中的相应证书的亚马逊资源名称 (ARN)。

1. 更新您为 Web 客户端创建的相应 Route53 子域名记录，使其指向外部 alb 负载均衡器的 DNS 名称。`<env-name>-external-alb`

1. 如果环境中已经配置了 SSO，请使用与 RES Web 门户中的**环境管理 > **身份管理**** > **单点登录** > **状态** > **编辑**按钮中最初使用的相同输入来重新配置 SSO。

**向证书添加证书 VDIs 或轮换证书**

1. 通过在密钥中添加以下标签，授予 RES 应用程序对密钥执行 GetSecret 操作的权限：
   + `res:EnvironmentName` : `<env-name>`
   + `res:ModuleName` : `virtual-desktop-controller`

1. 在集群设置表中：

   1. 在 DynamoDB-> 表格-> 中找到集群设置表。`<env-name>.cluster-settings`

   1. 转到**浏览项目**并**按属性筛选** — 名称 “密钥”、“字符串”、条件 “包含” 和值 “dcv\$1connection\$1gateway”。

   1. 设置`vdc.dcv_connection_gateway.certificate.provided`为 True。

   1. 更新的值`vdc.dcv_connection_gateway.certificate.custom_dns_name`。这是 VDI 访问的自定义域名。

   1. 更新的值`vdc.dcv_connection_gateway.certificate.certificate_secret_arn`。这是保存证书内容的密钥的 ARN。

   1. 更新的值`vdc.dcv_connection_gateway.certificate.private_key_secret_arn`。这是保存私钥内容的密钥的 ARN。

1. 更新用于网关实例的启动模板：

   1. 在 AWS 控制台的 **EC2 > Auto Scaling > Auto Scaling > A** **uto Scaling** 组下打开 A **uto Scaling 组**。

   1. 选择与 RES 环境对应的网关 auto Scaling 组。该名称遵循命名惯例`<env-name>-vdc-gateway-asg`。

   1. 在详细信息部分找到并打开启动模板。

   1. 在**详细信息** > **操作** > 下，选择**修改模板**（创建新版本）。

   1. 向下滚动到 “**高级详情”**。

   1. 滚动到最底部的**用户数据**。

   1. 寻找单词`CERTIFICATE_SECRET_ARN`和`PRIVATE_KEY_SECRET_ARN`. 使用保存证书（参见步骤 2.c）和私钥（参见步骤 2.d）内容的密钥更新这些值。 ARNs 

   1. 确保 Auto Scaling 组已配置为使用最近创建的启动模板版本（来自 Auto Scaling 组页面）。

1. 更新您为虚拟桌面创建的相应 Route53 子域名记录，使其指向外部 nlb 负载均衡器的 DNS 名称:。`<env-name>-external-nlb`

1. 终止现有的 dcv-gateway 实例：`<env-name>-vdc-gateway`然后等待新实例启动。dcv-gateway 实例每天在世界标准时间上午 12:00（午夜）检查存储在 Secrets Manager 中的证书和私钥值是否有更改，并在更新后自动检索和应用新值。