AWS::IAM::Policy与ManagedPolicy的区别及Lambda权限配置指引
AWS::IAM::Policy 与 AWS::IAM::ManagedPolicy 的核心区别
1. 依附关系与存在形式
- AWS::IAM::Policy:必须绑定到特定IAM实体(角色、用户、组),无法独立存在,属于实体的一部分,仅能为绑定的实体提供权限。
- AWS::IAM::ManagedPolicy:是独立的账户级资源,不依附于任何实体,可自由附加到多个IAM实体,实现权限复用。
2. 复用性
- Policy:仅能作用于绑定的单个/多个指定实体,无法跨实体共享权限规则,适合单一实体的专属权限配置。
- ManagedPolicy:可批量附加到任意数量的IAM实体,非常适合多个资源共享的通用权限集合,大幅减少配置冗余。
3. 管理与版本控制
- ManagedPolicy支持版本管理,更新策略时可保留历史版本,方便回滚;还能在IAM控制台独立查看、编辑,权限管理更清晰。
- Policy无版本控制,修改直接生效;只能在关联的IAM实体页面查看,管理分散。
4. 配额限制
- 单个IAM角色最多可附加2个内联Policy,而ManagedPolicy默认最多可附加10个;此外,ManagedPolicy的内容大小配额(6144字符)远高于内联Policy(2048字符),更适合复杂的通用权限规则。
你的场景更适合用 AWS::IAM::ManagedPolicy
你的需求是10余个Lambda共享CloudWatch、XRay等通用权限,同时每个Lambda有专属权限,选择ManagedPolicy的原因:
- 复用性强:只需定义一次通用权限规则,就能附加到所有Lambda的执行角色,无需在每个Lambda的配置中重复编写通用权限,减少模板冗余。
- 维护高效:后续调整通用权限时,只需修改一次ManagedPolicy,所有关联的Lambda角色会自动生效,不用逐个修改10余个Lambda的配置。
- 权限边界清晰:通用权限(ManagedPolicy)与专属权限(内联Policy)分离,符合IAM权限最小化原则,也便于审计和排查权限问题。
SAM模板实现示例
以下是具体的配置方式,包含通用ManagedPolicy、Lambda执行角色及专属权限的定义:
1. 定义通用权限的ManagedPolicy
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Resources: # 通用权限ManagedPolicy:包含CloudWatch日志、XRay追踪权限 LambdaCommonPermissions: Type: AWS::IAM::ManagedPolicy Properties: Description: Common permissions for all Lambda functions PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: - logs:CreateLogGroup - logs:CreateLogStream - logs:PutLogEvents Resource: "*" - Effect: Allow Action: - xray:PutTraceSegments - xray:PutTelemetryRecords Resource: "*"
2. 配置Lambda执行角色(通用权限+专属权限)
以两个Lambda为例,分别配置S3、ParameterStore专属权限:
# Lambda1执行角色:绑定通用ManagedPolicy + 专属S3权限 Lambda1ExecutionRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: lambda.amazonaws.com Action: sts:AssumeRole # 引用通用ManagedPolicy ManagedPolicyArns: - !Ref LambdaCommonPermissions # 专属权限:S3对象操作 Policies: - PolicyName: Lambda1S3Access PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: - s3:GetObject - s3:PutObject Resource: arn:aws:s3:::your-target-bucket/* # Lambda1资源 Lambda1Function: Type: AWS::Serverless::Function Properties: CodeUri: lambda1/ Handler: index.handler Runtime: python3.11 Role: !GetAtt Lambda1ExecutionRole.Arn # Lambda2执行角色:绑定通用ManagedPolicy + 专属SSM参数权限 Lambda2ExecutionRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: lambda.amazonaws.com Action: sts:AssumeRole ManagedPolicyArns: - !Ref LambdaCommonPermissions Policies: - PolicyName: Lambda2SSMAccess PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: - ssm:GetParameter - ssm:GetParameters Resource: arn:aws:ssm:us-east-1:123456789012:parameter/your-param-path/* # Lambda2资源 Lambda2Function: Type: AWS::Serverless::Function Properties: CodeUri: lambda2/ Handler: index.handler Runtime: python3.11 Role: !GetAtt Lambda2ExecutionRole.Arn
关键说明
- 推荐为每个Lambda单独创建执行角色,遵循权限最小化原则,避免一个角色权限过大影响所有Lambda。
- 实际配置时,可将ManagedPolicy中的
Resource限制为具体的ARN(比如指定CloudWatch Log Group前缀),进一步缩小权限范围。
内容的提问来源于stack exchange,提问作者Vishnupriya
相关产品推荐
相关产品推荐

