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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 03:27:29