You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Terraform如何将输出的GitHub SSH密钥正确传入aws_key_pair资源

解决方案

你报错的核心原因有两个:

  1. 你当前给public_key赋值的是所有GitHub用户的公钥组成的嵌套列表,没有和当前for_each遍历的单个用户做对应
  2. 单个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 16:36:03