

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用工作階段指令碼來管理 Amazon WorkSpaces 應用程式使用者的串流體驗
<a name="use-session-scripts"></a>

WorkSpaces 應用程式提供執行個體上的工作階段指令碼。當使用者的串流工作階段發生特定事件時，您可以使用這些指令碼來執行您自己的自訂指令碼。例如，您可以在使用者的串流工作階段開始之前，使用自訂指令碼來準備 WorkSpaces 應用程式環境。在使用者完成其串流工作階段之後，您也可以使用自訂指令碼來清除串流執行個體。

工作階段指令碼是在 WorkSpaces 應用程式映像中指定。這些指令碼在使用者環境或系統環境之內執行。如果您的工作階段指令碼使用標準輪出來撰寫資訊、錯誤或偵錯訊息，這些都可以選擇性地儲存在您 Amazon Web Services 帳戶內的 Amazon S3 儲存貯體中。

**Topics**
+ [

# 串流工作階段開始之前執行指令碼
](run-scripts-before-streaming-sessions-begin.md)
+ [

# 在串流工作階段結束之後執行指令碼
](run-scripts-after-streaming-sessions-end.md)
+ [

# 建立和指定工作階段指令碼
](create-specify-session-scripts.md)
+ [

# 工作階段指令碼組態檔案
](session-script-configuration-file.md)
+ [

# 使用 Windows PowerShell 檔案
](using-powershell-files-with-session-scripts.md)
+ [

# 記錄工作階段指令碼輸出
](logging-session-output.md)
+ [

# 使用儲存連接器搭配工作階段指令碼
](use-storage-connectors-with-session-scripts.md)
+ [

# 為工作階段指令碼日誌啟用 Amazon S3 儲存貯體儲存
](enable-S3-bucket-storage-session-script-logs.md)
+ [

# 在多工作階段機群上使用工作階段指令碼
](session-scripts-multi-session-fleets.md)

# 串流工作階段開始之前執行指令碼
<a name="run-scripts-before-streaming-sessions-begin"></a>

您可以設定指令碼來執行最長 60 秒，之後，使用者的應用程式才啟動，他們的串流工作階段才開始。這樣做可讓您在使用者開始串流其應用程式之前自訂 WorkSpaces 應用程式環境。當工作階段指令碼執行時，使用者會看到載入環。當您的指令碼成功完成或超過最長等待時間後，使用者的串流工作階段就會開始。如果您的指令碼未成功完成，則會顯示錯誤訊息給使用者。但是，不會阻止您的使用者使用其串流工作階段。

當您在 Windows 執行個體上指定檔案名稱時，您必須使用雙反斜線。例如：

C:\$1\$1Scripts\$1\$1Myscript.bat

如果未使用雙反斜線，便會顯示錯誤來通知您 .json 檔案的格式不正確。

**注意**  
當您的指令碼成功完成時，必須傳回 0 這個值。如果您的指令碼傳回 0 以外的值，WorkSpaces 應用程式會向使用者顯示錯誤訊息。

當您在串流工作階段開始之前執行指令碼，且未啟用 WorkSpaces 應用程式動態應用程式架構時，會發生下列程序：

![\[WorkSpaces Applications workflow diagram showing connection, application selection, and session launch steps.\]](http://docs.aws.amazon.com/zh_tw/appstream2/latest/developerguide/images/session-scripts-without-DAF-non-domain-joined2.png)


1. 您的使用者連線到未加入網域的 WorkSpaces 應用程式機群執行個體。他們使用以下其中一個方法連接：
   + WorkSpaces 應用程式使用者集區
   + SAML 2.0
   + WorkSpaces 應用程式 API

1. 應用程式目錄會顯示在 WorkSpaces 應用程式入口網站中，您的使用者選擇要啟動的應用程式。

1. 發生以下其中一項：
   + 如果已針對使用者啟用應用程式設定持續性，則會下載並掛載應用程式設定虛擬硬碟 (VHD) 檔案，其中存放使用者的自訂項目和 Windows 設定。在這種情況下，需要 Windows 使用者登入。

     如需應用程式設定持續性的相關資訊，請參閱[為您的 WorkSpaces 應用程式使用者啟用應用程式設定持續性](app-settings-persistence.md)。
   + 如果應用程式設定持續性未啟用，但 Windows 使用者已登入。

1. 您的工作階段指令碼會開始。如果已針對使用者啟用持久性儲存，則儲存連接器掛載也會開始。如需持久性儲存的相關資訊，請參閱[為您的 WorkSpaces 應用程式使用者啟用和管理持久性儲存](persistent-storage.md)。
**注意**  
儲存連接器掛載並不需要完成，串流工作階段也會開始。如果工作階段指令碼比儲存連接器掛載更早完成，串流工作階段會開始。  
如需有關監控儲存連接器掛載狀態的資訊，請參閱[使用儲存連接器搭配工作階段指令碼](use-storage-connectors-with-session-scripts.md)。

1. 您的工作階段指令碼完成或逾時。

1. 使用者的串流工作階段會開始。

1. 使用者選擇的應用程式會啟動。

如需 WorkSpaces 應用程式動態應用程式架構的相關資訊，請參閱 [使用 WorkSpaces 應用程式動態應用程式架構來建置動態應用程式提供者](build-dynamic-app-provider.md)。

當您在串流工作階段開始之前執行指令碼並啟用 WorkSpaces 應用程式動態應用程式架構時，會發生下列程序：

![\[WorkSpaces Applications workflow from user login to application launch, including SAML authentication and session scripts.\]](http://docs.aws.amazon.com/zh_tw/appstream2/latest/developerguide/images/session-scripts-with-DAF-domain-joined2.png)


1. 您的使用者會造訪您組織的 SAML 2.0 應用程式入口網站，並選擇 WorkSpaces 應用程式堆疊。

1. 它們連接到加入網域的 WorkSpaces 應用程式機群執行個體。

1. 如果已針對使用者啟用應用程式設定持續性，則會下載並掛載應用程式設定 VHD 檔案，其中存放使用者的自訂項目和 Windows 設定。

1. 發生 Windows 使用者登入。

1. 應用程式目錄會顯示在 WorkSpaces 應用程式入口網站中，您的使用者選擇要啟動的應用程式。

1. 您的工作階段指令碼會開始。如果已針對使用者啟用持久性儲存，則儲存連接器掛載也會開始。
**注意**  
儲存連接器掛載並不需要完成，串流工作階段也會開始。如果工作階段指令碼比儲存連接器掛載更早完成，串流工作階段會開始。  
如需有關監控儲存連接器掛載狀態的資訊，請參閱[使用儲存連接器搭配工作階段指令碼](use-storage-connectors-with-session-scripts.md)。

1. 您的工作階段指令碼完成或逾時。

1. 使用者的串流工作階段會開始。

1. 使用者選擇的應用程式會啟動。

# 在串流工作階段結束之後執行指令碼
<a name="run-scripts-after-streaming-sessions-end"></a>

您也可以將您的指令碼設定為在使用者的工作階段結束之後執行。例如，當使用者從 WorkSpaces 應用程式工具列選取**結束工作階段**，或當他們達到工作階段允許的持續時間上限時，您可以執行指令碼。您也可以使用這些工作階段指令碼，在串流執行個體終止之前清除 WorkSpaces 應用程式環境。例如，您可以使用指令碼來發行檔案鎖定或上傳日誌檔。當您在串流工作階段結束之後執行指令碼時，則處理如下：

![\[Flowchart showing WorkSpaces Applications session termination process with scripts and storage actions.\]](http://docs.aws.amazon.com/zh_tw/appstream2/latest/developerguide/images/session-scripts-termination.png)


1. 使用者的 WorkSpaces 應用程式串流工作階段結束。

1. 您的工作階段終止指令碼會開始。

1. 工作階段終止指令碼完成或逾時。

1. 發生 Windows 使用者登出。

1. 以下一項或兩項同時發生 (如果適用)：
   + 如果已針對使用者啟用應用程式設定持續性，則會卸載應用程式設定 VHD 檔案 (其中存放使用者的自訂項目和 Windows 設定)，並上傳到您帳戶中的 Amazon S3 儲存貯體。
   + 如果已針對使用者啟用持久性儲存，則儲存連接器會完成最終同步，然後卸載。

1. 機群執行個體會終止。

# 建立和指定工作階段指令碼
<a name="create-specify-session-scripts"></a>

您可以設定和指定 Always-on、On-demand 和彈性機群的工作階段指令碼。

**設定和指定 Always-on 和 On-demand 機群的工作階段指令碼**

1. 在 https：//[https://console.aws.amazon.com/appstream2](https://console.aws.amazon.com/appstream2) 開啟 WorkSpaces 應用程式主控台。

1. 在導覽窗格中，選擇 **Images (映像)**、**Image Builder (映像建置器)**。

1. 選擇處於 **Running (執行中)** 狀態的映像建置器，然後選擇 **Connect (連線)**。

1. 出現提示時，請選擇 **Administrator (管理員)**。

1. 導覽至 `C:\AppStream\SessionScripts` 並開啟 `config.json` 組態檔案。

   如需工作階段指令碼參數的相關資訊，請參閱[工作階段指令碼組態檔案](session-script-configuration-file.md)。

1. 完成變更之後，儲存並關閉 `config.json` 檔案。

1. 在映像建置器桌面上開啟**映像助理**。

1. (選用) 您可以指定要包含在映像中的任何其他應用程式。

1. 按照映像助理的必要步驟建立映像。

   如果無法驗證工作階段指令碼組態 (例如，如果 .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` 檔案，且未包含資料夾。如需詳細資訊，請參閱[工作階段指令碼組態檔案](session-script-configuration-file.md)。

1. 將 zip 檔案上傳至帳戶中的 Amazon S3 儲存貯體。
**注意**  
您的 VPC 必須提供 Amazon S3 儲存貯體的存取權。如需詳細資訊，請參閱[將 Amazon S3 VPC 端點用於 WorkSpaces 應用程式功能](managing-network-vpce-iam-policy.md)。  
您必須在相同的 中擁有 S3 儲存貯體和 WorkSpaces 應用程式機群 AWS 區域。  
您必須擁有 IAM 許可才能對 Amazon S3 儲存貯體中的工作階段指令碼物件執行 `S3:GetObject` 動作。若要深入了解如何在 Amazon S3 儲存貯體中存放工作階段指令碼，請參閱 [將應用程式圖示、安裝指令碼、工作階段指令碼和 VHD 儲存在 S3 儲存貯體中](store-s3-bucket.md)。

1. 在 https：//[https://console.aws.amazon.com/appstream2](https://console.aws.amazon.com/appstream2) 開啟 WorkSpaces 應用程式主控台。

1. 在導覽窗格中，選擇 **Fleets (機群)**。

1. 選擇您要更新的彈性機群，然後選擇**檢視詳細資訊**。

1. 在**工作階段指令碼設定**索引標籤上，選擇**編輯**。

1. 針對 **S3 中的工作階段指令碼物件**，輸入代表工作階段指令碼物件的 S3 URI，或選擇**瀏覽 S3**，以導覽至您的 S3 儲存貯體並尋找工作階段指令碼物件。

1. 完成變更之後，選擇**儲存變更**。

1. 此時，工作階段指令碼會提供給所有已啟動的機群執行個體使用。
**注意**  
您也可以在建立新的彈性機群時設定工作階段指令碼。

# 工作階段指令碼組態檔案
<a name="session-script-configuration-file"></a>

若要在 Windows 執行個體中尋找工作階段指令碼組態檔案，請導覽至 C:\$1AppStream\$1SessionScripts\$1config.json。在 Linux 執行個體上，瀏覽至 /opt/appstream/SessionScripts/config.json。檔案的格式如下所示。

**注意**  
組態檔案為 .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 ***  
在適當的工作階段事件中根據物件名稱執行的工作階段指令碼。  
**類型：**字串  
**必要**：否  
**允許的值：****SessionStart**、**SessionTermination**

***WaitingTime***  
工作階段指令碼的最長持續時間 (以秒為單位)。  
**類型**：整數  
**必要**：否  
**限制：**最長持續時間為 60 秒。如果工作階段指令碼在此期間內未完成，則會停下。如果需要讓指令碼繼續執行，請以單獨程序的形式來加以啟動。

***Executables***  
要執行的指令碼工作階段的詳細資訊。  
**類型：**字串  
**必要**：是  
**限制：**針對每個工作階段事件可執行的指令碼數量上限為 2 (一個用於使用者環境，另一個用於系統環境)。

***Context***  
用來執行工作階段指令碼的環境。  
**類型：**字串  
**必要**：是  
**允許的值：****user**、**system**

***Filename***  
要執行的工作階段指令碼的完整路徑。如果未指定此參數，則工作階段指令碼不會執行。  
**類型：**字串  
**必要**：否  
**限制：**檔案名稱和完整路徑的最大長度為 1,000 個字元。  
**允許的值：****.bat**、**.exe**、 **.sh**  
您也可以使用 Windows PowerShell 檔案。如需詳細資訊，請參閱[使用 Windows PowerShell 檔案](using-powershell-files-with-session-scripts.md)。

***Arguments (引數)***  
工作階段指令碼或可執行檔的引數。  
**類型：**字串  
**必要**：否  
**長度限制：**長度上限為 1,000 個字元。

***S3LogEnabled***  
當此參數的值設為 **True** 時，您的 Amazon Web Services 帳戶內會建立 S3 儲存貯體，以存放工作階段指令碼所建立的日誌。依預設，此值是設為 **True**。如需詳細資訊，請參閱本主題稍後的*記錄工作階段指令碼輸出*一節。  
**類型**：布林值  
**必要**：否  
**允許的值：****True**、**False**

# 使用 Windows PowerShell 檔案
<a name="using-powershell-files-with-session-scripts"></a>

若要使用 Windows PowerShell 檔案，請在 **filename** 參數中指定 PowerShell 檔案的完整路徑：

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

然後，在 **arguments** 參數中指定您的工作階段指令碼：

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

最後，確認 PowerShell 執行政策允許您的 PowerShell 檔案執行。

# 記錄工作階段指令碼輸出
<a name="logging-session-output"></a>

在組態檔案中啟用此選項時，WorkSpaces 應用程式會自動從寫入標準輸出的工作階段指令碼擷取輸出。此輸出會上傳到您帳戶中的 Amazon S3 儲存貯體。您可以檢閱日誌檔以進行故障排除或偵錯。

**注意**  
當工作階段指令碼傳回一個值，或 **WaitingTime** 中設定值已超過時 (以先到者為準)，就會上傳日誌檔。

# 使用儲存連接器搭配工作階段指令碼
<a name="use-storage-connectors-with-session-scripts"></a>

啟用 WorkSpaces 應用程式儲存連接器時，它們會在工作階段啟動指令碼執行時開始掛載。如果您的指令碼須使用掛載的儲存連接器，您可以等待連接器變成可用。WorkSpaces 應用程式會在 Windows 執行個體的 Windows 登錄檔中維護儲存連接器的掛載狀態，金鑰如下：

HKEY\$1LOCAL\$1MACHINE\$1SOFTWARE\$1Amazon\$1AppStream\$1Storage\$1<提供的使用者名稱>\$1<儲存連接器>

登錄機碼值如下：
+ 提供的使用者名稱：透過存取模式提供的使用者 ID。每個模式的存取模式和值如下：
  + 使用者集區：使用者的電子郵件地址
  + 串流 URL：UserID
  + SAML：NameID。如果使用者名稱包含斜線 (例如，網域使用者的 SAMAccountName)，斜線會換成 "-" 字元。
+ 儲存連接器：為使用者啟用的持久性儲存選項的連接器。儲存連接器值如下：
  + HomeFolder
  + GoogleDrive
  + OneDrive

每個儲存連接器登錄機碼都會包含 **MountStatus** DWORD 值。下表列出可能的 **MountStatus** 值。

**注意**  
若要檢視這些登錄機碼，您的映像必須安裝 Microsoft .NET Framework 4.7.2 版或更新版本。


| Value | Description | 
| --- | --- | 
| 0 |  未針對此使用者啟用儲存連接器  | 
| 1 |  儲存連接器掛載正在進行中  | 
| 2 |  儲存連接器掛載成功  | 
| 3 |  儲存連接器掛載失敗  | 
| 4 |  儲存連接器掛載已啟用，但尚未掛載  | 

在 Linux 執行個體中，您可以查看 \$1/.config/appstream-home-folder/appstream-home-folder-mount-status 檔案中 appstream\$1home\$1folder\$1mount\$1status 的值，以檢查主資料夾掛載狀態。


| Value | Description | 
| --- | --- | 
| True |  已成功掛載主資料夾  | 
| False | 未掛載主資料夾 | 

# 為工作階段指令碼日誌啟用 Amazon S3 儲存貯體儲存
<a name="enable-S3-bucket-storage-session-script-logs"></a>

當您在工作階段指令碼組態中啟用 Amazon S3 記錄時，WorkSpaces 應用程式會從工作階段指令碼擷取標準輸出。此輸出會定期上傳到您的 Amazon Web Services 帳戶內的 S3 儲存貯體。對於每個 AWS 區域，WorkSpaces 應用程式會在您的帳戶中建立專屬於您的帳戶和區域的儲存貯體。

您不需要執行任何設定任務來管理這些 S3 儲存貯體。它們完全由 WorkSpaces 應用程式服務管理。存放在每個儲存貯體中的日誌檔在傳輸中會使用 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 指定工作階段指令碼，WorkSpaces 應用程式會在您的帳戶內建立 Amazon S3 儲存貯體，並顯示名稱。只有具備足夠許可的管理員可以刪除這個儲存貯體。

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

停用工作階段指令碼不會刪除任何存放在 S3 儲存貯體的日誌檔。您或具有足夠許可的其他管理員必須使用 Amazon S3 主控台或 API，才能永久刪除日誌檔。WorkSpaces 應用程式會新增儲存貯體政策，以防止意外刪除儲存貯體。如需詳細資訊，請參閱 [Amazon WorkSpaces 應用程式的 Identity and Access Management](controlling-access.md) 中的 *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`適用於 WorkSpaces 應用程式 API 或 CLI、`federated`適用於 SAML，以及`userpool`適用於使用者集區中的使用者。

***user-id-SHA-256-hash***  
使用者特定的資料夾名稱。此名稱是使用從使用者識別符產生的小寫 SHA-256 雜湊十六進位字串建立。

***session-id***  
使用者串流工作階段的識別符。每個使用者串流工作階段都會產生唯一 ID。

***session-event***  
產生工作階段指令碼日誌的事件。事件值為：`SessionStart` 和 `SessionTermination`。

以下範例資料夾結構適用於從 test-stack 和 test-fleet 開始的串流工作階段。工作階段使用`testuser@mydomain.com`來自 AWS 帳戶 之 ID 的使用者 ID 的 API`123456789012`，以及`test-stack`美國西部 （奧勒岡） 區域中的設定群組 (us-west-2)：

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

在此範例資料夾結構中，一個日誌檔用於使用者環境工作階段開始指令碼，另一個日誌檔用於系統環境工作階段開始指令碼 (如果適用)。

# 在多工作階段機群上使用工作階段指令碼
<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** hook。這表示 **SessionStart** 和 **SessionTermination** 掛鉤可以在指定的執行個體上執行多次，並以許多不同的順序執行。為了獲得最佳體驗，在多工作階段機群上使用時，工作階段指令碼應該符合以下條件：
+ 指令碼是等冪的。

  當已執行動作時，指令碼應處理相同執行個體上的多個執行，並處理得體。
+ 指令碼是獨立的。

  由於指令碼每個工作階段執行，如果一個工作階段正在執行 **SessionTermination**，而另一個工作階段正在執行 **SessionStart**，則不應互相干擾或其他工作階段的體驗。
+ 指令碼具有效能。

  在多工作階段執行個體上，可以同時佈建多個工作階段。這表示工作階段指令碼可以有多個並行執行。指令碼應該有效率、不會耗用過多的資源，也不會影響其他使用者在執行個體上的體驗或工作階段的穩定性。

許多這些需求可以透過將工作階段指令碼邏輯專注於執行指令碼的特定使用者工作階段來滿足。

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

WorkSpaces 應用程式映像不應設定為允許任何使用者寫入工作階段指令碼檔案。這為惡意使用者引入了關鍵的攻擊向量，他們可以在其中修改指令碼檔案。這些檔案接著可以做為 SYSTEM 或其他使用者執行，視您的組態而定。

**重要**  
您有責任確保您的 WorkSpaces 應用程式映像設定安全。這對於多工作階段執行個體特別重要，其中多個使用者正在使用相同的執行個體。如果未安全地設定映像，則該執行個體的所有使用者都會面臨安全風險。

您的映像和工作階段指令碼檔案應該為真：
+ 使用者沒有修改工作階段指令碼檔案的許可。
+ 使用者沒有修改工作階段指令碼 config.json 的許可。映像上的預設行為會限制管理員的存取。

工作階段指令碼可執行檔應存放在安全的位置，可在執行時間安全地進行修改。

如果服務偵測到工作階段指令碼可執行檔已修改，則該執行個體上該掛鉤的任何後續執行將會失敗、將日誌檔案上傳至 Amazon S3 （如果已啟用 Amazon S3 記錄），而且您會看到下列訊息：

**工作階段指令碼未執行，因為執行個體佈建後已修改可執行檔。基於安全考量，已略過執行。**

如果您的使用案例需要在執行時間修改工作階段指令碼可執行檔 （例如，如果您指向執行時間自動更新程序修改的 EXE 檔案），則上述檢查將會失敗。在此情況下，請使用指令碼將執行重新導向至修改後的可執行檔。當服務執行安全檢查時，讓指令碼在執行時間保持不變。

如果您的工作階段指令碼檔案過大 （超過 100 MB)，這可能會導致執行個體和工作階段佈建延遲，而安全檢查需要額外時間 （取決於執行個體類型和可用資源）。如果您的使用案例需要大型工作階段指令碼，請考慮使用較小的指令碼來重新導向執行。這將改善執行個體和工作階段佈建體驗。

請注意，服務只會檢查工作階段指令碼 config.json 中定義的可執行檔，而這只是備用/最佳工作量機制。您有責任確保工作階段指令碼可執行檔中的所有程式碼路徑都是安全的，而且無法由最終使用者修改。