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 정책 생성 후 잘 작동하는것을 확인했다.
참조 :
[AWS/EC2] EC2 인스턴스 시작 시 스크립트 실행 (0) | 2022.05.20 |
---|---|
[AWS/CloudFormation/Scheduler] EC2 인스턴스 CloudFormation을 사용해서 스케줄러 적용하기 (0) | 2022.05.20 |
댓글 영역