使用SST的VPC中Lambda无法访问AWS Systems Manager Parameter Store
Lambda部署在VPC内,使用SST的Config.Secret获取密钥时触发超时,注释掉获取配置的代码后恢复正常。核心原因是VPC内的Lambda无法访问存储SST Secret的AWS Secrets Manager服务,导致请求超时。
1. 检查Secret Manager VPC端点配置
你提到VPC已有Secret Manager的VPC端点,需确认以下配置:
- 端点已关联Lambda所在的子网(
subnet-XXXXXX) - 端点的安全组允许Lambda安全组(
sg-XXXXXX)发起的HTTPS(443端口)流量 - 端点为接口类型,服务名称格式为
com.amazonaws.<你的区域>.secretsmanager
2. 验证Lambda安全组的出站规则
确保Lambda使用的安全组包含出站规则:允许HTTPS(443)流量到Secret Manager的VPC端点IP,或AWS Secrets Manager的服务前缀列表(Prefix List)。
3. 确认Lambda权限
SST的bind方法会自动为Lambda添加读取Secrets Manager的权限,但可手动验证:
在AWS控制台查看Lambda执行角色,确认包含secretsmanager:GetSecretValue权限,且目标资源为MONGODB_PROD_URL对应的Secret ARN。
4. 改用SSM Parameter Store(适配你的使用场景)
既然你原本使用Systems Manager Parameter Store,可将SST的Config.Secret替换为Config.Parameter,让密钥存储在SSM中,无需依赖Secret Manager:
修改MyStack.ts代码
import * as ec2 from 'aws-cdk-lib/aws-ec2'; import { Config, Function, StackContext } from 'sst/constructs'; export function MyStack({ stack }: StackContext) { const secrets = { MONGODB_PROD_URL: new Config.Parameter(stack, 'MONGODB_PROD_URL', { type: 'SECRET', // 标记为敏感参数,存储为SecureString }), }; const securityGroup = ec2.SecurityGroup.fromSecurityGroupId(stack, 'default', 'sg-XXXXXX'); const subnet = ec2.Subnet.fromSubnetId(stack, 'my-subnet', 'subnet-XXXXXX'); const vpc = ec2.Vpc.fromLookup(stack, 'db-vpc', { vpcId: 'vpc-XXXXXX', }); const myLambda = new Function(stack, 'hello-function', { handler: 'src/functions/hello/handler.main', runtime: 'nodejs20.x', bind: [secrets.MONGODB_PROD_URL], vpc, vpcSubnets: { subnets: [subnet], }, securityGroups: [securityGroup], timeout: 5, memorySize: 2048, enableLiveDev: true, }); stack.addOutputs({ LambdaName: myLambda.functionName, }); }
同时需为VPC添加SSM Parameter Store的接口端点(服务名称com.amazonaws.<你的区域>.ssm),并配置关联子网和安全组规则,允许Lambda通过端点访问SSM。
handler.ts无需修改,依然使用Config.MONGODB_PROD_URL.toString()获取值。
内容的提问来源于stack exchange,提问作者TheSmartMonkey

