AWS Builder Center: Learn, Build and Connect with builders in the AWS community
AWS Builder Center is the official home for builders on AWS. Share and read what others are working on, follow people who inspire you, explore training and workshops, and find tools to support what you're building.
IAM 인증을 사용하여 Amazon RDS for PostgreSQL 인스턴스 또는 Aurora PostgreSQL 클러스터에 연결할 때의 오류를 해결하려면 어떻게 해야 하나요?
AWS Identity Access Management(IAM) 인증을 사용하여 Amazon Relational Database Service(Amazon RDS) for PostgreSQL 인스턴스 또는 Amazon Aurora PostgreSQL 호환 버전 클러스터에 연결하려고 할 때 오류가 발생합니다.
간략한 설명
다음과 같은 경우 ‘사용자에 대한 PAM 인증 실패’ 오류 메시지가 표시될 수 있습니다.
- IAM 인증이 비활성화됨
- IAM 정책에 rds-db:connect 작업이 포함되지 않음
- rds_iam 역할이 데이터베이스 사용자와 연결되지 않음
- 연결이 올바르지 않음
- 잘못된 IAM 역할이 사용됨
해결 방법
참고: AWS Command Line Interface(AWS CLI) 명령을 실행할 때 오류가 발생하면 AWS CLI의 오류 해결을 참조하세요. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하세요.
IAM 인증이 비활성화됨
기본적으로 IAM 인증은 비활성화되어 있습니다. Amazon RDS for PostgreSQL 인스턴스 또는 Aurora PostgreSQL 호환 클러스터용 Amazon RDS에 대한 IAM 인증을 활성화하세요.
IAM 정책에 rds-db:connect 작업이 포함되지 않음
IAM 데이터베이스 인증을 사용하여 DB 인스턴스에 연결하려면 rds-db:connect 작업을 포함하도록 정책을 업데이트하세요.
다음은 정책 예시입니다.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "rds-db:connect" ], "Resource": [ "arn:aws:rds-db:region:account-id:dbuser:(DbiResourceId for RDS PostgreSQL or DbClusterResourceId for Aurora PostgreSQL)/db_user_name" ] } ] }
참고: 정책에 올바른 리소스 ID와 Amazon 리소스 이름(ARN)을 사용해야 합니다.
DB 인스턴스의 리소스 ID를 찾으려면 Amazon Aurora 및 RDS 콘솔에서 DB 인스턴스 또는 클러스터를 선택하고 구성 탭을 선택합니다. 자세한 내용은 IAM 데이터베이스 액세스를 위한 IAM 정책 생성 및 사용을 참조하세요.
참고: IAM 인증은 정책 문의 조건 요소에서 서비스별 또는 글로벌 조건 컨텍스트 키를 지원하지 않습니다.
rds_iam 역할이 데이터베이스 사용자와 연결되지 않음
PostgreSQL에서 IAM 인증을 사용하려면 데이터베이스 사용자가 rds_iam 역할을 맡아야 합니다. 이 역할이 사용자와 연결되어 있는지 확인하려면 PostgreSQL 클라이언트에서 다음 명령을 실행합니다.
\du
예상 출력은 다음과 같습니다.
List of roles Role name | Attributes | Member of ----------------+------------------------------------------------------------+------------------------------------------------------------- db_user_name | | {rds_iam} postgres | Create role, Create DB | {rds_superuser} | Password valid until infinity |
모든 플랫폼에서 다음 쿼리를 실행할 수도 있습니다.
SELECT r.rolname, ARRAY( SELECT b.rolname FROM pg_catalog.pg_auth_members m JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid) WHERE m.member = r.oid ) AS memberof FROM pg_catalog.pg_roles r WHERE r.rolname !~ '^pg_' ORDER BY 1;
사용자를 만들고 rds_iam 역할을 부여하려면 다음 명령을 실행합니다.
CREATE USER db_user_name WITH LOGIN; GRANT rds_iam TO db_user_name;
연결이 올바르지 않음
인증 토큰에는 명령줄에서 사용하기 어려울 수 있는 여러 문자가 포함되어 있습니다. 대신 인증 토큰을 환경 변수에 저장하세요. 그런 다음 Aurora PostgreSQL 클러스터에 연결할 때 환경 변수를 사용합니다.
다음은 환경 변수를 사용한 인증 토큰 생성의 예시입니다.
export RDSHOST='aurorapostgresql.cluster-abcdef12ghi.us-east-1.rds.amazonaws.com' export PGPASSWORD="$(aws rds generate-db-auth-token --hostname $RDSHOST --port 5432 --region us-east-1 --username db_user_name)" psql "host=$RDSHOST port=5432 sslmode=verify-full sslrootcert=global-bundle.pem dbname=postgres user=db_user_name password=$PGPASSWORD"
클라이언트가 SSL/TLS 연결 없이 DB 인스턴스에 연결하려고 하면 다음 오류가 발생합니다.
"FATAL: no pg_hba.conf entry for host "host.ip", user "<username>", database "postgres", SSL off FATAL: password authentication failed for user "db_user_name""
IAM 데이터베이스 인증에는 SSL/TLS 연결이 필요합니다. DB 인스턴스와 주고받는 모든 데이터는 암호화되기 때문입니다. 앞선 오류를 방지하려면 SSL/TLS 연결을 사용해야 합니다. sslmode 옵션을 verify-full로 사용하고 연결 문자열의 sslrootcert 옵션에 인증서를 제공하는 것이 모범 사례입니다.
최신 인증 기관(CA) 인증서를 다운로드하려면 SSL/TLS를 사용하여 DB 클러스터에 대한 연결 암호화를 참조하세요.
잘못된 IAM 역할이 사용됨
인증 토큰을 생성할 때 잘못된 IAM 역할을 사용하는 경우 오류 메시지가 표시될 수 있습니다. 현재 IAM 사용자가 맡은 역할을 확인하려면 get-caller-identity 명령을 실행합니다.
aws sts get-caller-identity
맡은 역할이 잘못된 경우 IAM 사용자를 올바른 IAM 역할로 전환하거나 올바른 역할을 맡으세요. 오류 메시지가 계속 표시되면 AWS 계정이 AWS Organizations 조직에 속하는지 확인하세요. 계정이 조직에 속한 경우, **rds-db:**를 허용하는 서비스 제어 정책(SCP)을 생성하세요. 자세한 내용은 SCP가 권한에 미치는 영향을 참조하세요.
또한 rds-db: 권한이 없는 IAM 사용자 계층 구조가 있는지 확인합니다. 자세한 내용은 서비스 제어 정책을 사용하여 AWS Organizations의 계정 간에 권한 가드레일을 설정하는 방법을 참조하세요.
IAM 엔터티에 대한 권한 경계를 사용하는 경우 IAM 사용자 또는 역할에 rds-db:connect 작업을 허용하세요. 사용자의 권한 경계를 수정하려면 사용자의 권한 경계 변경을 참조하세요.
다른 AWS 계정에서 연결
다른 AWS 계정에서 Aurora PostgreSQL 호환 클러스터에 연결하는 경우 클러스터 계정의 임시 자격 증명을 사용하여 인증 토큰을 생성하세요. 다음 assume-role AWS CLI 명령을 실행하여 클러스터 계정의 역할을 맡습니다.
aws sts assume-role \ --role-arn arn:aws:iam::CLUSTER-ACCOUNT-ID:role/ROLE-NAME \ --role-session-name cross-account-session
참고: CLUSTER-ACCOUNT-ID를 클러스터가 있는 AWS 계정 ID로 바꾸고 ROLE-NAME을 IAM 역할 이름으로 바꿉니다.
그런 다음 임시 자격 증명을 내보내고 인증 토큰을 생성합니다.
export AWS_ACCESS_KEY_ID=TEMPORARY-ACCESS-KEY export AWS_SECRET_ACCESS_KEY=TEMPORARY-SECRET-KEY export AWS_SESSION_TOKEN=TEMPORARY-SESSION-TOKEN export PGPASSWORD="$(aws rds generate-db-auth-token --hostname CLUSTER-ENDPOINT --port 5432 --region REGION --username DB-USER-NAME)"
참고: TEMPORARY-ACCESS-KEY, TEMPORARY-SECRET-KEY 및 TEMPORARY-SESSION-TOKEN을 assume-role 결과의 값으로 교체합니다. CLUSTER-ENDPOINT를 클러스터 엔드포인트로, REGION을 AWS 리전으로, DB-USER-NAME을 데이터베이스 사용자 이름으로 교체합니다.
소스 계정의 자격 증명을 사용하여 토큰을 직접 생성하면, 모든 IAM 정책과 신뢰 관계가 올바르게 구성되어 있더라도 ‘암호 인증 실패’ 오류가 발생합니다. 토큰은 클러스터와 동일한 계정에 속한 자격 증명에서 생성되어야 합니다.

