在 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 副本错误的主要内容,如果未能解决你的问题,请参考以下文章