

# プライベート Docker イメージ用の Amazon ECS コンテナインスタンスを設定する
<a name="private-auth-container-instances"></a>

Amazon ECS コンテナエージェントは、基本認証を使用してプライベートレジストリで認証できます。プライベートレジストリ認証を有効にすると、タスク定義のプライベート Docker イメージを使用できます。この機能は、EC2 を使用するタスクでのみサポートされています。

プライベートレジストリ認証を有効にする別の方法では、AWS Secrets Manager を使用して、プライベートレジストリ認証情報を安全に保存してから、コンテナの定義で参照します。これにより、プライベートリポジトリのイメージをタスクで使用できるようになります。このメソッドは、EC2 または Fargate のいずれかを使用するタスクをサポートします。詳細については、「[Amazon ECS での AWS 以外のコンテナイメージの使用](private-auth.md)」を参照してください。

Amazon ECS コンテナエージェントでは、起動時に次の 2 つの環境変数を検索します。
+ `ECS_ENGINE_AUTH_TYPE`。送信する認証データのタイプを指定します。
+ `ECS_ENGINE_AUTH_DATA`。実際の認証情報が含まれます。

Amazon ECSに最適化されたAMIのLinuxバリアントは、コンテナインスタンスの起動時、およびサービスが開始されるたびに（**sudo start ecs** コマンドを使用して）、`/etc/ecs/ecs.config` ファイルをスキャンしてこれらの変数を探します。Amazon ECSに最適化されていないAMIは、これらの環境変数をファイルに保存し、`--env-file path_to_env_file`オプションを付けてコンテナエージェントを起動する**docker run**コマンドに渡す必要があります。

**重要**  
これらの認証環境変数を、 Amazon EC2 ユーザーデータを使用してインスタンス起動時に挿入することや、`--env` オプションを使用して **docker run** コマンドに渡すことはお勧めしません。これらの方法は、認証情報などの機密データには適していません。認証情報をコンテナインスタンスに安全に追加する方法については、「[Amazon S3 に Amazon ECS コンテナインスタンスの設定を保存する](ecs-config-s3.md)」を参照してください。

## 認証形式
<a name="docker-auth-formats"></a>

プライベートレジストリ認証には、`dockercfg` と `docker` の 2 つの形式を使用できます。

**dockercfg 認証形式**  
`dockercfg` 形式は、**docker login** コマンドの実行時に作成した設定ファイルに保存されている認証情報を使用します。このファイルを作成するには、ローカルシステムで **docker login** を実行し、レジストリのユーザー名、パスワード、および E メールアドレスを入力します。コンテナインスタンスにログインして、そこでコマンドを実行することもできます。Docker のバージョンによって、ファイルは `~/.dockercfg` または `~/.docker/config.json` として保存されます。

```
cat ~/.docker/config.json
```

出力:

```
{
  "auths": {
    "https://index.docker.io/v1/": {
      "auth": "zq212MzEXAMPLE7o6T25Dk0i"
    }
  }
}
```

**重要**  
Docker の新しいバージョンは、外部 `auths` オブジェクトを使用して、上に示したような設定ファイルを作成します。Amazon ECS エージェントは、`auths` オブジェクトを持たない、以下の形式の `dockercfg` 認証データのみをサポートします。**jq** ユーティリティをインストール済みである場合、このデータは **cat \$1/.docker/config.json \$1 jq .auths** コマンドを使用して抽出できます。

```
cat ~/.docker/config.json | jq .auths
```

出力:

```
{
  "https://index.docker.io/v1/": {
    "auth": "zq212MzEXAMPLE7o6T25Dk0i",
    "email": "email@example.com"
  }
}
```

上記の例では、以下の環境変数を、Amazon ECS コンテナエージェントが実行時にロードする環境変数ファイル ( `/etc/ecs/ecs.config` Amazon ECSに最適化された AMI の場合は ) に追加しなければなりません。Amazon ECS に最適化された AMI を使用せず、 **docker run** を使用して手動でエージェントを開始する場合は、エージェント開始時に `--env-file path_to_env_file` オプションを使用して環境変数ファイルを指定します。

```
ECS_ENGINE_AUTH_TYPE=dockercfg
ECS_ENGINE_AUTH_DATA={"https://index.docker.io/v1/":{"auth":"zq212MzEXAMPLE7o6T25Dk0i","email":"email@example.com"}}
```

次の構文を使用して複数のプライベートレジストリを設定できます。

```
ECS_ENGINE_AUTH_TYPE=dockercfg
ECS_ENGINE_AUTH_DATA={"repo.example-01.com":{"auth":"zq212MzEXAMPLE7o6T25Dk0i","email":"email@example-01.com"},"repo.example-02.com":{"auth":"fQ172MzEXAMPLEoF7225DU0j","email":"email@example-02.com"}}
```

**docker 認証形式**  
`docker` 形式は、エージェントが認証する必要があるレジストリサーバーの JSON 表現を使用します。また、そのレジストリに必要な認証パラメータ (ユーザー名、パスワード、およびそのアカウントの E メールアドレスなど) も含まれます。Docker Hub アカウントの場合、JSON 表現は次のようになります。

```
{
  "https://index.docker.io/v1/": {
    "username": "my_name",
    "password": "my_password",
    "email": "email@example.com"
  }
}
```

この例では、以下の環境変数を、Amazon ECS コンテナエージェントが実行時にロードする環境変数ファイル ( `/etc/ecs/ecs.config` Amazon ECSに最適化された AMI の場合は ) に追加する必要があります。Amazon ECS に最適化された AMI を使用せず、 **docker run** を使用して手動でエージェントを開始する場合は、エージェント開始時に `--env-file path_to_env_file` オプションを使用して環境変数ファイルを指定します。

```
ECS_ENGINE_AUTH_TYPE=docker
ECS_ENGINE_AUTH_DATA={"https://index.docker.io/v1/":{"username":"my_name","password":"my_password","email":"email@example.com"}}
```

次の構文を使用して複数のプライベートレジストリを設定できます。

```
ECS_ENGINE_AUTH_TYPE=docker
ECS_ENGINE_AUTH_DATA={"repo.example-01.com":{"username":"my_name","password":"my_password","email":"email@example-01.com"},"repo.example-02.com":{"username":"another_name","password":"another_password","email":"email@example-02.com"}}
```

## 手順
<a name="enabling-private-registry"></a>

以下の手順を使用して、コンテナインスタンスのプライベートレジストリをオン状態にします。

**Amazon ECS に最適化された AMI のプライベートレジストリを有効にするには**

1. SSH を使用してコンテナインスタンスにログインします。

1. `/etc/ecs/ecs.config` ファイルを開いて、レジストリとアカウントの `ECS_ENGINE_AUTH_TYPE` 値と `ECS_ENGINE_AUTH_DATA` 値を追加します。

   ```
   sudo vi /etc/ecs/ecs.config
   ```

   この例では Docker Hub のユーザーアカウントが認証されます。

   ```
   ECS_ENGINE_AUTH_TYPE=docker
   ECS_ENGINE_AUTH_DATA={"https://index.docker.io/v1/":{"username":"my_name","password":"my_password","email":"email@example.com"}}
   ```

1. エージェントが `ECS_DATADIR` 環境変数を使用して状態を保存しているかどうかを確認します。

   ```
   docker inspect ecs-agent | grep ECS_DATADIR
   ```

   出力:

   ```
   "ECS_DATADIR=/data",
   ```
**重要**  
前のコマンドで `ECS_DATADIR` 環境変数が返されない場合は、エージェントを停止する前に、このコンテナインスタンスで実行されているタスクをすべて停止する必要があります。より新しいエージェントは `ECS_DATADIR` 環境変数を使用して状態を保存するため、タスクが実行中でも問題なく停止および起動できます。詳細については、「[Amazon ECS コンテナエージェントをアップデートする](ecs-agent-update.md)」を参照してください。

1. `ecs` サービスを停止します。

   ```
   sudo stop ecs
   ```

   出力:

   ```
   ecs stop/waiting
   ```

1. `ecs` サービスを再起動します。
   + Amazon ECS に最適化された Amazon Linux 2 AMI の場合:

     ```
     sudo systemctl restart ecs
     ```
   + Amazon ECS に最適化された Amazon Linux AMI の場合:

     ```
     sudo stop ecs && sudo start ecs
     ```

1. (オプション) エージェント詳細分析 API オペレーションをクエリして、エージェントが実行されていることを確認し、新しいコンテナインスタンスに関する情報の一部を表示できます。詳細については、「[Amazon ECS コンテナの詳細分析](ecs-agent-introspection.md)」を参照してください。

   ```
   curl http://localhost:51678/v1/metadata
   ```