如何仅在预置 AWS RDS 实例后创建用户和数据库?

Posted

技术标签:

【中文标题】如何仅在预置 AWS RDS 实例后创建用户和数据库?【英文标题】:How do I create a user and database only after an AWS RDS instance is provisioned? 【发布时间】:2020-01-03 02:29:03 【问题描述】:

关于如何在创建数据库或用户之前等待 AWS RDS 数据库主机配置好有什么建议吗?为此,我尝试使用 depends_on 参数,以便它等待首先配置 RDS 数据库。提供者似乎无法等待资源。

运行时出现以下错误:

提供者参数名称“depends_on”保留供 Terraform 在未来版本中使用。

--- Terraform 计划片段----

# Provision AWS PostgreSQL Dev Database
resource "aws_db_instance" "dev_db" 
    identifier = "dev"
    allocated_storage    = 100
    storage_type         = "gp2"
    engine               = "postgres"
    engine_version       = "10.9"
    port                 = 1433
    instance_class       = "db.t3.medium"
    name                 = "dev"
    username             = "dev"
    password             = "mydevpassword"
    parameter_group_name = "postgress10"
    tags = 
        Name = "dev"
    
    skip_final_snapshot = true

# Setup PostgreSQL Provider After RDS Database is Provisioned
provider "postgresql" 
    host            = "$aws_db_instance.dev_db.address"
    port            = 1433
    username        = "dev"
    password        = "mydevpassword"
    depends_on      = [aws_db_instance.dev_db]

# Create App User
resource "postgresql_role" "application_role" 
    name                = "dev_appuser"
    login               = true
    password            = "myappuserpassword"
    encrypted_password  = true
    depends_on          = [aws_db_instance.dev_db]

# Create Database 
resource "postgresql_database" "dev_db" 
    name              = "mydatabase1"
    owner             = "dev"
    template          = "template0"
    lc_collate        = "C"
    connection_limit  = -1
    allow_connections = true
    depends_on        = [aws_db_instance.dev_db]

【问题讨论】:

depends_on 应该是一个列表,例如:depends_on = [aws_db_instance.dev_db] 谢谢!现在我遇到了一个问题,告诉提供者连接要等到配置数据库。似乎depends_on 不是为提供者设计的,或者在Terraform 中尚不可用。我收到此错误“提供程序参数名称“depends_on”已保留供 Terraform 在未来版本中使用。” Terraform v0.12.7 + provider.aws v2.25.0 + provider.postgresql v1.1.0 Terraform 隐式处理大多数依赖项。如果你完全省略depends_on,你还有问题吗? 我试过了。 Posgress 提供者似乎试图在数据库准备好之前建立连接。 "Error: Error initializing PostgreSQL client: error detection capabilities: error PostgreSQL version: dial tcp 172.31.68.174:1433: connectex: 连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立连接失败,因为连接主机没有响应。” 我明白了。您似乎遇到了这个问题:github.com/terraform-providers/terraform-provider-postgresql/… 【参考方案1】:

我在 GitHub Issue 的 postgres 提供程序存储库中询问了这个问题,维护人员能够为此提供解决方法 - 如果您在提供程序配置中指定 expected_version,它不会尝试连接,直到资源实际上使用了连接。

这意味着资源的依赖行为可用于阻止连接,直到 Terraform 完成 RDS 资源的设置。这似乎适用于plan 情况和apply 情况。

【讨论】:

以上是关于如何仅在预置 AWS RDS 实例后创建用户和数据库?的主要内容,如果未能解决你的问题,请参考以下文章

AWS 新建RDS实例 for MySQL

AWS CloudFormation - 在 RDS 实例就绪后创建表?

如何修复AWS DMS到RDS的连接错误?

如何在 aws Secrets Manager 服务中管理 aws RDS(由 cloudformation 创建)的主用户凭证?

AWS RDS 的使用

如何连接mysql数据库(AWS下的RDS实例)