使用 CDK 将 AWS SM 密钥传递到 Lambda 环境

Mat*_*s S 3 amazon-web-services typescript aws-cdk

我在获取特定 Secrets Manager Secret 键值以通过 CDK 将其传递给我的 lambda 时遇到一些问题。

一段时间后,我终于意识到,SecretValue 只有当我实际将其部署到 lambda 时,我的问题才得到解决,而不是通过 SAM CLI 在本地运行时得到解决。通过做

cdk.SecretValue.secretsManager(secretId).toString()
Run Code Online (Sandbox Code Playgroud)

我得到类似的东西"{\"apiKey\":\"sdfsdf-sdfsdf-sddsf\"}",但我想直接拥有 apiKey 。不幸的是,在我的 CDK 代码中,我不能JSON:parse(...secretsManager(..).toString()) ,因为这只有在部署后才能解决。之前,该值很简单:( {{resolve:secretsmanager:apiKey:SecretString:::}}这似乎是一个令牌: https: //docs.aws.amazon.com/cdk/latest/guide/tokens.html

所以我想我需要某种方法来告诉 CDK 如何使用渲染值,也许通过传递一个转换渲染结果的回调 - 这可能吗?我可以在 CDK 设置中使用任何其他工具来允许我从秘密接收特定密钥,以便我可以将其直接传递给 lambda 吗?

我希望这个问题是可以理解的。在此先感谢您的帮助。

ago*_*dev 11

2022年

.toString()如果不先打电话,似乎不再接受在 Secrets 上使用.unsafeUnwrap()。就文档而言:

如果不调用此方法,则直接在字符串上下文中使用秘密值或在某处作为属性值将产生错误。

对我来说,它产生了错误cdk deploy

解决方案错误:将秘密值合成到 Resources(...) 此处使用 SecretValue 存在暴露您的秘密的风险。仅将 SecretValues 传递给接受 SecretValue 属性的构造,或直接在运行时代码中调用 AWS Secrets Manager。如果您了解并接受风险,请致电“secretValue.unsafeUnwrap()”。

解决方案

  1. 正如消息建议尝试使用接受 SecretValue 的框架,或者如果您没有机会(就像在我的例子中,我正在尝试使用 Prisma,但它还不接受它

  2. 使用.unsafeUnwrap()。喜欢:

const getValueFromSecret = (secret: ISecret, key: string): string => {
  return secret.secretValueFromJson(key).unsafeUnwrap()
}

// usage (e.g. in Lambda stack)
const password = getValueFromSecret(secret, 'password')
Run Code Online (Sandbox Code Playgroud)


Jas*_*rth 7

您需要使用Secret。您可以使用任何静态from方法来获取秘密。从那里您可以使用SecretValueFromJson方法来获取该值。

示例(Postgres 数据库的秘密):

import * as secretsmanager from '@aws-cdk/aws-secretsmanager';

const dbSecret = secretsmanager.Secret.fromSecretNameV2(this, 'db-secret', 'db-secret-name');
const dbUser = dbSecret.secretValueFromJson('username').toString();
const dbPass = dbSecret.secretValueFromJson('password').toString();
const dbName = dbSecret.secretValueFromJson('dbname').toString();
Run Code Online (Sandbox Code Playgroud)