

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

# 在多会话实例集上使用会话脚本
<a name="session-scripts-multi-session-fleets"></a>

在多会话实例集上使用会话脚本时，为确保最佳性能和安全性，还有额外的要求和注意事项。

## 要求
<a name="session-scripts-multi-session-fleets-requirements"></a>

在单会话队列中，对于给定实例，**SessionStart**和**SessionTermination**挂钩保证只运行一次。这是因为会话与实例之间存在 1:1 的映射。使用多会话队列时，会话与实例之间存在一个 N: M 映射，其中每个会话都独立运行并挂钩。**SessionStart**SessionTermination****这意味着**SessionStart**和**SessionTermination**挂钩可以在给定实例上以许多不同的顺序运行多次。为了获得最佳体验，在多会话实例集上使用会话脚本时，您的会话脚本应符合以下条件：
+ 脚本是幂等脚本。

  当已执行某个操作后，脚本应能够优雅地处理同一实例上的多次执行。
+ 脚本是独立的。

  由于脚本按会话运行，因此如果一个会话**SessionTermination**在运行，而另一个会话在运行 **SessionStart**，则它们不应相互干扰，也不应干扰其他会话的体验。
+ 脚本性能卓越。

  在多会话实例上，可以同时调配多个会话。这意味着会话脚本可能会多次并发执行。脚本应该高效运行，不消耗过多资源，并且不影响该实例上其他用户的体验或会话的稳定性。

通过将会话脚本逻辑集中在运行脚本的特定用户会话上，可以满足其中的许多要求。

## 安全考虑因素
<a name="session-scripts-multi-session-fleets-security"></a>

WorkSpaces 不应将应用程序映像配置为允许任何用户对会话脚本文件具有写入权限。这会给恶意用户带来一个关键的攻击向量，使他们能够修改脚本文件。根据您的配置，这些文件随后可能会以 SYSTEM 身份或其他用户身份运行。

**重要**  
您有责任确保您的 WorkSpaces 应用程序映像配置安全。这对于多会话实例尤其重要，在这种实例中，多个用户使用同一个实例。如果未安全配置映像，则该实例的所有用户都将面临安全风险。

您的映像和会话脚本文件应符合以下要求：
+ 用户无权修改会话脚本文件。
+ 用户无权修改会话脚本 config.json。映像的默认行为限制了管理员的访问权限。

会话脚本可执行文件应存储在安全位置，以免在运行时被修改。

如果服务检测到会话脚本可执行文件已被修改，它将阻止在该实例上对该挂钩的任何后续执行，将日志文件上传到 Amazon S3（如果启用了 Amazon S3 日志记录），并且您将看到以下消息：

**The session script was not executed because the executable was modified after instance provisioning. Execution was skipped for security.**

如果您的用例需要在运行时修改会话脚本可执行文件（例如，如果您指向在运行时由自动更新流程修改的 EXE 文件），则上述检查将失败。在这种情况下，请使用脚本将执行重定向到修改后的可执行文件。当服务执行安全检查时，保持脚本在运行时未被修改。

如果您的会话脚本文件过大（超过 100 MB），则可能会导致实例和会话调配延迟，并且安全检查将花费更多时间（具体取决于实例类型和可用资源）。如果您的用例需要大型会话脚本，请考虑使用较小的脚本来重定向执行。这将改善实例和会话调配体验。

请注意，该服务仅检查会话脚本 config.json 中定义的可执行文件，这只是一种 fallback/best 努力机制。您有责任确保会话脚本可执行文件中的所有代码路径都是安全的，并且最终用户无法对其进行修改。