

# Aurora MySQL 네이티브 함수로 Lambda 함수 호출
<a name="AuroraMySQL.Integrating.NativeLambda"></a>

**참고**  
Aurora MySQL 버전 2 또는 Aurora MySQL 3.01 이상을 사용하는 경우 `lambda_sync` 및 `lambda_async` 네이티브 함수를 호출할 수 있습니다. Aurora MySQL 버전에 대한 자세한 내용은 [Amazon Aurora MySQL에 대한 데이터베이스 엔진 업데이트Amazon Aurora MySQL 장기 지원(LTS) 및 베타 릴리스](AuroraMySQL.Updates.md) 단원을 참조하십시오.

네이티브 함수 `lambda_sync` 및 `lambda_async`를 호출하여 Aurora MySQL DB 클러스터에서 AWS Lambda 함수를 호출할 수 있습니다. 이 방식은 Aurora MySQL에서 실행 중인 데이터베이스를 다른 AWS 서비스와 통합하려는 경우에 유용합니다. 예를 들어 데이터베이스의 특정 테이블에 행이 삽입될 때마다 Amazon Simple Notification Service(Amazon SNS)를 사용하여 알림을 보낼 수 있습니다.

**Contents**
+ [Lambda 함수를 호출하기 위해 네이티브 함수로 작업](#AuroraMySQL.Integrating.NativeLambda.lambda_functions)
  + [Aurora MySQL 버전 3에서의 역할 부여](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.v3)
  + [Aurora MySQL 버전 2에서의 권한 부여](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.v2)
  + [lambda\$1sync 함수의 구문](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.Sync.Syntax)
  + [lambda\$1sync 함수의 파라미터](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.Sync.Parameters)
  + [lambda\$1sync 함수의 예](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.Sync.Example)
  + [lambda\$1async 함수의 구문](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.Async.Syntax)
  + [lambda\$1async 함수의 파라미터](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.Async.Parameters)
  + [lambda\$1async 함수의 예](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.Async.Example)
  + [트리거 내에서 Lambda 함수 호출](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.trigger)

## Lambda 함수를 호출하기 위해 네이티브 함수로 작업
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions"></a>

`lambda_sync` 및 `lambda_async` 함수는 내장된 네이티브 함수이며 동기적 또는 비동기적으로 Lambda 함수를 호출합니다. 다른 작업으로 넘어가기 전에 Lambda 함수의 결과를 알아야 하는 경우, 동기식 함수 `lambda_sync`를 사용합니다. 다른 작업으로 넘어가기 전에 Lambda함수의 결과를 알 필요가 없는 경우, 비동기식 함수 `lambda_async`를 사용합니다.

### Aurora MySQL 버전 3에서의 역할 부여
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.v3"></a>

Aurora MySQL 버전 3에서는 네이티브 함수를 호출하는 사용자에게는 `AWS_LAMBDA_ACCESS` 역할이 부여되어야 합니다. 사용자에게 이 역할을 부여하려면 관리자 사용자로 DB 인스턴스에 연결하고 다음 명령문을 실행합니다.

```
GRANT AWS_LAMBDA_ACCESS TO user@domain-or-ip-address
```

다음 명령문을 실행하여 이 역할을 호출할 수 있습니다.

```
REVOKE AWS_LAMBDA_ACCESS FROM user@domain-or-ip-address
```

**작은 정보**  
Aurora MySQL 버전 3에서 역할을 사용하는 경우 `SET ROLE role_name` 또는 `SET ROLE ALL` 문을 사용하여 해당 역할을 활성화할 수도 있습니다. MySQL 8.0 역할 시스템에 익숙하지 않을 경우 [역할 기반 권한 모델](AuroraMySQL.Compare-80-v3.md#AuroraMySQL.privilege-model)에서 자세한 내용을 확인할 수 있습니다. 자세한 내용은 **MySQL 참조 설명서의 [역할 사용](https://dev.mysql.com/doc/refman/8.0/en/roles.html)을 참조하세요.  
이는 현재 활성 세션에만 적용됩니다. 다시 연결할 때 권한을 부여하려면 `SET ROLE` 문을 다시 실행해야 합니다. 자세한 내용은 **MySQL 참조 매뉴얼의 [SET ROLE 문](https://dev.mysql.com/doc/refman/8.0/en/set-role.html)을 참조하세요.  
`activate_all_roles_on_login` DB 클러스터 파라미터로 사용자가 DB 인스턴스에 연결할 때 모든 역할을 자동으로 활성화할 수 있습니다. 이 파라미터를 설정하면 역할을 활성화하는 데 `SET ROLE` 문을 명시적으로 직접 호출할 필요가 없습니다. 자세한 내용은 *MySQL Reference Manual*(MySQL 참조 매뉴얼)의 [activate\$1all\$1roles\$1on\$1login](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_activate_all_roles_on_login)을 참조하세요.  
하지만 다른 사용자가 저장 프로시저를 직접 호출한 경우에는 저장 프로시저를 시작할 때 명시적으로 `SET ROLE ALL`을 직접 호출하여 역할을 활성화해야 합니다.

Lambda 함수를 간접적으로 호출하려고 할 때 다음과 같은 오류가 발생하면 `SET ROLE` 문을 실행합니다.

```
SQL Error [1227] [42000]: Access denied; you need (at least one of) the Invoke Lambda privilege(s) for this operation
```

`mysql.users` 테이블 항목에 표시된 대로 올바른 사용자에게 역할을 부여하고 있는지 확인합니다. 이름이 동일하지만 호스트가 다른 사용자가 여러 명 있을 수 있습니다. `lambda_sync` 함수를 간접 호출하는 애플리케이션 또는 호스트에 따라 MySQL은 `host` 열 항목을 기준으로 가장 일치하는 사용자를 선택합니다.

### Aurora MySQL 버전 2에서의 권한 부여
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.v2"></a>

Aurora MySQL 버전 2에서 네이티브 함수를 호출하는 사용자에게는 `INVOKE LAMBDA` 권한이 부여되어야 합니다. 사용자에게 이 권한을 부여하려면 관리자 사용자로 DB 인스턴스에 연결하고 다음 명령문을 실행합니다.

```
GRANT INVOKE LAMBDA ON *.* TO user@domain-or-ip-address
```

다음 명령문을 실행하여 이 권한을 호출할 수 있습니다.

```
REVOKE INVOKE LAMBDA ON *.* FROM user@domain-or-ip-address
```

### lambda\$1sync 함수의 구문
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.Sync.Syntax"></a>

`lambda_sync` 호출 유형으로 `RequestResponse` 함수를 동기식으로 호출합니다. 함수가 JSON 페이로드에서 Lambda 호출 결과를 반환합니다. 함수에는 다음과 같은 구문이 있습니다.

```
lambda_sync (
  lambda_function_ARN,
  JSON_payload
)
```

### lambda\$1sync 함수의 파라미터
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.Sync.Parameters"></a>

`lambda_sync` 함수에는 다음과 같은 파라미터가 있습니다.

* lambda\$1function\$1ARN *  
호출할 Lambda 함수의 Amazon 리소스 이름(ARN)입니다.

* JSON\$1payload *  
JSON 형식으로 호출된 Lambda 함수의 페이로드입니다.

**참고**  
Aurora MySQL 버전 3은 MySQL 8.0의 JSON 구문 분석 함수를 지원합니다. 그러나 Aurora MySQL 버전 2에는 이러한 함수가 포함되어 있지 않습니다. Lambda 함수가 숫자 또는 문자열과 같은 원자 값을 반환할 때 JSON 구문 분석이 필요하지 않습니다.

### lambda\$1sync 함수의 예
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.Sync.Example"></a>

`lambda_sync`를 기반으로 하는 다음 쿼리는 함수 ARN을 사용하여 Lambda 함수 `BasicTestLambda`를 동기식으로 호출합니다. 함수에 대한 페이로드는 `{"operation": "ping"}`입니다.

```
SELECT lambda_sync(
    'arn:aws:lambda:us-east-1:123456789012:function:BasicTestLambda',
    '{"operation": "ping"}');
```

### lambda\$1async 함수의 구문
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.Async.Syntax"></a>

`lambda_async` 호출 유형으로 `Event` 함수를 비동기식으로 호출합니다. 함수가 JSON 페이로드에서 Lambda 호출 결과를 반환합니다. 함수에는 다음과 같은 구문이 있습니다.

```
lambda_async (
  lambda_function_ARN,
  JSON_payload
)
```

### lambda\$1async 함수의 파라미터
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.Async.Parameters"></a>

`lambda_async` 함수에는 다음과 같은 파라미터가 있습니다.

* lambda\$1function\$1ARN *  
호출할 Lambda 함수의 Amazon 리소스 이름(ARN)입니다.

* JSON\$1payload *  
JSON 형식으로 호출된 Lambda 함수의 페이로드입니다.

**참고**  
Aurora MySQL 버전 3은 MySQL 8.0의 JSON 구문 분석 함수를 지원합니다. 그러나 Aurora MySQL 버전 2에는 이러한 함수가 포함되어 있지 않습니다. Lambda 함수가 숫자 또는 문자열과 같은 원자 값을 반환할 때 JSON 구문 분석이 필요하지 않습니다.

### lambda\$1async 함수의 예
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.Async.Example"></a>

`lambda_async`를 기반으로 하는 다음 쿼리는 함수 ARN을 사용하여 Lambda 함수 `BasicTestLambda`를 비동기식으로 호출합니다. 함수에 대한 페이로드는 `{"operation": "ping"}`입니다.

```
SELECT lambda_async(
    'arn:aws:lambda:us-east-1:123456789012:function:BasicTestLambda',
    '{"operation": "ping"}');
```

### 트리거 내에서 Lambda 함수 호출
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.trigger"></a>

트리거를 사용하여 데이터 수정 문에서 Lambda을 호출할 수 있습니다. 다음 예제에서는 `lambda_async` 기본 함수를 사용하고 결과를 변수에 저장합니다.

```
mysql>SET @result=0;
mysql>DELIMITER //
mysql>CREATE TRIGGER myFirstTrigger
      AFTER INSERT
          ON Test_trigger FOR EACH ROW
      BEGIN
      SELECT lambda_async(
          'arn:aws:lambda:us-east-1:123456789012:function:BasicTestLambda',
          '{"operation": "ping"}')
          INTO @result;
      END; //
mysql>DELIMITER ;
```

**참고**  
트리거는 SQL 문당 한 번이 아니라 수정된 행당 한 번 실행되며 한 번에 한 행씩 실행됩니다. 트리거가 실행되면 프로세스는 동기식입니다. 트리거가 완료될 때만 데이터 수정 문이 반환합니다.  
쓰기 트래픽이 높은 테이블의 트리거에서 AWS Lambda 함수를 호출할 때는 주의해야 합니다. `INSERT`, `UPDATE` 및 `DELETE` 트리거는 행별로 활성화됩니다. `INSERT`, `UPDATE` 또는 `DELETE` 트리거가 있는 테이블에서 쓰기가 많은 워크로드는 AWS Lambda 함수에 다량의 호출을 야기합니다.