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

如何在Python Lambda中根据部署阶段配置可变S3桶

解决方案:利用Serverless阶段变量实现动态S3桶名

核心思路是通过Serverless Framework的stage部署参数,把对应环境的桶名以环境变量的形式注入Lambda函数——事件触发是用来响应S3操作的,和部署阶段配置无关,不用在这上面浪费精力。

1. 修改serverless.yaml配置

方式一:直接拼接生成桶名

在函数配置里添加环境变量,用Serverless自带的${self:provider.stage}变量动态生成桶名:

service: my-service
provider:
  name: aws
  runtime: python3.9
  stage: ${opt:stage, 'dev'} # 默认部署到dev,可通过--stage prod指定生产环境
  region: us-east-1

functions:
  myLambdaFunction:
    handler: handler.lambda_handler
    environment:
      S3_BUCKET_NAME: my-bucket_name-${self:provider.stage} # 根据stage自动拼接后缀

方式二:自定义变量统一管理桶名

如果需要非直接拼接的命名规则(比如dev对应-test、prod对应-prod),可以在自定义变量里统一配置:

service: my-service
provider:
  name: aws
  runtime: python3.9
  stage: ${opt:stage, 'dev'}
  region: us-east-1

custom:
  bucketNames:
    dev: my-bucket_name-test
    prod: my-bucket_name-prod

functions:
  myLambdaFunction:
    handler: handler.lambda_handler
    environment:
      S3_BUCKET_NAME: ${self:custom.bucketNames.${self:provider.stage}}

可选:自动创建对应环境的S3桶

如果需要部署时自动生成对应环境的桶,在resources节点添加桶资源配置:

resources:
  Resources:
    MyDynamicBucket:
      Type: AWS::S3::Bucket
      Properties:
        BucketName: ${self:custom.bucketNames.${self:provider.stage}}

2. 修改Python Lambda代码

把硬编码的桶名改成读取环境变量:

import os
import boto3

s3 = boto3.client('s3')

def lambda_handler(event, context):
    # 从环境变量获取当前环境的桶名
    bucket_name = os.environ.get('S3_BUCKET_NAME')
    
    # 后续业务逻辑直接使用这个动态获取的桶名
    response = s3.list_objects_v2(Bucket=bucket_name)
    # ... 其他业务操作

部署验证

  • 部署到dev环境:执行serverless deploy --stage dev,Lambda的环境变量会自动设为my-bucket_name-test
  • 部署到prod环境:执行serverless deploy --stage prod,环境变量会自动设为my-bucket_name-prod

这样就能实现不同部署阶段自动切换S3桶名的需求,全程不用改代码,完全靠配置控制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 04:43:12