无服务器 - 如何将 Aws Secret Manager 作为环境变量访问

问题描述 投票:0回答:4

目前,我正在将 AWS 参数存储值作为环境变量访问。它在 serverless 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}}

但是它不起作用。请帮忙!

node.js aws-lambda serverless-framework
4个回答
6
投票

在自己解决这个问题后,我找到了对我有用的解决方案。

假设我们有一个秘密 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}

我正在使用 Serverless 1.73.1 部署到 CloudFormation。

希望这对其他人有帮助。


1
投票

假设您在秘密管理器中的秘密名称是正确的。我想你在解密之前可能在 manager 后面有一个“a”。


1
投票

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

您可以将环境变量设置为如下所示:

MYSQL_USERNAME=secret:MYSQL_USERNAME
MYSQL_PASSWORD=secret:MYSQL_PASSWORD

插件将从 AWS Secrets Manager 加载密钥,然后替换

MYSQL_USERNAME
MYSQL_PASSWORD
的值。

因此,当您在 lambda 中访问

process.env.MYSQL_USERNAME
时,秘密就已经可用了。


0
投票

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

例如。

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

否则传递秘密管理器名称并使用代码中的 aws-sdk 进行解密

 environment:
     secretkey_name:XYZ_CREDS_SECRET_MANAGERa
© www.soinside.com 2019 - 2024. All rights reserved.