簡體   English   中英

Terraform AWS RDS 實例跨區域復制 - US-west-1 中的只讀副本

[英]Terraform AWS RDS Instance Cross Region Replication - Read Replica in US-west-1

我在 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 Terraform 提供商的文檔已經考慮了這種可能性。

我根本沒有測試過,但是當我閱讀它時:

  • 您可以創建一個單獨的Terraform 配置或在同一配置中聲明另一個aws提供者在不同的別名下,讓另一個提供者使用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 ,讓它為主體的實例作為ARN使用replicate_source_db 類似的東西:(再次未經測試)
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
}

我正在執行相同的任務,為跨區域創建 RDS 副本並參考此文檔,但還沒有找到任何類似的選項

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM