1

Dockerホストとして使用されるEC2インスタンスを作成するためにterraformを使用しています。これは、インターネット経由で安全に接続するための暗号化キーを作成する必要があることを意味します。キーを作成するときは、接続先の IP アドレスとホスト名を指定する必要があります。Terraform では、これらの値を動的に割り当てることができますが、これにより、循環的な依存関係が発生しやすくなります。例を使用しましょう:

resource "tls_private_key" "example" {
  algorithm = "ECDSA"
}

resource "tls_self_signed_cert" "docker_host_key" {
  key_algorithm = "${tls_private_key.example.algorithm}"
  private_key_pem = "${tls_private_key.example.private_key_pem}"
  validity_period_hours = 12
  early_renewal_hours = 3
  allowed_uses = ["server_auth"]
  dns_names = [ "${aws_instance.example.public_dns}" ]
  ip_addresses = [ "${aws_instance.example.public_ip}" ]
  subject {
    common_name = "example.com"
    organization = "example"
  }
}

resource "aws_instance" "example" {
  count = 1
  ami = "ami-d05e75b8"
  instance_type = "t2.micro"
  subnet_id = "subnet-24h4fos9"
  associate_public_ip_address = true
  provisioner "remote-exec" {
    inline = [
      "echo \"${tls_self_signed_cert.docker_host_key.private_key_pem}\" > private_key_pem",
      "echo \"${tls_self_signed_cert.docker_host_key.cert_pem}\" > cert_pem",
      "echo \"${tls_private_key.docker_host_key.private_key_pem}\" > private_key_pem2",
    ]
  }
}

remote-execプロビジョナーでは、リソースからの値を書き込む必要があります。tls_self_signed_certこれには、リソースからの値が必要ですaws_instance

どうすればこの状況を克服できますか?

4

1 に答える 1

0

リソースを使用aws_eipして Elastic IP を作成し、aws_eip_association.

resource "aws_eip" "eip" {
  ...
}

resource "aws_eip_association" "eip" {
  allocation_id = "${aws_eip.eip.id}"
  instance_id = "${aws_instance.example.id}"
}

resource "tls_self_signed_cert" "docker_host_key" {
  # set something here from Route53 instead: dns_names = [ "${aws_instance.example.public_dns}" ]
  ip_addresses = [ "${aws_eip.eip.public_ip}" ]
  ...
}
于 2016-12-12T16:17:02.200 に答える