Terraform 修改尚未激活的VPC Peering连接的DNS设置失败问题

45次阅读
没有评论

问题描述

在使用Terraform配置VPC Peering连接时,遇到一个问题。问题出现在资源配置文件中的aws_vpc_peering_connection_options部分,具体涉及DNS设置。用户描述了问题现象以及引发问题的部分配置。
具体错误如下:

Error: error modifying VPC Peering Connection (pcx-084fe8578b2935b6a) Options: OperationNotPermitted: Peering pcx-084fe8578b2935b6a is not active. Peering options can be added only to active peerings.

用户提到如果等待一段时间再次运行terraform apply,问题就会解决,因为VPC已经有足够的时间变为活动状态。用户还提到最初尝试将DNS设置与aws_vpc_peering_connection资源一起配置,但仍然遇到相同的错误,因此将其分开配置也未能解决问题。用户猜测是否需要在应用选项之前进行某种延时操作。

解决方案

请注意以下操作可能会受版本差异影响,做好备份并谨慎操作。

方案1

经过分析,问题的根本在于DNS设置的应用发生在VPC Peering连接尚未激活(approved)时。这可能导致Terraform依赖顺序问题。可以通过修改aws_vpc_peering_connection_options中的vpc_peering_connection_id来解决这个问题,以确保Terraform的依赖关系正确。
具体操作如下:
1. 打开配置文件,找到aws_vpc_peering_connection_options部分。
2. 将vpc_peering_connection_id的值修改为aws_vpc_peering_connection_accepter.sb_vpc_peering_accepter.id,这样Terraform的依赖树会自动按正确的顺序执行。

修改前的配置:

resource "aws_vpc_peering_connection_options" "sb_vpc_peering_options" {
  vpc_peering_connection_id = aws_vpc_peering_connection.sb_vpc_peering.id
  accepter {
    allow_remote_vpc_dns_resolution = var.accepter_dns_resolution
  }
  requester {
    allow_remote_vpc_dns_resolution = var.requester_dns_resolution
  }
}

修改后的配置:

resource "aws_vpc_peering_connection_options" "sb_vpc_peering_options" {
  vpc_peering_connection_id = aws_vpc_peering_connection_accepter.sb_vpc_peering_accepter.id
  accepter {
    allow_remote_vpc_dns_resolution = var.accepter_dns_resolution
  }
  requester {
    allow_remote_vpc_dns_resolution = var.requester_dns_resolution
  }
}

通过这种方式,Terraform会在VPC Peering连接激活后才应用DNS设置,解决了问题。

方案2

另一种可能的解决方案是在配置中加入一个等待(sleep)的操作,确保VPC Peering连接足够时间变为活动状态再应用DNS设置。这种方法需要考虑合适的等待时间,以免过早应用DNS设置。
以下是一个简单的bash脚本示例,可以在VPC Peering连接变为活动状态后再应用DNS设置:

#!/bin/bash
# 启动VPC Peering连接
# ...(省略部分配置代码)
# 等待VPC Peering连接变为活动状态
while ! terraform show | grep -q "status = active"; do
  sleep 5
done
# 应用DNS设置
terraform apply

在这个示例中,我们首先启动VPC Peering连接的配置。然后,使用一个循环来检查terraform show输出是否包含status = active,即VPC Peering连接变为活动状态。一旦连接变为活动状态,就应用DNS设置,再次运行terraform apply

这两种方案都可以解决问题,选择哪种取决于用户的需求和偏好。

方案3

如果用户在使用Terraform时遇到了问题,可以先检查相关文档和社区,有时可能会找到特定问题的解决方案。此外,升级Terraform到最新版本也有可能修复一些已知问题。

正文完