无服务器 - 如何将 AWS 密钥管理器作为环境变量进行访问



目前,我正在访问作为环境变量的 AWS 参数存储值。它在无服务器 yml 中定义如下:

environment:
    XYZ_CREDS: ${ssm:xyzCreds}

在代码中,我像这样访问它process.env.XYZ_CREDS
我需要将此值移动到 AWS 密钥管理器,并以相同的方式访问 xyzCreds。
基于我尝试过的无服务器文档 -

  custom:
    xyzsecret: ${ssm:/aws/reference/secretsmanager/XYZ_CREDS_SECRET_MANAGERa~true} 
  environment:
    XYZ_CREDS: ${self:custom.xyzsecret}}

但它不起作用。请帮忙!

在自己解决这个问题之后,我找到了适合我的解决方案。

假设我们有一个秘密XYZ_CREDS,用于存储用户和密码键值对。AWS Secrets Manager 以 JSON 格式存储它们:{"user": "test", "password": "xxxx"}

下面介绍如何将用户和密码放入 Lambda 函数环境变量中:

custom:
  xyzsecret: ${ssm:/aws/reference/secretsmanager/XYZ_CREDS~true}
myService:
  handler: index.handler
  environment:
    username: ${self:custom.xyzsecret.user}
    password: ${self:custom.xyzsecret.password}

我正在使用无服务器 1.73.1 部署到 CloudFormation。

希望这对其他人有所帮助。

鉴于机密管理器中的机密名称是正确的。我认为在解密之前,您可能在管理器之后有一个"a"。

机密管理器以键值/json 格式存储。因此,请单独指定变量

例如。

   environment:
     user_name: ${self:custom.xyzsecret}.username
     password: ${self:custom.xyzsecret}.password 

否则,在代码中使用 aws-sdk 传递密钥管理器名称并解密

 environment:
     secretkey_name:XYZ_CREDS_SECRET_MANAGERa

自从遇到同样的问题以来,我已经创建了一个无服务器插件。您在此处查看插件:https://github.com/robin-thomas/serverless-aws-secrets

您可以拥有如下所示的环境变量:

MYSQL_USERNAME=SECRET:MYSQL_USERNAME
MYSQL_PASSWORD=SECRET:MYSQL_PASSWORD

然后,该插件将从 AWS 密钥管理器加载密钥,然后替换 MYSQL_USERNAMEMYSQL_PASSWORD 的值。

因此,当您在 lambda 中访问process.env.MYSQL_USERNAME时,密钥已经可用。

最新更新