使用无服务器,如何在 AWS lambda 函数中添加密钥作为环境变量?
Using serverless, how to add secret keys as environment variable in AWS lambda function?
我需要使用带有密钥的无服务器将 AWS lambda 函数部署到文件中的环境变量中。我不想使用 AWS secret/system 管理器。
如何在 serverless.yml 文件中隐藏环境变量?
当我手动上传和部署我的 nodejs AWS lambda 函数时,它能够从环境变量和 运行 读取数据。我想使用无服务器而不是手动部署来处理这个问题。
我的无服务器 yml 文件如下:
service: sample-lambda
provider:
name: aws
runtime: nodejs10.x
stage: dev
region: us-east-2
apiName: getData
profile: MYAWS
timeout: 300
memorySize: 512
functions:
getData:
handler: handler.getData
name: getData
description: API to get data from server
environment:
key1: 12345
key2: abcdef
server: sample
events:
- http:
path: getData
method: post
cors: true
使用 npm 中的 serverless-secrets-plugin 包并安装它。
您可以为不同的环境创建不同的文件。
当你的阶段是 dev 时,使用文件 secrets.dev.yml
当你的阶段是生产时,使用文件 secrets.production.yml
创建文件secrets.dev.yml并添加如下数据:
key1: 123456
key2: abcdef
server: sample
要使用密码加密您的 secrets.dev.yml 文件:
serverless encrypt --stage dev --password 'YOUR_PASSWORD'
要使用密码解密您的 secrets.dev.yml 文件:
serverless encrypt --stage dev --password 'YOUR_PASSWORD'
注意:在部署 lambda 函数之前,请确保 secrets.dev.yml 文件处于解密视图
更新 serverless.yml 如下:
service: sample-lambda
plugins:
- serverless-secrets-plugin
custom:
secrets: ${file(secrets.${opt:stage, self:provider.stage}.yml)}
provider:
name: aws
runtime: nodejs10.x
stage: dev
region: us-east-2
apiName: getData
profile: MYAWS
timeout: 300
memorySize: 512
functions:
getData:
handler: handler.getData
name: getData
description: API to get data from server
environment:
key1: ${self:custom.secrets.key1}
key2: ${self:custom.secrets.key2}
server: ${self:custom.secrets.server}
events:
- http:
path: getData
method: post
cors: true
作为已接受答案的替代方案,如果您像我一样不喜欢修改额外的秘密文件,您还可以使用 AWS Systems Manager Parameter Store 服务。您可以存储您的 Amazon 密钥、数据库连接、用户名和密码。
这种方法的优点是您只需保存一次密钥,就可以在多个项目中使用它们,只要它们是在同一地区创建的即可。
使用 AWS cli 行将环境变量保存在 AWS Parameter Store 中:
aws --profile default --region us-west-2 ssm put-parameter --name KEY1 --value 123456 --type String
aws --profile default --region us-west-2 ssm put-parameter --name KEY2 --value abcdef --type String
aws --profile default --region us-west-2 ssm put-parameter --name SERVER --value sample --type String
使用控制台将环境变量保存在 AWS Parameter Store 中:
- 登录 AWS 控制台。
- 搜索系统管理器。
- 在应用程序管理下,查找 Parameter Store。
- 单击“创建参数”按钮。
使用 serverless.yml 文件中的密钥:
service: sample-lambda-service
custom:
config:
KEY1: ${ssm:KEY1}
KEY2: ${ssm:KEY2}
SERVER: ${ssm:SERVER}
provider:
name: aws
stage: prod
timeout: 20
memorySize: 512
region: us-west-2
runtime: nodejs12.x
endpointType: regional
environment: ${self:custom.config}
. . .
然后您可以在 handler.js 文件中将它们用作普通环境变量,如下所示:
'use strict'
const AWS = require("aws-sdk");
const s3 = new AWS.S3({
credentials: {
accessKeyId: process.env.KEY1,
secretAccessKey: process.env.KEY2,
},
});
let server = process.env.SERVER;
. . .
我需要使用带有密钥的无服务器将 AWS lambda 函数部署到文件中的环境变量中。我不想使用 AWS secret/system 管理器。 如何在 serverless.yml 文件中隐藏环境变量?
当我手动上传和部署我的 nodejs AWS lambda 函数时,它能够从环境变量和 运行 读取数据。我想使用无服务器而不是手动部署来处理这个问题。
我的无服务器 yml 文件如下:
service: sample-lambda
provider:
name: aws
runtime: nodejs10.x
stage: dev
region: us-east-2
apiName: getData
profile: MYAWS
timeout: 300
memorySize: 512
functions:
getData:
handler: handler.getData
name: getData
description: API to get data from server
environment:
key1: 12345
key2: abcdef
server: sample
events:
- http:
path: getData
method: post
cors: true
使用 npm 中的 serverless-secrets-plugin 包并安装它。
您可以为不同的环境创建不同的文件。 当你的阶段是 dev 时,使用文件 secrets.dev.yml 当你的阶段是生产时,使用文件 secrets.production.yml
创建文件secrets.dev.yml并添加如下数据:
key1: 123456
key2: abcdef
server: sample
要使用密码加密您的 secrets.dev.yml 文件:
serverless encrypt --stage dev --password 'YOUR_PASSWORD'
要使用密码解密您的 secrets.dev.yml 文件:
serverless encrypt --stage dev --password 'YOUR_PASSWORD'
注意:在部署 lambda 函数之前,请确保 secrets.dev.yml 文件处于解密视图
更新 serverless.yml 如下:
service: sample-lambda
plugins:
- serverless-secrets-plugin
custom:
secrets: ${file(secrets.${opt:stage, self:provider.stage}.yml)}
provider:
name: aws
runtime: nodejs10.x
stage: dev
region: us-east-2
apiName: getData
profile: MYAWS
timeout: 300
memorySize: 512
functions:
getData:
handler: handler.getData
name: getData
description: API to get data from server
environment:
key1: ${self:custom.secrets.key1}
key2: ${self:custom.secrets.key2}
server: ${self:custom.secrets.server}
events:
- http:
path: getData
method: post
cors: true
作为已接受答案的替代方案,如果您像我一样不喜欢修改额外的秘密文件,您还可以使用 AWS Systems Manager Parameter Store 服务。您可以存储您的 Amazon 密钥、数据库连接、用户名和密码。
这种方法的优点是您只需保存一次密钥,就可以在多个项目中使用它们,只要它们是在同一地区创建的即可。
使用 AWS cli 行将环境变量保存在 AWS Parameter Store 中:
aws --profile default --region us-west-2 ssm put-parameter --name KEY1 --value 123456 --type String
aws --profile default --region us-west-2 ssm put-parameter --name KEY2 --value abcdef --type String
aws --profile default --region us-west-2 ssm put-parameter --name SERVER --value sample --type String
使用控制台将环境变量保存在 AWS Parameter Store 中:
- 登录 AWS 控制台。
- 搜索系统管理器。
- 在应用程序管理下,查找 Parameter Store。
- 单击“创建参数”按钮。
使用 serverless.yml 文件中的密钥:
service: sample-lambda-service
custom:
config:
KEY1: ${ssm:KEY1}
KEY2: ${ssm:KEY2}
SERVER: ${ssm:SERVER}
provider:
name: aws
stage: prod
timeout: 20
memorySize: 512
region: us-west-2
runtime: nodejs12.x
endpointType: regional
environment: ${self:custom.config}
. . .
然后您可以在 handler.js 文件中将它们用作普通环境变量,如下所示:
'use strict'
const AWS = require("aws-sdk");
const s3 = new AWS.S3({
credentials: {
accessKeyId: process.env.KEY1,
secretAccessKey: process.env.KEY2,
},
});
let server = process.env.SERVER;
. . .