按AWS官方示例配置资源策略后Lambda无法访问SecretsManager
我账户下多个Lambda函数需要访问SecretsManager密钥,且无法使用身份策略,按照AWS官方文档示例配置了如下资源策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "lambda.amazonaws.com" ] }, "Action": "secretsmanager:GetSecretValue", "Resource": "*", "Condition": { "ArnLike": { "aws:sourceArn": "arn:aws:lambda::1234567891911:*" }, "StringEquals": { "aws:sourceAccount": "1234567891911" } } } ] }
调用Lambda时失败,报错信息:
"An error occurred (AccessDeniedException) when calling the GetSecretValue operation: User: arn:aws:sts::1234567891911:assumed-role/my-secret-name/my-lambda-name is not authorized to perform: secretsmanager:GetSecretValue on resource: ps-shield-token because no identity-based policy allows the secretsmanager:GetSecretValue action"
问题原因
AWS权限验证需要身份策略(Lambda执行角色)和资源策略(SecretsManager密钥)同时允许。你当前配置的资源策略用了lambda.amazonaws.com作为主体,但Lambda实际调用SecretsManager时,使用的是执行角色的STS临时身份(即报错里的arn:aws:sts::...:assumed-role/...),服务主体的配置无法匹配这种临时身份,导致权限校验失败。
解决方案
调整SecretsManager的资源策略,适配Lambda的临时身份访问模式,同时保留权限范围的安全性:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "secretsmanager:GetSecretValue", "Resource": "arn:aws:secretsmanager:你的AWS区域:1234567891911:secret:ps-shield-token-*", "Condition": { "ArnLike": { "aws:PrincipalArn": "arn:aws:sts::1234567891911:assumed-role/*/*" }, "StringEquals": { "aws:sourceAccount": "1234567891911", "aws:sourceArn": "arn:aws:lambda::1234567891911:function:*" } } } ] }
关键调整说明:
- 缩小资源范围:将
Resource从*改为目标密钥的ARN(SecretsManager密钥ARN末尾会自动添加随机后缀,所以用ps-shield-token-*匹配),避免过度授权 - 适配临时身份:将
Principal设为*,通过aws:PrincipalArn条件限制仅允许你账户内Lambda执行角色的临时身份访问 - 保留源校验:保留
aws:sourceAccount和aws:sourceArn条件,确保请求确实来自你账户内的Lambda函数,防止外部非法请求
额外检查项
- 确认该资源策略已正确附加到目标密钥
ps-shield-token上 - 确保Lambda函数所在区域与SecretsManager密钥的区域一致(跨区域访问需额外配置VPC端点或跨区域权限)
内容的提问来源于stack exchange,提问作者pkaramol

