使用terraform创建数据库实例

时间:2018-04-16 16:48:04

标签: amazon-web-services terraform

我正在尝试创建仅在Intranet(也称为某个私有子网)中运行的RDS。只能向应用程序提供对它的访问权限。

我已在单独的vpc文件link中创建terraform个配置 该文件包含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子网覆盖更多区域?

2 个答案:

答案 0 :(得分:4)

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

对于子网组,AWS强制要求每个子网组都应具有分布在多个可用区域中的子网。可以找到更多详细信息here

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

  

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

答案 1 :(得分:0)

我只是遇到了相同的问题/问题,即使接受的答案感觉正确,我还是希望在@Davos的评论中回答以下问题以增加答案:

“如果您正在测试/开发并且需要单个可用区RDS,即使仅使用一个可用区,RDS仍需要一个子网组(并且所有子网组都具有多个可用区?”

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

可以找到更多详细信息here(请选中“步骤3”)