CloudFormation容器定义从SecretManager指定密钥报错求助
问题描述
我有以下CloudFormation配置,希望从SecretManager中解析密钥:
DefinitionBackend: Type: AWS::ECS::TaskDefinition DependsOn: TaskPolicy Properties: ExecutionRoleArn: !GetAtt TaskRole.Arn NetworkMode: awsvpc RequiresCompatibilities: - FARGATE Cpu: 1024 Memory: 5120 ContainerDefinitions: - Name: admin Essential: true Image: !Sub XXXXXXXXXX.dkr.ecr.${AWS::REGION}.amazonaws.com/some-image:${AWS::StackName}-${ImageTag} PortMappings: - ContainerPort: 8003 Command: - .... Secrets: - Name: DATABASE_URL ValueFrom: '{{resolve:secretsmanager:Dev:SecretString:DATABASE_URL}}'
密钥名为Dev,其中包含若干KEY:VALUE键值对,例如DATABASE_URL是数据库连接字符串。尝试使用上述配置解析密钥时,出现以下错误:
Resource handler returned message: "Invalid request provided: Create TaskDefinition: The Systems Manager parameter name specified for secret DATABASE_URL is invalid. The parameter name can be up to 2048 characters and include the following letters and symbols: a-zA-Z0-9_.-,
数据库字符串格式如下,之前在环境变量中可正常使用:
"DATABASE_URL":"postgresql://web:PASSWORD@dev.234098234uuoi.eu-central-1.rds.amazonaws.com:5432/database"
请问我是否在密钥获取方式上有误?还是需要将其转换为Base64等其他格式才能用于密钥配置?
解决方案
问题出在ValueFrom的格式上——ECS任务定义的Secrets字段不支持CloudFormation的!resolve函数语法,你需要改用Secret Manager的标准引用格式:
方式一:使用ARN+JSON路径
替换成你实际的Secret ARN(注意Secret Manager的ARN默认带随机后缀,比如Dev-abc123):ValueFrom: arn:aws:secretsmanager:<你的区域>:<你的账号ID>:secret:Dev-<随机后缀>:DATABASE_URL::方式二:使用Secret名称+JSON路径
如果你的Secret名称无特殊字符,可直接用名称引用:ValueFrom: secretsmanager:Dev:DATABASE_URL::
另外无需将密钥转换为Base64格式,Secret Manager会直接传递明文值给ECS容器,只要你的任务执行角色(ExecutionRole)拥有访问该Secret的权限即可。
内容的提问来源于stack exchange,提问作者Daniil
相关产品推荐
相关产品推荐

