如何在serverless.yml中引用AWS Secrets Manager对象类型密钥的指定键值
Serverless框架读取AWS Secrets Manager对象密钥指定键值的实现
问题背景
- 基于Serverless框架将应用部署到AWS时,需要在部署流程中从Secrets Manager读取配置值
- 参考官方给出的Secrets Manager值读取示例,使用
${ssm:/aws/reference/secretsmanager/secret_ID~true}的写法,可以正常读取Secrets Manager中存储的单字符串类型密钥值 - 但实际业务中存储的密钥是包含key/value对的JSON对象类型,希望直接读取对象内部的指定key值,此前尝试的两种拼接写法均无法正常生效:
${ssm:/aws/reference/secretsmanager/secret_ID_in_Secrets_Manager:MY_KEY~true}${ssm:/aws/reference/secretsmanager/secret_ID_in_Secrets_Manager/MY_KEY~true}
实现方案
两种拼接写法失效的核心原因是:SSM路径参数仅支持定位Secrets Manager中的整个密钥资源本身,路径里拼接的冒号、斜杠片段都会被识别为密钥资源ID的一部分,和实际的资源路径不匹配,无法触发密钥的JSON对象解析逻辑。
正确的实现需要结合Serverless内置的JSON变量解析能力,先拉取完整的密钥JSON字符串,再提取指定键值,写法如下:
custom: # 拉取完整密钥JSON后,解析提取MY_KEY字段的值 supersecret: ${ssm:/aws/reference/secretsmanager/secret_ID_in_Secrets_Manager~true,json:MY_KEY}
注意事项
- 语法中的
~true标识不能省略,该标识的作用是声明拉取的是需要解密的敏感参数,省略后会拿到加密的密文,无法正常解析JSON - 如果密钥是多层嵌套的JSON结构,可以在
json:后使用点路径匹配嵌套字段,比如要取JSON里db.config.password的值,写法为json:db.config.password - 如果需要给读取失败配置兜底默认值,可以按照Serverless的变量规则追加默认值配置,比如
${ssm:/aws/reference/secretsmanager/secret_ID~true,json:MY_KEY, "local-default-value"}
内容的提问来源于stack exchange,提问作者Joey Yi Zhao
相关产品推荐
相关产品推荐

