You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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,或按需使用通配符

三、排查之前的错误原因

  1. S3CrudPolicy报错:你之前未传递BucketName参数,SAM生成的策略会出现无效ARN格式,导致CloudFormation报错。预定义策略模板必须传入必要参数才能正常生成权限。
  2. 自定义策略属性无效:大概率是YAML格式错误,比如缩进混乱、PolicyDocument结构写错,或Resources层级错位。要确保Policies是数组结构,每个策略对象的键值对符合IAM规范。

最后提醒:SAM部署时会自动创建Lambda的服务角色,只要模板中正确配置Policies,部署后角色就会自动拥有对应权限,完全符合基础设施即代码的理念,无需手动修改角色。

内容的提问来源于stack exchange,提问作者user3062260

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:00:38