terraform:如何使资源幂等-即,如果不存在,则创建,如果存在,则不执行任何操作

terraform:如何使资源幂等-即,如果不存在,则创建,如果存在,则不执行任何操作,terraform,Terraform,我有一些示例代码: 创建一个EC2实例 创建并添加我的公钥 但我希望它是幂等的。i、 e.如果密钥存在,则它仍将运行,不会因错误而失败 我不知道该怎么做。有什么建议吗 示例代码: provider "aws" { region = "eu-west-1" } module ec2 { source = "./ec2_instance" name = "EC2 Instance" } resource "aws_key_pair" "my_key" { key_name

我有一些示例代码:

  • 创建一个EC2实例
  • 创建并添加我的公钥
  • 但我希望它是幂等的。i、 e.如果密钥存在,则它仍将运行,不会因错误而失败

    我不知道该怎么做。有什么建议吗

    示例代码:

    provider "aws" {
      region = "eu-west-1"
    }
    
    module ec2 {
      source = "./ec2_instance"
      name = "EC2 Instance"
    } 
    
    resource "aws_key_pair" "my_key" {
      key_name   = "my_key"
      public_key = "<string>"
    }
    

    这正是Terraform的行为,只要提供者中的所有资源都由Terraform创建或管理

    如果您有一个空白的AWS帐户,并针对问题中的代码应用Terraform,那么它将创建一个AWS密钥对以及
    ec2
    模块中包含的任何内容

    如果在此之后运行计划,则不会显示任何更改

    这是因为AWS API只允许一个资源的单一版本,它是可配置的,并且它已经存在于Terraform所知道的范围之外。这适用于AWS密钥对,其中每个AWS帐户/区域组合只能有一个由同一事物命名的密钥对

    此时,您有两个选择:您可以让Terraform直接管理AWS密钥对,或者您可以简单地使用数据源引用它,而不是尝试创建一个新的

    要使Terraform管理AWS密钥对,您可以运行:

    terraform import aws_key_pair.my_key my_key
    
    相反,如果您只想引用它,您通常可以使用,但在这种情况下,它将是不必要的(因此没有
    aws\u key\u pair
    数据源),因为您只需按名称引用密钥对,如本例中所示:

    resource "aws_instance" "web" {
      ami           = "am-123456"
      instance_type = "t2.micro"
      key_pair      = "my_key"
    }
    

    看起来您需要将现有的
    my_-key
    keypair导入您的地形状态。导入资源后,terraform将不会尝试创建存在的密钥对

    terraform import aws_key_pair.my_key my_key
    

    请提供您的示例代码
    terraform import aws_key_pair.my_key my_key