使用 terraform InvalidKeyPair.NotFound 配置 EC2 实例

时间:2020-12-27 14:02:41

标签: amazon-ec2 terraform

我为 EC2 创建了一个名为 terraform 的密钥对,将 pem 文件下载到我的 terraform 文件所在的同一目录,我发出 terraform apply 并得到:

aws_instance.windows: Creating...

Error: Error launching source instance: InvalidKeyPair.NotFound: The key pair 'terraform' does not exist
        status code: 400, request id: 1ac563d4-244a-4371-bde7-ee9bcf048830

我通过环境变量指定键值对的名称。这是我用来创建 Windows 虚拟机的块的开始:

resource "aws_instance" "windows" {
  ami                         = data.aws_ami.Windows_2019.image_id
  instance_type               = var.windows_instance_types
  key_name                    = var.key_name
  vpc_security_group_ids      = [aws_security_group.allow_rdp_winrm.id]
  associate_public_ip_address = true
  subnet_id                   = aws_subnet.subnet1.id
  get_password_data           = "true"

  user_data = file("scripts/user_data.txt")

显然我做错了什么,我是否需要告诉 terraform 哪个 aws 区域然后密钥对驻留在其中?

2 个答案:

答案 0 :(得分:0)

密钥对是区域性的,因此如果您在一个区域中创建它们,则它们在另一个区域中不可用。

Terraform 将始终尝试在您告诉它运行的区域中查找和使用密钥,如果该密钥不存在,AWS 会抱怨此错误。

Terraform 也不喜欢带外创建的东西,您可能会遇到复杂情况。使用 terraform 创建密钥对也更简洁,您可以将其引用为 Atul has posted in his answer

您也可以将密钥导入 Terraform 或使用 Terraform 的数据源来搜索和查找密钥作为替代方案,但这些方法有点高级,尤其是当您开始使用 Terraform 时。

答案 1 :(得分:0)

您需要先创建一个密钥对,然后才能使用它。

function myFunction() {
  
  // get spreadsheet details
  const ss = SpreadsheetApp.getActive();
  const sh = ss.getSheetByName('Sheet1'); // change that to the name of your sheet
  
  // provide some data
  const sep_col = 3; // column you want to separate the data 
  const data = ["d1","d2","d3","d5","d6"];
  const data1 = data.slice(0,sep_col);
  const data2 = data.slice(sep_col,data.length);

  // get current last row of document
  const Lrow = sh.getLastRow();
  
  // paste the data to separate ranges
  const start_col = 1; 
  const space_col = 1;
  sh.getRange(Lrow+1,start_col, 1, data1.length).setValues([data1]); 
  sh.getRange(Lrow+1,start_col+data1.length + space_col, 1, data2.length).setValues([data2]);        
}

现在使用密钥作为

resource "aws_key_pair" "my_key_pair" {
  key_name   = var.key_name
  public_key = file("${abspath(path.cwd)}/my-key.pub")
}