スキップしてコンテンツを表示

Amazon ECS のタスクやサービス用のシークレットとアクセスキーを管理する方法を教えてください。

所要時間2分
0

Amazon Elastic Container Service (Amazon ECS) がデータベース認証情報や API キーなどの機密情報にアクセスするように設定しました。ハードコーディングされていないシークレットを安全に管理して取得したいです。

解決策

ハードコーディングされていないシークレットとアクセスキーを管理するには、AWS Secrets Manager または、AWS Systems Manager の機能である Parameter Store を使用します。

注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。

シークレットを作成する

シークレットを作成するには、Secrets Manager コンソールまたは AWS CLI を使用します。Parameter Store を使用してシークレットを保存するには、次の put-parameter コマンドを実行します。

aws ssm put-parameter --type SecureString --name awsExampleParameter --value awsExampleValue

注: 実際のものでそれぞれ、awsExampleParameter をパラメータに、awsExampleValue をシークレットに置き換えます。

Amazon ECS タスクがシークレットにアクセスできるようにする

Amazon ECS は、AWS Identity and Access Management (IAM) のタスク実行ロールを使用して Secrets Manager または Parameter Store からシークレットの情報を取得します。必要最小限の権限を含む、ロールの IAM ポリシーを作成します。Secrets Manager を使用する場合、IAM ロールには secretsmanager:GetSecretValue が必要です。Parameter Store を使用する場合、IAM ロールにはアクセス許可 ssm:GetParameterskms:Decrypt が必要です。

Secrets Manager のポリシー例

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "secretsmanager:GetSecretValue",
      "Resource": "arn:aws:secretsmanager:region:account-id:secret:secret-name"
    }
  ]
}

注: arn:aws:secretsmanager:region:account-id:secret:secret-name は、実際のシークレットの ARN に置き換えます。

Parameter Store のポリシー例

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:GetParameter",
                "ssm:GetParameters",
                "ssm:GetParameterHistory"
            ],
            "Resource": "arn:aws:ssm:region:account-id:parameter/parameter-name"
        },
        {
            "Effect": "Allow",
            "Action": "kms:Decrypt",
            "Resource": "arn:aws:kms:region:account-id:key/kms-key-id"
        }
    ]
}

注: 実際のものでそれぞれ、arn:aws:ssm:region:account-id:parameter/parameter-name をパラメータの ARN に、arn:aws:kms:region:account-id:key/kms-key-id を AWS Key Management Service (AWS KMS) キーに置き換えます。

IAM ポリシーを Amazon ECS のタスク実行ロールにアタッチします。

Amazon ECS タスクのシークレットにアクセスする

API キーや認証情報などの機密データをパラメーターまたは環境変数として渡すことができます。最初に、Amazon ECS タスク定義を変更し、環境変数またはシークレットマッピングを含めます。

タスク定義のシークレットマッピング例

{
  "name": "MY_SECRET",
  "valueFrom": "arn:aws:secretsmanager:region:account-id:secret:secret-name"
}

次に、環境変数を Amazon ECS コンテナに渡します。

タスク定義の containerDefinitions

  - name: my-container
    environment:
      - name: Example_PASSWORD
        valueFrom: arn:aws:ssm:us-west-2:123456789012:parameter/my-app/example-password

CI/CD でシークレットを管理する

環境変数を使用して、継続的統合と継続的デリバリー (CI/CD) のデプロイ時にシークレットを動的に渡します。デプロイスクリプトで、Secrets Manager または Parameter Store からシークレットを取得します。タスク定義内では、シークレットをハードコーディングしないでください。代わりに、パラメータまたはプレースホルダーを使用してください。詳細とベストプラクティスについては、「AWS Secrets Manager、AWS KMS、AWS Certificate Manager を使用して DevOps パイプラインを強化し、データを保護する」を参照してください。

たとえば、AWS CodePipeline を使用する場合は、シークレットの取得に AWS CLI を使用するビルドステップを設定します。

bashCopy codeaws secretsmanager get-secret-value --secret-id secret-name --query 'SecretString' --output text

注: secret-name は、実際のシークレットに置き換えます。

シークレット管理に関する問題のトラブルシューティング

Amazon ECS でシークレットを使用するときに問題が発生した場合は、次の手順を実行します。

  • Amazon ECS タスクの IAM ロールに、適切な secretsmanager:GetSecretValue または ssm:GetParameter アクセス許可があることを確認します。

  • Denied エラーが発生した場合は、IAM ポリシーが正しい Amazon ECS タスク実行ロールにアタッチされていることを確認してください。IAM ポリシーのシークレット ARN が正確であることも確認してください。

  • Amazon ECS がシークレットを取得できない場合は、正しい AWS リージョンとシークレットを使用していることを確認してください。シークレットをテストするには、Amazon ECS の外部から、次の get-secret-value コマンドを実行します。

    aws secretsmanager get-secret-value --secret-id secret-name --region region-code

    注: 実際のものでそれぞれ、secret-name をシークレットに、region-code をリージョンに置き換えます。

AWS公式更新しました 1年前
コメントはありません

関連するコンテンツ