Amazon Relational Database Service(Amazon RDS) for PostgreSQL 또는 Amazon Aurora(Aurora) PostgreSQL 호환 버전 인스턴스에서 데이터 정의 언어(DDL) 작업을 방지하고 싶습니다. 논리적 복제를 사용하는 블루/그린 배포 중에 DDL 작업으로 인해 오류가 발생합니다.
간략한 설명
논리적 복제를 사용하는 블루/그린 배포 중에 Amazon RDS for PostgreSQL 인스턴스에서 DDL 작업을 실행하면 다음과 같은 오류 메시지가 표시됩니다.
"Data definition language (DDL) changes aren't supported... Your green databases now have a status of REPLICATION_DEGRADED. Delete and recreate your blue/green deployment and avoid future DDL changes..."
전환을 시도하면 Amazon RDS가 전환을 차단하고 다음과 같은 오류 메시지가 표시됩니다.
"Switchover from DB cluster to... was cancelled because there are DDL or Large Object changes on... that can't be replicated. Delete the blue/green deployment along with the target cluster, then re-create it."
RDS for PostgreSQL 기반 블루/그린 배포의 DDL 작업은 환경 간 논리적 복제 성능을 저하시키고 전체 재배포가 필요할 수 있습니다. 이 문제를 방지하려면 블루/그린 배포 중에 블루 데이터베이스에서 PostgreSQL 이벤트 트리거 및 트리거 함수를 구성해야 합니다.
그러나 다음 DDL 작업은 방지할 수 없습니다.
- 데이터베이스, 역할 또는 테이블스페이스와 같은 공유 객체를 대상으로 하는 명령
- 이벤트 트리거를 대상으로 하는 명령
- pg_largeobject의 대규모 객체 수정
참고: 이 문제는 Amazon RDS가 물리적 복제 대신 논리적 복제를 사용하는 메이저 버전 업그레이드 중에만 RDS for PostgreSQL에 영향을 미칩니다. 네이티브 PostgreSQL 논리적 복제의 제한 사항으로 인해 논리적 복제 중에 PostgreSQL 블루/그린 배포가 제한됩니다. 자세한 내용은 PostgreSQL 웹 사이트의 제한 사항을 참조하십시오.
해결 방법
PostgreSQL 이벤트 트리거 및 트리거 함수 구성
블루/그린 배포를 구성하기 전에 이벤트 트리거 및 트리거 함수를 생성하십시오. 또한 이벤트 트리거는 데이터베이스 수준에서 작동하므로 DDL 보호가 필요한 모든 데이터베이스에서 각 이벤트 트리거 및 트리거 함수를 별도로 생성해야 합니다. 그린 환경은 기본적으로 이벤트 트리거와 트리거 함수를 상속합니다. 그린 환경에서 DDL 작업을 수행하려면 먼저 블루 환경에서 생성한 트리거와 함수를 삭제하십시오.
이벤트 트리거 및 트리거 함수를 구성하려면 다음 단계를 완료하십시오.
-
다음 명령을 실행하여 데이터베이스에 슈퍼 사용자로 로그인합니다.
psql -U admin -h your_rds_endpoint -d your_database
-
다음 명령을 실행하여 DDL 차단 함수를 생성합니다.
CREATE OR REPLACE FUNCTION schema_name.block_ddl_bg() RETURNS event_trigger
SECURITY DEFINER
AS $$
DECLARE
-- Define allowed users and roles here
allowed_users TEXT[] := ARRAY['rdsadmin', 'rdsrepladmin'];
allowed_roles TEXT[] := ARRAY['rdsrepladmin'];
BEGIN
-- Check if either the session user or current role is allowed
IF NOT (session_user = ANY(allowed_users) OR current_role = ANY(allowed_roles)) THEN
RAISE EXCEPTION 'DDL operations are blocked to prevent Blue Green Deployment replica degradation. User: %, Role: %, Status: BLOCKED',
session_user, current_role;
END IF;
END;
$$ LANGUAGE plpgsql;
참고: 위 명령에서 schema_name을 스키마로 바꾸십시오.
-
다음 명령을 실행하여 이벤트 트리거를 생성합니다.
CREATE EVENT TRIGGER block_ddl_trigger
ON ddl_command_start
EXECUTE FUNCTION schema_name.block_ddl_bg();
참고: 위 명령에서 schema_name을 스키마로 바꾸십시오.
-
다음 명령을 실행하여 트리거 구현을 확인합니다.
-- Check if the function exists
SELECT proname, pronamespace::regnamespace
FROM pg_proc
WHERE proname = 'block_ddl_bg';
-- Check if the event trigger exists
SELECT evtname, evtevent, evtowner::regrole
FROM pg_event_trigger
WHERE evtname = 'block_ddl_trigger';
-
다음 명령을 실행하여 트리거를 테스트합니다.
-- Try to create a test table
CREATE TABLE test_table (id int);
-- Should receive blocking message
이벤트 트리거 및 트리거 함수 제거
블루/그린 배포 전환을 완료하거나 블루/그린 배포를 해제한 후 다음 명령을 실행합니다.
이벤트 트리거 제거:
-- Remove event trigger
DROP EVENT TRIGGER block_ddl_trigger;
트리거 함수 제거:
-- Remove trigger function
DROP FUNCTION schema_name.block_ddl_bg();
참고: 위 명령에서 schema_name을 스키마로 바꾸십시오.
관련 정보
PostgreSQL 웹 사이트의 이벤트 트리거
PostgreSQL 웹 사이트의 이벤트 트리거 발생 매트릭스
블루/그린 배포에 대한 Aurora PostgreSQL 제한 사항
논리적 복제를 사용하는 블루/그린 배포에 대한 RDS for PostgreSQL 제한 사항