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
문의주신 환경을 구성하면
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 클러스터 파라미터 그룹 선택
DB에서 test 유저 생성
- Create user test indetified by’1q2w3e4r’
유저에 권한 부여
- GRANT AWS_LAMBDA_ACCEES TO test;
- Show grants; 명령어를 통해서 GRANT `AWS_LAMBDA_ACCESS`@`%` TO `test`@`%` <-이 내용을 확인할 수 있습니다.
여기까지 진행하고나서 추가로 역할 활성화가 필요합니다.
방법은 다음과 같습니다.
사용자 계정에 대한 활성화 된 역할 확인
- SELECT CURRENT_ROLE(); - 해당 구문으로 활성화 된 역할 확인
만약 활성화가 되어있지 않은 경우 역할 활성화
- SET ROLE ALL; - 해당구문으로 역할 활성화
이 후 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 문을 명시적으로 호출할 필요가 없습니다.