API Gateway调用Lambda:AWS::Lambda::Permission与IAM Role选型咨询
API Gateway调用Lambda的权限方案对比与最佳实践
两种权限方案的核心差异
- AWS::Lambda::Permission:属于Lambda资源的权限附加策略,直接授权API Gateway服务主体调用指定Lambda函数。配置步骤少,无需额外管理IAM角色,适合简单场景。
- AWS::IAM::Role:为API Gateway创建专属执行角色,通过角色的权限策略授予调用Lambda(或其他AWS服务)的权限。这种方式权限配置更灵活,支持批量授权和扩展其他操作权限。
方案选择与最佳实践
单API单Lambda场景:优先使用AWS::Lambda::Permission
这种场景下,Permission方案足够满足需求,且符合最小权限原则:
- 配置示例(CloudFormation YAML):
LambdaInvokePermission: Type: AWS::Lambda::Permission Properties: FunctionName: !Ref MyLambdaFunction Action: lambda:InvokeFunction Principal: apigateway.amazonaws.com SourceArn: !Sub "arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:${MyApiGateway}/*/*/${MyApiResourcePath}" - 关键要点:通过
SourceArn精确限制只有指定的API Gateway路径能调用该Lambda,避免权限过度开放。
多API多Lambda/复杂权限场景:使用IAM角色
当需要让API Gateway调用多个Lambda,或同时需要访问其他AWS服务(如读取S3文件、查询DynamoDB)时,IAM角色是更优选择:
- 角色配置示例(CloudFormation YAML):
ApiGatewayExecutionRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: apigateway.amazonaws.com Action: sts:AssumeRole Policies: - PolicyName: LambdaInvokeAndOtherPermissions PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: lambda:InvokeFunction Resource: - !GetAtt LambdaFunction1.Arn - !GetAtt LambdaFunction2.Arn - Effect: Allow Action: s3:GetObject Resource: !Sub "arn:aws:s3:::${MyBucket}/*" - 优势:统一管理API Gateway的所有权限,后续扩展时只需更新角色的权限策略,无需逐个修改Lambda的Permission资源。
通用最佳实践
- 严格遵循最小权限原则:无论哪种方案,都避免使用通配符
*,精确指定允许调用的Lambda ARN或API Gateway路径。 - 确保CloudFormation资源依赖正确:比如Permission资源要依赖Lambda函数和API Gateway的部署资源,防止因资源未就绪导致权限配置失效。
- 定期审计权限:通过IAM Access Analyzer等工具检查权限是否存在过度授权的情况,及时调整。
内容的提问来源于stack exchange,提问作者Chris White
相关产品推荐
相关产品推荐

