Secrets Manager を使用した機密データの指定 - Amazon ECS

Secrets Manager を使用した機密データの指定

Amazon ECS を使用すると、AWS Secrets Manager シークレットに機密データを保存してコンテナの定義でそれを参照することによって、コンテナに機密データを挿入できます。Secrets Manager シークレットに保存された機密データは、環境変数として、またはログ設定の一部としてコンテナに公開できます。

Secrets Manager を使用した機密データの指定に関する考慮事項

Secrets Manager を使用してコンテナの機密データを指定する場合は、以下を考慮する必要があります。

  • Fargate 起動タイプを使用するタスクでは、以下を考慮する必要があります。

    • シークレットの内容全体を環境変数として挿入することのみがサポートされています。現時点では、特定の JSON キーやバージョンの指定はサポートされていません。

    • シークレットの内容全体を環境変数として挿入したり、ログ設定にシークレットを挿入したりするには、プラットフォームバージョン 1.3.0 以降を使用する必要があります。詳細については、AWS Fargate プラットフォームのバージョン を参照してください。

  • CreateSecret API の SecretString パラメータで作成されたシークレットであるテキストデータを格納するシークレット のみがサポートされます。CreateSecret API の SecretBinary パラメータで作成されたシークレットであるバイナリデータを格納するシークレットはサポートされていません。

  • Secrets Manager シークレットを参照するタスク定義を使用してコンテナの機密データを取得する場合、インターフェイス VPC エンドポイントも使用している場合は、Secrets Manager のインターフェイス VPC エンドポイントを作成する必要があります 。詳細については、AWS Secrets Manager ユーザーガイドの「VPC エンドポイントで Secrets Manager を使用する」を参照してください。

  • 重要なデータは、コンテナが最初に開始されたときにコンテナに挿入されます。シークレットを後で更新またはローテーションすると、コンテナには更新された値が自動的に送信されなくなります。この場合は、新しいタスクを起動する必要があります。または、タスクがサービスの一部である場合は、サービスを更新し、[新しいデプロイの強制] オプションを使用して、新しいタスクの起動をサービスに強制できます。

Amazon ECS シークレットで必須の IAM アクセス許可

この機能を使用するには、Amazon ECS タスク実行ロールを持っていて、タスク定義でそのロールを参照する必要があります。このロールにより、必要な Secrets Manager リソースをコンテナエージェントがプルできます。詳細については、「Amazon ECS タスク実行 IAM ロール」を参照してください。

作成した Secrets Manager シークレットへのアクセスを許可するには、以下のアクセス許可をインラインポリシーとしてタスクの実行ロールに手動で追加します。詳細については、「IAM ポリシーの追加と削除」を参照してください。

  • secretsmanager:GetSecretValue – Secrets Manager シークレットを参照する場合に必須です。

  • kms:Decrypt – シークレットでカスタムの KMS キーを使用し、デフォルトのキーを使用しない場合にのみ必須です。そのカスタムキーの ARN はリソースとして追加されている必要があります。

次の例のインラインポリシーでは必須のアクセス許可を追加します。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "secretsmanager:GetSecretValue", "kms:Decrypt" ], "Resource": [ "arn:aws:secretsmanager:<region>:<aws_account_id>:secret:<secret_name>", "arn:aws:kms:<region>:<aws_account_id>:key/<key_id>" ] } ] }

環境変数としての機密データの挿入

コンテナの定義内では、以下を指定できます。

  • コンテナに設定する環境変数の名前が含まれている secrets オブジェクト

  • Secrets Manager シークレットの Amazon リソースネーム (ARN)

  • コンテナに渡す機密データが含まれている追加のパラメータ

次の例は、Secrets Manager シークレットに指定する必要がある完全な構文を示しています。

arn:aws:secretsmanager:region:aws_account_id:secret:secret-name
重要

AWS Fargate を使用している場合、タスク定義でシークレットの完全な ARN を指定することのみがサポートされます。現時点では、特定の JSON キーやバージョンの指定はサポートされていません。

Secrets Manager シークレットを作成し、それを環境変数としてコンテナに挿入するための詳細なチュートリアルについては、「チュートリアル: Secrets Manager シークレットを使用した機密データの指定」を参照してください。

コンテナの定義の例

以下の例では、コンテナの定義で Secrets Manager シークレットを参照する方法を示します。

例 シークレット全体を参照する

次に示すのは、Secrets Manager シークレットのテキスト全体を参照するときの形式を示すタスク定義のスニペットです。

{ "containerDefinitions": [{ "secrets": [{ "name": "environment_variable_name", "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:secret_name-AbCdEf" }] }] }

ログ設定への機密データの挿入

コンテナの定義内で logConfiguration を指定するときに、コンテナに設定するログドライバーオプションの名前と、コンテナに渡す機密データが含まれている Secrets Manager シークレットの ARN 全体を使用して secretOptions を指定できます。

以下に示すのは、Secrets Manager シークレットを参照するときの形式を示すタスク定義のスニペットです。

{ "containerDefinitions": [{ "logConfiguration": [{ "logDriver": "splunk", "options": { "splunk-url": "https://cloud.splunk.com:8080" }, "secretOptions": [{ "name": "splunk-token", "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:secret_name-AbCdEf" }] }] }] }

AWS Secrets Manager シークレットの作成

Secrets Manager コンソールを使用して、機密データ用のシークレットを作成できます。詳細については、AWS Secrets Manager ユーザーガイドの「基本的なシークレットの作成」を参照してください。

基本的なシークレットを作成するには

機密データのシークレットを作成するには、Secrets Manager を使用します。

  1. Secrets Manager コンソール (https://console.aws.amazon.com/secretsmanager/) を開きます。

  2. [新しいシークレットの保存] を選択します。

  3. [Select secret type (シークレットタイプの選択)] で、[Other type of secrets (他の種類のシークレット)] を選択します。

  4. カスタムシークレットの詳細を [キー] と [] のペアの形式で指定します。たとえば、UserName のキーを指定し、その値として適切なユーザー名を指定できます。Password の名前とパスワードのテキストを値として持つ 2 番目のキーを追加します。データベース名、サーバーアドレス、TCP ポートなどのエントリを追加することもできます。必要な情報を格納するのに必要な数だけペアを追加できます。

    または、[プレーンテキスト] タブを選択して、任意の方法でシークレット値を入力することもできます。

  5. シークレットの保護されたテキストを暗号化するために使用する AWS KMS 暗号化キーを選択します。選択しない場合、Secrets Manager は、アカウントのデフォルトキーが存在するかどうかを調べ、存在する場合はそれを使用します。デフォルトのキーが存在しない場合は、Secrets Manager が自動的に作成します。また、[Add new key(新しいキーの追加)] を選択して、このシークレット専用のカスタム CMK を作成します。独自の AWS KMS CMK を作成するには、アカウントに CMK を作成するアクセス許可が必要です。

  6. [次へ] を選択します。

  7. [Secret name (シークレット名)] に、オプションのパスと名前 (例: production/MyAwesomeAppSecret または development/TestSecret) を入力し、[] を選択します。オプションで説明を追加することもできます。後でこのシークレットを思い出すのに役立ちます。

    シークレット名に使用できるのは、ASCII 文字、数字、または次の記号のみです: /_+=.@-

  8. (オプション) この時点で、シークレットのローテーションを設定することができます。この手順では、[Disable automatic rotation (自動ローテーションを無効化)] は無効のままにし、[] を選択します。

    新規または既存のシークレットでローテーションを設定する方法については、「AWS Secrets Manager シークレットの更新」を参照してください。

  9. 設定を確認し、次に [Store secret (シークレットの保存)] を選択して入力した内容すべてを Secrets Manager の新しいシークレットとして保存します。

機密データを参照するタスク定義の作成

Amazon ECS コンソールを使用して、Secrets Manager シークレットを参照するタスク定義を作成できます。

シークレットを指定するタスク定義を作成するには

  1. Amazon ECS コンソール (https://console.aws.amazon.com/ecs) を開きます。

  2. ナビゲーションペインで [Task Definitions (タスク定義)]、[Create new Task Definition (新しいタスク定義の作成)] の順に選択します。

  3. [Select launch type compatibility (起動タイプの互換性の選択)] ページで、タスクの起動タイプを選択してから [Next step (次の手順)] を選択します。

  4. [Task Definition Name (タスク定義名)] に、タスク定義の名前を入力します。最大 255 文字の英字 (大文字と小文字)、数字、ハイフン、アンダースコアを使用できます。

  5. [Task execution role (タスク実行ロール)] で、既存のタスク実行ロールを選択するか、[Create new role (新しいロールの作成)] を選択して作成します。このロールを使用して、タスクのプライベートイメージをプルする Amazon ECS を認証することができます。詳細については、「プライベートレジストリの認証で必須の IAM アクセス許可」を参照してください。

    重要

    [Task execution role (実行ロール)] フィールドが表示されない場合は、[Configure via JSON (JSON による設定)] を選択し、[executionRoleArn] フィールドを手動で追加して、タスク実行ロールを指定します。次のコードは構文を示しています。

    "executionRoleArn": "arn:aws:iam::aws_account_id:role/ecsTaskExecutionRole"
  6. タスク定義で作成するコンテナごとに、以下のステップを実行します。

    1. [Container Definitions (コンテナの定義)] で [Add container (コンテナの追加)] を選択します。

    2. [Container name (コンテナ名)] に、コンテナの名前を入力します。 最大 255 文字の英字 (大文字と小文字)、数字、ハイフン、アンダースコアを使用できます。

    3. [イメージ] に、イメージ名、またはプライベートイメージのパスを入力します。 最大 255 文字の英字 (大文字と小文字)、数字、ハイフン、アンダースコアを使用できます。

    4. [Advanced container configuration (詳細コンテナ設定)] を展開します。

    5. 環境変数として挿入する機密データの場合は、[環境] の [環境変数] で、以下のフィールドに入力します。

      1. [Key (キー)] に、コンテナ内で設定する環境変数の名前を入力します。これは、コンテナの定義の secrets セクションの name フィールドに相当します。

      2. [Value (値)] で、[ValueFrom] を選択します。[Add value (値の追加)] に、環境変数としてコンテナに渡すデータが含まれている Secrets Manager シークレットの ARN を入力します。

    6. コンテナのログ設定で参照される機密データの場合は、[Storage and Logging (ストレージとログ記録)] の [Log configuration (ログ設定)] で、以下のフィールドに入力します。

      1. [Auto-configure CloudWatch Logs (CloudWatch Logs の自動設定)] オプションをオフにします。

      2. [ログオプション] の [Key (キー)] に、設定するログ設定オプションの名前を入力します。

      3. [Value (値)] で、[ValueFrom] を選択します。[Add value (値の追加)] に、ログオプションとしてログ設定に渡すデータが含まれている Secrets Manager シークレットの ARN 全体を入力します。

    7. コンテナの定義で使用するために、残りの必須のフィールドとオプションのフィールドに入力します。その他のコンテナの定義パラメータは、[Advanced container configuration (詳細コンテナ設定)] メニューより設定できます。詳細については、「タスク定義パラメータ」を参照してください。

    8. [Add] を選択します。

  7. コンテナが追加されたら、[作成] を選択します。