【问题标题】:AWS SAM retrieve secret value from Secret Manager with dynamic referencingAWS SAM 使用动态引用从 Secret Manager 检索密钥值
【发布时间】:2021-09-10 02:20:03
【问题描述】:

我一直在关注 AWS 的 this 官方文档,了解如何将存储在 Secret Manager 中的 SAM template.yaml 文件中的机密信息告诉我们,这就是我所做的:

 Environment:
        Variables:
          DUMMY_VARIABLE: '{{resolve:secretsmanager:dummy/secret:SecretString:key1}}'

一切正常,我可以看到正在检索机密,但是,如果我更改机密管理器中的机密值,并通过 sam deploy 命令重新部署 Lambda 函数,则即将到来的环境变量的值来自 Secret Manager 的信息保持不变。

我没有指定版本阶段或版本 ID,但我可以通过指定密钥的版本 ID 来解决问题,如下所示:

DUMMY_VARIABLE: '{{resolve:secretsmanager:dummy/secret:SecretString:key3::VERSION_ID_OF_THE_SECRET}}'

根据AWS官方文档:

如果你不 指定版本阶段或版本 ID,则默认为 检索版本阶段值为 AWSCURRENT 的版本。

我的期望是它应该从 Secret Manager 获取当前值,而不必指定版本 ID 和阶段,但它似乎没有发生!

【问题讨论】:

    标签: amazon-web-services aws-lambda aws-secrets-manager


    【解决方案1】:

    same page上有这么一段话:

    在 Secrets Manager 中更新密钥不会自动更新 CloudFormation 中的密钥。为了让 CloudFormation 更新 secretsmanager 动态引用,您必须执行堆栈更新以更新包含动态引用的资源,方法是更新包含 secretsmanager 动态引用的资源属性,或更新资源的另一个属性。例如,假设在您的模板中,您将 AWS::RDS::DBInstance 资源的 MasterPassword 属性指定为 secretsmanager 动态引用,然后从模板创建堆栈。您稍后会在 Secret Manager 中更新该密钥的值,但不要更新模板中的 AWS::RDS::DBInstance 资源。在这种情况下,即使您执行堆栈更新,MasterPassword 属性中的秘密值也不会更新,而是保持之前的秘密值。

    因此,不幸的是,秘密值存储在堆栈本身中。您可能需要在需要使用它的代码中通过 API 显式获取秘密值。

    【讨论】:

    • 在我看来这是一个非常糟糕的限制。无论如何,我已经克服了这个问题,通过明确使用来自秘密管理器的版本号,并在每次发生变化时更新它,这是一个丑陋的工作,但它有效。
    • 根据您的用例,您可能会因 SM 请求而产生巨大的意外成本。例如。一个频繁且高度并发的 lambda。
    猜你喜欢
    • 2021-04-11
    • 1970-01-01
    • 2021-07-17
    • 2020-06-18
    • 2019-05-04
    • 2021-06-29
    • 2021-10-29
    • 1970-01-01
    • 2021-06-25
    相关资源
    最近更新 更多