Terraform으로 Amazon Aurora 클러스터 자동 구축(PostgreSQL 호환 편)

개시하다
이전 기사에서 나는 오로라의 MySQL 호환의 기본 내용을 썼다.
이번에는 PostgreSQL과 호환되는 Aurora 클러스터 인스턴스를 만듭니다.
전제지식은 지난번과 마찬가지로 다음과 같은 내용만 있으면 된다.

  • Amazon Aurora의 Black Belt 자료 대략적으로 눈을 통해 개요를 이해한다
  • Terraform에서 AWS 서비스를 구축한 경험이 있음
  • 구성은 지난번과 마찬가지로 퍼블릭의 서브넷에 라이터 판독기 실례를 구축했다.

    실제 구축상 주의점도 지난번과 마찬가지로 아우라는 프라이빗 서브넷에 배치돼 발판을 거쳐 방문한다.

    또 구축은 포스트 커스QL12다.7 겸용으로 진행됩니다.
    Terraform
    주로 이전 Aurora MySQL 호환성 문서와의 차분 부분을 묘사한다.
    네트워크 설정
    이 부분은 이전의 보도와 차이가 없다.
    data "aws_subnet_ids" "my_vpc" {
      vpc_id = data.aws_vpc.my.id
    }
    
    resource "aws_db_subnet_group" "example" {
      name       = local.db_subnet_group_name
      subnet_ids = data.aws_subnet_ids.my_vpc.ids
    }
    
    DB 클러스터 및 매개 변수
    DB 클러스터 설정은 다음과 같습니다.
    MySQL을 교환할 때engine_version의 기록은 매우 번거롭지만 PostgreSQL을 교환하는 상황은 매우 간단하다.
    포트는 PostgreSQL 표준 포트5432입니다.
    resource "aws_rds_cluster" "example" {
      cluster_identifier                  = local.aurora_cluster_identifier
      engine                              = "aurora-postgresql"
      engine_version                      = "12.7"
      master_username                     = local.aurora_master_username
      master_password                     = local.aurora_master_password
      port                                = 5432
      database_name                       = local.aurora_database_name
      vpc_security_group_ids              = [aws_security_group.aurora.id]
      db_subnet_group_name                = aws_db_subnet_group.example.name
      db_cluster_parameter_group_name     = aws_rds_cluster_parameter_group.example.name
      iam_database_authentication_enabled = true
    
      skip_final_snapshot = true
      apply_immediately   = true
    }
    
    resource "aws_rds_cluster_parameter_group" "example" {
      name   = local.rdscluster_parameter_group_name
      family = "aurora-postgresql12"
    }
    
    Aurora 인스턴스 및 매개변수
    여기서 인스턴스의 설정은 MySQL 호환성과 크게 달라지지 않습니다.
    단, PostgreSQL 스와프의 한쪽 자원 소모가 많기 때문에instance_class 설정 가능한 유형을 제한했다.자세한 내용은 공식 사용 설명서에 적고 필요에 따라 참고하세요.
    인스턴스 매개변수의 경우 shared_preload_librariespg_stat_statements,pg_hint_plan로 설정합니다.
    없어도 작동하지만 안정적인 동작과 성능을 확보하는 데 문제가 있을 때 조사가 필요하다.
    엄밀히 말하면 DB 클러스터의 매개 변수 그룹rds.extensions에서도 같은 설정을 미리 설정해야 하지만, 기본으로 설정된 것이기 때문에 자신이 변경한 경우를 제외하고는 신경 쓸 필요가 없다.
    resource "aws_rds_cluster_instance" "example" {
      count = local.aurora_instance_count
    
      cluster_identifier = aws_rds_cluster.example.id
      identifier         = "${local.aurora_cluster_identifier}-instance-${count.index}"
    
      engine                  = aws_rds_cluster.example.engine
      engine_version          = aws_rds_cluster.example.engine_version
      instance_class          = "db.t4g.medium"
      db_subnet_group_name    = aws_db_subnet_group.example.name
      db_parameter_group_name = aws_db_parameter_group.example.name
    
      monitoring_role_arn = aws_iam_role.aurora_monitoring.arn
      monitoring_interval = 60
    
      publicly_accessible = true
    }
    
    resource "aws_db_parameter_group" "example" {
      name   = local.db_parameter_group_name
      family = "aurora-postgresql12"
    
      parameter {
        apply_method = "pending-reboot"
        name  = "shared_preload_libraries"
        value = "pg_stat_statements,pg_hint_plan"
      }
    }
    
    작성된 테이블 자동 생성
    MySQL 호환과 마찬가지로 테이블은 자동으로 생성되어 사용됩니다null_resource.
    미리 설정하지 않으면export PGPASSWORD 비밀번호 알림이 표시되어 전진할 수 없기 때문에 여기만 설정합니다.CREATE EXTENSION에서 shared_preload_libraries에서 유효화된 통계 정보를 참고하는 표를 만듭니다.
    이 표는 라이터 실례에서만 제작할 수 있지만 리더 실례에서 SQL이 발매되면 잘 업데이트된다.
    resource "null_resource" "db_setup" {
      depends_on = [
        aws_rds_cluster.example,
        aws_rds_cluster_instance.example,
      ]
    
      provisioner "local-exec" {
        command = "export PGPASSWORD=${local.aurora_master_password}; psql -h ${aws_rds_cluster.example.endpoint} -U administrator -d COMPANY -f ./aurora_init_db.sql"
      }
    }
    
    aurora_init_db.sql
    CREATE EXTENSION pg_stat_statements;
    
    CREATE TABLE IF NOT EXISTS employee (
      id char(5) PRIMARY KEY,
      name CHAR(20) NOT NULL,
      age integer,
      update_dt timestamp
    );
    
    INSERT INTO employee VALUES ( '00001', 'Taro', 35, CURRENT_TIMESTAMP );
    INSERT INTO employee VALUES ( '00002', 'Jiro', 30, CURRENT_TIMESTAMP );
    INSERT INTO employee VALUES ( '00003', 'Saburo', 28, CURRENT_TIMESTAMP );
    INSERT INTO employee VALUES ( '00004', 'Shiro', 24, CURRENT_TIMESTAMP );
    INSERT INTO employee VALUES ( '00005', 'Goro', 40,CURRENT_TIMESTAMP );
    
    확장 모니터링
    확장 감시에 관해서는 기본적으로 제작 방법이 변경되지 않았기 때문에 이번에는 기재를 생략합니다.
    응용 프로그램 연결의 실천
    MySQL 호환innodb_read_only에서 확인할 수 있는 상태는 다음과 같습니다.
    COMPANY=> SHOW transaction_read_only;
     transaction_read_only 
    -----------------------
     off
    (1 row)
    
    COMPANY=> SHOW transaction_read_only;
     transaction_read_only 
    -----------------------
     on
    (1 row)
    
    고장이 라이터를 옮긴 실례가 나오자 호응이 크게 달라졌다.
    그러나 psql에서 전환된 최초의 SQL에서 다음과 같은 오류가 발생했습니다.
    실제 업무 응용 프로그램에서 연결이 끊긴 후에 리더십을 연결하면 특별한 검사 등이 없어도 자동으로 전환될 수 있다.
    COMPANY=> SHOW transaction_read_only;
    SSL SYSCALL error: EOF detected
    The connection to the server was lost. Attempting reset: Succeeded.
    psql (12.9 (Ubuntu 12.9-0ubuntu0.20.04.1), server 12.7)
    SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
    
    이렇게 되면 PostgreSQL이 호환되는 아우라 클러스터도 쉽게 만들 수 있습니다!

    좋은 웹페이지 즐겨찾기