Включение PostGIS в AWS RDS PostgreSQL с помощью Terraform

#postgresql #terraform #amazon-rds #terraform-provider-aws

#postgresql #terraform #amazon-rds #terraform-поставщик-aws

Вопрос:

Не могу найти способ активировать расширение PostGIS с помощью официального ресурса aws_db_instance, есть ли какие-либо другие варианты его активации с помощью Terraform?

Комментарии:

1. Для других, пытающихся помочь — я предполагаю , что речь идет о наличии эквивалента Terraform docs.aws.amazon.com/AmazonRDS/latest/UserGuide /…

Ответ №1:

Вы должны быть в состоянии сделать это с помощью postgres provider. Однако это может быть сложно с подключением.

 provider "postgresql" {
  host             = aws_db_instance.app_rds.address
  port             = aws_db_instance.app_rds.port
  database         = "postgres"
  username         = aws_db_instance.app_rds.username
  password         = var.db_admin_password
  sslmode          = "require"
  expected_version = aws_db_instance.app_rds.engine_version
  superuser        = false
}

# Installs postgres PostGIS extension
resource "postgresql_extension" "postgis" {
  name = "postgis"
}
 

Комментарии:

1. Обратите внимание, что вам также необходимо предоставить postgres required_providers в вашем terraform блоке. Вы можете найти пример в репозитории плагина .

Ответ №2:

Подход поставщика эффективно просто подключается к экземпляру базы данных с предоставленными учетными данными, а затем выполняет любые команды, которые вы запрашиваете, например, создание расширения. Если ваш экземпляр RDS находится в частной подсети, а Terraform запускается из другого места (например, из облака Terraform), поставщик не сможет подключиться. В рекомендациях по безопасности говорится, что вы не должны делать свою базу данных доступной напрямую из Интернета, поэтому этот подход не будет работать для большинства людей.

Вместо этого вы можете установить расширение в коде настройки для контейнера, который взаимодействует с базой данных. В моем случае я использовал Flask для доступа к экземпляру RDS, поэтому у него уже были учетные данные. Моя инициализация БД теперь выглядит так:

 from flask import Flask
from flask_migrate import Migrate
from flask_sqlalchemy import SQLAlchemy

def create_app(config):
  app = Flask(__name__)

  db = SQLAlchemy()
  db.init_app(app)
  db.engine.execute("CREATE EXTENSION IF NOT EXISTS postgis")

  migrate = Migrate()
  migrate.init_app(app, db)