如何在Serverless中访问SSM变量?
别急,我来帮你一步步解决这个问题——从正确配置SSM参数,到在代码里访问,再到消除部署警告,都给你理清楚:
1. 先确保Serverless.yml的配置正确
首先,你需要在serverless.yml里正确引用SSM参数,同时给部署角色加上必要的权限,这是避免警告的关键:
引用SSM参数
在custom块里定义变量,根据参数是否加密选择语法:
custom: # 加密的SSM参数(用KMS加密),要加~true表示需要解密 encryptedDbPassword: ${ssm:/my-service/prod/db-password~true} # 未加密的普通参数 apiEndpoint: ${ssm:/my-service/prod/api-endpoint}
配置IAM权限(必加,否则会出警告)
Serverless部署时使用的IAM角色需要有访问SSM参数的权限,否则框架无法验证参数存在,会抛出警告。在provider块里添加权限:
provider: name: aws runtime: nodejs18.x # 换成你用的运行时 iamRoleStatements: - Effect: Allow Action: - ssm:GetParameter - ssm:GetParameters # 限定参数路径,遵循最小权限原则,不要用通配符*除非必要 Resource: "arn:aws:ssm:${aws:region}:${aws:accountId}:parameter/my-service/prod/*"
2. 在代码/配置中访问变量
有两种常用的访问方式,看你的需求:
方式一:通过环境变量注入到Lambda
把SSM参数注入到Lambda的环境变量里,代码里直接用process.env读取:
provider: environment: DB_PASSWORD: ${self:custom.encryptedDbPassword} API_ENDPOINT: ${self:custom.apiEndpoint}
然后在Lambda代码里(以Node.js为例):
exports.handler = async (event) => { // 直接读取环境变量 const dbPassword = process.env.DB_PASSWORD; const apiUrl = process.env.API_ENDPOINT; // 你的业务逻辑 return { statusCode: 200, body: JSON.stringify({ apiUrl }) }; };
方式二:直接在Serverless配置中使用
如果是要在配置里用(比如函数内存、超时时间),可以直接引用:
functions: mainFunction: handler: src/handler.main memorySize: ${ssm:/my-service/prod/function-memory} # 直接用SSM参数设置内存 timeout: ${ssm:/my-service/prod/function-timeout}
3. 消除部署警告的常见排查点
如果部署时出现警告,大概率是以下问题:
- 权限缺失:刚才的IAM权限没加全,或者Resource路径写错了,导致Serverless框架无法获取参数信息。
- 参数路径错误:检查SSM参数的名称/路径是否和配置里一致,注意区分大小写,还有区域是否和部署区域匹配。
- 加密参数未加~true:如果参数是KMS加密的,没加
~true的话,框架无法解密,会抛出警告。 - 参数不存在:确认AWS控制台里的SSM参数确实存在,没有被删除。
比如如果警告提示Unable to fetch SSM parameter at path...,先去AWS IAM控制台检查部署角色的权限,再核对SSM参数的路径和区域。
内容的提问来源于stack exchange,提问作者SeanPlusPlus
相关产品推荐
相关产品推荐

