Terraform如何将输出的GitHub SSH密钥正确传入aws_key_pair资源
解决方案
你报错的核心原因有两个:
- 你当前给
public_key赋值的是所有GitHub用户的公钥组成的嵌套列表,没有和当前for_each遍历的单个用户做对应 - 单个GitHub用户的
ssh_keys本身就是列表类型,你需要从中取出单个公钥字符串传入aws_key_pair
方案1:每个用户仅导入第一个SSH公钥
因为你的data "github_user" "this"和aws_key_pair资源都是用var.users作为for_each参数,两者的key完全一一对应,可以直接通过each.key取对应单个用户的公钥:
resource "aws_key_pair" "deployer" { for_each = var.users key_name = each.value["github"] # 取当前遍历用户的第一个公钥字符串 public_key = data.github_user.this[each.key].ssh_keys[0] }
方案2:导入所有用户的全部SSH公钥
如果需要把每个GitHub账号下的所有SSH公钥都导入为独立的AWS密钥对,可以先展开公钥列表构造新的遍历映射:
# 先构造扁平化的公钥映射 locals { all_ssh_keys = flatten([ for user_key, user in var.users : [ for idx, pubkey in data.github_user.this[user_key].ssh_keys : { key_name = "${user.github}-${idx}" pubkey = pubkey } ] ]) # 构造for_each需要的map结构,用key_name做唯一键 ssh_key_map = { for item in local.all_ssh_keys : item.key_name => item } } resource "aws_key_pair" "deployer" { for_each = local.ssh_key_map key_name = each.value.key_name public_key = each.value.pubkey }
额外注意事项
如果存在GitHub用户未配置SSH公钥的情况,可以加上判断逻辑避免索引报错:
public_key = length(data.github_user.this[each.key].ssh_keys) > 0 ? data.github_user.this[each.key].ssh_keys[0] : ""
如果需要跳过无公钥的用户,可以在for_each中加过滤规则。
内容的提问来源于stack exchange,提问作者D. Meier
相关产品推荐
相关产品推荐

