

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

# gMSA 使用 搭配無網域使用 Amazon ECS Windows 容器 AWS CLI
<a name="tutorial-gmsa-windows"></a>

以下教學課程示範如何建立一個執行 Windows 容器的 Amazon ECS 任務，此容器具有透過 AWS CLI存取 Active Directory 的憑證。使用無網域 gMSA 時，容器執行個體不會加入網域，執行個體上的其他應用程式無法使用憑證來存取網域，而加入不同網域的任務則可在相同的執行個體上執行。

**Topics**
+ [先決條件](#tutorial-gmsa-windows-prerequisites)
+ [步驟 1：在 Active Directory Domain Services (AD DS) 上建立和設定 gMSA 帳戶](#tutorial-gmsa-windows-step1)
+ [步驟 2：將憑證上傳至 Secrets Manager](#tutorial-gmsa-windows-step2)
+ [步驟 3：修改您的 CredSpec JSON 以包含無網域 gMSA 資訊](#tutorial-gmsa-windows-step3)
+ [步驟 4：將 CredSpec 上傳至 Amazon S3](#tutorial-gmsa-windows-step4)
+ [步驟 5：(選用) 建立 Amazon ECS 叢集](#tutorial-gmsa-windows-step5)
+ [步驟 6：針對容器執行個體建立 IAM 角色](#tutorial-gmsa-windows-step6)
+ [步驟 7：建立自訂任務執行角色](#tutorial-gmsa-windows-step7)
+ [步驟 8：為 Amazon ECS Exec 建立任務角色](#tutorial-gmsa-windows-step8)
+ [步驟 9：註冊使用無網域 gMSA 的任務定義](#tutorial-gmsa-windows-step9)
+ [步驟 10：將 Windows 容器執行個體註冊至叢集](#tutorial-gmsa-windows-step10)
+ [步驟 11：驗證容器執行個體](#tutorial-gmsa-windows-step11)
+ [步驟 12：執行 Windows 任務](#tutorial-gmsa-windows-step12)
+ [步驟 13：驗證容器具有 gMSA 憑證](#tutorial-gmsa-windows-step13)
+ [步驟 14：清除](#tutorial-gmsa-windows-step14)
+ [偵錯 Windows 容器的 Amazon ECS 無網域 gMSA](#tutorial-gmsa-windows-debugging)

## 先決條件
<a name="tutorial-gmsa-windows-prerequisites"></a>

本教學課程假設已完成下列先決條件：
+ 已完成「[設定以使用 Amazon ECS。](get-set-up-for-amazon-ecs.md)」中的步驟。
+ 您的 IAM 使用者擁有 [AmazonECS\$1FullAccess](security-iam-awsmanpol.md#security-iam-awsmanpol-AmazonECS_FullAccess) IAM 政策範例中指定的所需許可。
+  AWS CLI 已安裝並設定最新版本的 。如需安裝或升級 的詳細資訊 AWS CLI，請參閱[安裝 AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)。
**注意**  
您可以使用雙堆疊服務端點，透過 IPv4 和 IPv6 AWS CLI從 、 SDKs 和 Amazon ECS API 與 Amazon ECS 互動。如需詳細資訊，請參閱[使用 Amazon ECS 雙堆疊端點](dual-stack-endpoint.md)。
+ 您可以使用您希望容器存取的資源來設定 Active Directory 網域。Amazon ECS 支援下列設定：
  +  Directory Service Active Directory. Directory Service 是在 Amazon EC2 上託管的 AWS 受管 Active Directory。如需詳細資訊，請參閱《 *AWS Directory Service 管理指南*》中的 [AWS Managed Microsoft AD 入門](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_getting_started.html)。
  + 內部部署 Active Directory。您必須確認 Amazon ECS Linux 容器執行個體可以加入網域。如需詳細資訊，請參閱[AWS Direct Connect](https://docs.aws.amazon.com/whitepapers/latest/aws-vpc-connectivity-options/aws-direct-connect-network-to-amazon.html)。
+ 您擁有可以解析 Active Directory 網域的 VPC 和子網路。
+ 您可以選擇**無網域 gMSA** 或**將每個執行個體加入單一網域**。使用無網域 gMSA 時，容器執行個體不會加入網域，執行個體上的其他應用程式無法使用憑證來存取網域，而加入不同網域的任務則可在相同的執行個體上執行。

  然後，選擇 CredSpec 的資料儲存，也可以選擇無網域 gMSA 的 Active Directory 使用者憑證的資料儲存。

  Amazon ECS 使用 Active Directory 憑證規格檔案 (CredSpec)。此檔案包含用於將 gMSA 帳戶內容傳播至容器的 gMSA 中繼資料。您會產生 CredSpec 檔案，然後將其儲存在下表中特定於容器執行個體的作業系統的 CredSpec 儲存選項之一。若要使用無網域方法，CredSpec 檔案中的選擇性區段可以在下表中的 *domainless user credentials* 儲存選項之一中指定憑證 (特定於容器執行個體的作業系統)。    
<a name="gmsa-table"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonECS/latest/developerguide/tutorial-gmsa-windows.html)
+ （選用） AWS CloudShell 是一種工具，可為客戶提供命令列，而不需要建立自己的 EC2 執行個體。如需詳細資訊，請參閱*AWS CloudShell 《 使用者指南*》中的[什麼是 AWS CloudShell？](https://docs.aws.amazon.com/cloudshell/latest/userguide/welcome.html)。

## 步驟 1：在 Active Directory Domain Services (AD DS) 上建立和設定 gMSA 帳戶
<a name="tutorial-gmsa-windows-step1"></a>

在 Active Directory 網域上建立並設定 gMSA 帳戶。

**注意**  
此步驟會建立兩個不同的帳戶：為容器提供身分的群組受管服務帳戶 (gMSA)，以及用於網域身分驗證的一般使用者帳戶。這些帳戶的用途各不相同，因此應使用不同的名稱。

1. 

**產生金鑰分佈服務根金鑰**
**注意**  
如果您使用的是 Directory Service，則可以略過此步驟。

   KDS 根金鑰和 gMSA 許可是使用您 AWS 受管的 Microsoft AD 來設定。

   如果您尚未在網域中建立 gMSA 服務帳戶，則必須先產生金鑰分佈服務 (KDS) 根金鑰。KDS 負責建立、輪換和向授權主機發佈 gMSA 密碼。當 `ccg.exe` 需要擷取 gMSA 憑證時，將會聯絡 KDS 以擷取目前密碼。

   若要檢查是否已建立 KDS 根金鑰，請使用 `ActiveDirectory` PowerShell 模組，在網域控制器上以網域管理員權限執行下列 PowerShell cmdlet。如需有關此模組的詳細資訊，請參閱 Microsoft Learn 網站上的 [ActiveDirectory 模組](https://learn.microsoft.com/en-us/powershell/module/activedirectory/?view=windowsserver2022-ps)。

   ```
   PS C:\> Get-KdsRootKey
   ```

   如果命令傳回金鑰 ID，您可以略過此步驟的其餘部分。否則，執行下列命令以建立 KDS 根金鑰：

   ```
   PS C:\> Add-KdsRootKey -EffectiveImmediately
   ```

   儘管命令的引數 `EffectiveImmediately` 意味著金鑰會立即生效，但您需要等待 10 小時才能複製 KDS 根金鑰並可在所有網域控制器上使用。

1. 

**建立 gMSA 帳戶**

   若要建立 gMSA 帳戶並允許 `ccg.exe` 擷取 gMSA 密碼，請從有權存取網域的 Windows 伺服器或用戶端執行下列 PowerShell 命令。將 `ExampleAccount` 取代為要用於 gMSA 帳戶的名稱，並將 `example-domain` 取代為 Active Directory 網域名稱 (例如：網域為 `contoso.com`，則使用 `contoso`)。

   1. 

      ```
      PS C:\> Install-WindowsFeature RSAT-AD-PowerShell
      ```

   1. 

      ```
      PS C:\> New-ADGroup -Name "ExampleAccount Authorized Hosts" -SamAccountName "ExampleAccountHosts" -GroupScope DomainLocal
      ```

   1. 

      ```
      PS C:\> New-ADServiceAccount -Name "ExampleAccount" -DnsHostName "example-domain" -ServicePrincipalNames "host/ExampleAccount", "host/example-domain" -PrincipalsAllowedToRetrieveManagedPassword "ExampleAccountHosts"
      ```

   1. 建立一個具有不會過期的永久密碼的使用者。這些登入資料會存放在 中， AWS Secrets Manager 並由每個任務用來加入網域。這是與前文建立的 gMSA 帳戶不同的使用者帳戶。將 `ExampleServiceUser` 取代為要用於該服務使用者帳戶的名稱。

      ```
      PS C:\> New-ADUser -Name "ExampleServiceUser" -AccountPassword (ConvertTo-SecureString -AsPlainText "Test123" -Force) -Enabled 1 -PasswordNeverExpires 1
      ```

   1. 

      ```
      PS C:\> Add-ADGroupMember -Identity "ExampleAccountHosts" -Members "ExampleServiceUser"
      ```

   1. 安裝用於在 Active Directory 中建立 CredSpec 物件的 PowerShell 模組並輸出 CredSpec JSON。

      ```
      PS C:\> Install-PackageProvider -Name NuGet -Force
      ```

      ```
      PS C:\> Install-Module CredentialSpec
      ```

   1. 

      ```
      PS C:\> New-CredentialSpec -AccountName ExampleAccount
      ```

1. 將上一個命令的 JSON 輸出複製到名為 `gmsa-cred-spec.json` 的檔案中。這是 CredSpec 檔案。其在步驟 3 [步驟 3：修改您的 CredSpec JSON 以包含無網域 gMSA 資訊](#tutorial-gmsa-windows-step3) 中使用。

## 步驟 2：將憑證上傳至 Secrets Manager
<a name="tutorial-gmsa-windows-step2"></a>

將 Active Directory 憑證複製至安全的憑證儲存系統中，以便每個任務都能擷取此憑證。這是無網域 gMSA 方法。使用無網域 gMSA 時，容器執行個體不會加入網域，執行個體上的其他應用程式無法使用憑證來存取網域，而加入不同網域的任務則可在相同的執行個體上執行。

此步驟使用 AWS CLI。您可以在預設 Shell (即 `bash`) 的 AWS CloudShell 中執行這些命令。
+ 執行下列 AWS CLI 命令並取代使用者名稱、密碼和網域名稱，以符合您的環境。使用服務使用者帳戶名稱 (而非 gMSA 帳戶名稱) 作為使用者名稱。預留密碼的 ARN 以在下一個步驟中使用，[步驟 3：修改您的 CredSpec JSON 以包含無網域 gMSA 資訊](#tutorial-gmsa-windows-step3)

  以下命令使用由 `sh` 和相容 shell 所使用的反斜線接續字元。此命令與 PowerShell 不相容。您必須修改命令才能將其與 PowerShell 搭配使用。

  ```
  $ aws secretsmanager create-secret \
  --name gmsa-plugin-input \
  --description "Amazon ECS - gMSA Portable Identity." \
  --secret-string "{\"username\":\"ExampleServiceUser\",\"password\":\"Test123\",\"domainName\":\"contoso.com\"}"
  ```

## 步驟 3：修改您的 CredSpec JSON 以包含無網域 gMSA 資訊
<a name="tutorial-gmsa-windows-step3"></a>

在將 CredSpec 上傳至其中一個儲存選項之前，請使用上一個步驟中 Secrets Manager 中密碼的 ARN 將資訊新增至 CredSpec。如需詳細資訊，請參閱 Microsoft Learn 網站上的[未加入網域的容器主機使用案例的其他憑證規格組態](https://learn.microsoft.com/en-us/virtualization/windowscontainers/manage-containers/manage-serviceaccounts#additional-credential-spec-configuration-for-non-domain-joined-container-host-use-case)。

1. 將下列資訊新增至 `ActiveDirectoryConfig` 內的 CredSpec 檔案。將 ARN 替換為上一個步驟 Secrets Manager 中的密碼。

   請注意，`PluginGUID` 值必須與下列範例程式碼片段中的 GUID 相符，且為必要值。

   ```
   "HostAccountConfig": {
         "PortableCcgVersion": "1",
         "PluginGUID": "{859E1386-BDB4-49E8-85C7-3070B13920E1}",
         "PluginInput": "{\"credentialArn\": \"arn:aws:secretsmanager:aws-region:111122223333:secret:gmsa-plugin-input\"}"
       }
   ```

   您也可以透過使用以下格式的 ARN，在 SSM 參數存放區中使用祕密：`\"arn:aws:ssm:aws-region:111122223333:parameter/gmsa-plugin-input\"`。

1. 修改 CredSpec 檔案之後，檔案應類似於以下範例：

   ```
   {
     "CmsPlugins": [
       "ActiveDirectory"
     ],
     "DomainJoinConfig": {
       "Sid": "S-1-5-21-4066351383-705263209-1606769140",
       "MachineAccountName": "ExampleAccount",
       "Guid": "ac822f13-583e-49f7-aa7b-284f9a8c97b6",
       "DnsTreeName": "example-domain",
       "DnsName": "example-domain",
       "NetBiosName": "example-domain"
     },
     "ActiveDirectoryConfig": {
       "GroupManagedServiceAccounts": [
         {
           "Name": "ExampleAccount",
           "Scope": "example-domain"
         },
         {
           "Name": "ExampleAccount",
           "Scope": "example-domain"
         }
       ],
       "HostAccountConfig": {
         "PortableCcgVersion": "1",
         "PluginGUID": "{859E1386-BDB4-49E8-85C7-3070B13920E1}",
         "PluginInput": "{\"credentialArn\": \"arn:aws:secretsmanager:aws-region:111122223333:secret:gmsa-plugin-input\"}"
       }
     }
   }
   ```

## 步驟 4：將 CredSpec 上傳至 Amazon S3
<a name="tutorial-gmsa-windows-step4"></a>



此步驟使用 AWS CLI。您可以在預設 Shell (即 `bash`) 的 AWS CloudShell 中執行這些命令。

1. 將 CredSpec 檔案複製至正在執行 AWS CLI 命令的電腦或環境中。

1. 執行下列 AWS CLI 命令，將 CredSpec 上傳至 Amazon S3。將 `MyBucket` 取代為您的 Amazon S3 儲存貯體的名稱。您可以將檔案作為物件儲存在任何儲存貯體和位置，但必須在附加至任務執行角色的政策中允許存取該儲存貯體和位置。

   以下命令使用由 `sh` 和相容 shell 所使用的反斜線接續字元。此命令與 PowerShell 不相容。您必須修改命令才能將其與 PowerShell 搭配使用。

   ```
   $ aws s3 cp gmsa-cred-spec.json \
   s3://MyBucket/ecs-domainless-gmsa-credspec
   ```

## 步驟 5：(選用) 建立 Amazon ECS 叢集
<a name="tutorial-gmsa-windows-step5"></a>

預設情況下，您的帳戶會有一個名為 `default` 的 Amazon ECS 叢集。根據預設 AWS CLI，此叢集用於 、 SDKs和 CloudFormation。您可以使用其他叢集來分組和組織任務和基礎結構，並為某些組態指派預設值。

您可以從 AWS 管理主控台、 AWS CLI SDKs或 建立叢集 CloudFormation。叢集中的設定和組態不會影響 gMSA。

此步驟使用 AWS CLI。您可以在預設 Shell (即 `bash`) 的 AWS CloudShell 中執行這些命令。

```
$ aws ecs create-cluster --cluster-name windows-domainless-gmsa-cluster
```

**重要**  
如果您選擇建立自己的叢集，您必須在打算對該叢集使用的每個命令中指定 `--cluster clusterName`。

## 步驟 6：針對容器執行個體建立 IAM 角色
<a name="tutorial-gmsa-windows-step6"></a>

*容器執行個體*是在 ECS 任務中執行容器的主機電腦，例如 Amazon EC2 執行個體。每個容器執行個體都會註冊至 Amazon ECS 叢集。在您啟動 Amazon EC2 執行個體並將其註冊到叢集之前，您必須先為要使用的容器執行個體建立 IAM 角色。

若要建立容器執行個體角色，請參閱 [Amazon ECS 容器執行個體 IAM 角色](instance_IAM_role.md)。預設值 `ecsInstanceRole` 具有足夠的許可來完成此教學課程。

## 步驟 7：建立自訂任務執行角色
<a name="tutorial-gmsa-windows-step7"></a>

Amazon ECS 可針對啟動每個任務所需的許可使用不同的 IAM 角色，而不是容器執行個體角色。此角色是*任務執行角色*。我們建議您建立僅具有 ECS 執行任務所需許可的任務執行角色，也稱為*最低權限許可*。如需有關最低權限原則的詳細資訊，請參閱《AWS Well-Architected 的架構》**中的 [SEC03-BP02 授予最低權限存取權](https://docs.aws.amazon.com/wellarchitected/latest/framework/sec_permissions_least_privileges.html)。

1. 若要建立任務執行角色，請參閱 [建立任務執行角色](task_execution_IAM_role.md#create-task-execution-role)。預設許可允許容器執行個體從 Amazon Elastic Container Registry 中提取容器映像，並從應用程式中提取 `stdout` 和 `stderr` 並記錄到 Amazon CloudWatch Logs 中。

   由於角色需要本教學課程的自訂許可，因此您可以為該角色指定與 `ecsTaskExecutionRole` 不同的名稱。本教學課程將在後續步驟中使用 `ecsTaskExecutionRole`。

1. 建立自訂原則 (僅存在於此角色的內嵌政策或可重複使用的政策)，以新增下列許可。將第一個陳述式中 `Resource` 的 ARN 替換為 Amazon S3 儲存貯體和位置，並將第二個 `Resource` 替換為 Secrets Manager 中密碼的 ARN。

   如果您使用自訂金鑰在 Secrets Manager 中加密密碼，則也必須允許金鑰使用 `kms:Decrypt`。

   如果您使用 SSM 參數存放區而不是 Secrets Manager，您必須允許參數使用 `ssm:GetParameter`，而不是 `secretsmanager:GetSecretValue`。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "s3:GetObject"
               ],
               "Resource": "arn:aws:s3:::MyBucket/ecs-domainless-gmsa-credspec/gmsa-cred-spec.json"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "secretsmanager:GetSecretValue"
               ],
               "Resource": "arn:aws:secretsmanager:us-east-1:111122223333:secret:gmsa-plugin-AbCdEf"
           }
       ]
   }
   ```

------

## 步驟 8：為 Amazon ECS Exec 建立任務角色
<a name="tutorial-gmsa-windows-step8"></a>

本教學課程使用 Amazon ECS Exec，透過在執行中的任務內執行命令來驗證功能。若要使用 ECS Exec，服務或任務必須開啟 ECS Exec，且任務角色 (但不是任務執行角色) 必須具有 `ssmmessages` 許可。如需了解所需的 IAM 政策，請參閱[ECS Exec 許可](task-iam-roles.md#ecs-exec-required-iam-permissions)。

此步驟使用 AWS CLI。您可以在預設 Shell (即 `bash`) 的 AWS CloudShell 中執行這些命令。

若要使用 建立任務角色 AWS CLI，請遵循下列步驟。

1. 建立稱為 `ecs-tasks-trust-policy.json` 的檔案，其中具有以下內容：

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Principal": {
                   "Service": "ecs-tasks.amazonaws.com"
               },
               "Action": "sts:AssumeRole"
           }
       ]
   }
   ```

------

1. 建立 IAM 角色。您可以替換名稱 `ecs-exec-demo-task-role`，但預留以下步驟的名稱。

   以下命令使用由 `sh` 和相容 shell 所使用的反斜線接續字元。此命令與 PowerShell 不相容。您必須修改命令才能將其與 PowerShell 搭配使用。

   ```
   $ aws iam create-role --role-name ecs-exec-demo-task-role \
   --assume-role-policy-document file://ecs-tasks-trust-policy.json
   ```

   您可以刪除檔案 `ecs-tasks-trust-policy.json`。

1. 建立稱為 `ecs-exec-demo-task-role-policy.json` 的檔案，其中具有以下內容：

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "ssmmessages:CreateControlChannel",
                   "ssmmessages:CreateDataChannel",
                   "ssmmessages:OpenControlChannel",
                   "ssmmessages:OpenDataChannel"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

------

1. 建立 IAM 政策並將其附加至上一個步驟中的角色。

   以下命令使用由 `sh` 和相容 shell 所使用的反斜線接續字元。此命令與 PowerShell 不相容。您必須修改命令才能將其與 PowerShell 搭配使用。

   ```
   $ aws iam put-role-policy \
       --role-name ecs-exec-demo-task-role \
       --policy-name ecs-exec-demo-task-role-policy \
       --policy-document file://ecs-exec-demo-task-role-policy.json
   ```

   您可以刪除檔案 `ecs-exec-demo-task-role-policy.json`。

## 步驟 9：註冊使用無網域 gMSA 的任務定義
<a name="tutorial-gmsa-windows-step9"></a>



此步驟使用 AWS CLI。您可以在預設 Shell (即 `bash`) 的 AWS CloudShell 中執行這些命令。

1. 建立稱為 `windows-gmsa-domainless-task-def.json` 的檔案，其中具有以下內容：

   ```
   {
     "family": "windows-gmsa-domainless-task",
     "containerDefinitions": [
       {
         "name": "windows_sample_app",
         "image": "mcr.microsoft.com/windows/servercore/iis",
         "cpu": 1024,
         "memory": 1024,
         "essential": true,
         "credentialSpecs": [
                   "credentialspecdomainless:arn:aws:s3:::ecs-domainless-gmsa-credspec/gmsa-cred-spec.json"
         ],
         "entryPoint": [
           "powershell",
           "-Command"
         ],
         "command": [
           "New-Item -Path C:\\inetpub\\wwwroot\\index.html -ItemType file -Value '<html> <head> <title>Amazon ECS Sample App</title> <style>body {margin-top: 40px; background-color: #333;} </style> </head><body> <div style=color:white;text-align:center> <h1>Amazon ECS Sample App</h1> <h2>Congratulations!</h2> <p>Your application is now running on a container in Amazon ECS.</p>' -Force ; C:\\ServiceMonitor.exe w3svc"
         ],
         "portMappings": [
           {
             "protocol": "tcp",
             "containerPort": 80,
             "hostPort": 8080
           }
         ]
       }
     ],
     "taskRoleArn": "arn:aws:iam::111122223333:role/ecs-exec-demo-task-role",
     "executionRoleArn": "arn:aws:iam::111122223333:role/ecsTaskExecutionRole"
   }
   ```

1. 執行下列命令來註冊任務定義：

   以下命令使用由 `sh` 和相容 shell 所使用的反斜線接續字元。此命令與 PowerShell 不相容。您必須修改命令才能將其與 PowerShell 搭配使用。

   ```
   $ aws ecs register-task-definition \
   --cli-input-json file://windows-gmsa-domainless-task-def.json
   ```

## 步驟 10：將 Windows 容器執行個體註冊至叢集
<a name="tutorial-gmsa-windows-step10"></a>

啟動 Amazon EC2 Windows 執行個體並執行 ECS 容器代理程式，以將其註冊為叢集中的容器執行個體。ECS 會在已註冊至叢集 (任務在其中啟動) 的容器執行個體上執行任務。

1. 若要啟動在 中為 Amazon ECS 設定的 Amazon EC2 Windows 執行個體 AWS 管理主控台，請參閱 [啟動 Amazon ECS Windows 容器執行個體](launch_window-container_instance.md)。在*使用者資料*的步驟停止。

1. 若為 gMSA，使用者資料必須先設定環境變數 `ECS_GMSA_SUPPORTED`，才能啟動 ECS 容器代理程式。

   對於 ECS Exec，代理程式必須以引數 `-EnableTaskIAMRole` 開頭。

   若要防止任務到達 EC2 IMDS Web 服務以擷取角色憑證，以保護執行個體 IAM 角色，請新增引數 `-AwsvpcBlockIMDS`。這只適用於使用 `awsvpc` 網路模式的任務。

   ```
   <powershell>
   [Environment]::SetEnvironmentVariable("ECS_GMSA_SUPPORTED", $TRUE, "Machine")
   Import-Module ECSTools
   Initialize-ECSAgent -Cluster windows-domainless-gmsa-cluster -EnableTaskIAMRole -AwsvpcBlockIMDS
   </powershell>
   ```

1. 檢閱 **Summary** (摘要) 面板中執行個體組態的摘要，並在準備就緒時選擇 **Launch instance** (啟動執行個體)。

## 步驟 11：驗證容器執行個體
<a name="tutorial-gmsa-windows-step11"></a>

您可以使用 AWS 管理主控台驗證叢集中是否存在容器執行個體。但是，gMSA 需要指示為*屬性*的其他功能。這些屬性不會顯示在 中 AWS 管理主控台，因此本教學課程會使用 AWS CLI。

此步驟使用 AWS CLI。您可以在預設 Shell (即 `bash`) 的 AWS CloudShell 中執行這些命令。

1. 列出叢集中的容器執行個體。容器執行個體的 ID 與 EC2 執行個體的 ID 不同。

   ```
   $ aws ecs list-container-instances
   ```

   輸出：

   ```
   {
       "containerInstanceArns": [
           "arn:aws:ecs:aws-region:111122223333:container-instance/default/MyContainerInstanceID"
       ]
   }
   ```

   例如，`526bd5d0ced448a788768334e79010fd` 是有效的容器執行個體 ID。

1. 使用上一個步驟中的容器執行個體 ID 來取得容器執行個體的詳細資訊。使用 ID 取代 `MyContainerInstanceID`。

   以下命令使用由 `sh` 和相容 shell 所使用的反斜線接續字元。此命令與 PowerShell 不相容。您必須修改命令才能將其與 PowerShell 搭配使用。

   ```
   $ aws ecs describe-container-instances \
        ----container-instances MyContainerInstanceID
   ```

   請注意，輸出內容非常長。

1. 驗證 `attributes` 清單中是否存在一個索引鍵為 `name` 且值為 `ecs.capability.gmsa-domainless` 的物件。下列為物件的範例。

   輸出：

   ```
   {
       "name": "ecs.capability.gmsa-domainless"
   }
   ```

## 步驟 12：執行 Windows 任務
<a name="tutorial-gmsa-windows-step12"></a>

執行 Amazon ECS 任務。如果叢集中只有 1 個容器執行個體，您可以使用 `run-task`。如果有許多不同的容器執行個體，則相較於將置放條件限制新增至任務定義，以控制要執行此任務的容器執行個體類型，使用 `start-task` 並指定要在其上執行任務的容器執行個體 ID 可能會更為容易。

此步驟使用 AWS CLI。您可以在預設 Shell (即 `bash`) 的 AWS CloudShell 中執行這些命令。

1. 

   以下命令使用由 `sh` 和相容 shell 所使用的反斜線接續字元。此命令與 PowerShell 不相容。您必須修改命令才能將其與 PowerShell 搭配使用。

   ```
   aws ecs run-task --task-definition windows-gmsa-domainless-task \
       --enable-execute-command --cluster windows-domainless-gmsa-cluster
   ```

   請注意，任務 ID 是由命令傳回。

1. 執行下列命令，以驗證任務已開始。這個命令會等待，直到任務開始時才傳回 Shell 提示字元。使用前一步驟中的任務 ID，取代 `MyTaskID`。

   ```
   $ aws ecs wait tasks-running --task MyTaskID
   ```

## 步驟 13：驗證容器具有 gMSA 憑證
<a name="tutorial-gmsa-windows-step13"></a>

驗證任務中的容器具有 Kerberos 權杖。gMSA

此步驟使用 AWS CLI。您可以在預設 Shell (即 `bash`) 的 AWS CloudShell 中執行這些命令。

1. 

   以下命令使用由 `sh` 和相容 shell 所使用的反斜線接續字元。此命令與 PowerShell 不相容。您必須修改命令才能將其與 PowerShell 搭配使用。

   ```
   $ aws ecs execute-command \
   --task MyTaskID \
   --container windows_sample_app \
   --interactive \
   --command powershell.exe
   ```

   輸出將是 PowerShell 提示字元。

1. 在容器內的 PowerShell 終端中執行以下命令。

   ```
   PS C:\> klist get ExampleAccount$
   ```

   在輸出中，請注意 `Principal` 是您先前所建立的項目。

## 步驟 14：清除
<a name="tutorial-gmsa-windows-step14"></a>

完成此教學課程時，建議您清除相關聯的資源，以免未使用的資源產生費用。

此步驟使用 AWS CLI。您可以在預設 Shell (即 `bash`) 的 AWS CloudShell 中執行這些命令。

1. 停止任務。使用步驟 12 中的任務 ID [步驟 12：執行 Windows 任務](#tutorial-gmsa-windows-step12) 取代 `MyTaskID`。

   ```
   $ aws ecs stop-task --task MyTaskID
   ```

1. 終止 Amazon EC2 執行個體。之後，叢集中的容器執行個體將會在一小時後自動刪除。

   您可以使用 Amazon EC2 主控台來尋找和終止執行個體。或者，您可以執行下列命令。若要執行命令，請在步驟 1 [步驟 11：驗證容器執行個體](#tutorial-gmsa-windows-step11) 的 `aws ecs describe-container-instances` 命令輸出中尋找 EC2 執行個體識別碼。i-10a64379 是 EC2 執行個體 ID 的範例。

   ```
   $ aws ec2 terminate-instances --instance-ids MyInstanceID
   ```

1. 刪除 Amazon S3 中的 CredSpec 檔案。將 `MyBucket` 取代為您的 Amazon S3 儲存貯體的名稱。

   ```
   $ aws s3api delete-object --bucket MyBucket --key ecs-domainless-gmsa-credspec/gmsa-cred-spec.json
   ```

1. 從 Secrets Manager 中刪除密碼。如果您改用 SSM 參數存放區，請刪除參數。

   以下命令使用由 `sh` 和相容 shell 所使用的反斜線接續字元。此命令與 PowerShell 不相容。您必須修改命令才能將其與 PowerShell 搭配使用。

   ```
   $ aws secretsmanager delete-secret --secret-id gmsa-plugin-input \
        --force-delete-without-recovery
   ```

1. 取消註冊並刪除任務定義。透過取消註冊任務定義，您可以將其標記為非作用中狀態，以便無法用於啟動新任務。然後，您可以刪除任務定義。

   1. 透過指定版本取消註冊任務定義。ECS 會自動建立任務定義的版本，編號從 1 開始。您引用的版本與容器映像上的標籤格式相同，例如 `:1`。

      ```
      $ aws ecs deregister-task-definition --task-definition windows-gmsa-domainless-task:1
      ```

   1. 刪除任務定義。

      ```
      $ aws ecs delete-task-definitions --task-definition windows-gmsa-domainless-task:1
      ```

1. (選用) 如果您已建立叢集，請刪除 ECS 叢集。

   ```
   $ aws ecs delete-cluster --cluster windows-domainless-gmsa-cluster
   ```

## 偵錯 Windows 容器的 Amazon ECS 無網域 gMSA
<a name="tutorial-gmsa-windows-debugging"></a>



Amazon ECS 任務狀態  
ECS 會嘗試僅啟動一次任務。任何有問題的任務均會停止，並設定為狀態 `STOPPED`。任務有兩種常見的問題類型。首先是無法啟動的任務。其次是應用程式已在容器之一內停止的任務。在 中 AWS 管理主控台，查看任務的**停止原因**欄位，了解任務停止的原因。在 AWS CLI中，描述任務並查看 `stoppedReason`。如需 AWS 管理主控台 和 中的步驟 AWS CLI，請參閱 [檢視 Amazon ECS 已停止任務錯誤](stopped-task-errors.md)。

Windows 事件  
容器中 gMSA 的 Windows 事件記錄在 `Microsoft-Windows-Containers-CCG` 日誌中，您可以在 `Logs\Microsoft\Windows\Containers-CCG\Admin`「應用程式和服務」區段的「事件檢視器」中找到。如需詳細的偵錯提示，請參閱 Microsoft Learn 網站上的 [ Windows 容器 gMSA 故障排除](https://learn.microsoft.com/en-us/virtualization/windowscontainers/manage-containers/gmsa-troubleshooting#non-domain-joined-container-hosts-use-event-logs-to-identify-configuration-issues)。

ECS 代理程式 gMSA 外掛程式  
Windows 容器執行個體上 ECS 代理程式的 gMSA 外掛程式記錄位於下列目錄 `C:/ProgramData/Amazon/gmsa-plugin/` 中。查看此日誌，查看是否已從儲存位置 (例如 Secrets Manager) 下載無網域使用者憑證，以及是否正確讀取憑證格式。