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



我正试图使用打包器版本1.3.2来烘焙具有多个块设备的AMI,其中每个块设备都用不同的KMS密钥加密,该密钥与用于加密引导设备的KMS密匙不同。

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

我已经尝试了许多不同的变体,使用amazon ebs构建器,将ami_block_device_mapping与launch_block_device_mapping相结合。任何组合最多只能使用引导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的引导kms密钥加密的新快照所取代,无论我是否还包括AMI_block_device_mappings。即使我在启动时将delete_on_termination设置为false。。。

然后,我从另一个角度来看,试图从EBS卷中创建快照,而不是从amazon 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"
}    
},...

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

我尝试将加密设置与snapshot_ids:一起重复

"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.

但我显然已经"加密"了:真正的

我已经没有什么想法了,觉得这是可能的,只是显然不够聪明。

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

深入研究,我使用的源AMI有以下与之相关的块映射,这些短暂的磁盘没有显示在控制台中,所以我花了一段时间来了解发生了什么,一个重要的线索是,我甚至在定义磁盘之前就可以挂载磁盘(我最初将其定义为AMI映射,而不是错误启动,但在我的脚本中已经挂载了(

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

我注意到你没有列出AMI的来源,但希望这能帮助

最新更新