首页 > 解决方案 > CloudFormation KMS 加密问题

问题描述

给定一个 CloudFormation 模板,该模板定义:

如果出于某种原因我需要删除 CloudFormation 堆栈并重新部署,则删除会保留创建的 KMS 密钥和别名。(这是明智的,我不想丢失所有被加密的密钥)。

但这意味着当我重新部署堆栈时它会失败,因为具有该名称的别名已经存在。

我可以通过 CLI 删除别名并重新部署,这将为新的 KMS 密钥创建一个别名。

CloudFormation 堆栈是否可以使用初始部署中的现有 KMS 密钥?

另外:对于别名已更改的 S3 存储桶中的加密数据会发生什么,我不是 100% 清楚,AWS 是否知道自动查找之前使用它加密的 KMS 密钥或是否进行了重新加密?

标签: amazon-web-servicesamazon-s3amazon-cloudformationaws-kms

解决方案


我建议你有一个 Stack 只创建 KMS 并将其值导出到输出

Resources:
  KmsKey:
    Type: AWS::KMS::Key
    Properties: 
      ...

Outputs:
  S3KmsKeyId:
    Description: The KMS Key used
    Value: !Ref KmsKey
    Export:
      Name: S3KmsKeyId

然后,您可以拥有第二个 Stack,它仅创建 S3 存储桶,您可以在其中引用 Exported Value

Resources:
  S3Bucket:
      Type: AWS::S3::Bucket
      Properties: 
        ...
        BucketEncryption:
          ServerSideEncryptionConfiguration: 
          - ServerSideEncryptionByDefault: 
              KMSMasterKeyID: !ImportValue S3KmsKeyId
              SSEAlgorithm: aws:kms

推荐阅读