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

使用AWS CDK(Go)部署时如何为Lambda配置环境变量?

在AWS CDK(Go)中为Lambda配置环境变量

要让你的Go Lambda代码获取到EMAIL_HOST这类环境变量,你需要在CDK代码中给Lambda函数明确配置这些变量。下面是三种常用实现方式,按需选择:


方法1:代码直接配置(仅适用于测试环境)

在cdk/cdk.go里创建Lambda函数时,直接通过Environment字段设置变量值。这种方式简单但绝对不能用于生产环境——敏感信息会硬编码在代码中。

package main

import (
	"github.com/aws/aws-cdk-go/awscdk/v2"
	"github.com/aws/aws-cdk-go/awscdk/v2/awslambda"
	"github.com/aws/constructs-go/constructs/v10"
	"github.com/aws/jsii-runtime-go"
)

type CdkStackProps struct {
	awscdk.StackProps
}

func NewCdkStack(scope constructs.Construct, id string, props *CdkStackProps) awscdk.Stack {
	sprops := props.StackProps
	stack := awscdk.NewStack(scope, &id, &sprops)

	// 创建Lambda并配置环境变量
	lambdaFn := awslambda.NewFunction(stack, jsii.String("EmailHandlerLambda"), &awslambda.FunctionProps{
		Runtime: awslambda.Runtime_GO_1_X(),
		Code:    awslambda.Code_FromAsset(jsii.String("../api/aj/lambda"), nil),
		Handler: jsii.String("main"),
		Environment: &map[string]*string{
			"EMAIL_HOST":     jsii.String("smtp.example.com"),
			"EMAIL_USERNAME": jsii.String("your-test-email@example.com"),
			"EMAIL_PASSWORD": jsii.String("test-password"),
			"EMAIL_PORT":     jsii.String("587"),
		},
	})

	return stack
}

// main和env函数保持原有逻辑即可
func main() {
	defer jsii.Close()
	app := awscdk.NewApp(nil)
	NewCdkStack(app, "CdkStack", &CdkStackProps{
		awscdk.StackProps{Env: env()},
	})
	app.Synth(nil)
}

func env() *awscdk.Environment {
	return nil
	// 生产环境可取消下方注释指定账号区域
	// return &awscdk.Environment{
	//  Account: jsii.String(os.Getenv("CDK_DEFAULT_ACCOUNT")),
	//  Region:  jsii.String(os.Getenv("CDK_DEFAULT_REGION")),
	// }
}

方法2:从本地环境变量读取(推荐开发环境)

先在终端设置本地环境变量,再让CDK读取这些值传递给Lambda,避免代码中硬编码敏感信息。

步骤1:终端设置环境变量

执行cdk deploy前,在终端输入:

export EMAIL_HOST="smtp.example.com"
export EMAIL_USERNAME="your-email@example.com"
export EMAIL_PASSWORD="your-password"
export EMAIL_PORT="587"

步骤2:CDK代码读取并配置

修改cdk/cdk.go的Lambda配置部分,引入os包读取本地环境变量:

import "os"

// ...

lambdaFn := awslambda.NewFunction(stack, jsii.String("EmailHandlerLambda"), &awslambda.FunctionProps{
	Runtime: awslambda.Runtime_GO_1_X(),
	Code:    awslambda.Code_FromAsset(jsii.String("../api/aj/lambda"), nil),
	Handler: jsii.String("main"),
	Environment: &map[string]*string{
		"EMAIL_HOST":     jsii.String(os.Getenv("EMAIL_HOST")),
		"EMAIL_USERNAME": jsii.String(os.Getenv("EMAIL_USERNAME")),
		"EMAIL_PASSWORD": jsii.String(os.Getenv("EMAIL_PASSWORD")),
		"EMAIL_PORT":     jsii.String(os.Getenv("EMAIL_PORT")),
	},
})

方法3:使用AWS Secrets Manager(生产环境最佳实践)

将敏感信息存储在AWS Secrets Manager中,通过CDK引用密钥并授予Lambda读取权限,彻底避免敏感信息暴露。

步骤1:在Secrets Manager创建密钥

创建一个名为EmailCredentials的密钥,包含host、username、password、port四个键值对。

步骤2:CDK代码配置

import (
	"github.com/aws/aws-cdk-go/awscdk/v2/awssecretsmanager"
)

// ...

// 引用已创建的Secrets Manager密钥
emailSecrets := awssecretsmanager.Secret_FromSecretNameV2(stack, jsii.String("EmailSecrets"), jsii.String("EmailCredentials"))

lambdaFn := awslambda.NewFunction(stack, jsii.String("EmailHandlerLambda"), &awslambda.FunctionProps{
	Runtime: awslambda.Runtime_GO_1_X(),
	Code:    awslambda.Code_FromAsset(jsii.String("../api/aj/lambda"), nil),
	Handler: jsii.String("main"),
	Environment: &map[string]*string{
		"EMAIL_HOST":     emailSecrets.SecretValueFromJson(jsii.String("host")).ToString(),
		"EMAIL_USERNAME": emailSecrets.SecretValueFromJson(jsii.String("username")).ToString(),
		"EMAIL_PASSWORD": emailSecrets.SecretValueFromJson(jsii.String("password")).ToString(),
		"EMAIL_PORT":     emailSecrets.SecretValueFromJson(jsii.String("port")).ToString(),
	},
})

// 授予Lambda读取密钥的权限
emailSecrets.GrantRead(lambdaFn, nil)

部署完成后,你可以在AWS控制台的Lambda函数配置页查看环境变量是否正确设置,也可以通过Lambda日志验证代码是否能正常读取这些变量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 16:16:06