

# AWS CLI を使用するドメインレス gMSA で Amazon ECS Windows コンテナを使用する
<a name="tutorial-gmsa-windows"></a>

次のチュートリアルでは、AWS CLI を使用して Active Directory にアクセスするための認証情報を持つ Windows コンテナを実行する Amazon ECS タスクを作成する方法を示します。ドメインレス gMSA を使用すると、コンテナインスタンスはドメインに参加せず、インスタンス上の他のアプリケーションは認証情報を使用してドメインにアクセスできなくなり、異なるドメインに参加するタスクを同じインスタンス上で実行できます。

**Topics**
+ [前提条件](#tutorial-gmsa-windows-prerequisites)
+ [ステップ 1: Active Directory ドメイン サービス (AD DS) で gMSA アカウントを作成して設定する](#tutorial-gmsa-windows-step1)
+ [ステップ 2: Secrets Manager に認証情報をアップロードする](#tutorial-gmsa-windows-step2)
+ [ステップ 3: CredSpec JSON を変更してドメインレス gMSA 情報を含める](#tutorial-gmsa-windows-step3)
+ [ステップ 4： Amazon S3 に CredSpec をアップロードする](#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、SDK、および 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/ja_jp/AmazonECS/latest/developerguide/tutorial-gmsa-windows.html)
+ (任意) AWS CloudShell は、お客様が独自の EC2 インスタンスを作成する必要なく、コマンドラインを提供するツールです。詳細については、「*AWS CloudShell ユーザーガイド*」の「[What is AWS CloudShell?](https://docs.aws.amazon.com/cloudshell/latest/userguide/welcome.html)」を参照してください。

## ステップ 1: Active Directory ドメイン サービス (AD DS) で gMSA アカウントを作成して設定する
<a name="tutorial-gmsa-windows-step1"></a>

Active Directory ドメインの gMSA アカウントを作成して設定します。

**注記**  
このステップでは、コンテナの ID を提供するグループ管理サービスアカウント (gMSA) と、ドメイン認証に使用される通常のユーザーアカウントの 2 つの個別のアカウントを作成します。これらのアカウントは目的が異なるため、異なる名前を付ける必要があります。

1. 

**Key Distribution Service のルートキーを生成する**
**注記**  
Directory Service を使用している場合は、このステップを省略できます。

   KDS ルートキーと gMSA アクセス許可は、AWS マネージド Microsoft AD で構成されます。

   ドメインに 1 つの gMSA Service Account をまだ作成していない場合は、まず Key Distribution Service (KDS) ルートキーを生成する必要があります。KDS は、gMSA パスワードの作成、ローテーション、承認されたホストへのパスワードのリリースを担います。`ccg.exe` が gMSA 認証情報を取得する必要がある場合は、KDS に連絡して現在のパスワードを取得します。

   KDS ルート キーが既に作成されているかどうかを確認するには、`ActiveDirectory` PowerShell モジュールを使用して、ドメインコントローラー上でドメイン管理者権限で次の PowerShell コマンドレットを実行します。モジュールの詳細については、Microsoft Learn Web サイトの「[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` は、キーがすぐに有効になることを暗示していますが、KDS ルートキーが複製され、すべてのドメインコントローラーで使用できるようになるまで 10 時間待つ必要があります。

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 を使用します。AWS CloudShell のこれらのコマンドは、デフォルトのシェルである `bash` で実行できます。
+ AWS CLI コマンドを実行し、ユーザー名、パスワード、ドメイン名を環境に合わせて置き換えます。ユーザー名には、サービスユーザーアカウント名 (gMSA アカウント名ではない) を使用します。シークレットの ARN を保管して次のステップ [ステップ 3: CredSpec JSON を変更してドメインレス gMSA 情報を含める](#tutorial-gmsa-windows-step3) で使用します。

  次のコマンドでは、`sh` と互換性のあるシェルで使用されるバックスラッシュ継続文字を使用します。このコマンドは 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 Web サイトの「[ドメイン結合されていないコンテナホストのユースケース向けの追加の認証情報仕様設定](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:aws:ssm:aws-region:111122223333:parameter/gmsa-plugin-input\"` の ARN を使用して SSM Parameter Store でシークレットを使用できます。

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： Amazon S3 に CredSpec をアップロードする
<a name="tutorial-gmsa-windows-step4"></a>



このステップでは、AWS CLI を使用します。AWS CloudShell のこれらのコマンドは、デフォルトのシェルである `bash` で実行できます。

1. AWS CLI コマンドを実行しているコンピューターまたは環境に CredSpec ファイルをコピーします。

1. 次の AWS CLI コマンドを実行し、Amazon S3 に CredSpec をアップロードします。`MyBucket` をお使いの Amazon S3 バケットの名前に置き換えます。ファイルは任意のバケットと場所にオブジェクトとして保存できますが、タスク実行ロールにアタッチするポリシーでそのバケットと場所へのアクセスを許可する必要があります。

   次のコマンドでは、`sh` と互換性のあるシェルで使用されるバックスラッシュ継続文字を使用します。このコマンドは 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、SDK、CloudFormation でデフォルトで使用されます。追加のクラスターを使用してタスクとインフラストラクチャをグループ化および整理し、一部の構成にデフォルトを割り当てることができます。

クラスターは、AWS マネジメントコンソール、AWS CLI、SDK、または CloudFormation のいずれかを使用して作成できます。クラスター内の設定と構成は gMSA に影響しません。

このステップでは、AWS CLI を使用します。AWS CloudShell のこれらのコマンドは、デフォルトのシェルである `bash` で実行できます。

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

**重要**  
独自のクラスターを作成することを選択する場合は、そのクラスターで使用する予定のコマンドごとに `--cluster clusterName` を指定する必要があります。

## ステップ 6: コンテナインスタンスの IAM ロールを作成する
<a name="tutorial-gmsa-windows-step6"></a>

*コンテナインスタンス*は、Amazon EC2 インスタンスなどの ECS タスクでコンテナを実行するホストコンピュータです。各コンテナインスタンスは 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 Framework*」の「[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 バケットと場所に置き換え、2 番目の `Resource` を Secrets Manager のシークレットの ARN に置き換えます。

   Secrets Manager でカスタムキーを使用してシークレットを暗号化する場合は、そのキー の `kms:Decrypt` も許可する必要があります。

   Secrets Manager の代わりに SSM Parameter Store を使用する場合は、`secretsmanager:GetSecretValue` の代わりにパラメータの `ssm:GetParameter` を許可する必要があります。

------
#### [ 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 を使用します。AWS CloudShell のこれらのコマンドは、デフォルトのシェルである `bash` で実行できます。

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` と互換性のあるシェルで使用されるバックスラッシュ継続文字を使用します。このコマンドは 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` と互換性のあるシェルで使用されるバックスラッシュ継続文字を使用します。このコマンドは 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 を使用します。AWS CloudShell のこれらのコマンドは、デフォルトのシェルである `bash` で実行できます。

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` と互換性のあるシェルで使用されるバックスラッシュ継続文字を使用します。このコマンドは 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. AWS マネジメントコンソール で Amazon ECS 用に設定された Amazon EC2 Windows インスタンスを起動するには、「[Amazon ECS Windows コンテナインスタンスの起動](launch_window-container_instance.md)」を参照してください。*ユーザーデータ*のステップで停止します。

1. gMSA には、ECS コンテナエージェントを開始する前に、ユーザーデータで環境変数 `ECS_GMSA_SUPPORTED` を設定する必要があります。

   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 を使用します。AWS CloudShell のこれらのコマンドは、デフォルトのシェルである `bash` で実行できます。

1. クラスター内のコンテナインスタンスをリストします。コンテナインスタンスの ID は EC2 インスタンスの ID とは異なります。

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

   出力:

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

   例えば、`526bd5d0ced448a788768334e79010fd` は有効なコンテナインスタンス ID です。

1. 前のステップのコンテナインスタンス ID を使用して、コンテナインスタンスの詳細を取得します。`MyContainerInstanceID` を ID に置き換えます。

   次のコマンドでは、`sh` と互換性のあるシェルで使用されるバックスラッシュ継続文字を使用します。このコマンドは 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 を使用します。AWS CloudShell のこれらのコマンドは、デフォルトのシェルである `bash` で実行できます。

1. 

   次のコマンドでは、`sh` と互換性のあるシェルで使用されるバックスラッシュ継続文字を使用します。このコマンドは PowerShell と互換性がありません。PowerShell で使用するには、コマンドを変更する必要があります。

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

   コマンドによって返されるタスク ID をメモします。

1. 次のコマンドを実行して、タスクが開始されたことを確認します。このコマンドは、タスクが開始されるまで待機し、シェルプロンプトを返しません。`MyTaskID` を前のステップのタスク ID に置き換えます。

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

## ステップ 13: コンテナに gMSA 認証情報があることを検証する
<a name="tutorial-gmsa-windows-step13"></a>

タスク内のコンテナに Kerberos トークン gMSA があることを確認します。

このステップでは、AWS CLI を使用します。AWS CloudShell のこれらのコマンドは、デフォルトのシェルである `bash` で実行できます。

1. 

   次のコマンドでは、`sh` と互換性のあるシェルで使用されるバックスラッシュ継続文字を使用します。このコマンドは 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 を使用します。AWS CloudShell のこれらのコマンドは、デフォルトのシェルである `bash` で実行できます。

1. タスクを停止します。`MyTaskID` をステップ 12 のタスク ID [ステップ 12: Windows タスクを実行する](#tutorial-gmsa-windows-step12) に置き換えます。

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

1. Amazon EC2 インスタンスを停止します。その後、クラスター内のコンテナインスタンスは 1 時間後に自動で削除されます。

   Amazon EC2 コンソールを使用し、インスタンスを検索して終了できます。または、以下のコマンドを実行できます。コマンドを実行するには、ステップ 1、[ステップ 11: コンテナインスタンスを検証する](#tutorial-gmsa-windows-step11) の `aws ecs describe-container-instances` コマンドの出力で EC2 インスタンス ID を見つけます。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 Parameter Store を使用した場合は、パラメータを削除してください。

   次のコマンドでは、`sh` と互換性のあるシェルで使用されるバックスラッシュ継続文字を使用します。このコマンドは 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 はタスクを 1 回のみ開始しようとします。問題のあるタスクはすべて停止され、`STOPPED` 状態に設定されます。タスクに関する一般的な問題には 2 つのタイプがあります。最初に、開始できなかったタスクです。2 つ目は、アプリケーションがいずれかのコンテナ内で停止したタスクです。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 Web サイトの「[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 などのストレージ場所からダウンロードされたかどうか、および認証情報の形式が正しく読み取られたかどうかを確認してください。