【问题标题】:Terraform AWS RDS Instance Cross Region Replication - Read Replica in US-west-1Terraform AWS RDS 实例跨区域复制 - US-west-1 中的只读副本
【发布时间】:2021-02-28 01:42:10
【问题描述】:

我在 aws 区域 us-east-1 中有一个通过 terraform 代码运行的数据库实例。 现在我想在另一个区域创建该数据库的只读副本:us-west-1。

这是代码:

# PostgreSQL RDS App Instance
module "rds" {
  source = "git@github.com:****"

  name           = var.rds_name_app
  engine         = var.rds_engine_app
  engine_version = var.rds_engine_version_app
  family         = var.rds_family_app
  instance_class = var.rds_instance_class_app

  # WARNING: 'terraform taint random_string.rds_password' must be run prior to recreating the DB if it is destroyed
  password                   = random_string.rds_password.result
  port                       = var.rds_port_app
  security_groups            = [aws_security_group.rds_app.id]
  subnets                    = [module.vpc.public_subnets]
  auto_minor_version_upgrade = var.rds_auto_minor_version_upgrade_app
  backup_retention_period    = var.rds_backup_retention_period_app
  backup_window              = var.rds_backup_window_app
  maintenance_window         = var.rds_maintenance_window_app
  environment                = var.environment
  kms_key_id                 = aws_kms_key.rds.arn
  multi_az                   = var.rds_multi_az_app
  notification_topic         = var.rds_notification_topic_app
  publicly_accessible        = var.rds_publicly_accessible_app
  storage_encrypted          = var.rds_storage_encrypted_app
  storage_size               = var.rds_storage_size_app
  storage_type               = var.rds_storage_type_app
  apply_immediately          = true
}

# PostgreSQL RDS Read Replica Instance
module "rds_replica" {
  source = "git@github.com:****"

  name           = var.rds_name_app_replica
  engine         = var.rds_engine_app_replica
  engine_version = var.rds_engine_version_app_replica
  family         = var.rds_family_app_replica
  instance_class = var.rds_instance_class_app_replica

  read_replica = "true"
  source_db    = module.rds.db_instance

  # NOTE: Using same password as primary 'rds_app' instance generated above
  password                   = ""
  port                       = var.rds_port_app_replica
  security_groups            = [aws_security_group.rds_app.id]
  subnets                    = [module.vpc.public_subnets]
  auto_minor_version_upgrade = var.rds_auto_minor_version_upgrade_app_replica
  backup_retention_period    = var.rds_backup_retention_period_app_replica
  backup_window              = var.rds_backup_window_app_replica
  maintenance_window         = var.rds_maintenance_window_app_replica
  environment                = var.environment
  kms_key_id                 = aws_kms_key.rds.arn
  multi_az                   = var.rds_multi_az_app_replica
  notification_topic         = var.rds_notification_topic_app_replica
  publicly_accessible        = var.rds_publicly_accessible_app_replica
  storage_encrypted          = var.rds_storage_encrypted_app_replica
  storage_size               = var.rds_storage_size_app_replica
  storage_type               = var.rds_storage_type_app_replica
  apply_immediately          = true
}

另外,这是我的 main.tf:

# pinned provider versions

provider "random" {
  version = "~> 2.3.0"
}

provider "template" {
  version = "~> 2.1.2"
}

provider "archive" {
  version = "~> 1.1"
}

# default provider
provider "aws" {
  version             = "~> 2.44"
  allowed_account_ids = [var.aws_account_id]
  region              = "us-east-1"
}

# remote state
terraform {
  required_version = "0.12.24"

  backend "s3" {
    key     = "terraform.dev.tfstate"
    encrypt = "true"
    bucket  = "dev-tfstate"
    region  = "us-east-1"
  }
}
  1. 这部分是否正确定义为告诉 terraform 我正在创建先前数据库的副本?:
read_replica = "true"
source_db    = module.rds.db_instance
  1. 我不确定在哪里以及如何指定我希望在另一个区域创建我的副本?

有人请告诉我!

  • 我添加了 Grzegorz Oledzki 在答案中给出的解决方案.. 它奏效了。
  • 但是,当我运行计划时,它并没有告诉我它将在 us-west-1 中创建的任何地方.. 我该如何确认?

计划的一部分:

module.rds_replica.aws_db_instance.db_instance will be created
  + resource "aws_db_instance" "db_instance" {
      + address                               = (known after apply)
      + allocated_storage                     = 200
      + allow_major_version_upgrade           = false
      + apply_immediately                     = true
      + arn                                   = (known after apply)
      + auto_minor_version_upgrade            = true
      + availability_zone                     = (known after apply)
      + backup_retention_period               = 0
      + backup_window                         = "***"
      + ca_cert_identifier                    = (known after apply)
      + character_set_name                    = (known after apply)
      + copy_tags_to_snapshot                 = true
      + db_subnet_group_name                  = (known after apply)
      + delete_automated_backups              = true
      + deletion_protection                   = false
      + endpoint                              = (known after apply)
      + engine                                = "postgres"
      + engine_version                        = "9.5.22"
      + final_snapshot_identifier             = "app-replica-final-snapshot"
      + hosted_zone_id                        = (known after apply)
      + iam_database_authentication_enabled   = false
      + id                                    = (known after apply)
      + identifier                            = (known after apply)
      + identifier_prefix                     = "app-replica-"
      + instance_class                        = "db.t2.micro"
      + iops                                  = 0
      + kms_key_id                            = "arn****"
      + license_model                         = (known after apply)
      + maintenance_window                    = "sat:05:09-sat:05:39"
      + max_allocated_storage                 = 0
      + monitoring_interval                   = 0
      + monitoring_role_arn                   = (known after apply)
      + multi_az                              = false
      + name                                  = (known after apply)
      + option_group_name                     = (known after apply)
      + parameter_group_name                  = (known after apply)
      + performance_insights_enabled          = false
      + performance_insights_kms_key_id       = (known after apply)
      + performance_insights_retention_period = (known after apply)
      + port                                  = 5432
      + publicly_accessible                   = false
      + replicas                              = (known after apply)
      + replicate_source_db                   = "arn****"
      + resource_id                           = (known after apply)
      + skip_final_snapshot                   = true
      + status                                = (known after apply)
      + storage_encrypted                     = true
      + storage_type                          = "gp2"

看到它确实说明了地区吗?

【问题讨论】:

  • 您需要配置两个 aws 提供程序,每个区域一个。 source_db在设置跨区域时需要是完整的ARN。
  • @jordanm 谢谢你,但你能帮我写一下代码吗?因为我是 tf 的新手
  • @jordanm 谢谢.. 但是我在哪里指定我的只读副本需要在 west-1 中?

标签: postgresql amazon-web-services terraform amazon-rds terraform-provider-aws


【解决方案1】:

(我自己从来没有做过,但是……)

看起来the docs for AWS Terraform provider 已经考虑到了这种可能性。

我根本没有测试过,但是当我读到它时:

  • 您可以创建一个单独的 Terraform 配置或在同一配置中声明另一个aws provider under different alias,让其他提供者使用us-west-1 作为区域:
# The default provider you already have
provider "aws" {
  region = "us-east-1"
}
# Thew new one
provider "aws" {
  region = "us-west-1"
  alias = "west"
}
  • 并在那里创建一个带有 replicate_source_db 的只读副本,该副本具有编写器/主实例的 ARN。 在这里您再次使用模块,因此当“调用”rds_replica 模块以将aws.west 传递为aws 并让它作为replicate_source_db 用作主实例ARN 时,需要应用该技巧。类似的东西:(再次未经测试)
module "rds_replica" {
  source = "git@github.com:****"
  ...
  providers = {
    aws = aws.west
  }

  # point to the main instance's ARN
  replicate_source_db = module.rds.db_instance.arn
}

【讨论】:

  • 谢谢你,但你能帮我写一下代码,比如如何准确地编写它,因为我是 tf 的新手
  • 我在代码中添加了这个并运行了计划——似乎工作正常!!但是,我如何确认这将在 us-west-1 中制作?因为在计划中没有说明哪个地区。 (请看我更新的问题)
  • 你可以运行apply看看会发生什么?
【解决方案2】:

我正在执行相同的任务,为跨区域创建 RDS 副本并参考此文档,但没有找到类似的选项

【讨论】:

  • 如果您有新问题,请点击 按钮提出问题。如果有助于提供上下文,请包含指向此问题的链接。
  • 你也可以这样做: ``` read_replica = "true" # 指向主实例的 ARN source_db = var.source_db ``` 并将 var 设为: ``` variable "source_db" { description = "要从中复制的源数据库实例的标识符" default = "arn:aws:rds:xxxx" } ```
猜你喜欢
  • 2021-10-16
  • 1970-01-01
  • 2020-12-19
  • 1970-01-01
  • 2018-03-31
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
相关资源
最近更新 更多