【问题标题】:creating db instance using terraform使用 terraform 创建数据库实例
【发布时间】:2018-09-26 11:52:40
【问题描述】:

我正在尝试创建仅在 Intranet(也称为某些私有子网)中运行的 RDS。对它的访问将仅提供给应用程序。

我在单独的terraform 文件link 中创建了vpc 配置 该文件包含vpc配置、routesnat等。

resource "aws_vpc" "vpc" {
  cidr_block = "10.0.0.0/16"
  enable_dns_support = true
  enable_dns_hostnames = true

  tags {
    Environment = "Dev"
  }
}

resource "aws_subnet" "intranet" {
  vpc_id = "${aws_vpc.vpc.id}"
  cidr_block = "10.0.1.0/24"
  availability_zone = "eu-central-1a"
  tags {
    Name = "Intranet"
    Environemnt = "Dev"
  }
}
....

resource "aws_route_table_association" "intranet" {
   subnet_id = "${aws_subnet.intranet.id}"
   route_table_id = "${aws_route_table.intranet_routetable.id}"
}

对于我的RDS 配置,我创建了一个具有类似内容的单独terraform 文件

terraform {
  backend "s3" {
    bucket = "s3-terraform-state-backend"
    region = "eu-central-1"
    key = "common/terraform.tfstate"
  }
}

provider "aws" {
  region = "eu-central-1"
}

resource "aws_vpc" "vpc" {
  cidr_block = "10.0.0.0/16"
  enable_dns_support = true
  enable_dns_hostnames = true

  tags {
    Environment = "Dev"
  }
}

resource "aws_subnet" "intranet" {
  vpc_id = "${aws_vpc.vpc.id}"
  cidr_block = "10.0.1.0/24"
  availability_zone = "eu-central-1a"
  tags {
    Name = "Intranet"
    Environemnt = "Dev"
  }
}

# should contain configuration for common components (rds, sqs etc.)
resource "aws_db_subnet_group" "db_subnet" {
  name = "intranet"
  subnet_ids = ["${aws_subnet.intranet.id}"]
}

resource "aws_db_instance" "core" {
  name = "gj-core-db"
  engine = "postgres"

  allocated_storage = 10
  storage_type = "gp2"
  instance_class = "db.t2.micro"

  db_subnet_group_name = "${aws_db_subnet_group.db_subnet.name}"
}

基本上我从另一个文件中复制了subnetvpc 配置(因为我在这里也需要它)。文件本身在这里link

当我尝试apply 配置时出现错误

* aws_db_subnet_group.db_subnet: Error creating DB Subnet Group: DBSubnetGroupDoesNotCoverEnoughAZs: DB Subnet Group doesn't meet availability zone coverage requirement
. Please add subnets to cover at least 2 availability zones. Current coverage: 1
        status code: 400, request id: 44e37b59-1db1-4519-847f-d35f5d150592

我只有一个子网。问题是什么?我应该创建更多子网吗?或者让这个intranet 子网覆盖更多区域?

【问题讨论】:

    标签: amazon-web-services terraform


    【解决方案1】:

    一个子网不能跨越多个可用区。您应该创建多个子网并将它们分配给您正在创建的子网组。这是为了确保 HA。如果您配置多可用区 RDS 数据库实例并且您的主数据库发生故障,RDS 将确保您的数据库移动到不同的可用区(具有相同的端点)。

    对于子网组,AWS 强制要求每个子网组的子网应分布在多个可用区中。更多详情请见here

    以下是 AWS 文档中的相关部分。

    每个数据库子网组应在给定区域的至少两个可用区中拥有子网。在 VPC 中创建数据库实例时,您必须选择数据库子网组。 Amazon RDS 使用该数据库子网组和您的首选可用区来选择子网和该子网中的 IP 地址以与您的数据库实例关联。如果多可用区部署的主数据库实例失败,Amazon RDS 可以提升相应的备用数据库,然后使用其他可用区之一中的子网 IP 地址创建新备用数据库

    【讨论】:

    • 这是否意味着我必须使用不同的 cidr 块创建多个 aws_subnet 资源?
    • 是的,您需要在不同的可用区中至少有 2 个子网。
    • 如果你在测试/开发,想要一个单AZ RDS,RDS仍然需要一个子网组(并且所有子网组都有多个AZ),即使它只使用一个AZ?
    • 我不明白为什么multi_az 可能是假的,但仍然需要拥有两个 AZ(这需要两个 nat)? aws.amazon.com/blogs/database/… “您可以在单可用区数据库 (DB) 实例或多可用区数据库实例中设置 Amazon RDS 以满足高可用性要求。” @krishna_mee2004
    【解决方案2】:

    我刚刚遇到了同样的问题/问题,即使接受的答案感觉正确,我想在@Davos 的 cmets 中回答以下问题时增加它:

    “如果您正在测试/开发并想要一个单AZ RDS,RDS仍然需要一个子网组(并且所有子网组都有多个AZ),即使它只使用一个AZ?”

    是的,确实如此。这似乎是您将来想将 RDS 转换为 Multi-AZ 的准备。

    更多详情请见here(查看“步骤3”)

    【讨论】:

      猜你喜欢
      • 2019-08-13
      • 2021-03-16
      • 2021-05-04
      • 1970-01-01
      • 2021-08-20
      • 2017-02-14
      • 2020-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多