AWS Lambda无法访问公开ElasticSearch实例,本地可正常访问求助
问题解决步骤
1. 移除Lambda角色权限中的IP限制
你的Lambda执行角色的iamRoleStatements里添加了IpAddress条件,Lambda运行在AWS内部网络,源IP并非你设置的0.0.0.0,这直接导致权限策略不生效。删除该条件即可让权限正常应用:
修改后的iamRoleStatements:
iamRoleStatements: - Effect: Allow Action: - es:ESHttpPost - es:ESHttpPut - es:ESHttpDelete - es:ESHttpGet Resource: - {'Fn::GetAtt': ['ElasticSearchInstance', 'DomainArn']} - { 'Fn::Join': [ '', [ {'Fn::GetAtt': ['ElasticSearchInstance', 'DomainArn']}, '/*', ], ], }
2. 调整ElasticSearch的访问策略,允许Lambda角色访问
当前ES的AccessPolicies仅允许指定IP访问,Lambda的请求来自AWS内部,IP不在白名单内,需要添加一条允许Lambda角色的语句,同时保留原有IP白名单用于本地访问:
修改后的AccessPolicies:
AccessPolicies: Version: '2012-10-17' Statement: # 允许指定IP(本地环境)访问 - Effect: 'Allow' Principal: AWS: '*' Action: 'es:*' Resource: '*' Condition: IpAddress: aws:SourceIp: ['182.177.251.40', '103.115.199.162'] # 允许Lambda执行角色访问 - Effect: 'Allow' Principal: AWS: 'arn:aws:iam::xxxxxxxx:role/infrastruct-dev-us-east-2-lambdaRole' Action: 'es:*' Resource: '*'
注意替换xxxxxxxx为你的AWS账号ID,确保角色ARN和错误信息中的一致。
原理说明
- Lambda执行角色的权限不能加IP限制:Lambda没有固定公网IP,且运行时通过AWS内部网络访问ES,
aws:SourceIp条件不适用。 - ES的访问策略需要同时覆盖本地IP和Lambda角色:本地请求来自固定公网IP,Lambda请求来自指定IAM角色,两者需要分别授权。
内容的提问来源于stack exchange,提问作者Hamza J
相关产品推荐
相关产品推荐

