상세 컨텐츠

본문 제목

[AWS/Postgresql] Postgresql 테이블 트리거(Trigger)로 람다(Lambda) 호출하기

Development/AWS

by J-Developer 2022. 5. 20. 15:50

본문

반응형

AWS RDS(Postgresql)에서 테이블 트리거 시 람다를 호출해야하는 일이 있어 해당 작업을 기록하려고 한다.

 

1. Postgresql에 aws_lambda 확장 모듈이 필요하여 설치를 해야한다.

Postgresql을 실행하는 클라이언트 프로그램으로 아래의 명령어(쿼리)를 실행 시키면 된다.

 

CREATE EXTENSION IF NOT EXISTS aws_lambda CASCADE;

 

설치가 완료되면 이렇게 나온다.

CREATE EXTENSION IF NOT EXISTS aws_lambda CASCADE;
NOTICE:  installing required extension "aws_commons"
CREATE EXTENSION

 

설치 되어있는지 확인하려면 해당 쿼리를 실행해본다.

select * from pg_available_extensions where name like '%aws%';

 

해당 쿼리를 실행 시 잘 설치가 되었다면 installed_version 컬럼에 버전이 입력되어 있을 것이다.

확장 모듈 설치 여부 실행 결과

 

 

2. IAM 정책과 역할 추가

RDS에서 람다를 호출할 수 있도록 DB에 권한을 줘야 합니다.

 

- IAM 정책 생성

aws iam create-policy  --policy-name rds-lambda-policy --policy-document '{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": "*"
        }
    ]
}'

 

- IAM 역할 생성

aws iam create-role  --role-name rds-lambda-role --assume-role-policy-document '{
    "Version": "2012-10-17",
    "Statement": [
        {
        "Effect": "Allow",
        "Principal": {
            "Service": "rds.amazonaws.com"
        },
        "Action": "sts:AssumeRole"
        }
    ]
}'

 

- IAM 역할에 정책 매핑

aws iam attach-role-policy \
    --policy-arn arn:aws:iam::444455556666:policy/rds-lambda-policy \
    --role-name rds-lambda-role --region aws-region

 

- RDS에 역할 매핑

aws rds add-role-to-db-instance \
       --db-cluster-identifier my-cluster-name \
       --feature-name Lambda \
       --role-arn  arn:aws:iam::444455556666:role/rds-lambda-role   \
       --region aws-region

 

 

3. Lambda 함수 생성

Lambda로 restAPI를 호출하는 기능이 필요하여 코드 상에서는 파이썬으로 API를 호출하고 있다.

import json
import urllib3
from urllib.parse import urlencode

def lambda_handler(event, context):
    http = urllib3.PoolManager()
    r = http.request('GET', 'https:///xxx.xxx.xxxtest/tests?' + urlencode(event))
    print(r.data)
    # TODO implement
    return {
        'statusCode': 200
    }

 

 

4. Postgresql function 생성

Postgresql에서 특정 테이블의 insert, update 시 Postgresql function이 호출되도록 function을 생성한다.

Lambda를 호출하려면 Lambda의 ARN을 넣으면 된다.

CREATE OR REPLACE FUNCTION public.test()
 RETURNS trigger
 LANGUAGE plpgsql
AS $function$

declare
	newRecord JSON;

	begin
		
		newRecord := row_to_json(NEW.*);
		perform
			*
		from
			aws_lambda.invoke('arn:aws:lambda:ap-northeast-2:xxxxxxx:function:test', newRecord);
		
return null;
	end;
$function$
;

 

5. Postgresql 테이블의 Trigger 생성

”Test” 테이블에 insert, update 시 trigger 이벤트가 발생하도록 생성한다.

create trigger test_trigger
after insert or update on "Test"
for each row
execute procedure test();

 

 

AWS의 공식 문서를 보면서 실제로 작성해서 테스트를 진행해봤고, IAM 정책을 놓쳐 삽질을 좀 했지만 IAM 정책 생성 후 잘 작동하는것을 확인했다.

 

참조 :

https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/PostgreSQL-Lambda.html#PostgreSQL-Lambda-invoke

반응형

관련글 더보기

댓글 영역