Jør*_*ode 5 amazon-web-services aws-cloudformation aws-secrets-manager
在下面(缩写为 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"}'
Run Code Online (Sandbox Code Playgroud)
使用此模板创建堆栈时,一切都按预期进行。然后我去更改 CloudFormation 之外的机密值,因为我真的不希望将机密签入源代码管理。这是完全可能的,并且文档暗示,只要我避免更改SecretString模板中的虚拟值,后续 CloudFormation 堆栈更新就不会触及机密的值。
因此,在 AWS 控制台中设置实际密钥后,我需要触发 Lambda 函数的重新部署,以便新的密钥值将由 CloudFormation 解析并在函数环境中设置。我怎么做?
执行aws cloudformation deploy失败并显示消息:没有要部署的更改。
我怀疑 CloudFormation 正在将模板的“原始”版本与最后部署的版本进行比较,而没有首先解析对 Secrets Manager 的引用。是这样吗?是否有一些技巧可以强制提前取消引用?
脚注:我很清楚,以这种方式使用 Secrets Manager 会导致密钥值在 AWS Lambda 控制台中可见,并且在运行时从 Secrets Manager 获取值将是更安全的方法。这恰好超出了我希望做的范围。
小智 6
您可以人为地更改资源上的其他内容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
Run Code Online (Sandbox Code Playgroud)
假设您从脚本进行部署,那么您aws cloudformation deploy --parameter-overrides "DeployTimestamp=$(date)"每次都会执行类似更改值的操作。
当然,这样做的缺点是该函数将更新每个部署,即使机密尚未更新。如果这让您感到困扰,您可以更高级并aws secretsmanager describe-secret --query LastChangedDate作为参数而不是当前时间注入。
| 归档时间: |
|
| 查看次数: |
3590 次 |
| 最近记录: |