AWS Lambda角色与OpenSearch资源权限策略配置异常排查
问题分析与解决方法
原因
Lambda执行时使用的是临时会话身份ARN(即arn:aws:sts::123456789:assumed-role/testelk-purge-elk-role/testelk-purge-elk),而非角色本身的ARN。原策略的Deny语句中,NotPrincipal仅指定了角色ARN,临时会话身份不在排除列表内,因此触发了显式Deny,导致403权限拒绝。
AWS资源策略中,NotPrincipal仅匹配显式列出的身份,临时会话身份与角色本身是独立的标识,不会自动关联匹配。
解决方法
修改OpenSearch的资源策略,确保允许Lambda的临时会话身份执行es:ESHttpDelete操作,推荐两种方案:
方案1:同时包含角色ARN和临时会话ARN
在NotPrincipal中添加Lambda的临时会话ARN(会话名称testelk-purge-elk为Lambda函数名,若函数名不变则可固定):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "es:*", "Resource": "arn:aws:es:eu-west-2:123456789:domain/domain-elktest/*" }, { "Effect": "Deny", "NotPrincipal": { "AWS": [ "arn:aws:iam::123456789:role/testelk-purge-elk-role", "arn:aws:sts::123456789:assumed-role/testelk-purge-elk-role/testelk-purge-elk" ] }, "Action": "es:ESHttpDelete", "Resource": "arn:aws:es:eu-west-2:123456789:domain/domain-elktest/*" } ] }
方案2:使用条件匹配角色ID(更灵活)
通过aws:PrincipalArn条件,匹配所有由该角色生成的临时会话身份,无需指定具体会话名称:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "es:*", "Resource": "arn:aws:es:eu-west-2:123456789:domain/domain-elktest/*" }, { "Effect": "Deny", "Principal": { "AWS": "*" }, "Action": "es:ESHttpDelete", "Resource": "arn:aws:es:eu-west-2:123456789:domain/domain-elktest/*", "Condition": { "StringNotLike": { "aws:PrincipalArn": "arn:aws:sts::123456789:assumed-role/testelk-purge-elk-role/*" } } } ] }
额外注意事项
- 确保Lambda执行角色本身已被授权调用OpenSearch的
es:ESHttpDelete操作(IAM角色权限需配合资源策略,两者都允许才会生效)。 - 方案2中的通配符
*会匹配该角色下的所有临时会话,不管会话名称是什么,适用性更强。
内容的提问来源于stack exchange,提问作者user2485980
相关产品推荐
相关产品推荐

