チュートリアル: Secrets Manager のシークレットを使用し、機密データを指定する - Amazon Elastic Container Service

チュートリアル: Secrets Manager のシークレットを使用し、機密データを指定する

Amazon ECS を使用すると、AWS Secrets Manager シークレットに機密データを保存してコンテナの定義でそれを参照することによって、コンテナに機密データを注入できます。詳細については、「機密データの指定」を参照してください。

以下のチュートリアルでは、Secrets Manager シークレットを作成して Amazon ECS タスク定義でシークレットを参照する方法を示し、コンテナ内の環境変数をクエリすることでシークレットの内容を表示して正しく動作したことを確認します。

Prerequisites

このチュートリアルでは、以下の前提条件が完了済みであることを前提としています。

  • Amazon ECS を使用してセットアップする」のステップを完了していること。

  • AWSユーザーに、説明されているSecrets Manager と Amazon ECS リソースを作成するために必要な IAM アクセス許可があります。

ステップ 1:Secrets Manager シークレットを作成する

Secrets Manager コンソールを使用して、機密データ用のシークレットを作成できます。このチュートリアルでは、後にコンテナで参照するユーザー名とパスワードを保存するための基本的なシークレットを作成します。詳細については、[AWS Secrets Manager ユーザーガイド]の [Tutorial: Creating and retrieving a secret] を参照してください。

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

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

  1. [https://console.aws.amazon.com/secretsmanager/]で、Secrets Manager コンソール を開きます。

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

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

  4. [このシークレットに保存するキーと値のペアを指定します] で、[プレーンテキスト] タブを選択し、既存のテキストを以下のテキストに置き換えます。ここで指定したテキストの値は、チュートリアルの最後にコンテナに存在する環境変数の値になります。

    password_value
  5. [Next] を選択します。

  6. [シークレット名] に「username_value」と入力し、[次へ] を選択します。ここで指定したシークレット名の値は、チュートリアルの最後にコンテナに存在する環境変数の名前になります。

  7. [自動ローテーションの設定] で [自動ローテーションを無効化] を選択したままにしておき、[次へ] を選択します。

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

  9. 先ほど作成したシークレットを選択して [シークレット ARN] を保存し、後のステップのタスク実行 IAM ポリシーとタスク定義で参照できるようにします。

ステップ 2: タスク実行 IAM ロールを更新する

Amazon ECS で Secrets Manager シークレットから機密データを取得するには、Amazon ECS タスク実行ロールを持っていて、タスク定義でそのロールを参照する必要があります。これにより、コンテナエージェントは必要な Secrets Manager リソースをプルすることを許可されます。タスク実行 IAM ロールをまだ作成していない場合は、「Amazon ECS タスク実行IAM ロール」を参照してください。

以下のステップは、タスク実行 IAM ロールが既に作成され、適切に設定されていることを前提としてます。

タスク実行 IAM ロールを更新するには

IAM コンソールを使用して、必要なアクセス許可を持つタスク実行ロールを更新します。

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

  2. ナビゲーションペインで [Roles (ロール) ] を選択します。

  3. ロールの一覧で ecsTaskExecutionRole を探し、選択します。

  4. [アクセス許可]、[Add inline policy (インラインポリシーの追加)] の順に選択します。

  5. [JSON] タブを選択して以下の JSON テキストを指定し、ステップ 1 で作成した Secrets Manager シークレットの完全な ARN を指定していることを確認します。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "secretsmanager:GetSecretValue" ], "Resource": [ "arn:aws:secretsmanager:region:aws_account_id:secret:username_value-u9bH6K" ] } ] }
  6. [ポリシーの確認] を選択します。[名前] で ECSSecretsTutorial を指定し、[ポリシーの作成] を選択します。

ステップ3:Amazon ECS タスク定義の作成

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

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

IAM コンソールを使用して、必要なアクセス許可を持つタスク実行ロールを更新します。

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

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

  3. [Select launch type compatibility (起動タイプの互換性の選択)] ページで、[EC2]、[Next step (次のステップ)] の順に選択します。

  4. [Configure via JSON (JSON による設定)] を選択して以下のタスク定義 JSON テキストを入力し、ステップ 1 で作成した Secrets Manager シークレットの完全な ARN と、ステップ 2 で更新したタスク定義 IAM ロールを指定していることを確認します。[Save] を選択します。

    重要

    タスク定義のシークレット名の値は、シークレットを作成した際にシークレット名で指定した名前と一致する必要があります。

    { "executionRoleArn": "arn:aws:iam::aws_account_id:role/ecsTaskExecutionRole", "containerDefinitions": [ { "entryPoint": [ "sh", "-c" ], "portMappings": [ { "hostPort": 80, "protocol": "tcp", "containerPort": 80 } ], "command": [ "/bin/sh -c \"echo '<html> <head> <title>Amazon ECS Sample App</title> <style>body {margin-top: 40px; background-color: #333;} </style> </head><body> <div style=color:white;text-align:center> <h1>Amazon ECS Sample App</h1> <h2>Congratulations!</h2> <p>Your application is now running on a container in Amazon ECS.</p> </div></body></html>' > /usr/local/apache2/htdocs/index.html && httpd-foreground\"" ], "cpu": 10, "secrets": [ { "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:username_value-u9bH6K", "name": "username_value" } ], "memory": 300, "image": "httpd:2.4", "essential": true, "name": "ecs-secrets-container" } ], "family": "ecs-secrets-tutorial" }
  5. 設定を確認し、[Create (作成)] を選択します。

ステップ 4: Amazon ECS クラスターを作成する

Amazon ECS コンソールを使用してコンテナインスタンスを含むクラスターを作成し、タスクを実行します。利用可能なリソースを使用して登録された少なくとも 1 つのコンテナインスタンスを持つ既存のクラスターがあり、このチュートリアル用に作成されたタスク定義の 1 つのインスタンスを実行できる場合は、次のステップに進みます。

このチュートリアルでは、Amazon ECS最適化Amazon Linux 2 AMIを使用して、1つのt2.microコンテナ・インスタンスでクラスタを作成します。

クラスターを作成するには

Amazon ECS コンソールを使用してクラスターを作成し、1 つのコンテナインスタンスを登録します。

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

  2. ナビゲーションバーで、作成した Secrets Manager シークレットと Amazon ECS タスク定義の両方が含まれるリージョンを選択します。

  3. ナビゲーションペインで [Clusters] を選択します。

  4. [Clusters] ページで、[Create Cluster] を選択します。

  5. [EC2 instance type (EC2 インスタンスタイプ)] で [t2.micro] を選択します。

  6. [Key pair (キーペア)] で、コンテナインスタンスに追加するキーペアを選択します。

    重要

    このチュートリアルを完了するにはキーペアが必要です。そのため、作成したキーペアをまだ持っていない場合は、EC2 コンソールのリンクをクリックしてキーペアを作成してください。

  7. 他のすべてのフィールドはデフォルト値のままにして、[Create (作成)] を選択します。

ステップ 5: Amazon ECS タスクを実行する

Amazon ECS コンソールを使用し、作成したタスク定義を使用してタスクを実行できます。このチュートリアルでは、前のステップで作成したクラスターを使用し、EC2 起動タイプを使用してタスクを実行します。

タスクを実行するには

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

  2. ナビゲーションペインで [Task Definitions (タスク定義)] を選択し、作成した [ecs-secrets-tutorial] タスク定義を選択します。

  3. タスク定義の最新のリビジョンを選択し、[Actions (アクション)]、[Run Task (タスクの実行)] の順に選択します。

  4. [起動タイプ] で、[EC2] を選択します。

  5. [Cluster (クラスター)] で、前のステップで作成した [ecs-secrets-tutorial] クラスターを選択します。

  6. [Task tagging configuration (タスクのタグ付け設定)] で [Enable ECS managed tags (ECS で管理されたタグを有効にする)] を選択解除します。これらは、このチュートリアルでは必要ありません。

  7. タスク情報を確認し、[Run Task] を選択します。

    注記

    タスクが PENDING から STOPPED に移行した場合、または PENDING ステータスが表示された後、リストされているタスクから消えた場合、エラーで停止した可能性があります。詳細については、トラブルシューティングセクションの「停止されたタスクでのエラーの確認」を参照してください。

ステップ 6: 確認する

以下のステップを使用して、すべてのステップが正常に完了し、コンテナに環境変数が適切に作成されたことを確認できます。

環境変数が作成されたことを確認するには

  1. コンテナインスタンスのパブリック IP アドレスまたは DNS アドレスを見つけます。

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

    2. コンテナインスタンスをホストする ecs-secrets-tutorial クラスターを選択します。

    3. [Cluster] ページで、[ECS Instances] を選択します。

    4. [Container Instance] 列で、接続するコンテナインスタンスを選択します。

    5. [Container Instance] ページで、インスタンスの [Public IP] または [Public DNS] を記録します。

  2. macOS または Linux コンピュータを使用している場合は、以下のコマンドでインスタンスに接続します (パスとアドレスはプライベートキーへのパスとインスタンスのパブリックアドレスに置き換えます)。

    $ ssh -i /path/to/my-key-pair.pem ec2-user@ec2-198-51-100-1.compute-1.amazonaws.com

    Windows コンピュータを使用している場合は、「Linux インスタンス用 Amazon EC2 ユーザーガイド」のPuTTY を使用してWindows から Linux インスタンスに接続するを参照してください。

    重要

    インスタンス接続時の問題の詳細については、Linux インスタンス用 Amazon EC2 ユーザーガイドの「インスタンスへの接続に関するトラブルシューティング」を参照してください。

  3. インスタンスで実行するコンテナを一覧表示します。ecs-secrets-tutorial コンテナのコンテナ ID をメモしておきます。

    docker ps
  4. 前のステップの出力のコンテナ ID を使用して ecs-secrets-tutorial コンテナに接続します。

    docker exec -it container_ID /bin/bash
  5. echo コマンドを使用して環境変数の値を出力します。

    echo $username_value

    このチュートリアルが成功すると、次のような出力が表示されます。

    password_value
    注記

    あるいは、env (または printenv) コマンドを使用して、コンテナ内の環境変数をすべて一覧表示できます。

ステップ 7: クリーンアップ

このチュートリアルが終了したら、未使用のリソースに対する料金が発生しないように、それに関連付けられたリソースをクリーンアップする必要があります。

リソースをクリーンアップするには

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

  2. 作成した [ecs-secrets-tutorial] クラスターを選択します。

  3. [Cluster (クラスター)] ページで [Delete Cluster (クラスターの削除)] を選択します。

  4. クラスターの削除を確認するフレーズを入力し、[Delete (削除)] を選択します。これには数分かかりますが、Amazon ECS クラスターのリソースがすべてクリーンアップされます。

  5. IAM コンソール (https://console.aws.amazon.com/iam/) を開きます。

  6. ナビゲーションペインで [Roles (ロール) ] を選択します。

  7. ロールの一覧で ecsTaskExecutionRole を探し、選択します。

  8. アクセス許可を選択、そのあとECSSecretsTutorialの次にある[X] の順に選択します。[Remove (削除)] を選択してインラインポリシーの削除を確定します。

  9. [https://console.aws.amazon.com/secretsmanager/]で、Secrets Manager コンソール を開きます。

  10. 作成した [username_value] シークレットを選択し、[Actions (アクション)]、[Delete secret (シークレットの削除)] の順に選択します。