如何在Python全局作用域(Lambda函数外)访问AWS Lambda环境变量
在Lambda全局作用域访问CDK配置的环境变量
解决方案代码(app.py)
import os import json import boto3 from sqlalchemy import create_engine, func, select, and_, text # 初始化Secrets Manager客户端 secrets_manager = boto3.client('secretsmanager') # 获取CDK配置的环境变量(Secrets Manager ARN) rds_secret_arn = os.environ.get("rds") # 从Secrets Manager拉取数据库凭证 secret_response = secrets_manager.get_secret_value(SecretId=rds_secret_arn) db_config = json.loads(secret_response['SecretString']) # 拼接SQLAlchemy连接字符串(以PostgreSQL为例,可根据数据库类型调整) db_conn_str = f"postgresql://{db_config['username']}:{db_config['password']}@{db_config['host']}:5432/{db_config['dbname']}" # 在全局作用域创建SQLAlchemy Engine engine = create_engine(db_conn_str) def get_games(event, context): # Lambda业务逻辑示例 with engine.connect() as conn: query_result = conn.execute(select(func.count()).select_from(text('games'))) return {"games_count": query_result.scalar()}
关键配置说明
访问环境变量
直接通过os.environ.get("rds")获取CDK中配置的环境变量,键名需与CDK代码里environment字典的键完全一致。Secrets Manager权限配置
Lambda默认没有访问Secrets Manager的权限,需在CDK栈代码中为Lambda角色添加权限:from aws_cdk import aws_iam as iam # 给Lambda添加Secrets Manager读取权限 get_games_lambda.add_to_role_policy(iam.PolicyStatement( actions=["secretsmanager:GetSecretValue"], resources=["arn:aws:secretsmanager:..."] # 替换为你的Secret ARN,若用CDK创建Secret可直接引用secret.secret_arn ))全局作用域的优势与注意事项
- 全局代码会在Lambda容器初始化时执行一次,后续请求复用容器,Engine的连接池也会被复用,提升性能。
- 若Secrets Manager中的凭证更新,需等待Lambda容器回收重启后,才会加载新的凭证;若需实时刷新,可将凭证获取逻辑移至函数内部。
内容的提问来源于stack exchange,提问作者Rony Tesler
相关产品推荐
相关产品推荐

