基于Serverless的Go API部署AWS后无法读取环境变量的问题
解决Serverless部署Go API到AWS后无法访问环境变量的问题
问题背景
本地用Serverless框架搭建的Go API运行正常,但部署到AWS Lambda后调用端点时出现错误:
Failed to load env file: open ./.env: no such file or directory
项目结构:根目录包含main.go、.env文件,以及存放config.go的config文件夹。
相关代码
config.go
package config import ( "fmt" "log" "os" "github.com/joho/godotenv" ) func config(key string) string { if err := godotenv.Load("./.env"); err != nil { log.Fatalf("Failed to load env file: %v", err) } return os.Getenv(key) }
serverless.yml
service: my_service frameworkVersion: ">=4.0.32" useDotenv: true provider: name: aws runtime: provided.al2 architecture: arm64 region: ap-southeast-1 stage: ${opt:stage} environment: DB_STRING: ${env:DB_STRING} HOST_URL: ${env:URL} HOST_API_KEY: ${env:API_KEY} # Other env vars... plugins: - serverless-plugin-go - serverless-dotenv-plugin functions: api: handler: main.go events: - http: path: /healthcheck method: GET package: patterns: - "!*/**" - bin/bootstrap
解决方法
1. 删除代码中加载本地.env文件的逻辑
部署到AWS Lambda后,.env文件不会被打包上传(看serverless.yml的package.patterns配置,已经排除了大部分文件,仅保留bin/bootstrap),而且Serverless已经将provider.environment中配置的变量注入到Lambda的运行环境中,直接通过os.Getenv()即可读取。
修改后的config.go:
package config import ( "log" "os" ) func Config(key string) string { value := os.Getenv(key) if value == "" { log.Fatalf("Environment variable %s not set", key) } return value }
2. 确认Serverless环境变量配置有效
你的serverless.yml中已经通过provider.environment将本地.env的变量映射到Lambda环境变量,配合useDotenv: true和serverless-dotenv-plugin,部署时会自动读取本地.env的值并注入到Lambda,这部分配置是正确的,无需修改。
3. (可选)兼容本地开发环境
如果想保留本地开发时加载.env的能力,可以通过环境变量区分运行环境,仅在本地加载.env:
package config import ( "log" "os" "github.com/joho/godotenv" ) func Config(key string) string { // 仅在本地开发阶段加载.env文件 if os.Getenv("STAGE") == "local" { if err := godotenv.Load("./.env"); err != nil { log.Fatalf("Failed to load env file: %v", err) } } value := os.Getenv(key) if value == "" { log.Fatalf("Environment variable %s not set", key) } return value }
本地运行时设置STAGE=local即可加载.env,部署到AWS后STAGE为你指定的阶段(如dev/prod),不会触发.env加载逻辑。
内容的提问来源于stack exchange,提问作者Namit Deb
相关产品推荐
相关产品推荐

