我有一些示例代码:
但我希望它是幂等的。即,如果密钥存在,则它将仍然运行并且不会因错误而失败。
不知道该怎么做。有什么建议么?
样例代码:
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)
只要提供程序中的所有资源均由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)
归档时间: |
|
查看次数: |
6304 次 |
最近记录: |