我正在创建 EC2,并使用 terraform 提供 3 个额外的私有接口。计划/应用后,所有内容都已创建(以及公共IP)。 但是当我停止 ec2 然后再次启动时,aws 不提供公共 IP。 因此,当我再次制定地形计划/申请时,所有资源都会发生变化和破坏。自动分配公共 IPv4 地址 - 是 tf 版本 - v1.6.6
aws = {
source = "hashicorp/aws"
version = "~> 4.0"
}
resource "aws_instance" "monitoring" {
ami = var.ami_id
instance_type = var.instance_type
subnet_id = var.subnet_id
associate_public_ip_address = true
key_name = var.key
# iam_instance_profile = var.aws_iam_instance_profile
# security_groups = [aws_security_group.common.id]
tags = merge(
local.common_tags,
{
"Name" = "${var.monitoring}"
}
)
lifecycle {
# ignore_changes = [network_interface, associate_public_ip_address, vpc_security_group_ids, security_groups]
prevent_destroy = false
}
}
resource "aws_network_interface" "private1" {
subnet_id = var.subnet_id
# security_groups = [aws_security_group.common.id]
attachment {
instance = aws_instance.monitoring.id
device_index = 1
}
tags = merge(
local.common_tags,
{
"Name" = "${var.monitoring}"
}
)
}
.....
输出
Terraform will perform the following actions:
# aws_instance.monitoring must be replaced
-/+ resource "aws_instance" "monitoring" {
~ arn = "arn:aws:ec2:eu-west-1:335094912020:instance/i-04dbad35419e5403d" -> (known after apply)
~ associate_public_ip_address = false -> true # forces replacement
~ availability_zone = "eu-west-1a" -> (known after apply)
~ cpu_core_count = 2 -> (known after apply)
~ cpu_threads_per_core = 2 -> (known after apply)
~ disable_api_stop = false -> (known after apply)
~ disable_api_termination = false -> (known after apply)
~ ebs_optimized = false -> (known after apply)
- hibernation = false -> null
+ host_id = (known after apply)
+ host_resource_group_arn = (known after apply)
+ iam_instance_profile = (known after apply)
~ id = "i-04dbad35419e5403d" -> (known after apply)
~ instance_initiated_shutdown_behavior = "stop" -> (known after apply)
~ instance_state = "running" -> (known after apply)
~ ipv6_address_count = 0 -> (known after apply)
~ ipv6_addresses = [] -> (known after apply)
~ monitoring = false -> (known after apply)
+ outpost_arn = (known after apply)
+ password_data = (known after apply)
+ placement_group = (known after apply)
~ placement_partition_number = 0 -> (known after apply)
~ primary_network_interface_id = "eni-067ddc45b42b3bc58" -> (known after apply)
~ private_dns = "ip-10-1-4-200.eu-west-1.compute.internal" -> (known after apply)
~ private_ip = "10.1.4.200" -> (known after apply)
+ public_dns = (known after apply)
+ public_ip = (known after apply)
~ secondary_private_ips = [] -> (known after apply)
~ security_groups = [] -> (known after apply)
tags = {
"Name" = "advertisement-monitoring"
"Owner" = "devops-team"
"Project" = "advertising"
"Role" = "monitoring"
"Terraform" = "true"
}
~ tenancy = "default" -> (known after apply)
+ user_data = (known after apply)
+ user_data_base64 = (known after apply)
~ vpc_security_group_ids = [
- "sg-058c8236c532c5a43",
] -> (known after apply)
# (8 unchanged attributes hidden)
- capacity_reservation_specification {
- capacity_reservation_preference = "open" -> null
}
- cpu_options {
- core_count = 2 -> null
- threads_per_core = 2 -> null
}
- credit_specification {
- cpu_credits = "unlimited" -> null
}
- enclave_options {
- enabled = false -> null
}
- maintenance_options {
- auto_recovery = "default" -> null
}
- metadata_options {
- http_endpoint = "enabled" -> null
- http_put_response_hop_limit = 2 -> null
- http_tokens = "required" -> null
- instance_metadata_tags = "disabled" -> null
}
- private_dns_name_options {
- enable_resource_name_dns_a_record = false -> null
- enable_resource_name_dns_aaaa_record = false -> null
- hostname_type = "ip-name" -> null
}
- root_block_device {
- delete_on_termination = true -> null
- device_name = "/dev/xvda" -> null
- encrypted = false -> null
- iops = 3000 -> null
- tags = {} -> null
- throughput = 125 -> null
- volume_id = "vol-05544aeda21e9408c" -> null
- volume_size = 8 -> null
- volume_type = "gp3" -> null
}
}
# aws_network_interface.private1 will be updated in-place
~ resource "aws_network_interface" "private1" {
id = "eni-0f66a33626a3a3f66"
tags = {
"Name" = "advertisement-monitoring"
"Owner" = "devops-team"
"Project" = "advertising"
"Role" = "monitoring"
"Terraform" = "true"
}
# (22 unchanged attributes hidden)
- attachment {
- attachment_id = "eni-attach-0740bf5f5dfab0d38" -> null
- device_index = 1 -> null
- instance = "i-04dbad35419e5403d" -> null
}
+ attachment {
+ attachment_id = (known after apply)
+ device_index = 1
+ instance = (known after apply)
}
}
这是预期的行为,就好像您的 EC2 中有两个以上的 eni,那么您将不会收到新的公共 IP,来自 docs :
在某些情况下,我们会释放您的实例的公共 IP 地址, 或为其分配一个新的:
我们会在实例停止时释放您的实例的公共 IP 地址, 休眠或终止。您已停止或休眠的实例 启动时会收到一个新的公共 IP 地址。
当您关联实例时,我们会释放您实例的公有 IP 地址 弹性IP地址就用它了。当您解除弹性IP关联时 来自您的实例的地址,它会收到一个新的公共 IP 地址。
如果您的VPC实例的公网IP地址已被释放, 如果有多个网络,它将不会收到新的 附加到您的实例的接口。
如果您的实例的公有IP地址在其具有公网IP地址的情况下被释放 与弹性 IP 关联的辅助私有 IP 地址 地址,实例不会收到新的公共 IP 地址。
从 Terraform 的角度来看,实例必须有一个公共 IP,因此在丢失它之后,它将尝试重新创建它以重新建立计划中所示的状态:
~ associate_public_ip_address = false -> true # forces replacement