如何无需EC2侧配置权限,允许所有EC2实例调用Lambda?
我尝试给Lambda函数添加以下基于资源的策略,期望允许所有EC2实例调用它:
{ "Version": "2012-10-17", "Id": "default", "Statement": [ { "Sid": "InvokeLambdaFunction", "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:eu-west-1:123456789012:myLambdaFunction", "Condition": { "ArnLike": { "AWS:SourceArn": "arn:aws:ec2:eu-west-1:123456789012:instance/*" } } } ] }
但在EC2实例内使用AWS CLI调用该Lambda时,出现权限拒绝错误:
sh-4.2$ aws lambda invoke --function-name "myLambdaFunction" --payload "{\"instance-id\":\"$EC2_INSTANCE_ID\"}" --region eu-west-1 response.json
错误信息:
An error occurred (AccessDeniedException) when calling the Invoke operation: User: arn:aws:sts::123456789012:assumed-role/AmazonSSMRoleForInstancesQuickSetup/i-06e731b382734dc8f is not authorized to perform: lambda:InvokeFunction on resource: arn:aws:lambda:eu-west-1:123456789012:function:myLambdaFunction because no identity-based policy allows the lambda:InvokeFunction action
请问我是否遗漏了配置,还是这种需求根本不可行?
这种需求不可行,核心原因是AWS的权限模型要求身份策略与资源策略同时满足允许条件,才能完成操作:
你配置的Lambda资源策略仅允许EC2服务作为主体发起请求,但实际发起调用的是EC2实例关联的IAM角色(即错误信息中的
AmazonSSMRoleForInstancesQuickSetup),该角色本身没有被授予lambda:InvokeFunction权限——这正是错误提示中「no identity-based policy allows the lambda:InvokeFunction action」的含义。EC2实例调用Lambda时,请求的身份是实例所扮演的IAM角色,而非EC2服务本身。设置
Principal: ec2.amazonaws.com只是允许EC2服务代表角色发起请求,但角色必须拥有对应的身份策略授权才能执行操作。
若要实现让所有EC2实例调用该Lambda,可选择以下方案:
- 方案一:给所有EC2实例关联的IAM角色添加身份策略,明确授予
lambda:InvokeFunction权限(可限定资源为目标Lambda的ARN)。 - 方案二:创建通用的IAM托管策略,批量附加给所有EC2实例角色,本质仍是给实例角色添加授权。
另外,你当前资源策略中的Condition: ArnLike仅用于过滤请求来源为EC2实例ARN,属于额外的安全限制,无法替代实例角色的身份授权。
内容的提问来源于stack exchange,提问作者Mit94

