web-dev-qa-db-ja.com

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>"
}

そしてそれは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>
8
Snowcrash

プロバイダー内のすべてのリソースがTerraformによって作成または管理されている限り、これはまさにTerraformの動作です。

空のAWSアカウントがあり、質問のコードに対してTerraformを適用すると、AWSキーペアとec2モジュール。

その後、計画を実行すると、変更は表示されません。

これが落ちてくるのは、AWS APIが、設定可能な何かによってリソースの単一バージョンのみを許可し、Terraformが知っている範囲外に既に存在する場合です。これは、AWSアカウント/リージョンの組み合わせごとに、同じもので命名された単一のキーペアのみを持つことができるAWSキーペアに適用されます。

この時点では、2つのオプションがあります。TerraformでAWSキーペアを直接管理するか、新しいキーペアを作成する代わりにデータソースで参照することができます。

TerraformでAWSキーペアを管理するには、次のコマンドを実行して import it を実行します。

terraform import aws_key_pair.my_key my_key

代わりに参照したい場合は、通常 data source を使用できますが、この場合は不要です(したがって、aws_key_pairデータソース)この例のように、名前でキーペアを単純に参照する場合:

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

既存のmy_keyキーペアをテラフォーム状態にインポートする必要があるようです。リソースをインポートすると、terraformは存在するキーペアを作成しようとしません。

terraform import aws_key_pair.my_key my_key

https://www.terraform.io/docs/import/index.html

0
manojlds