使用AWS Go SecretsManager缓存客户端的Lambda函数正确资源权限配置
问题根因与解决方案
1. 关于sts assumed-role的疑问说明
Lambda运行时会自动扮演你为其配置的执行角色,生成的身份ARN格式为arn:aws:sts::[账户ID]:assumed-role/[角色名]/[函数实例标识],这是Lambda的正常运行逻辑,和跨账户无关,不属于故障原因。
2. 报错的两个核心原因
2.1 IAM Action大小写错误
AWS IAM权限的Action字段大小写敏感,你尝试添加的secretsManager:DescribeSecret中服务名的M大写是错误写法,正确写法为全小写的secretsmanager:DescribeSecret。
2.2 权限策略的Condition限制了DescribeSecret调用
你原有的资源策略中,Condition配置是针对GetSecretValue接口的限制:仅当请求的VersionStage为AWSCURRENT时允许访问。但DescribeSecret接口调用时不会传递VersionStage参数,会直接命中Condition的拒绝逻辑,哪怕你把Action改成secretsmanager:*也会被拦截。
3. 修复方案
3.1 修正Secrets Manager资源策略
将两个接口的权限拆分为两个独立Statement,避免Condition误拦截:
{ "Version" : "2012-10-17", "Statement" : [ { "Effect" : "Allow", "Principal" : { "AWS" : "arn:aws:iam::111111111111:role/MyLambda-FunctionNameRole-1TG1EVGPEQ8TZ" }, "Action" : "secretsmanager:GetSecretValue", "Resource" : "*", "Condition" : { "ForAnyValue:StringEquals" : { "secretsmanager:VersionStage" : "AWSCURRENT" } } }, { "Effect" : "Allow", "Principal" : { "AWS" : "arn:aws:iam::111111111111:role/MyLambda-FunctionNameRole-1TG1EVGPEQ8TZ" }, "Action" : "secretsmanager:DescribeSecret", "Resource" : "*" } ] }
3.2 检查Lambda执行角色的身份权限
除了Secrets Manager的资源策略,还需要确认Lambda绑定的执行角色本身的权限策略中,已经允许了secretsmanager:GetSecretValue和secretsmanager:DescribeSecret两个操作,资源范围匹配你的密钥ARN。
3.3 代码无需额外修改
缓存客户端的原有逻辑、包括GetSecretStringWithStage的调用都可以保留,权限配置正确后即可正常运行。
内容的提问来源于stack exchange,提问作者tgilino
相关产品推荐
相关产品推荐

