【发布时间】:2020-04-26 23:00:51
【问题描述】:
在以下(简称 CloudFormation 模板)中,我尝试配置 AWS Lambda 函数以从注入其环境的 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 之外的秘密值,因为我真的不希望将秘密签入源代码控制。这是完全可能的,documentation 暗示,只要我避免在模板中更改 SecretString 的虚拟值,后续 CloudFormation 堆栈更新就不会触及密钥的值。
因此,在 AWS 控制台中设置实际密钥后,我需要触发 Lambda 函数的重新部署,以便 CloudFormation 解析新的密钥值并在函数的环境中设置。我该怎么做?
执行aws cloudformation deploy 失败并显示以下消息:No changes to deploy。
我怀疑 CloudFormation 将模板的“原始”版本与上次部署的版本进行比较,而没有首先解析对 Secrets Manager 的引用。是这样吗?是否有一些技巧可以强制提前取消引用?
脚注:我很清楚以这种方式使用 Secrets Manager 会导致密钥值在 AWS Lambda 控制台中可见,并且在运行时从 Secrets Manager 获取值会更安全方法。这恰好超出了我希望做的事情的范围。
【问题讨论】:
-
当 Cloudformation 引用机密管理器或 ssm 等安全值时,它引用的是
literal dynamic reference stringsource。过去我也遇到过 lambda 未更新的类似问题。最简单的方法是更新您的代码 uri 以强制更新,但这并不理想。另一件事是lambda versioning,但在不更改代码的情况下强制更新时也有很多问题。
标签: amazon-web-services amazon-cloudformation aws-secrets-manager