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 문을 명시적으로 호출할 필요가 없습니다.
아티클이 유용했나요?
훌륭합니다!
피드백을 제공해 주셔서 감사합니다.
도움이 되지 못해 죄송합니다!
피드백을 제공해 주셔서 감사합니다.
피드백 전송
소중한 의견을 수렴하여 아티클을 개선하도록 노력하겠습니다.