如何让AWS SAM模板自动读取.env文件中的环境变量?
从环境变量自动读取参数部署AWS SAM模板的方法
方法1:结合环境变量与SAM CLI的--parameter-overrides参数
先加载本地.env文件中的环境变量,再在部署命令中直接引用这些变量,无需手动输入参数。
假设你的.env文件中定义了GOOGLE_CLIENT_ID和GOOGLE_CLIENT_SECRET两个变量,执行以下步骤:
- 加载环境变量:
source .env
- 执行SAM部署命令,直接引用环境变量:
sam deploy --parameter-overrides "GoogleClientId=$GOOGLE_CLIENT_ID GoogleClientSecret=$GOOGLE_CLIENT_SECRET"
嫌每次敲命令麻烦的话,可以把上述命令写到shell脚本里,比如创建deploy.sh:
#!/bin/bash source .env sam deploy --parameter-overrides "GoogleClientId=$GOOGLE_CLIENT_ID GoogleClientSecret=$GOOGLE_CLIENT_SECRET"
给脚本添加执行权限后,直接运行脚本即可完成部署。
方法2:使用SAM配置文件(samconfig.toml)
SAM支持通过配置文件保存部署参数,你可以在配置文件中直接引用环境变量,部署时自动读取。
- 生成默认配置文件(若未创建过):
sam deploy --save-config
执行后会自动生成samconfig.toml文件。
- 编辑
samconfig.toml,在[default.deploy.parameters]节点下添加参数配置:
[default.deploy.parameters] parameter_overrides = "GoogleClientId=${GOOGLE_CLIENT_ID} GoogleClientSecret=${GOOGLE_CLIENT_SECRET}"
- 加载
.env后执行部署命令,SAM会自动读取配置文件并替换环境变量:
source .env && sam deploy
方法3:使用AWS Secrets Manager(生产环境推荐)
如果不想依赖本地.env文件,可将密钥存储到AWS Secrets Manager,让SAM模板直接从云端拉取值,无需定义模板参数。
- 将Google客户端ID和密钥上传到Secrets Manager:
aws secretsmanager create-secret --name GoogleAuthSecrets --secret-string '{"client_id":"你的Google客户端ID","client_secret":"你的Google客户端密钥"}'
- 修改SAM模板,移除原有的
Parameters部分,直接用!GetSecretValue获取密钥:
Resources: GoogleProvider: Type: AWS::Cognito::UserPoolIdentityProvider Properties: AttributeMapping: { "name": "name", "family_name": "family_name", "email": "email", "username": "sub", } ProviderDetails: { "client_id" : !GetAtt GoogleAuthSecrets.SecretString.client_id, "client_secret": !GetAtt GoogleAuthSecrets.SecretString.client_secret, "authorize_scopes": "openid profile email", } ProviderName: Google ProviderType: Google UserPoolId: !Ref ScreenshotUserPool GoogleAuthSecrets: Type: AWS::SecretsManager::Secret Properties: SecretId: GoogleAuthSecrets
部署时无需传递任何参数,SAM会直接从Secrets Manager拉取对应值,更适合团队协作和生产环境。
内容的提问来源于stack exchange,提问作者Дмитрий Чумаченко
相关产品推荐
相关产品推荐

