gpt4 book ai didi

amazon-web-services - 我可以强制 CloudFormation 解析 Secrets Manager 中的值吗?

转载 作者:行者123 更新时间:2023-12-03 22:00:34 25 4
gpt4 key购买 nike

在下面(缩写为 CloudFormation 模板)中,我尝试配置 AWS Lambda 函数以从注入(inject)其环境的 AWS Secrets Manager 获取值:

Resources:
Function:
Type: AWS::Serverless::Function
Properties:
Environment:
Variables:
SECRET_KEY: !Sub '{{resolve:secretsmanager:${Secret}:SecretString:KEY}}'

Secret:
Type: AWS::SecretsManager::Secret
Properties:
Name: 'very-secret-thing'
SecretString: '{"KEY":"dummy"}'

使用此模板创建堆栈时,一切都会按预期进行。然后,我在 CloudFormation 之外更改 secret 的值,因为我并不真正希望将 secret checkin 源代码管理。这是完全可能的,并且 documentation意味着,只要我避免更改模板中 SecretString 的虚拟值,后续的 CloudFormation 堆栈更新就不会触及该 key 的值。

因此,在 AWS 控制台中设置实际 key 后,我需要触发 Lambda 函数的重新部署,以便 CloudFormation 解析新的 key 值并在函数的环境中设置。我该怎么做?

执行 aws cloudformation 部署 失败,并显示消息:没有要部署的更改。

我怀疑 CloudFormation 正在将模板的“原始”版本与最后部署的版本进行比较,而没有首先解析对 Secrets Manager 的引用。是这样吗?是否有一些技巧可以强制提前取消引用?

脚注:我很清楚,以这种方式使用 Secrets Manager 会导致 secret 值在 AWS Lambda 控制台中可见,并且在运行时从 Secrets Manager 获取值会更安全方法。这恰好超出了我希望做的范围。

最佳答案

您可以人为地更改 AWS::Serverless::Function 资源上的其他内容,以强制其在部署时进行更新。

例如,时间戳:

Parameters:
DeployTimestamp: { Type: String }

Resources:
Function:
Type: AWS::Serverless::Function
Properties:
Environment:
Variables:
SECRET_KEY: !Sub '{{resolve:secretsmanager:${Secret}:SecretString:KEY}}'
SECRET_KEY_UPDATED: !Ref DeployTimestamp

假设您通过脚本进行部署,那么您需要执行诸如 aws cloudformation deploy --parameter-overrides "DeployTimestamp=$(date)" 之类的操作来每次更改该值。

当然,这样做的缺点是该函数将更新每个部署,即使 secret 尚未更新。如果这让您感到困扰,您可以更进一步,将 aws Secretsmanager describe-secret --query LastChangedDate 作为参数而不是当前时间注入(inject)。

关于amazon-web-services - 我可以强制 CloudFormation 解析 Secrets Manager 中的值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59662283/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com