使用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
相关产品推荐
相关产品推荐

