PostgreSQL용 AlloyDB의 실패한 Identity and Access Management (IAM) 인증 로그인 시도를 진단하고 해결하려면 로그 탐색기에서 인증 알림 로그를 검사하면 됩니다.
IAM 기반 인증 실패의 원인을 파악하려면 다음 단계를 따르세요.
Google Cloud 콘솔에서 로그 탐색기 페이지로 이동합니다.
모든 리소스 드롭다운 목록에서 AlloyDB 인스턴스를 선택합니다.
심각도에서 알림을 클릭합니다.
알림 옵션이 표시되지 않는 경우, 선택한 기간 내에 기록된 인증 실패가 없다는 의미입니다. 로그 탐색기의 컨트롤을 사용해 시간 범위를 조정해야 할 수도 있습니다.
쿼리 결과에서 다음 메시지 중 하나를 포함한 로그 항목을 확인합니다.
Request had invalid authentication credentials.- 액세스 토큰이 잘못되었습니다.
Caller does not have required permission to use project.- IAM 주 구성원에 필요한 IAM 역할 또는 권한이 없습니다. 전체 오류 메시지에는 누락된 역할 또는 권한이 표시됩니다.
IAM principal does not match database user.액세스 토큰으로 지정된 인증된 IAM 주 구성원이 연결하려는 데이터베이스 사용자와 일치하지 않습니다.
토큰에 지정된 주 구성원을 확인하려면 다음 명령어를 실행하세요.
curl -H "Content-Type: application/x-www-form-urlencoded" \ -d "access_token=ACCESS_TOKEN" \ https://www.googleapis.com/oauth2/v1/tokeninfoACCESS_TOKEN을 OAuth 2.0 액세스 토큰으로 바꿉니다.이 오류는
.gserviceaccount.com서픽스가 없는 이메일 주소인 서비스 계정의 축약된 주 구성원이 63자를 초과하는 경우에도 발생합니다.PostgreSQL은 역할 및 사용자 식별자에 63자(영문 기준) 제한이 있습니다. AlloyDB에서 사용자를 만들 수 있지만 PostgreSQL은 내부 카탈로그에서 역할 이름을 63바이트로 자릅니다. 로그인 중에 AlloyDB의 IAM 인증 레이어는 OAuth 토큰의 잘리지 않은 전체 주 구성원을 잘린 데이터베이스 역할과 비교하므로 문자열 불일치가 발생합니다.
해결 방법: 서비스 계정 가장 사용
서비스 계정 이름을 줄일 수 없는 경우 서비스 계정 가장을 사용하여 이 제한을 우회할 수 있습니다. 이렇게 하면 워크로드를 실행하는 ID가 데이터베이스에 로그인하는 데 사용되는 ID와 분리됩니다.
.gserviceaccount.com서픽스를 제외한 축약된 주 구성원이 63자(영문 기준) 이하인 이름(예:db-proxy@PROJECT_ID.iam.gserviceaccount.com)으로 프록시 서비스 계정을 만듭니다.- 프록시 서비스 계정을 AlloyDB 클러스터에 추가합니다. 이때 사용자 이름이
db-proxy@PROJECT_ID.iam인IAM_BASED데이터베이스 사용자로 추가합니다. - IAM에서 워크로드의 원래 서비스 계정에 프록시 서비스 계정에 대한 서비스 계정 토큰 생성자 역할 (
roles/iam.serviceAccountTokenCreator)을 부여합니다. - 프록시 ID를 사용하여 연결하도록 애플리케이션, AlloyDB 언어 커넥터 또는 AlloyDB 인증 프록시를 구성합니다.
예를 들어
gcloud beta alloydb connect명령어를--impersonate-service-account플래그와 함께 사용하여 연결할 수 있습니다.gcloud beta alloydb connect INSTANCE_ID \ --cluster=CLUSTER_ID \ --region=REGION_ID \ --impersonate-service-account=PROXY_SERVICE_ACCOUNT_EMAIL \ --auto-iam-authn다음을 바꿉니다.
INSTANCE_ID: AlloyDB 인스턴스의 ID입니다.CLUSTER_ID: 인스턴스가 포함된 클러스터의 ID입니다.REGION_ID: 클러스터가 상주하는 리전입니다.PROXY_SERVICE_ACCOUNT_EMAIL: 프록시 서비스 계정의 전체 이메일 주소입니다.
참고: 원래 서비스 계정에는 데이터베이스에 대한 직접 로그인 액세스 권한이 필요하지 않으며 프록시 계정을 가장할 수 있는 권한만 필요합니다. 프록시 서비스 계정은 데이터베이스 권한을 보유합니다.
Request had insufficient scopes.- 액세스 토큰에
alloydb.login범위 또는cloud-platform범위가 포함되어 있지 않습니다. 두 범위 중 하나가 필요합니다.