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:GetParameters と kms: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 をリージョンに置き換えます。