我正在尝试使用版本为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,如下所示:
这将导致不同的错误:
起初我认为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。
我已经没有更多的想法了,感觉这是可能的,只是显然不够聪明去看到它。