Packer:如何使用具有不同kms密钥的多个块设备创建AWS AMI

时间:2018-11-01 10:21:22

标签: amazon-web-services packer

我正在尝试使用1.3.2版打包程序来烘焙具有多个块设备的AMI,其中每个块设备都使用不同的KMS密钥加密,而该KMS密钥与用于加密启动设备的KMS密钥不同。

起初,我开始认为AWS可能不支持此功能。但是,使用AWS控制台,我能够使用AMI和先前具有加密卷的AMI启动EC2实例,并添加使用不同KMS密钥的另一个卷。然后从中创建一个AMI。然后,我使用新的AMI启动另一个EC2实例,并维护了不同的KMS密钥。这是因为它确实使用不同的KMS密钥为其他卷创建了新快照。

我已经尝试使用amazon-ebs构建器结合ami_block_device_mappings和launch_block_device_mappings的组合进行许多不同的变化。任何组合最多都可以使用启动KMS密钥生成与AMI绑定的最终卷快照。我注意到,如果我在launch_block_device_mappings中指定备用kms_key_id,如下所示:

"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,它们都将被新的快照所替代,这些新快照已使用用于最终AMI的启动kms密钥进行了加密。即使我在启动时将delete_on_termination设置为false ...

然后我尝试通过尝试与Amazon-ebs构建器分开的EBS卷创建快照,从另一个角度看待这个问题。使用amazon-ebsvolume构建器,我创建了空的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"
      }    
    },...

然后从中创建快照,然后尝试使用其中的快照_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

我尝试重复加密设置以及snapshot_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.

但是我显然已经“加密”了:是的

我用尽了所有想法,并认为这是可能的,只是显然不够聪明。

1 个答案:

答案 0 :(得分:0)

来这里是因为我有同样的问题。我通过将设备移动到/dev/xvdf来解决此问题。

进一步研究我正在使用的源AMI,它具有以下关联的块映射,这些临时磁盘未显示在控制台中,因此花了我一些时间来锻炼正在发生的事情,事实很重要我甚至可以在定义磁盘之前就挂载磁盘(我最初将其定义为AMI映射,而不是错误启动,但脚本中已经包含了挂载)

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

我注意到您尚未列出源AMI,但希望这会有所帮助