

# Amazon ECS の EC2 Windows コンテナで gMSA を使用する方法について説明します。
<a name="windows-gmsa"></a>

Amazon ECS は、*グループマネージドサービスアカウント* (gMSA) と呼ばれる特殊なサービスアカウントを使用して、Windows コンテナの Active Directory 認証をサポートします。

.NET アプリケーションなどの Windows ベースのネットワークアプリケーションは、多くの場合、Active Directory を使用して、ユーザーとサービス間の認証と認可の管理を容易にします。開発者は、通常、Active Directory と統合し、この目的のためにドメインに参加しているサーバーで実行するようにアプリケーションを設計します。Windows コンテナはドメインに結合できないため、gMSA で実行するように Windows コンテナを設定する必要があります。

gMSA で実行されている Windows コンテナは、ホスト Amazon EC2 インスタンスに依存して、Active Directory ドメインコントローラから gMSA 資格情報を取得し、コンテナインスタンスに提供します。詳細については、「[Windows コンテナでの gMSA の使用](https://docs.microsoft.com/en-us/virtualization/windowscontainers/manage-containers/manage-serviceaccounts)」を参照してください。

**注記**  
この機能は、Fargate の Windows コンテナではサポートされていません。

**Topics**
+ [考慮事項](#windows-gmsa-considerations)
+ [前提条件](#windows-gmsa-prerequisites)
+ [Amazon ECS での Windows コンテナ向け gMSA の設定](#windows-gmsa-setup)

## 考慮事項
<a name="windows-gmsa-considerations"></a>

Windows コンテナに gMSAs を使用する場合は、次の点を考慮する必要があります。
+ コンテナインスタンスに Amazon ECSに最適化されたWindows Server 2016 Full AMI を使用する場合、コンテナのホスト名は、認証情報仕様ファイルで定義されている gMSA アカウント名と同じである必要があります。コンテナのホスト名を指定するには、`hostname` コンテナ定義パラメータを使用します。詳細については、「[ネットワーク設定](task_definition_parameters.md#container_definition_network)」を参照してください。
+ **ドメインレス 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/windows-gmsa.html)

## 前提条件
<a name="windows-gmsa-prerequisites"></a>

Amazon ECS で Windows コンテナ向け gMSA 機能を使用する前に、必ず次の作業を完了してください。
+ コンテナがアクセスするリソースを含む 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 に既存の gMSA アカウントがあります。詳細については、「[Windows コンテナでの gMSA の使用](https://docs.microsoft.com/en-us/virtualization/windowscontainers/manage-containers/manage-serviceaccounts)」を参照してください。
+ ***ドメインレス gMSA* を使用することを選択した場合、または Amazon ECS タスクをホストする Amazon ECS Windows コンテナインスタンスは、Active Directory に*ドメイン参加*しており、gMSA アカウントにアクセスできる Active Directory セキュリティグループのメンバーである必要があります。**

  ドメインレス gMSA を使用すると、コンテナインスタンスはドメインに参加せず、インスタンス上の他のアプリケーションは認証情報を使用してドメインにアクセスできなくなり、異なるドメインに参加するタスクを同じインスタンス上で実行できます。
+ 必須の IAM アクセス権限を追加しました。必要な権限は、初期認証情報と認証情報の仕様の保存に選択した方法によって異なります。
  + 初期認証情報に*ドメインレス gMSA* を使用する場合は、Amazon EC2 インスタンスロールに AWS Secrets Manager の IAM アクセス許可が必要です。
  + 認証情報の仕様を SSM Parameter Store に保存する場合は、タスク実行ロールで Amazon EC2 Systems Manager Parameter Store に対する IAM 許可が必要です。
  + 認証情報の仕様を Amazon S3 で保存する場合は、タスク実行ロールで Amazon Simple Storage Service の IAM 許可が必要です。

## Amazon ECS での Windows コンテナ向け gMSA の設定
<a name="windows-gmsa-setup"></a>

前提条件 [AWS CLI を使用するドメインレス gMSA で Amazon ECS Windows コンテナを使用する](tutorial-gmsa-windows.md) の設定を含む完全なチュートリアルに従い、Windows コンテナ向け gMSA を Amazon ECS 上で設定できます。

次のセクションでは、CredSpec の構成について詳しく説明します。

**Topics**
+ [CredSpec の例](#windows-gmsa-example)
+ [ドメインレス gMSA 設定](#windows-gmsa-domainless)
+ [タスク定義での認証情報仕様ファイルの参照](#windows-gmsa-credentialspec)

### CredSpec の例
<a name="windows-gmsa-example"></a>

Amazon ECS は、gMSA アカウントコンテキストを Windows コンテナに伝達するために使用される gMSA メタデータを含む認証情報仕様ファイルを使用します。認証情報仕様ファイルを生成し、タスク定義の `credentialSpec` フィールドで参照できます。認証情報仕様ファイルにはシークレットが含まれていません。

認証情報仕様ファイルの例を次に示します。

```
{
    "CmsPlugins": [
        "ActiveDirectory"
    ],
    "DomainJoinConfig": {
        "Sid": "S-1-5-21-2554468230-2647958158-2204241789",
        "MachineAccountName": "WebApp01",
        "Guid": "8665abd4-e947-4dd0-9a51-f8254943c90b",
        "DnsTreeName": "contoso.com",
        "DnsName": "contoso.com",
        "NetBiosName": "contoso"
    },
    "ActiveDirectoryConfig": {
        "GroupManagedServiceAccounts": [
            {
                "Name": "WebApp01",
                "Scope": "contoso.com"
            }
        ]
    }
}
```

### ドメインレス gMSA 設定
<a name="windows-gmsa-domainless"></a>

コンテナインスタンスを単一のドメインに参加させるのではなく、ドメインレス gMSA をお勧めします。ドメインレス gMSA を使用すると、コンテナインスタンスはドメインに参加せず、インスタンス上の他のアプリケーションは認証情報を使用してドメインにアクセスできなくなり、異なるドメインに参加するタスクを同じインスタンス上で実行できます。

1. CredSpec をいずれかのストレージオプションにアップロードする前に、Secrets Manager または SSM Parameter Store のシークレットの 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)」を参照してください。

**ドメインレス gMSA 認証情報の形式**  
以下は、Active Directory のドメインレス gMSA 認証情報の JSON 形式です。認証情報を Secrets Manager または SSM Parameter Store に保存します。

   ```
   {
       "username":"WebApp01",
       "password":"Test123!",
       "domainName":"contoso.com"
   }
   ```

1. `ActiveDirectoryConfig` 内部の CredSpec ファイルに以下の情報を追加します。ARN を Secrets Manager または SSM Parameter Store のシークレットに置き換えます。

   `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": "WebApp01",
       "Guid": "ac822f13-583e-49f7-aa7b-284f9a8c97b6",
       "DnsTreeName": "contoso",
       "DnsName": "contoso",
       "NetBiosName": "contoso"
     },
     "ActiveDirectoryConfig": {
       "GroupManagedServiceAccounts": [
         {
           "Name": "WebApp01",
           "Scope": "contoso"
         },
         {
           "Name": "WebApp01",
           "Scope": "contoso"
         }
       ],
       "HostAccountConfig": {
         "PortableCcgVersion": "1",
         "PluginGUID": "{859E1386-BDB4-49E8-85C7-3070B13920E1}",
         "PluginInput": "{\"credentialArn\": \"arn:aws:secretsmanager:aws-region:111122223333:secret:gmsa-plugin-input\"}"
       }
     }
   }
   ```

### タスク定義での認証情報仕様ファイルの参照
<a name="windows-gmsa-credentialspec"></a>

Amazon ECS では、タスク定義の `credentialSpecs` フィールドでファイルパスを参照する次の方法がサポートされています。これらの各オプションでは、コンテナインスタンスを単一のドメインに参加させるかドメインレス gMSA を使用するかに応じて、`credentialspec:` または `domainlesscredentialspec:` を指定できます。

#### Amazon S3 バケット
<a name="gmsa-credspec-s3"></a>

認証情報仕様を Amazon S3 バケットに追加し、タスク定義の `credentialSpecs` フィールドで Amazon S3 バケットの Amazon リソースネーム (ARN) を参照します。

```
{
    "family": "",
    "executionRoleArn": "",
    "containerDefinitions": [
        {
            "name": "",
            ...
            "credentialSpecs": [
                "credentialspecdomainless:arn:aws:s3:::${BucketName}/${ObjectName}"
            ],
            ...
        }
    ],
    ...
}
```

また、次のアクセス権限をインラインポリシーとして Amazon ECS タスク実行 IAM ロール に追加して、タスクに Amazon S3 バケットへのアクセスを付与する必要があります。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor",
            "Effect": "Allow",
            "Action": [
                "s3:Get*",
                "s3:List*"
            ],
            "Resource": [
                "arn:aws:s3:::{bucket_name}",
                "arn:aws:s3:::{bucket_name}/{object}"
            ]
        }
    ]
}
```

------

#### SSM パラメータストアパラメータ
<a name="gmsa-credspec-ssm"></a>

認証情報仕様を SSM パラメータストアパラメータに追加し、タスク定義の `credentialSpecs` フィールドで SSM パラメータストアパラメータの Amazon リソースネーム (ARN) を参照します。

```
{
    "family": "",
    "executionRoleArn": "",
    "containerDefinitions": [
        {
            "name": "",
            ...
            "credentialSpecs": [
                "credentialspecdomainless:arn:aws:ssm:region:111122223333:parameter/parameter_name"
            ],
            ...
        }
    ],
    ...
}
```

また、次のアクセス権限をインラインポリシーとして Amazon ECS タスク実行 IAM ロール に追加して、タスクに SSM パラメータストアパラメータへのアクセス権を付与する必要があります。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:GetParameters"
            ],
            "Resource": "arn:aws:ssm:*:111122223333:parameter/example*"
        }
    ]
}
```

------

#### ローカルファイル
<a name="gmsa-credspec-file"></a>

ローカルファイルの認証情報仕様の詳細を使用して、タスク定義の `credentialSpecs` フィールドでファイルパスを参照します。参照されるファイルパスは `C:\ProgramData\Docker\CredentialSpecs` ディレクトリからの相対パスで、ファイルパスの区切り文字にはバックスラッシュ ('\$1') を使用する必要があります。

```
{
    "family": "",
    "executionRoleArn": "",
    "containerDefinitions": [
        {
            "name": "",
            ...
            "credentialSpecs": [
                "credentialspec:file://CredentialSpecDir\CredentialSpecFile.json"
            ],
            ...
        }
    ],
    ...
}
```