Question

Grants for test@%

GRANT USAGE ON *.* TO `test`@`%`

GRANT ALL PRIVILEGES ON `TEST`.`is_processed` TO `test`@`%`

GRANT ALL PRIVILEGES ON `testdb`.`TEST` TO `test`@`%`

GRANT ALL PRIVILEGES ON `testdb`.`testdb` TO `test`@`%`

GRANT `AWS_LAMBDA_ACCESS`@`%` TO `test`@`%`

위와 같이 계정에 람다 액세스 권한을 부여하고, DB에도 람다 엑세스 가능한 IAM을 등록하였으나, 아래와 같은 에러가 발생하고 있습니다.

<1064: Unknown trigger has an error in its body: 'Access denied; you need (at least one of) the Invoke Lambda privilege(s) for this operation>


Answer

문의주신 환경을 구성하면 

  1.  IAM 적용 및 RDS cluster parameter 그룹에 해당 룰 첨부 

  • DB가 Lambda Function 액세스 할 수 있는 IAM 역할 생성

1.1 IAM 정책(Policy) 추가

  • IAM 정책 생성 

    • 서비스 : Lambda

    • 액세스 수준 : InvokeFunction

리소스는 특정 하여 지정할 수 있습니다.


1.2 IAM 역할(Role) 추가

  • IAM 역할 생성 

    • IAM > 역할 > 역할 생성 클릭

    • AWS Service : RDS

    • 사용 사례 : RDS - Add Role to Database

    • 연결 정책 : 1.1 에서 생성한 정책

 

     


    1.3 Aurora DB Cluster에 IAM 역할 추가

  •  RDS 클러스터에 IAM 역할 추가 


1.4 RDS Parameter Group 생성 

  •  RDS > 파라미터 그룹 > "파라미터 그룹 생성" 

    • 파라미터 그룹 패밀리 : 해당 RDS 엔진과 버전 

    • 그룹이름 : DB Cluster Parameter Group

  • 사용자 지정 파라미터그룹 선택 > 편집 

    • aws_default_lambda_role 파라미터 검색 > 수정

    • 값 : 1.2 에서 생성한 역할의 ARN


    

1.5 사용자 지정 파라미터 그룹을 RDS에 연결 

  • 클러스터 선택 > 수정

  • 추가구성 탭 DB 클러스터 파라미터 그룹 선택 


  1.  DB에서 test 유저 생성 

    - Create user test indetified by’1q2w3e4r’

  1.  유저에 권한 부여

GRANT AWS_LAMBDA_ACCEES TO test;

Show grants; 명령어를 통해서 GRANT `AWS_LAMBDA_ACCESS`@`%` TO `test`@`%` <-이 내용을 확인할 수 있습니다.


여기까지 진행하고나서 추가로 역할 활성화가 필요합니다. 

방법은 다음과 같습니다. 


  1. 사용자 계정에 대한 활성화 된 역할 확인

- SELECT CURRENT_ROLE(); - 해당 구문으로 활성화 된 역할 확인 

  1. 만약 활성화가 되어있지 않은 경우 역할 활성화 

- SET ROLE ALL; - 해당구문으로 역할 활성화 

  1. 이 후 Lambda 호출 function 을 다시 실행


해당 이슈는 Aurora MySQL 버전 3에서 역할 매개 변수를 사용하는 경우 SET ROLE role_name 또는 SET ROLE ALL문을 사용하여 역할을 활성화 합니다.

하지만, 현재 활성화 한 세션에만 영향을 미치므로 Lambda 함수를 호출하려면 SET ROLE문을 먼저 실행 하셔야 합니다.


추가적으로 위의 방법이 번거로우신 경우, 클러스터에 대해 아래의 Parameter(activate_all_roles_on_login)를 설정 하시면 Lambda에서 DB인스턴스에 연결할 때 역할이 자동으로 활성화 되도록 합니다. 이 경우 이후에는 룰을 활성화 하기 위해 SET ROLE 문을 명시적으로 호출할 필요가 없습니다. 

https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_activate_all_roles_on_login