使用会话脚本管理 AppStream 2.0 用户的直播体验 - 亚马逊 AppStream 2.0

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

使用会话脚本管理 AppStream 2.0 用户的直播体验

AppStream 2.0 提供实例会话脚本。当用户的流式传输会话中发生特定事件时,您可以使用这些脚本来运行自己的自定义脚本。例如,您可以使用自定义脚本在用户的直播会话开始之前准备 AppStream 2.0 环境。您还可以在用户完成其流式传输会话后使用自定义脚本清理流实例。

会话脚本在 AppStream 2.0 映像中指定。这些脚本在用户上下文或系统上下文中运行。如果您的会话脚本使用标准输出来编写信息、错误或调试消息,则可以选择将这些脚本保存到 Amazon Web Services 账户内的 Amazon S3 存储桶中。

在流式传输会话开始前运行脚本

您可以将脚本配置为在用户的应用程序启动和其流式传输会话开始前运行最多 60 秒。这样,您就可以在用户开始流式传输其应用程序之前自定义 AppStream 2.0 环境。在会话脚本运行时,会为您的用户显示加载转盘。当您的脚本成功完成或超过最长等待时间时,用户的流式传输会话将开始。如果脚本未成功完成,则会为用户显示错误消息。但是,不会阻止您的用户使用其流式传输会话。

在指定 Windows 实例上的文件名时,您必须使用双反斜杠。例如:

C:\\Scripts\\Myscript.bat

如果未使用双反斜杠,则会显示一个错误以通知您 .json 文件格式不正确。

注意

脚本成功完成后,它们必须返回值 0。如果您的脚本返回的值不是 0,则 AppStream 2.0 会向用户显示错误消息。

当您在流式传输会话开始之前运行脚本并且未启用 AppStream 2.0 动态应用程序框架时,会发生以下过程:

AppStream 2.0 workflow diagram showing connection, application selection, and session launch steps.
  1. 您的用户连接到未加入域的 AppStream 2.0 队列实例。他们使用下列访问方法之一进行连接:

    • AppStream 2.0 用户池

    • SAML 2.0

    • AppStream 2.0 API

  2. 应用程序目录显示在 AppStream 2.0 门户中,您的用户可以选择要启动的应用程序。

  3. 发生下列情况之一:

    • 如果为用户启用了应用程序设置持久性,则会下载并装入用于存储用户的自定义项和 Windows 设置的应用程序设置虚拟硬盘 (VHD) 文件。在此情况下,需要 Windows 用户登录。

      有关应用程序设置持久性的信息,请参阅为 AppStream 2.0 用户启用应用程序设置持久性

    • 如果未启用应用程序设置持久性,则表示 Windows 用户已登录。

  4. 您的会话脚本启动。如果为用户启用了持久性存储,则还会启动存储连接器安装。有关持久性存储的信息,请参阅为您的 AppStream 2.0 用户启用和管理永久存储

    注意

    无需完成存储连接器安装即可启动流式传输会话。如果会话脚本在存储连接器安装完成之前完成,则流式传输会话将启动。

    有关监控存储连接器的装载状态的信息,请参阅将存储连接器与会话脚本结合使用

  5. 您的会话脚本完成或超时。

  6. 用户的流式传输会话启动。

  7. 用户选择的应用程序启动。

有关 AppStream 2.0 动态应用程序框架的信息,请参阅使用 AppStream 2.0 动态应用程序框架构建动态应用程序提供程序

当您在流式传输会话开始之前运行脚本并启用 AppStream 2.0 动态应用程序框架时,会发生以下过程:

AppStream 2.0 workflow from user login to application launch, including SAML authentication and session scripts.
  1. 您的用户访问您组织的 SAML 2.0 应用程序门户,然后他们选择 AppStream 2.0 堆栈。

  2. 它们连接到已加入域的 AppStream 2.0 队列实例。

  3. 如果为用户启用了应用程序设置持久性,则会下载并装入用于存储用户的自定义项和 Windows 设置的应用程序设置 VHD 文件。

  4. 发生 Windows 用户登录。

  5. 应用程序目录显示在 AppStream 2.0 门户中,您的用户可以选择要启动的应用程序。

  6. 您的会话脚本启动。如果为用户启用了持久性存储,则还会启动存储连接器安装。

    注意

    无需完成存储连接器安装即可启动流式传输会话。如果会话脚本在存储连接器安装完成之前完成,则流式传输会话将启动。

    有关监控存储连接器的装载状态的信息,请参阅将存储连接器与会话脚本结合使用

  7. 您的会话脚本完成或超时。

  8. 用户的流式传输会话启动。

  9. 用户选择的应用程序启动。

在流式传输会话结束后运行脚本

您还可以将脚本配置为在用户的流式传输会话结束后运行。例如,当用户从 AppStream 2.0 工具栏中选择 “结束会话” 或达到会话允许的最大持续时间时,您可以运行脚本。您还可以在流媒体实例终止之前使用这些会话脚本清理您的 AppStream 2.0 环境。例如,您可以使用脚本来释放文件锁定或上传日志文件。在流式传输会话结束后运行脚本时,会发生以下过程:

Flowchart showing AppStream 2.0 session termination process with scripts and storage actions.
  1. 您的用户的 AppStream 2.0 直播会话已结束。

  2. 会话终止脚本启动。

  3. 会话终止脚本完成或超时。

  4. 发生 Windows 用户注销。

  5. 发生以下一种情况或同时发生以下两种情况(如果适用):

    • 如果为用户启用了应用程序设置持久性,则会卸载用于存储用户的自定义项和 Windows 设置的应用程序设置 VHD 文件,并将该文件上传到您账户中的 Amazon S3 存储桶。

    • 如果为您的用户启用持久性存储,则存储连接器将完成最终同步并进行卸载。

  6. 实例集实例将终止。

创建并指定会话脚本

您可以为始终在线、按需和弹性实例集配置和指定会话脚本。

为始终在线和按需实例集配置和指定会话脚本
  1. 打开 AppStream 2.0 主机,网址为 https://console.aws.amazon.com/appstream2

  2. 在导航窗格中,依次选择 Images (映像)Image Builder (映像生成器)

  3. 选择处于 Running (正在运行) 状态的映像生成器,然后选择 Connect (连接)

  4. 在出现提示时,选择 Administrator (管理员)

  5. 导航到 C:\AppStream\SessionScripts,并打开 config.json 配置文件。

    有关会话脚本参数的信息,请参阅会话脚本配置文件

  6. 完成更改后,保存并关闭 config.json 文件。

  7. 在映像生成器桌面上,打开 Image Assistant

  8. (可选)指定要包括在映像中的任何其他应用程序。

  9. 按照 Image Assistant 中的必要步骤完成映像的创建。

    如果无法验证会话脚本配置(例如,如果 .json 文件的格式不正确),则在选择 Disconnect and create image (断开连接并创建映像) 时,您会收到通知。

    注意

    要找到基于 Linux 的映像生成器的会话脚本配置文件,请导航到 /opt/appstream/SessionScripts/config.json

配置并指定弹性实例集的会话脚本
  1. 创建一个包含会话脚本和 config.json 文件的 zip 文件。脚本文件将被复制到以下位置。您必须将这些位置用于您的 config.json。

    • 对于 Windows,使用 C:\AppStream\SessionScripts\SessionScript

    • 对于 Linux,使用 /opt/appstream/SessionScripts/SessionScript

    注意

    要运行会话脚本文件,请确保 .zip 文件仅包含会话脚本和 config.json 文件,而不包含包含文件夹。有关更多信息,请参阅会话脚本配置文件

  2. 将 zip 文件上传到您账户中的 Amazon S3 存储桶。

    注意

    您的 VPC 必须提供对 Amazon S3 存储桶的访问权限。有关更多信息,请参阅使用 Amazon S3 VPC 终端节点 AppStream 实现 2.0 功能

    您的 S3 存储桶和 AppStream 2.0 队列必须相同 AWS 区域。

    您必须具有 IAM 权限才能对 Amazon S3 存储桶中的会话脚本对象执行 S3:GetObject 操作。要了解有关将会话脚本存储在 Amazon S3 存储桶中的更多信息,请参阅将应用程序图标、设置脚本、会话脚本和 VHD 存储在 S3 存储桶中

  3. 打开 AppStream 2.0 主机,网址为 https://console.aws.amazon.com/appstream2

  4. 在导航窗格中,选择 Fleets

  5. 选择要更新的弹性实例集,然后选择查看详细信息

  6. 会话脚本设置选项卡上,选择编辑

  7. 对于 S3 中的会话脚本对象,输入表示会话脚本对象的 S3 URI,或者选择浏览 S3 以导航到您的 S3 存储桶并找到会话脚本对象。

  8. 完成更改后,选择保存更改

  9. 此时,会话脚本可用于所有启动的实例集实例。

    注意

    您还可以在创建新的弹性实例集时配置会话脚本。

会话脚本配置文件

要在 Windows 实例中找到会话脚本配置文件,请导航到 C:\\ AppStreamSessionScripts\ config.json。在 Linux 实例上,导航到 /opt/appstream/ /config.j SessionScripts son。该文件的格式如下所示。

注意

配置文件为 .json 格式。验证您在此文件中键入的任何文本是否为有效的 .json 格式。

{ "SessionStart": { "executables": [ { "context": "system", "filename": "", "arguments": "", "s3LogEnabled": true }, { "context": "user", "filename": "", "arguments": "", "s3LogEnabled": true } ], "waitingTime": 30 }, "SessionTermination": { "executables": [ { "context": "system", "filename": "", "arguments": "", "s3LogEnabled": true }, { "context": "user", "filename": "", "arguments": "", "s3LogEnabled": true } ], "waitingTime": 30 } }

您可以在会话脚本配置文件中使用以下参数。

SessionStart/SessionTermination

要基于对象的名称在相应会话事件中运行的会话脚本。

类型:字符串

必需:否

允许的值:SessionStartSessionTermination

WaitingTime

会话脚本的最大持续时间(以秒为单位)。

类型:整数

必需:否

约束:最大持续时间为 60 秒。如果会话脚本未在此持续时间内完成,则它们将停止。如果您需要脚本继续运行,则将其作为单独的过程启动。

可执行文件

要运行的会话脚本的详细信息。

类型:字符串

必需:是

约束:每个会话事件可以运行的脚本的最大数目为 2(一个用于用户上下文,一个用于系统上下文)。

上下文

要在其中运行会话脚本的上下文。

类型:字符串

必需:是

允许的值:usersystem

文件名

要运行的会话脚本的完整路径。如果未指定此参数,则会话脚本不会运行。

类型:字符串

必需:否

约束:文件名和完整路径的最大长度为 1000 个字符。

允许的值:.bat.exe.sh

注意

你也可以使用 Windows PowerShell 文件。有关更多信息,请参阅使用 Windows PowerShell 文件

Arguments (参数)

会话脚本或可执行文件的参数。

类型:字符串

必需:否

长度约束:最大长度为 1000 个字符。

S3 LogEnabled

当此参数的值设置为 True 时,会在您的 Amazon Web Services 账户中创建一个 S3 存储桶来存储会话脚本所创建的日志。默认情况下,该值设置为 True。有关更多信息,请参阅本主题后面的记录会话脚本输出 部分。

类型:布尔值

必需:否

允许的值:TrueFalse

使用 Windows PowerShell 文件

要使用 Windows PowerShell 文件,请在filename参数中指定 PowerShell 文件的完整路径:

"filename": "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",

然后,在 arguments 参数中指定您的会话脚本:

"arguments": "-File \"C:\\path\\to\\session\\script.ps1\"",

最后,验证 PowerShell 执行策略是否允许您的 PowerShell 文件运行。

记录会话脚本输出

在配置文件中启用此选项后, AppStream 2.0 会自动捕获写入标准输出的会话脚本的输出。此输出将上传到您账户中的 Amazon S3 存储桶。您可以查看日志文件以进行故障排除或调试。

注意

当会话脚本返回一个值时或 WaitingTime 中设置的值已过去时(以先到者为准),将上传日志文件。

将存储连接器与会话脚本结合使用

启用 AppStream 2.0 存储连接器后,它们将在会话启动脚本运行时开始装载。如果您的脚本依赖于正在装载的存储连接器,则可以等待连接器可用。 AppStream 2.0 通过以下键维护 Windows 实例上的 Windows 注册表中存储连接器的挂载状态:

<provided user name>HKEY_LOCAL_MACHINE\ SOFTWARE\ Amazon\ 存储\\ AppStream <Storage connector>

注册表项值如下所示:

  • 提供的用户名 – 通过访问模式提供的用户 ID。访问模式及其值如下所示:

    • 用户池 – 用户的电子邮件地址

    • 流式传输 URL – UserID

    • SAML – NameID。如果用户名包含斜杠(例如,域用户的 SAMAccountName),则该斜杠将替换为 “-” 字符。

  • 存储连接器 – 为用户启用的持久性存储选项的连接器。存储连接器值如下所示:

    • HomeFolder

    • GoogleDrive

    • OneDrive

每个存储连接器注册表项都包含一个 MountStatusDWORD 值。下表列出了可能的值MountStatus

注意

要查看这些注册表项,必须在映像上安装 Microsoft .NET Framework 4.7.2 或更高版本。

描述
0

未为此用户启用存储连接器

1

存储连接器安装正在进行中

2

已成功安装存储连接器

3

存储连接器安装失败

4

存储连接器安装已启用,但尚未安装

在 Linux 实例上,你可以通过查看 ~/.config/ /-status 文件中 appstream_home_folder_mount_status 的值来检查主文件夹的安装状态。appstream-home-folder appstream-home-folder-mount

描述
True

已成功挂载 Home 文件夹

False 尚未挂载 Home 文件夹

为会话脚本日志启用 Amazon S3 存储桶存储

当您在会话脚本配置中启用 Amazon S3 日志记录时, AppStream 2.0 会捕获会话脚本的标准输出。输出会定期上传到您的 Amazon Web Services 账户中的 S3 存储桶。对于每个 AWS 区域, AppStream 2.0 都会在您的账户中创建一个与您的账户和该地区不同的存储桶。

您无需执行任何配置任务即可管理这些 S3 存储桶。它们完全由 AppStream 2.0 服务管理。存储在每个存储桶中的日志文件在传输中使用 Amazon S3 的 SSL 端点进行加密,在静态期间使用 Amazon S3 托管的加密密钥进行加密。存储桶以特定格式命名,如下所述:

appstream-logs-region-code-account-id-without-hyphens-random-identifier
region-code

这是在为会话脚本日志启用 Amazon S3 存储桶存储的情况下创建堆栈的 AWS 区域代码。

account-id-without-hyphens

您的 Amazon Web Services 账户标识符。随机 ID 确保与该区域中的其他存储桶不发生冲突。存储桶名称的第一部分 appstream-logs 不随账户或区域而改变。

例如,如果您在美国西部(俄勒冈)区域 (us-west-2) 的图片中指定会话脚本,账号为 123456789012,则 AppStream 2.0 将在该地区的账户中创建一个名称显示的 Amazon S3 存储桶。只有具有足够权限的管理员才能删除此存储桶。

appstream-logs-us-west-2-1234567890123-abcdefg

禁用会话脚本不会删除存储在 S3 存储桶中的任何日志文件。要永久删除日志文件,您或其他拥有足够权限的管理员必须使用 Amazon S3 控制台或 API 执行此操作。 AppStream 2.0 添加了防止意外删除存储桶的存储桶策略。有关更多信息,请参阅适用于亚马逊 AppStream 2.0 的身份和访问管理中的“用于应用程序设置持久性的 IAM 策略和 Amazon S3 存储桶”

启用会话脚本后,将为启动的每个流式传输会话创建一个唯一文件夹。

存储在您账户的 S3 存储桶中的日志文件所在的文件夹路径使用以下结构:

bucket-name/stack-name/fleet-name/access-mode/user-id-SHA-256-hash/session-id/SessionScriptsLogs/session-event
bucket-name

存储会话脚本的 S3 存储桶的名称。该名称格式如本节中前面所述。

stack-name

会话来自的堆栈的名称。

fleet-name

运行会话脚本的实例集的名称。

access-mode

用户的身份方法:用custom于 AppStream 2.0 API 或 CLI、federated SAML 以及userpool用户池中的用户。

user-id-SHA-256-hash

用户特定的文件夹名称。此名称是使用从用户标识符生成的小写 SHA-256 哈希十六进制字符串创建的。

session-id

用户的流式传输会话的标识符。每个用户流式传输会话均生成一个唯一 ID。

session-event

生成会话脚本日志的事件。事件值为:SessionStartSessionTermination

以下示例文件夹结构适用于从 test-stack 和 test-fleet 启动的流式传输会话。该会话使用来自美国西部(俄勒冈)区域 (us-west-2) 的用户 AWS 账户 ID testuser@mydomain.com 和设置组test-stack的 API:123456789012

appstream-logs-us-west-2-1234567890123-abcdefg/test-stack/test-fleet/custom/a0bcb1da11f480d9b5b3e90f91243143eac04cfccfbdc777e740fab628a1cd13/05yd1391-4805-3da6-f498-76f5x6746016/SessionScriptsLogs/SessionStart/

此示例文件夹结构包含一个用于用户上下文会话启动脚本的日志文件,以及一个用于系统上下文会话启动脚本的日志文件(如果适用)。

在多会话队列上使用会话脚本

在多会话队列上使用会话脚本时,还有其他要求和注意事项,以确保最佳性能和安全性。

要求

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

  • 脚本是等性的。

    当已执行某项操作时,脚本应在同一个实例上处理多个执行并保持优雅的处理。

  • 脚本是独立的。

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

  • 脚本性能很高。

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

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

安全考虑因素

AppStream 不应将 2.0 映像配置为允许任何用户对会话脚本文件拥有写入权限。这为恶意用户引入了一种关键的攻击媒介,他们可以在其中修改脚本文件。然后,这些文件可以以 SYSTEM 或其他用户的身份运行,具体取决于您的配置。

重要

您有责任确保安全地配置您的 AppStream 2.0 镜像。这对于多会话实例尤其重要,在这种实例中,多个用户使用同一个实例。如果镜像配置不安全,则该实例的所有用户都将面临安全风险。

您的图像和会话脚本文件应符合以下条件:

  • 用户无权修改会话脚本文件。

  • 用户无权修改会话脚本 config.json。图像的默认行为限制了管理员的访问权限。

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

如果该服务检测到会话脚本可执行文件已被修改,则在该实例上随后执行该挂钩将失败,将日志文件上传到 Amazon S3(如果启用了 Amazon S3 日志记录),您将看到以下消息:

由于实例配置后修改了可执行文件,因此未执行会话脚本。为了安全起见,跳过了执行。

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

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

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