我正在尝试使用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.
但是我显然已经“加密”了:是的
我用尽了所有想法,并认为这是可能的,只是显然不够聪明。
答案 0 :(得分:0)
来这里是因为我有同样的问题。我通过将设备移动到/dev/xvdf
来解决此问题。
进一步研究我正在使用的源AMI,它具有以下关联的块映射,这些临时磁盘未显示在控制台中,因此花了我一些时间来锻炼正在发生的事情,事实很重要我甚至可以在定义磁盘之前就挂载磁盘(我最初将其定义为AMI映射,而不是错误启动,但脚本中已经包含了挂载)
Block devices: /dev/sda1=snap-0b399e12978e2290e:8:true:standard, /dev/xvdb=ephemeral0, /dev/xvdc=ephemeral1
我注意到您尚未列出源AMI,但希望这会有所帮助