Packer:如何创建一个包含多个块设备且使用不同KMS密钥的AWS AMI

3
我正在尝试使用版本为1.3.2的packer来制作一个带有多个块设备的AMI,其中每个块设备都使用不同的KMS密钥进行加密,这些密钥与用于加密引导设备的KMS密钥不同。
起初我认为AWS可能不支持这种操作。然而,使用AWS控制台,我能够启动一个具有先前加密卷的AMI的EC2实例,并添加另一个使用不同KMS密钥的卷。然后从中创建了一个AMI。我随后使用新AMI启动了另一个EC2实例,并且不同的KMS密钥得到了维护。这是因为它确实为具有不同KMS密钥的附加卷创建了新的快照。
我已经尝试了许多不同的变化,使用amazon-ebs builder和ami_block_device_mappings与launch_block_device_mappings的组合。最好的情况是,任何组合生成的最终卷快照都与使用引导KMS密钥的AMI相关联。我注意到,如果我在launch_block_device_mappings中指定替代的kms_key_ids,如下所示:
"launch_block_device_mappings": [
    {
      "device_name": "/dev/sdb",
      "volume_type": "gp2",
      "volume_size": "{{user `var_volume_size`}}",
      "delete_on_termination": true,
      "kms_key_id": "{{user `kms_key_arn_var`}}",
      "encrypted": true
    },
    {
      "device_name": "/dev/sdc",
      "volume_type": "gp2",
      "volume_size": "{{user `varlog_volume_size`}}",
      "delete_on_termination": true,
      "kms_key_id": "{{user `kms_key_arn_varlog`}}",
      "encrypted": true
    }, ...

它使用备用kms密钥创建临时快照,但无论我是否包括ami_block_device_mappings都会用引导kms密钥替换这些快照,以加密最终的AMI。即使我为启动设置了delete_on_termination为false...

然后我从另一个角度看待这个问题,尝试通过amazon-ebsvolume builder从EBS卷中单独创建快照。我创建了空的EBS卷:

"type": "amazon-ebsvolume",
...
      "ebs_volumes": [
    {
      "device_name": "/dev/sdb",
      "volume_type" : "{{user `var_volume_type`}}",
      "volume_size": 10,
      "delete_on_termination": false,
      "kms_key_id": "{{user `kms_key_arn_var`}}",
      "encrypted": true,
      "tags" : {
        "Name" : "starter-volume-var",
        "purpose" : "starter"
      }    
    },
    {
      "device_name": "/dev/sdc",
      "volume_type" : "{{user `varlog_volume_type`}}",
      "volume_size": 5,
      "delete_on_termination": false,
      "kms_key_id": "{{user `kms_key_arn_varlog`}}",
      "encrypted": true,
      "tags" : {
        "Name" : "starter-volume-varlog",
        "purpose" : "starter"
      }    
    },...

然后从它们创建了快照,尝试使用这些快照的snapshot_id而不是在amazon-ebs中内联创建卷。

"launch_block_device_mappings": [
    {
      "device_name": "/dev/sdb",
      "volume_type" : "{{user `var_volume_type`}}",
      "snapshot_id": "snap-08f2bed8aaa964469",
      "delete_on_termination": true
    },
    {
      "device_name": "/dev/sdc",
      "volume_type" : "{{user `varlog_volume_type`}}",
      "snapshot_id": "snap-037a4a6255e8d161d",
      "delete_on_termination": true
    }
  ],..

我这样做会出现以下错误:

2018/11/01 03:04:23 ui error: ==> amazon-ebs: Error launching source instance: InvalidBlockDeviceMapping: snapshotId can only be modified on EBS devices

我尝试重复加密设置,并附上快照ID:

      "launch_block_device_mappings": [
    {
      "device_name": "/dev/sdb",
      "volume_type" : "{{user `var_volume_type`}}",
      "snapshot_id": "snap-08f2bed8aaa964469",
      "kms_key_id": "{{user `kms_key_arn_var`}}",
      "encrypted": true,
      "delete_on_termination": true
    },
    {
      "device_name": "/dev/sdc",
      "volume_type" : "{{user `varlog_volume_type`}}",
      "snapshot_id": "snap-037a4a6255e8d161d",
      "kms_key_id": "{{user `kms_key_arn_varlog`}}",
      "encrypted": true,
      "delete_on_termination": true
    }
  ],...

这将导致不同的错误:
==> amazon-ebs: Error launching source instance: InvalidParameterDependency: The parameter KmsKeyId requires the parameter Encrypted to be set.

但是我明确地看到了 "encrypted": true。

我已经没有更多的想法了,感觉这是可能的,只是显然不够聪明去看到它。

1个回答

0

因为我遇到了同样的问题,所以来到这里。我通过将设备移动到/dev/xvdf来解决这个问题。

进一步挖掘后,我使用的源AMI与以下块映射相关联,这些临时磁盘未在控制台中显示,因此我花了一段时间才弄清楚发生了什么,一个很大的线索是我甚至在定义之前就可以挂载磁盘(最初错误地将其定义为AMI映射而不是启动,但已经在我的脚本中进行了挂载)。

Block devices: /dev/sda1=snap-0b399e12978e2290e:8:true:standard, /dev/xvdb=ephemeral0, /dev/xvdc=ephemeral1

我注意到您没有列出源AMI,但希望这可以帮助到您


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接