Terraform 创建子网依赖项时出错

Joh*_*Fox 5 amazon-web-services terraform terraform-provider-aws

我正在尝试启动并运行 documentdb 集群,并使其在我创建的私有子网内运行。

depends_on在没有创建子网的情况下运行下面的配置,我收到以下错误消息:

Error: error creating DocDB cluster: DBSubnetGroupNotFoundFault: DB subnet group 'subnet-0b97a3f5bf6db758f' does not exist.
status code: 404, request id: 59b75d23-50a4-42f9-99a3-367af58e6e16
Run Code Online (Sandbox Code Playgroud)

添加了依赖设置以等待创建子网,但遇到了问题。

  cluster_identifier      = "my-docdb-cluster"
  engine                  = "docdb"
  master_username         = "myusername"
  master_password         = "mypassword"
  backup_retention_period = 5
  preferred_backup_window = "07:00-09:00"
  skip_final_snapshot     = true
  apply_immediately       = true
  db_subnet_group_name    = aws_subnet.eu-west-3a-private
  depends_on = [aws_subnet.eu-west-3a-private]
}
Run Code Online (Sandbox Code Playgroud)

在运行 terraform apply 时,我在配置上遇到错误:

Error: error creating DocDB cluster: DBSubnetGroupNotFoundFault: DB subnet group 'subnet-0b97a3f5bf6db758f' does not exist.
status code: 404, request id: 8b992d86-eb7f-427e-8f69-d05cc13d5b2d

on main.tf line 230, in resource "aws_docdb_cluster" "docdb":
230: resource "aws_docdb_cluster" "docdb" 
Run Code Online (Sandbox Code Playgroud)

yda*_*coR 6

数据库子网组本身就是一种逻辑资源,它告诉 AWS 可以在 VPC 中的何处安排数据库实例。它并不是直接引用子网,而这正是您想要在那里做的。

要创建数据库子网组,您应该使用aws_db_subnet_group资源。然后,您可以在创建数据库实例或集群时直接通过名称引用它。

一个基本的例子如下所示:

resource "aws_vpc" "example" {
  cidr_block = "10.0.0.0/16"
}

resource "aws_subnet" "eu-west-3a" {
  vpc_id            = aws_vpc.example.id
  availability_zone = "a"
  cidr_block        = "10.0.1.0/24"

  tags = {
    AZ = "a"
  }
}

resource "aws_subnet" "eu-west-3b" {
  vpc_id            = aws_vpc.example.id
  availability_zone = "b"
  cidr_block        = "10.0.2.0/24"

  tags = {
    AZ = "b"
  }
}

resource "aws_db_subnet_group" "example" {
  name       = "main"

  subnet_ids = [
    aws_subnet.eu-west-3a.id,
    aws_subnet.eu-west-3b.id
  ]

  tags = {
    Name = "My DB subnet group"
  }
}

resource "aws_db_instance" "example" {
  allocated_storage    = 20
  storage_type         = "gp2"
  engine               = "mysql"
  engine_version       = "5.7"
  instance_class       = "db.t2.micro"
  name                 = "mydb"
  username             = "foo"
  password             = "foobarbaz"
  parameter_group_name = "default.mysql5.7"
  db_subnet_group_name = aws_db_subnet_group.example.name
}
Run Code Online (Sandbox Code Playgroud)

同样的情况也适用于使用该资源的Elasticache 子网组aws_elasticache_subnet_group


还值得注意的是,添加depends_on到已经通过插值引用依赖资源的资源不会执行任何操作。元depends_on参数适用于不公开仅直接提供此依赖关系信息的参数的资源。


Ash*_*tia 1

看来参数值是错误的。在其他地方创建的 db_subnet_group_name 给出输出 id/arn。所以你需要使用 id 值。虽然depends_on子句看起来不错。

db_subnet_group_name    = aws_db_subnet_group.eu-west-3a-private.id
Run Code Online (Sandbox Code Playgroud)

所以这是正确的/您可以尝试使用 arn 代替 id。

谢谢,

阿什什