通过CFT/SAM模板为RDS实例授权调用Lambda的问题排查
问题分析与解决:RDS实例通过SAM模板获取Lambda调用权限的错误处理
两次错误的原因
第一次错误:Policies字段无效
AWS::RDS::DBInstance资源的Properties中不存在Policies属性,该属性仅适用于IAM角色、用户等身份类资源,直接在RDS实例配置里添加会触发属性校验失败,报错提示extraneous key [Policies] is not permitted。
第二次错误:RoleArn格式错误
在AssociatedRoles中使用!Ref RootRole返回的是IAM角色的名称,而RDS要求RoleArn必须是完整的ARN格式,因此需要改用!GetAtt RootRole.Arn来获取角色的ARN值。另外,FeatureName参数需设置为Lambda(而非InvokeLambda),这是RDS关联Lambda调用权限的标准值。
修正后的SAM模板示例
Description: 包含处理邮件路由的Lambda函数服务 Resources: RootRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: "Allow" Principal: Service: - "rds.amazonaws.com" Action: - "sts:AssumeRole" Path: "/" Policies: - PolicyName: RDSLambdaCrud PolicyDocument: Version: "2012-10-17" Statement: - Sid: LambdaCrudPolicy Effect: Allow Action: - lambda:InvokeFunction Resource: "*" # 建议替换为具体Lambda的ARN,提升安全性 DBInstance: Type: AWS::RDS::DBInstance Properties: DBName: dbname Engine: postgres MasterUsername: dbuser DBInstanceClass: db.t3.micro DBInstanceIdentifier: artifacts AllocatedStorage: 5 MasterUserPassword: qwert1234 AssociatedRoles: - FeatureName: Lambda RoleArn: !GetAtt RootRole.Arn
额外注意事项
- 若使用PostgreSQL引擎,需确保实例已启用
aws_lambda扩展,否则无法通过RDS调用Lambda - 建议将Policy中的Resource从
*改为具体Lambda函数的ARN,遵循最小权限原则
内容的提问来源于stack exchange,提问作者Rupali Mishra
相关产品推荐
相关产品推荐

