如何为Python Lambda编写YAML策略以通过AWS SAM CLI访问S3
解决AWS SAM部署Lambda时的权限配置问题
我明白你遇到的痛点——本地调试一切正常,部署后却因为权限卡壳,手动改角色又违背了SAM基础设施即代码的初衷。下面针对你的问题一步步给出解决方案:
一、正确配置S3读写权限(两种方案)
方案1:使用SAM预定义策略模板(推荐)
你之前直接写Policies: S3CrudPolicy报错,是因为SAM的预定义策略模板需要传入必要的参数(比如目标存储桶名称),否则生成的策略会不符合规范。正确的写法是用PolicyTemplates引用,并传递参数:
Resources: GetFileFromBucketFunction: Type: AWS::Serverless::Function Properties: CodeUri: ./path/to/your/code Handler: app.lambda_handler Runtime: python3.x Policies: - S3CrudPolicy: BucketName: !Ref YourS3BucketName # 替换成你的存储桶名称,或用参数引用
如果你的Lambda需要访问多个存储桶,也可以用通配符(但遵循最小权限原则,不推荐滥用):
- S3CrudPolicy: BucketName: "*"
方案2:自定义内联策略(更灵活,最小权限适配)
如果预定义模板满足不了需求,或者你想更精细控制权限,可以直接写内联策略。注意YAML格式要严谨,Policies是数组,每个元素包含PolicyName和PolicyDocument:
Resources: GetFileFromBucketFunction: Type: AWS::Serverless::Function Properties: CodeUri: ./path/to/your/code Handler: app.lambda_handler Runtime: python3.x Policies: - PolicyName: S3ReadWriteAccess PolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Action: - s3:GetObject - s3:PutObject # 按需添加其他操作,比如s3:ListBucket(列表存储桶内容) Resource: - !Sub "arn:aws:s3:::${YourS3BucketName}" # 存储桶本身权限(如列表) - !Sub "arn:aws:s3:::${YourS3BucketName}/*" # 存储桶内所有对象权限
这里要注意:
Version必须是2012-10-17,这是IAM策略的标准最新版本Resource要区分存储桶级别和对象级别的ARN,按需配置,避免过度授权
二、配置Lambda调用其他Lambda的权限
要让你的Lambda调用另一个Lambda,同样有两种配置方式:
方案1:使用SAM预定义策略模板
SAM提供LambdaInvokePolicy模板,直接使用并指定目标Lambda的函数名即可:
Policies: - LambdaInvokePolicy: FunctionName: !Ref TargetLambdaFunctionName # 目标Lambda的名称或引用
方案2:自定义内联策略
如果需要调用多个Lambda或更精细控制,可编写自定义策略:
Policies: - PolicyName: LambdaInvokeAccess PolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Action: - lambda:InvokeFunction Resource: - !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:${TargetLambdaFunctionName}" # 多目标Lambda可继续添加ARN,或按需使用通配符
三、排查之前的错误原因
- S3CrudPolicy报错:你之前未传递
BucketName参数,SAM生成的策略会出现无效ARN格式,导致CloudFormation报错。预定义策略模板必须传入必要参数才能正常生成权限。 - 自定义策略属性无效:大概率是YAML格式错误,比如缩进混乱、
PolicyDocument结构写错,或Resources层级错位。要确保Policies是数组结构,每个策略对象的键值对符合IAM规范。
最后提醒:SAM部署时会自动创建Lambda的服务角色,只要模板中正确配置Policies,部署后角色就会自动拥有对应权限,完全符合基础设施即代码的理念,无需手动修改角色。
内容的提问来源于stack exchange,提问作者user3062260
相关产品推荐
相关产品推荐

