Terraform local-exec Provisioner异常:VPC对等连接无法自动接受
问题分析与解决方案
你的问题出在Terraform资源的执行顺序和VPC对等连接的状态依赖上,咱们一步步拆解:
为什么原来的代码会报错?
当你在aws_vpc_peering_connection资源里同时定义accepter块和local-exec provisioner时,Terraform的执行逻辑是这样的:
- 首先创建VPC对等连接,此时连接处于pending状态(等待接受方确认)
- 紧接着尝试应用
accepter块里的配置(比如允许DNS解析),但此时连接还未激活,所以触发了报错 - 因为资源创建过程中失败了,
local-execprovisioner根本没机会执行(provisioner是在资源成功创建后才运行的)
而你手动执行AWS CLI能成功,是因为此时连接已经处于pending状态,执行accept命令后它变成active,自然就能修改选项了。
正确的实现方式
跨账号的VPC对等连接,必须把请求方创建连接和接受方确认连接拆分成两个独立的资源来处理,利用Terraform的aws_vpc_peering_connection_accepter资源来完成接受操作,而不是依赖local-exec。
修改后的完整代码
# 请求方账号的Provider配置 provider "aws" { region = "us-east-1" profile = "default" } # 接受方账号的Provider配置(用alias区分) provider "aws" { region = "us-east-1" profile = "peer" alias = "peer" } # 请求方创建VPC对等连接(只设置请求方的选项,不要碰accepter块) resource "aws_vpc_peering_connection" "service-peer" { vpc_id = "vpc-123a56789bc" peer_vpc_id = "vpc-YYYYYY" peer_owner_id = "012345678901" peer_region = "us-east-1" requester { allow_remote_vpc_dns_resolution = true } } # 接受方账号接受对等连接并设置accepter选项 resource "aws_vpc_peering_connection_accepter" "peer-accept" { provider = aws.peer vpc_peering_connection_id = aws_vpc_peering_connection.service-peer.id auto_accept = true accepter { allow_remote_vpc_dns_resolution = true } }
关键知识点
- 同账号同区域的VPC对等连接,可以直接在
aws_vpc_peering_connection里设置auto_accept = true,不需要额外的accepter资源 - 跨账号(或跨区域)的对等连接,必须用
aws_vpc_peering_connection_accepter资源来处理接受操作,它会自动等待连接处于pending状态后再执行accept,确保后续的选项配置能在active状态下完成 - 避免用local-exec处理这类依赖状态的云资源操作,Terraform的原生资源已经帮你处理了状态依赖和重试逻辑,比自定义脚本更可靠
内容的提问来源于stack exchange,提问作者cinny
相关产品推荐
相关产品推荐

