我有一个packer .json文件,它管理几个不同AMI版本的构建/配置。每个AMI之间的不同是通过将不同的base-config.json变量集传递给packer来配置的,具体取决于更改的内容(例如,我有一个base_config-us-west-1.json和base_config-us- east-2.json,并选择一个,以填充vpc_id,subnet_id和security_group_id字段)。
现在我需要构建一个AMI,它使用kms_key_id作为外部account_id,并将对新创建的快照的访问权限授予拥有该密钥的account_id。
如果.json只适用于这个新的AMI,我可以轻松地将"snapshot_users" : [ "{{user external_account_id}}" ]
添加到json并完成它。但是,即使.json中有"snapshot_users" : [ "" ]
,也会导致烘焙失败并出现错误"无法共享使用默认KMS密钥加密的快照"问题,如果使用默认的kms_key_id(与"kms_key_id": ""
一样)。
是否有任何方法我只能通过指定给packer命令的某些条件将snapshot_users
部分插入builders
部分,或者我不得不使用ec2-api-tools编写脚本在烘焙完成后更改构建ami的权限(具有多个完整的.json文件,构建不同的AMI不是一种选择)。
也许,这也是一个打包程序错误,因为打包器应该识别snapsho_users数组是否为空,或者只包含空字符串,它可以被忽略。
答案 0 :(得分:0)
Packer将,
上的变量拆分为数组。所以你可以定义:
{
"variables": {
"snap_users": ""
},
"builders": [
{
"type": "amazon-ebs",
"snapshot_users": "{{user `snap_users`}}"
}
]
}
答案 1 :(得分:0)
从Packer文档中:
region_kms_key_ids(字符串映射)-要将ami复制到的区域映射,以及用于对该区域加密的自定义kms密钥ID(别名或arn)。密钥必须匹配ami_regions中提供的区域。如果您只想使用默认ID进行加密,则可以坚持使用kms_key_id和ami_regions。如果要使用该区域的默认密钥ID对该区域进行加密,则可以在此映射中使用空字符串“”代替密钥ID。 (例如“ us-east-1”:“”)但是,如果将它与snapshot_users结合使用,则不能使用默认密钥ID。在这种情况下,您必须使用自定义密钥。格式请参阅AWS API文档-CopyImage中的KmsKeyId。