

# Amazon ECS コンテナに機密データを渡す
<a name="specifying-sensitive-data"></a>

認証情報などの機密データを、コンテナ内のデータベースなどに安全に渡すことができます。

API キーやデータベース認証情報などのシークレットは、アプリケーションが他のシステムにアクセスするためによく使用されます。多くの場合、ユーザー名とパスワード、証明書、または API キーで構成されます。これらのシークレットへのアクセスは、IAM を使用する特定の IAM プリンシパルに限定され、またランタイムにコンテナに挿入される必要があります。

シークレットは、AWS Secrets Manager または Amazon EC2 Systems Manager Parameter Store からコンテナにシームレスに挿入できます。これらのシークレットは、タスク内で以下のいずれかとして参照できます。

1. `secrets` コンテナ定義パラメータを使用する環境変数として参照されます。

1. ロギングプラットフォームが認証を必要とする場合、`secretOptions` として参照されます。詳細については、「[ログの設定オプション](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_LogConfiguration.html#API_LogConfiguration_Contents)」を参照してください。

1. コンテナの取得元のレジストリーが認証を必要とする場合、これらは、`repositoryCredentials` コンテナ定義パラメータを使用するイメージによって取得されるシークレットとして参照されます。Amazon ECR Public Gallery からイメージを取得するときは、この方法を使用してください。詳細については、「[タスクのプライベートレジストリの認証](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/private-auth.html)」を参照してください。

シークレットの管理を設定するときは、次を行うことをお勧めします。

## シークレットマテリアルの保存に AWS Secrets Manager または AWS Systems Manager Parameter Store を使用する
<a name="security-secrets-management-recommendations-storing-secret-materials"></a>

API キー、データベース認証情報、およびその他のシークレットマテリアルは、Secrets Manager または暗号化されたパラメータとして Systems Manager Parameter Store に安全に保存する必要があります。これらのサービスは、どちらも AWS KMS を使用して機密データを暗号化する管理されたキー値ストアである点で似ています。ただし、Secrets Manager には、シークレットを自動的にローテーションし、ランダムなシークレットを生成し、アカウント間でシークレットを共有する機能も含まれています。これらの機能を利用するには、Secrets Manager を使用します。それ以外の場合は、Systems Manager パラメータストアで暗号化されたパラメータを使用します。

**重要**  
シークレットが変更された場合は、新しいデプロイを強制するか、新しいタスクを起動して最新のシークレット値を取得する必要があります。詳細については、以下の各トピックを参照してください。  
タスク - タスクを停止してから開始します。詳細については、「[Amazon ECS タスクの停止](standalone-task-stop.md)」および「[Amazon ECS タスクとしてのアプリケーションの実行](standalone-task-create.md)」を参照してください。
サービス - サービスを更新し、[新しいデプロイの強制] オプションを使用します。詳細については、「[Amazon ECS サービスを更新する](update-service-console-v2.md)」を参照してください。

## 暗号化された Amazon S3 バケットからデータを取得する
<a name="security-secrets-management-recommendations-encrypted-s3-buckets"></a>

暗号化された Amazon S3 バケットにシークレットを保存し、タスクロールを使用してそのシークレットへのアクセスを制限する必要があります。こうすることで、`docker inspect` の実行時に環境変数の値が誤ってログに漏れて公開されるのを防ぐことができます。これを行う場合、Amazon S3 バケットからシークレットを読み取るようにアプリケーションを作成する必要があります。手順については、「[Amazon S3 バケット向けのサーバー側のデフォルトの暗号化動作の設定](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-encryption.html)」を参照してください。

## サイドカーコンテナを使用してシークレットをボリュームにマウントする
<a name="security-secrets-management-recommendations-mount-secret-volumes"></a>

環境変数はデータ漏えいのリスクが高いため、AWS Secrets Manager からシークレットを読みとり、共有ボリュームに書き込むサイドカーコンテナを実行する必要があります。このコンテナは、[Amazon ECS コンテナの順序付け](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ContainerDependency.html)を使用することでアプリケーションコンテナより先に実行して終了できます。これを行うと、アプリケーションコンテナでシークレットが書き込まれたボリュームが後からマウントされます。Amazon S3 バケットメソッドと同様に、共有ボリュームからシークレットを読み取るようにアプリケーションを作成する必要があります。ボリュームの範囲はタスクに限定されるため、タスクが停止するとボリュームは自動的に削除されます。例については、[Task-def.json](https://github.com/aws-samples/aws-secret-sidecar-injector/blob/master/ecs-task-def/task-def.json) プロジェクトを参照してください。

Amazon EC2 では、シークレットが書き込まれるボリュームは、AWS KMS カスタマーマネージドキーで暗号化できます。AWS Fargate では、ボリュームストレージはサービスマネージドキーを使用して自動的に暗号化されます。