CloudFormation KMS加密问题

时间:2018-10-25 10:55:28

标签: amazon-web-services amazon-s3 amazon-cloudformation aws-kms

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

  • KMS密钥
  • KMS密钥别名
  • 一个S3存储桶

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

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

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

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

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

2 个答案:

答案 0 :(得分:3)

我建议您有一个仅创建KMS和export its value on the outputs的堆栈:

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

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

然后,您可以拥有另一个仅创建S3存储桶的堆栈,您可以在其中reference the Exported Value

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

答案 1 :(得分:0)

我能够使用一个堆栈创建一个加密的S3存储桶:

Resources:
  S3EncryptionKey:
    Type: AWS::KMS::Key
       ...

  EncrypedS3Bucket:
    Type: AWS::S3::Bucket
      Properties:
        BucketEncryption:
          ServerSideEncryptionConfiguration:
            - ServerSideEncryptionByDefault:
                KMSMasterKeyID:
                  Ref: S3EncryptionKey
                SSEAlgorithm: aws:kms