在 terraform 失败的不同 vpc 中创建时出现 rds 副本错误

Posted

技术标签:

【中文标题】在 terraform 失败的不同 vpc 中创建时出现 rds 副本错误【英文标题】:rds replica error when creating in different vpc with terraform failing 【发布时间】:2021-11-06 12:58:39 【问题描述】:

我正在尝试通过 terraform 在不同区域创建 rds 数据库的只读副本。我可以通过 AWS 控制台实现,但是通过 Terraform (0.14.10) 应用时,应用失败并显示以下内容:

错误:创建数据库实例时出错:无效参数组合:数据库实例和 EC2 安全组位于不同的 VPC 中。数据库实例在 vpc-xxx,EC2 安全组在 vpc-yyy

TF 块:

resource "aws_db_instance" "replica" 
   count                  = var.enable_peering_read_replica ? 1 : 0
   name                   = db-replica
   identifier             = db-replica
   replicate_source_db    = source-db
   instance_class         = "db.t3.small"
   apply_immediately      = true
   publicly_accessible    = false
   skip_final_snapshot    = true
   vpc_security_group_ids = [aws_security_group.peering_sg.id]

对于 replicate_source_db,我使用了 arn 和 db 名称,但仍然出现相同的错误。

【问题讨论】:

完整的资源代码和确切的错误信息是什么? 更新了 TF 源码和完全错误 您必须提供完整的 vpc 代码和您的安全组 【参考方案1】:

错误消息很清楚:您的数据库和安全组位于不同的 VPC。这意味着您无法关联它们。您的安全组aws_security_group.peering_sg.id(未显示定义)必须与您的数据库位于相同的 VPC 中。

【讨论】:

它允许我通过控制台执行此操作,即在不同的 vpc 中选择安全组,这是必需的,因为副本需要在不同的 vpc 中。 我已经能够通过 tf 部署所需的资源(新的 vpc、vpc 对等体、子网和安全组),然后通过控制台在此 vpc 中创建只读副本。但是通过 terraform 失败,但值与通过控制台执行时相同 @einonsy 您必须提供所有相关的 TF 代码。它显然与 AWS 控制台中的不同。【参考方案2】:

这是一个棘手的问题,让我受了很多苦。即使周围有许多与此类似的线程,也没有一个能引导我找到完整的解决方案。 完整的解释如下。有两种可能的情况:

    数据库副本将在与源数据库相同的区域中创建。 数据库副本将在与源数据库不同的区域中创建。

场景 2 是这篇文章的重点,也是我想要介绍的。这些是事实:

对于 replicate_source_db,指定一个有效的数据库实例 ARN。 AWS Doc。 db_subnet_group_name:数据库实例将在与数据库子网组关联的 VPC 中创建。如果未指定,它将在默认 VPC 或 EC2 Classic(如果可用)中创建。使用只读副本时,仅当源数据库指定另一个 AWS 区域中的实例时才应指定它。 db_instance module doc 最后但同样重要的是,即使正确设置了上述选项,只读副本也会在默认 VPC 中创建。为什么?答案是,还有另一个对实现预期目标至关重要的配置 cross_region_replica。此属性的默认值为 false,这是我所有困惑的原因。我们需要将其设置为 true。

有关真正有效的完整示例,请查看Same region example 和Different region example

【讨论】:

以上是关于在 terraform 失败的不同 vpc 中创建时出现 rds 副本错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 terraform 在非默认 VPC 中创建 AWS RDS 实例

无法使用 Terraform 在自定义 VPC 中创建 Elastic Beanstalk 应用程序

Terraform“为区域匹配失败的 VPC 接口端点创建 R53 别名”——但区域是正确的

Terraform gcp 与共享 vpc、gke

如何使用 Terraform 创建一个健康的 VPC-Native GKE 集群?

Terraform 和 GCP - 在现有的共享 VPC 和子网中创建新的计算 VM