在 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 别名”——但区域是正确的