본문 바로가기
AWS

[AWS] RDS에서 Lambda 함수 호출 방법

by parkjp 2022. 7. 4.

 

 

* MySQL 8.0 호환 클러스터용 Aurora Mysql 3.01 버전 사용.

 

 

1. Aurora에 Lambda 엑세스 권한 부여


 a. Lambda 리소스 엑세스를 위한 IAM 정책 새로 생성 또는 AWS 관리형 정책

  아래 처럼 IAM정책을 직접 만들거나 기본 AWS 관리형 정책 (AWSLambdaRole)을 사용하여 엑세스를 부여할 수 있다.

 

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowAuroraToExampleFunction",
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": "arn:aws:lambda:<region>:<123456789012>:function:<example_function>"
        }
    ]
}

 

 

 b. IAM 역할 생성 및 정책 적용.

 IAM 역할을 새로 생성하여 해당 역할에 위에서 새로 만든 정책 또는 기존 AWSLambdaRole 권한 정책을 준다.

 

 

 c. IAM 역할을 RDS에 적용

  RDS 클러스터의 '연결 & 보안' 탭에 IAM 역할 관리 추가.

 

 

 d. RDS 파라미터 그룹 수정

RDS 왼쪽 메뉴 바에 '파라미터 그룹'에서 현재 RDS 클러스터에 적용되어 있는 DB 클러스터 파라미터 그룹에

 

'activate_all_roles_on_login'의 값을 1로 변경,

 

'aws_default_lambda_role'의 값을 위 단계에서 생성한 IAM 역할 ARN으로 변경.

 

 

 e. DB 사용자에 Permission 적용

 AWS_LAMBDA_ACCESS 역할 부여.

GRANT AWS_LAMBDA_ACCESS TO <user@domain-or-ip-address>

 

 AWS_LAMBDA_ACCESS 역할 해제.

REVOKE AWS_LAMBDA_ACCESS FROM <user@domain-or-ip-address>

 

2. lambda_sync와 lambda_async 함수

 a. lambda_sync

동기적으로 호출하여 Lambda 함수 내에서 context.succeed() 함수 또는 context.fail()함수를 사용하여 Response body정보를 받아올 수 있다.

 

ex) Lambda함수에서 context.succeed('{"status": 200}')으로 응답을 보낸다면, RDS에서 해당 값을 String으로 받을 수 있다.

(파싱을 원한다면 JSON_UNQUOTE와 JSON_EXTRACT함수를 사용.)

SELECT lambda_sync( 'arn:aws:lambda:<REGION>:<ACCOUNT_ID>:function:<YOUR_LAMBDA_FUNCTION>', '{"operation": "ping"}');

 

 

 b. lambda_async

event함수를 비동기로 호출하여 처리된다.

 

SELECT lambda_async( 'arn:aws:lambda:<REGION>:<ACCOUNT_ID>:function:<YOUR_LAMBDA_FUNCTION>', '{"operation": "ping"}');
반응형