問題の概要
ISSUE - 課題
ECSタスクの起動時に以下のエラーが発生し、タスクが停止する問題が発生しました
ResourceInitializationError: unable to pull secrets or registry auth:
execution resource retrieval failed: unable to retrieve secret from asm:
api error AccessDeniedException: User: arn:aws:sts::************:assumed-role/***-ecs-execution-role/****************
is not authorized to perform: secretsmanager:GetSecretValue on resource:
arn:aws:secretsmanager:region:************:secret:***-db-credentials-******
because no identity-based policy allows the secretsmanager:GetSecretValue action
原因
ECSタスクで主に使用される2つのIAMロールは、それぞれ異なるタイミングで使用されます
ロール | 用途 | 実行タイミング | 必要な権限 |
---|---|---|---|
Task Execution Role | タスク起動時の権限 | コンテナ起動前 | ECRプル、Secrets Manager読み取り、CloudWatch Logs作成 |
Task Role | アプリケーション実行時の権限 | コンテナ起動後 | アプリケーションが使用するAWSサービス |
Task Definitionのsecrets
設定はTask Execution Roleの権限で実行されるため、Task RoleではなくTask Execution Roleに権限が必要です。
解決方法
1. Task Execution Roleへの権限追加
Task Execution Roleに以下のポリシーを追加します
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"secretsmanager:GetSecretValue"
],
"Resource": "arn:aws:secretsmanager:region:account-id:secret:secret-name-*"
}
]
}
2. Terraformでの実装例
# Task Execution Role用のカスタムポリシー
resource "aws_iam_role_policy" "ecs_execution_secrets_policy" {
name = "ecs-execution-secrets-policy"
role = aws_iam_role.ecs_execution_role.id
policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Effect = "Allow"
Action = [
"secretsmanager:GetSecretValue"
]
Resource = aws_secretsmanager_secret.your_secret.arn
}
]
})
}
3. AWS CLIでの権限追加
# ポリシードキュメントの作成
cat > secrets-policy.json << EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "secretsmanager:GetSecretValue",
"Resource": "arn:aws:secretsmanager:region:account-id:secret:secret-name-*"
}
]
}
EOF
# インラインポリシーの追加
aws iam put-role-policy \
--role-name your-ecs-execution-role \
--policy-name SecretsManagerAccess \
--policy-document file://secrets-policy.json
動作確認
IAM権限の確認
# ロールのポリシー確認
aws iam list-role-policies --role-name your-ecs-execution-role
# ポリシー内容の確認
aws iam get-role-policy \
--role-name your-ecs-execution-role \
--policy-name SecretsManagerAccess
ECSサービスの更新
# サービスの強制更新
aws ecs update-service \
--cluster your-cluster \
--service your-service \
--force-new-deployment
ベストプラクティス
権限は必要なリソースに限定します
{
"Effect": "Allow",
"Action": "secretsmanager:GetSecretValue",
"Resource": [
"arn:aws:secretsmanager:region:account-id:secret:db-credentials-*",
"arn:aws:secretsmanager:region:account-id:secret:api-keys-*"
]
}
Task DefinitionでのSecrets設定例
{
"containerDefinitions": [
{
"name": "app",
"secrets": [
{
"name": "DB_PASSWORD",
"valueFrom": "arn:aws:secretsmanager:region:account-id:secret:db-credentials:password::"
},
{
"name": "API_KEY",
"valueFrom": "arn:aws:secretsmanager:region:account-id:secret:api-keys:key::"
}
]
}
]
}
注意点
- AWSマネージドポリシー
AmazonECSTaskExecutionRolePolicy
にはSecrets Managerアクセス権限が含まれていません - Task Execution RoleとTask Roleの役割を正しく理解し、適切なロールに権限を付与すること
- Secrets Managerのリソースポリシーでもアクセス制御が可能ですが、IAMロールポリシーでの管理を推奨