正如您可能知道的那样,我试图将卷映射到同一可用区中的实例,以用于灾难恢复 terraform 脚本。原始(灾难前)集群有相同数量的实例分布在 3 个可用区之间。在发生灾难的情况下,我需要跨相同数量的可用区恢复集群,将节点保留到可用区组组合中。
我不确定这是否是解决这个问题的最干净的方法,但这就是我最终要做的。如果有人有更好/更清洁的方式来做这件事,我仍然愿意接受建议,但我很高兴至少现在能做到这一点。
首先,我最终创建了一个字符串映射的元组,基于这样的可用区域:
instance_az = [
flatten([for instance in aws_instance.cassandra:
map(
instance.availability_zone,
zipmap(
matchkeys(
tolist(aws_instance.cassandra.*.id),
tolist(aws_instance.cassandra.*.availability_zone),
[instance.availability_zone]
),
matchkeys(
tolist(aws_ebs_volume.data.*.id),
tolist(aws_ebs_volume.data.*.availability_zone),
[instance.availability_zone]
)
)
)
])
]
示例输出:
instance_az = [
[
{
"us-east-1c" = {
"i-0a18b339d3f1ddd80" = "vol-0ace4794f40c256ed"
"i-0bd9681b1b856c3db" = "vol-00f694635ef7b0904"
}
},
{
"us-east-1a" = {
"i-033c004ed25dbd907" = "vol-0a31e52f2e11dfdef"
"i-0ed01a562756800e9" = "vol-0a20cabb0ae568084"
}
},
{
"us-east-1b" = {
"i-0400baef538ea327a" = "vol-060aff04e902f7005"
"i-08ed6b26743a2bd95" = "vol-06917d88b07bd5d5c"
}
},
{
"us-east-1c" = {
"i-0a18b339d3f1ddd80" = "vol-0ace4794f40c256ed"
"i-0bd9681b1b856c3db" = "vol-00f694635ef7b0904"
}
},
{
"us-east-1a" = {
"i-033c004ed25dbd907" = "vol-0a31e52f2e11dfdef"
"i-0ed01a562756800e9" = "vol-0a20cabb0ae568084"
}
},
{
"us-east-1b" = {
"i-0400baef538ea327a" = "vol-060aff04e902f7005"
"i-08ed6b26743a2bd95" = "vol-06917d88b07bd5d5c"
}
},
],
]
该输出的问题在于,每个可用区都使用完全相同的 instanceId->volumeId 映射列出了两次。接下来,我想删除重复项,所以我将其转换为这样的集合:
inst_vol_to_set = {
s = toset(local.instance_az[0])
}
现在我的输出如下所示:
inst_vol_to_set = {
"s" = [
{
"us-east-1a" = {
"i-033c004ed25dbd907" = "vol-0a31e52f2e11dfdef"
"i-0ed01a562756800e9" = "vol-0a20cabb0ae568084"
}
},
{
"us-east-1b" = {
"i-0400baef538ea327a" = "vol-060aff04e902f7005"
"i-08ed6b26743a2bd95" = "vol-06917d88b07bd5d5c"
}
},
{
"us-east-1c" = {
"i-0a18b339d3f1ddd80" = "vol-0ace4794f40c256ed"
"i-0bd9681b1b856c3db" = "vol-00f694635ef7b0904"
}
},
]
}
好吧,这看起来更像是我想要完成的。现在,我只需要将其转换为 instanceId->VolumeId 的映射:
inst_vol = [
flatten([for s in lookup(local.inst_vol_to_set, "s"): [
for key in keys(s): [
for idx, v in keys(s[key]): {
"${v}" = lookup(s[key], v)
}
]
]])
]
现在看起来更好了,但它仍然是一个映射元组:
inst_vol = [
[
{
"i-033c004ed25dbd907" = "vol-0a31e52f2e11dfdef"
},
{
"i-0ed01a562756800e9" = "vol-0a20cabb0ae568084"
},
{
"i-0400baef538ea327a" = "vol-060aff04e902f7005"
},
{
"i-08ed6b26743a2bd95" = "vol-06917d88b07bd5d5c"
},
{
"i-0a18b339d3f1ddd80" = "vol-0ace4794f40c256ed"
},
{
"i-0bd9681b1b856c3db" = "vol-00f694635ef7b0904"
},
],
]
最后要做的是将结果展平,以便我可以查找 instance_id 并让它返回 volume_id:
instance_to_volume_map = merge(flatten(local.inst_vol)...)
这正是我想要的:
instance_to_volume_map = {
"i-033c004ed25dbd907" = "vol-0a31e52f2e11dfdef"
"i-0400baef538ea327a" = "vol-060aff04e902f7005"
"i-08ed6b26743a2bd95" = "vol-06917d88b07bd5d5c"
"i-0a18b339d3f1ddd80" = "vol-0ace4794f40c256ed"
"i-0bd9681b1b856c3db" = "vol-00f694635ef7b0904"
"i-0ed01a562756800e9" = "vol-0a20cabb0ae568084"
}