terraform:如何使资源成为幂等-即创建(如果不存在)但是不执行任何操作(如果存在)

Sno*_*ash 10 terraform

我有一些示例代码:

  1. 创建一个EC2实例
  2. 创建并添加我的公钥

但我希望它是幂等的。即,如果密钥存在,则它将仍然运行并且不会因错误而失败。

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

样例代码:

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>"
}
Run Code Online (Sandbox Code Playgroud)

它是aws_key_pair.my_key我想要做幂等。

目前,我收到如下错误:

Error: Error applying plan:

1 error(s) occurred:

* aws_key_pair.my_key: 1 error(s) occurred:

* aws_key_pair.my_key: Error import KeyPair: InvalidKeyPair.Duplicate: The keypair 'my_key' already exists.
    status code: 400, request id: <request id>
Run Code Online (Sandbox Code Playgroud)

yda*_*coR 5

只要提供程序中的所有资源均由Terraform创建或由Terraform管理,这就是Terraform的行为。

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

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

出现这种情况的地方是,AWS API仅允许通过可配置的方式提供资源的单个版本,并且该资源已经存在于Terraform所知范围之外。这适用于AWS密钥对,其中每个AWS账户/区域组合只能有一个由相同名称命名的密钥对。

此时,您有两个选择:您可以使Terraform直接管理AWS密钥对,也可以仅使用数据源引用它,而不必尝试创建一个新的密钥对。

要使Terraform管理AWS密钥对,您可以通过运行以下命令将其导入

terraform import aws_key_pair.my_key my_key
Run Code Online (Sandbox Code Playgroud)

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

resource "aws_instance" "web" {
  ami           = "am-123456"
  instance_type = "t2.micro"
  key_pair      = "my_key"
}
Run Code Online (Sandbox Code Playgroud)