

# デーモンタスク定義
<a name="managed-daemons-task-definitions"></a>

デーモンタスク定義は、デーモンのブループリントです。Amazon ECS マネージドデーモンは、標準の Amazon ECS タスク定義とは異なる専用のデーモンタスク定義リソースを使用します。デーモンタスク定義を登録して、デーモンのコンテナイメージ、リソース要件、および設定を指定します。

## デーモンタスク定義の作成
<a name="managed-daemons-create-taskdef"></a>

AWS マネジメントコンソール または AWS CLI を使用してデーモンタスク定義を作成できます。

### AWS マネジメントコンソール を使用する場合
<a name="managed-daemons-create-taskdef-console"></a>

1. Amazon ECS コンソールを開きます。左側のナビゲーションペインで、[**デーモンタスク定義**] を選択します。

1. [**新しいデーモンタスク定義の作成**] を選択します。

1. **[デーモンタスク定義ファミリー]** では、一意の名前を入力します。名前には、最大 255 文字の英数字、ハイフン、およびアンダースコアを使用できます。

1. (オプション) **[タスクロール]** では、コンテナで実行されているアプリケーションにアクセス許可を付与する IAM ロールを選択します。コンテナが AWS API を呼び出さない場合は、これを空白のままにします。

1. (オプション) **[タスク実行ロール]** では、`ecsTaskExecutionRole` を選択します。Amazon ECS には、コンテナイメージをプルしてログを発行するためにこのロールが必要です。

1. (オプション) **[タスクサイズ]** では、デーモン用に予約する CPU とメモリを指定します。例えば、`0.25 vCPU` および `512 MB` メモリです。

1. コンテナの詳細を設定します:
   + [**コンテナ名**] - コンテナの名前を入力します。名前には、最大 255 文字の英数字、ハイフン、およびアンダースコアを使用できます。
   + **[必須コンテナ]** - **[はい]** を選択します。各デーモンタスク定義には、少なくとも 1 つの必須コンテナが必要です。必須コンテナに障害が発生した場合、Amazon ECS はタスク全体を停止します。
   + **[イメージ URI]** - Docker イメージ URI を入力します。Amazon ECR イメージを参照することも、Docker Hub または他のレジストリからパブリックイメージを使用することもできます。

1. (オプション) 必要に応じて、リソース割り当て、ヘルスチェック、環境変数、ログ収集、およびタグを設定します。

1. 設定を確認し、[**作成**] を選択します。

### AWS CLI を使用する場合
<a name="managed-daemons-create-taskdef-cli"></a>

JSON ファイルを作成し、`register-daemon-task-definition` コマンドを使用して、デーモンタスク定義を登録します。

JSON ファイルの例を次に示します:

```
{
    "family": "my-daemon-task",
    "containerDefinitions": [
        {
            "name": "daemon-container",
            "image": "public.ecr.aws/docker/library/busybox:latest",
            "essential": true,
            "command": ["sh", "-c", "while true; do echo 'Daemon running'; sleep 30; done"],
            "memoryReservation": 512
        }
    ]
}
```

次のコマンドを実行して、デーモンタスク定義を登録します:

```
aws ecs register-daemon-task-definition --cli-input-json file://daemon-taskdef.json
```

## デーモンタスク定義パラメータ
<a name="managed-daemons-taskdef-parameters"></a>

デーモンタスク定義を登録するときは、次のパラメータを使用できます。

**必須パラメータ**
+ `family` - タスク定義のファミリー名。これにより、同じデーモンタスク定義の複数のリビジョンがグループ化されます。
+ `containerDefinitions` - デーモンタスクのコンテナを記述する `DaemonContainerDefinition` オブジェクトの配列。

**任意指定のパラメータ**
+ `cpu` - 文字列としてのタスクレベルの CPU ユニット (例: `"256"`)。
+ `memory` - 文字列としてのタスクレベルのメモリ (MiB 単位) (例: `"512"`)。
+ `taskRoleArn` - デーモンタスクのコンテナにアクセス許可を付与する IAM ロールの ARN。
+ `executionRoleArn` - Amazon ECS コンテナエージェントがユーザーに代わって AWS API コールを行うために使用する IAM ロールの ARN (例: Amazon ECR からイメージをプルする)。
+ `volumes` - `DaemonVolume` オブジェクトの配列。デーモンボリュームは、`host` および `sourcePath` を使用したバインドマウントのみをサポートします。デーモンタスク定義は、Amazon EBS、Amazon EFS、FSx for Windows File Server、Docker ボリューム、またはエフェメラルストレージをサポートしていません。
+ `tags` - デーモンタスク定義にタグを付けるためのキーと値のペアの配列。
+ `pidMode` - デーモンの PID 名前空間モードを制御します。
+ `ipcMode` - デーモンの IPC 名前空間モードを制御します。

## ネットワークモード
<a name="managed-daemons-network-mode"></a>

デーモンは、Amazon ECS が自動的に設定する特別な `daemon_bridge` ネットワークモードを使用します。デーモンタスク定義でネットワークモードを指定することはできません。インスタンス上のすべてのデーモンは、単一のネットワーク名前空間を共有し、静的デーモンブリッジ IP アドレス (IPv4 の場合は `169.254.172.2`、IPv6 の場合は `fd00:ec2::172:2`) を介してローカルにアクセスできます。アプリケーションタスク (デーモン以外) は、追加のネットワーク設定なしで、このアドレスでデーモンと通信できます。

デーモンはアプリケーションタスクとは別のネットワーク名前空間で実行されるため、デーモン以外のタスクはデーモンとのポート競合について心配する必要はありません。ただし、すべてのデーモンタスクが同じ名前空間を共有するため、同じインスタンス上のデーモンを同じポートにバインドすることはできません。複数のデーモンをデプロイする場合は、各デーモンが一意のポートを使用していることを確認します。

## 特権機能
<a name="managed-daemons-privileged"></a>

Amazon ECS マネージドインスタンスでは、デーモンはシステムレベルのオペレーションのための特権 Linux 機能をサポートしています。セキュリティエージェント、ネットワークモニタリングツール、オブザーバビリティエージェントは、多くの場合、正しく機能するためにカーネルレベルのアクセスを必要とします。

機能を付与するには、次の 2 つの方法があります:

**フル特権モード**では、すべての Linux 機能がコンテナに付与されます。エージェントが広範なシステムアクセスを必要とする場合に使用します:

```
{
    "containerDefinitions": [{
        "name": "security-daemon",
        "image": "my-security-agent:latest",
        "privileged": true
    }]
}
```

**個々の機能**は、最小特権の原則に従って、デーモンに必要なアクセス許可のみを付与します。`linuxParameters.capabilities` フィールドを使用して、`SYS_ADMIN`、`NET_ADMIN`、`SYS_PTRACE`、`BPF`、`PERFMON` などの個々の機能を追加します。

```
{
    "containerDefinitions": [{
        "name": "monitoring-daemon",
        "image": "my-monitoring-agent:latest",
        "linuxParameters": {
            "capabilities": {
                "add": ["NET_ADMIN", "SYS_PTRACE"]
            }
        }
    }]
}
```

## PID と IPC 名前空間の共有
<a name="managed-daemons-namespace-sharing"></a>

Amazon ECS マネージドインスタンスでは、デーモンは PID および IPC 名前空間の共有に対応し、アプリケーションタスクプロセスまたは IPC リソースの可視性を必要とするセキュリティエージェント、モニタリングツール、オブザーバビリティデーモンなどのユースケースを可能にします。

`pidMode`  
タイプ: 文字列  
必須: いいえ  
有効な値: `none` \| `shared`  
デフォルト: `none`  
デーモンの PID 名前空間モード。`none` が指定されている場合、または値が提供されない場合、デーモンは他のタスクから分離された独自の PID 名前空間を使用して実行されます。`shared` が指定されている場合、デーモンはホスト PID 名前空間を結合し、`pidMode: "host"` を使用するデーモン以外のタスク、または `pidMode: "shared"` を使用する他のデーモンにアクセスできるようにします。

`ipcMode`  
タイプ: 文字列  
必須: いいえ  
有効な値: `none` \| `shared`  
デフォルト: `none`  
デーモンの IPC 名前空間モード。`none` が指定されている場合、または値が提供されない場合、デーモンは他のタスクから分離された独自の IPC 名前空間を使用して実行されます。`shared` が指定されている場合、デーモンはホスト IPC 名前空間を結合し、`ipcMode: "host"` を使用するデーモン以外のタスク、または `ipcMode: "shared"` を使用する他のデーモンにアクセスできるようにします。

次の例は、PID と IPC の両方の名前空間の共有が有効になっているデーモンタスク定義を示しています。

```
{
    "family": "my-monitoring-daemon",
    "pidMode": "shared",
    "ipcMode": "shared",
    "containerDefinitions": [
        {
            "name": "monitoring-agent",
            "image": "public.ecr.aws/my-company/monitoring-agent:latest",
            "essential": true
        }
    ]
}
```

PID 名前空間を、`pidMode` が `shared` に設定されているデーモンと共有するには、デーモン以外のタスクがタスク定義で `pidMode: "host"` を指定する必要があります。これにより、タスクのコンテナはデーモンのプロセスを表示することができ、プロセスのモニタリングやシグナル配信などのユースケースが可能になります。

IPC 名前空間を、`ipcMode` が `shared` に設定されているデーモンと共有するには、デーモン以外のタスクがタスク定義で `ipcMode: "host"` を指定する必要があります。これにより、タスクのコンテナは、共有メモリセグメントやメッセージキューなどのデーモンの IPC リソースにアクセスできるようになります。

## ボリューム
<a name="managed-daemons-volumes"></a>

マネージドデーモンは、`sourcePath` 仕様を持つホストボリュームを使用したバインドマウントをサポートします。これにより、デーモンコンテナはホストディレクトリをマウントして、基盤となる Amazon EC2 インスタンスのログ、メトリクス、およびシステム情報にアクセスできます。ログ収集エージェント、メトリクスエクスポーター、およびセキュリティスキャナーは、一般的にこれを使用してホストレベルのデータを可視化します。

デーモンタスク定義は、`sourcePath` でホストボリュームの仕様をサポートしています。デーモンボリュームは、基盤となるコンテナインスタンスのライフサイクルの間、保持されます。

**注記**  
Amazon EBS ボリューム、Amazon EFS ボリューム、FSx for Windows File Server ボリューム、Docker ボリューム、およびエフェメラルストレージは、デーモンタスク定義ではサポートされていません。

**注記**  
デーモンは、お互いの間のボリューム共有をサポートしていません。各デーモンは、独自の独立したボリューム設定で動作します。

次の例は、バインドマウントを持つログコレクターデーモンを示しています。

```
{
    "containerDefinitions": [{
        "name": "log-collector",
        "image": "fluent/fluentd:latest",
        "mountPoints": [{
            "sourceVolume": "var-log",
            "containerPath": "/var/log"
        }]
    }],
    "volumes": [{
        "name": "var-log",
        "host": {
            "sourcePath": "/var/log"
        }
    }]
}
```

## サポートされているコンテナパラメータ
<a name="managed-daemons-container-params"></a>

デーモンコンテナ定義は、次のパラメータをサポートしています:
+ `image` (必須) - コンテナイメージ URI
+ `name` (必須) - コンテナ名
+ `cpu` - コンテナ用に予約されている CPU ユニット
+ `memory`/`memoryReservation` - ハードメモリとソフトメモリの制限
+ `essential` - コンテナが必須かどうか (デフォルト: true)
+ `command`/`entryPoint` - コンテナコマンドまたはエントリポイントを上書きする
+ `environment`/`environmentFiles`/`secrets` - 環境設定
+ `privileged` - 特権モードでコンテナを実行する
+ `user` - コンテナの実行ユーザー
+ `workingDirectory` - コンテナ内の作業ディレクトリ
+ `readonlyRootFilesystem` - ルートファイルシステムを読み取り専用としてマウントする
+ `mountPoints` - ボリュームマウントポイント (ホストと sourcePath のみを使用するバインドマウント)
+ `logConfiguration` - ログ記録設定 (awslogs、splunk、awsfirelens をサポート)
+ `healthCheck` - コンテナのヘルスチェック設定
+ `dependsOn` - コンテナスタートアップの依存関係
+ `ulimits` - リソースの制限
+ `systemControls` - カーネルパラメータ
+ `linuxParameters.capabilities` - 追加またはドロップする Linux 機能
+ `linuxParameters.initProcessEnabled` - コンテナで init プロセスを実行する
+ `repositoryCredentials` - プライベートレジストリの認証情報
+ `restartPolicy` - ECS コンテナ再起動ポリシー