

# Amazon RDS의 자격 증명 및 액세스 관리
<a name="UsingWithRDS.IAM"></a>





AWS Identity and Access Management(IAM)은 관리자가 AWS 리소스에 대한 액세스를 안전하게 제어할 수 있도록 지원하는 AWS 서비스입니다. IAM 관리자는 어떤 사용자가 Amazon RDS 리소스를 사용할 수 있도록 *인증*(로그인)되고 *권한이 부여*(권한 있음)될 수 있는지 제어합니다. IAM은 추가 비용 없이 사용할 수 있는 AWS 서비스입니다.

**Topics**
+ [고객](#security_iam_audience)
+ [자격 증명을 통한 인증](#security_iam_authentication)
+ [정책을 사용하여 액세스 관리](#security_iam_access-manage)
+ [Amazon RDS에서 IAM을 사용하는 방법](security_iam_service-with-iam.md)
+ [Amazon RDS 자격 증명 기반 정책 예](security_iam_id-based-policy-examples.md)
+ [AWSAmazon RDS에 대한 관리형 정책](rds-security-iam-awsmanpol.md)
+ [AWS 관리형 정책에 대한 Amazon RDS 업데이트](rds-manpol-updates.md)
+ [교차 서비스 혼동된 대리자 문제 방지](cross-service-confused-deputy-prevention.md)
+ [MariaDB, MySQL 및 PostgreSQL IAM 데이터베이스 인증](UsingWithRDS.IAMDBAuth.md)
+ [Amazon RDS 자격 증명 및 액세스 문제 해결](security_iam_troubleshoot.md)

## 고객
<a name="security_iam_audience"></a>

AWS Identity and Access Management(IAM)를 사용하는 방법은 Amazon RDS에서 수행하는 작업에 따라 달라집니다.

**서비스 사용자** – Amazon RDS 서비스를 사용하여 작업을 수행하는 경우 필요한 자격 증명과 권한을 관리자가 제공합니다. 더 많은 Amazon RDS 기능을 사용하여 작업을 수행하게 되면 추가 권한이 필요할 수 있습니다. 액세스 권한 관리 방식을 이해하면 적절한 권한을 관리자에게 요청할 수 있습니다. Amazon RDS의 기능에 액세스할 수 없는 경우 [Amazon RDS 자격 증명 및 액세스 문제 해결](security_iam_troubleshoot.md) 섹션을 참조하십시오.

**서비스 관리자** – 회사에서 Amazon RDS 리소스를 책임지고 있는 경우 Amazon RDS에 대한 전체 액세스를 가지고 있을 것입니다. 서비스 관리자는 직원이 액세스해야 하는 Amazon RDS 기능과 리소스를 결정합니다. 그런 다음 관리자에게 요청을 제출하여 서비스 사용자의 권한을 변경합니다. 이 페이지의 정보를 검토하여 IAM의 기본 개념을 이해하세요. 회사가 Amazon RDS에서 IAM을 사용하는 방법에 대해 자세히 알아보려면 [Amazon RDS에서 IAM을 사용하는 방법](security_iam_service-with-iam.md) 섹션을 참조하십시오.

**관리자** – 관리자는 Amazon RDS에 대한 액세스 권한을 관리하는 정책을 작성하는 방법에 대해 자세히 알아보는 것이 좋습니다. IAM에서 사용할 수 있는 예제 Amazon RDS 자격 증명 기반 정책 예제를 보려면 [Amazon RDS 자격 증명 기반 정책 예](security_iam_id-based-policy-examples.md) 섹션을 참조하십시오.

## 자격 증명을 통한 인증
<a name="security_iam_authentication"></a>

인증은 ID 자격 증명을 사용하여 AWS에 로그인하는 방식입니다. AWS 계정 루트 사용자나 IAM 사용자로 또는 IAM 역할을 수임하여 인증받아야 합니다.

AWS IAM Identity Center(IAM Identity Center), Single Sign-On 인증 또는 Google/Facebook 자격 증명과 같은 자격 증명 소스의 자격 증명을 사용하여 페더레이션 자격 증명으로 로그인할 수 있습니다. 로그인하는 방법에 대한 자세한 내용은 *AWS Sign-In 사용 설명서*의 [AWS 계정에 로그인하는 방법](https://docs.aws.amazon.com/signin/latest/userguide/how-to-sign-in.html) 섹션을 참조하세요.

프로그래밍 방식 액세스를 위해 AWS는 요청에 암호화 방식으로 서명할 수 있는 SDK 및 CLI를 제공합니다. 자세한 내용은 *IAM 사용 설명서*의 [API 요청용 AWS Signature Version 4](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv.html) 섹션을 참조하세요.

### AWS 계정 루트 사용자
<a name="security_iam_authentication-rootuser"></a>

 AWS 계정을 생성하는 경우에는 모든 AWS 서비스 서비스와 리소스에 대한 완전한 액세스 권한이 있는 AWS 계정 *루트 사용자*라는 단일 로그인 자격 증명으로 시작합니다. 일상적인 작업에 루트 사용자를 사용하지 않을 것을 강력히 권장합니다. 루트 사용자 자격 증명이 필요한 작업은 *IAM 사용 설명서*의 [루트 사용자 자격 증명이 필요한 작업](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#root-user-tasks) 섹션을 참조하세요.

### 페더레이션 자격 증명
<a name="security_iam_authentication-federatedidentity"></a>

가장 좋은 방법은 인간 사용자가 ID 제공업체와의 페더레이션을 사용하여 임시 보안 인증으로 AWS 서비스에 액세스하도록 하는 것입니다.

*페더레이션 자격 증명*은 엔터프라이즈 사용자 디렉터리, 웹 ID 제공업체 또는 Directory Service의 사용자로, 자격 증명 소스의 자격 증명을 사용하여 AWS 서비스에 액세스합니다. 페더레이션 자격 증명은 임시 자격 증명을 제공하는 역할을 수임합니다.

중앙 집중식 액세스 관리를 위해 AWS IAM Identity Center를 추천합니다. 자세한 정보는 *AWS IAM Identity Center 사용 설명서*의 [IAM Identity Center란 무엇인가요?](https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html) 섹션을 참조하세요.

### IAM 사용자 및 그룹
<a name="security_iam_authentication-iamuser"></a>

*[IAM 사용자](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html)*는 단일 개인 또는 애플리케이션에 대한 특정 권한을 가진 자격 증명입니다. 장기 자격 증명이 있는 IAM 사용자 대신 임시 자격 증명을 사용하는 것이 좋습니다. 자세한 내용은 *IAM 사용 설명서*에서 [임시 자격 증명을 사용하여 AWS에 액세스하려면 인간 사용자가 ID 공급자와의 페더레이션을 사용하도록 요구](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#bp-users-federation-idp)를 참조하세요.

[https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups.html)은 IAM 사용자 모음을 지정하고 대규모 사용자 집합에 대한 권한 관리를 더 쉽게 만듭니다. 자세한 내용은 *IAM 사용 설명서*의 [IAM 사용자 사용 사례](https://docs.aws.amazon.com/IAM/latest/UserGuide/gs-identities-iam-users.html) 섹션을 참조하세요. 

IAM 데이터베이스 인증을 사용하여 DB 인스턴스에 인증할 수 있습니다.

IAM 데이터베이스 인증은 다음 DB 엔진에서 유효합니다.
+ RDS for MariaDB
+ RDS for MySQL
+ RDS for PostgreSQL

 IAM을 사용한 DB 인스턴스 인증에 대한 자세한 내용은 [MariaDB, MySQL 및 PostgreSQL IAM 데이터베이스 인증](UsingWithRDS.IAMDBAuth.md) 섹션을 참조하세요.

### IAM 역할
<a name="security_iam_authentication-iamrole"></a>

[IAM 역할](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)**은 특정 권한을 가지고 있는 AWS 계정 계정 내 ID입니다. 이 역할은 사용자와 비슷하지만, 특정 개인과 연결되지 않습니다. [역할 전환](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-console.html)하여 AWS Management Console에서 IAM 역할을 임시로 수임할 수 있습니다. AWS CLI 또는 AWS API 작업을 호출하거나 사용자 지정 URL을 사용하여 역할을 수임할 수 있습니다. 역할 사용 방법에 대한 자세한 정보는 *IAM 사용 설명서*의 [IAM 역할 사용](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html)을 참조하세요.

임시 자격 증명이 있는 IAM 역할은 다음과 같은 상황에서 유용합니다.
+ ****임시 사용자 권한 - 사용자는 IAM 역할을 수임하여 특정 작업에 대한 다양한 권한을 임시로 받을 수 있습니다.
+ **페더레이션 사용자 액세스** - 페더레이션 ID에 권한을 부여하려면 역할을 생성하고 해당 역할의 권한을 정의합니다. 페더레이션 ID가 인증되면 역할이 연결되고 역할에 정의된 권한이 부여됩니다. 페더레이션 관련 역할에 대한 자세한 내용은 *IAM 사용 설명서*의 [Create a role for a third-party identity provider (federation)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp.html)를 참조하세요. IAM Identity Center를 사용하는 경우, 권한 집합을 구성합니다. 인증 후 ID가 액세스할 수 있는 항목을 제어하기 위해 IAM Identity Center는 권한 집합을 IAM의 역할과 연관짓습니다. 권한 집합에 대한 자세한 내용은 *AWS IAM Identity Center 사용 설명서*의 [권한 집합](https://docs.aws.amazon.com/singlesignon/latest/userguide/permissionsetsconcept.html)을 참조하세요.
+ **교차 계정 액세스** - IAM 역할을 사용하여 다른 계정의 사용자(신뢰할 수 있는 보안 주체)가 내 계정의 리소스에 액세스하도록 허용할 수 있습니다. 역할은 교차 계정 액세스를 부여하는 기본적인 방법입니다. 그러나 일부 AWS 서비스를 사용하면 (역할을 프록시로 사용하는 대신) 리소스에 정책을 직접 연결할 수 있습니다. 크로스 계정 액세스를 위한 역할과 리소스 기반 정책의 차이점을 알아보려면 *IAM 사용 설명서*의 [IAM 역할과 리소스 기반 정책의 차이](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_compare-resource-policies.html)를 참조하십시오.
+ **교차 서비스 액세스** - 일부 AWS 서비스는 다른 AWS 서비스의 기능을 사용합니다. 예를 들어, 서비스에서 호출하면 일반적으로 해당 서비스는 Amazon EC2에서 애플리케이션을 실행하거나 Amazon S3에 객체를 저장합니다. 서비스는 직접적으로 호출하는 위탁자의 권한을 사용하거나, 서비스 역할을 사용하거나, 또는 서비스 연결 역할을 사용하여 이 작업을 수행할 수 있습니다.
  + **전달 액세스 세션** – 전달 액세스 세션(FAS)은 AWS 서비스를 직접적으로 호출하는 위탁자의 권한과 요청하는 AWS 서비스를 함께 사용하여 다운스트림 서비스에 대한 요청을 수행합니다. FAS 요청 시 정책 세부 정보는 [전달 액세스 세션](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_forward_access_sessions.html)을 참조하세요.
  + **서비스 역할** - 서비스 역할은 서비스가 사용자를 대신하여 작업을 수행하기 위해 맡는 [IAM 역할](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)입니다. IAM 관리자는 IAM 내에서 서비스 역할을 생성, 수정 및 삭제할 수 있습니다. 자세한 정보는 *IAM 사용 설명서*의 [Create a role to delegate permissions to an AWS 서비스](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)를 참조하세요.
  + **서비스 연결 역할** – 서비스 연결 역할은 AWS 서비스에 연결된 서비스 역할의 한 유형입니다. 서비스는 사용자를 대신하여 작업을 수행하기 위해 역할을 수임할 수 있습니다. 서비스 링크 역할은 AWS 계정에 나타나고, 서비스가 소유합니다. IAM 관리자는 서비스 연결 역할의 권한을 볼 수 있지만 편집할 수는 없습니다.
+ **Amazon EC2에서 실행 중인 애플리케이션** – IAM 역할을 사용하여 EC2 인스턴스에서 실행되고 AWS CLI 또는 AWS API 요청을 수행하는 애플리케이션의 임시 자격 증명을 관리할 수 있습니다. 이는 EC2 인스턴스 내에 액세스 키를 저장할 때 권장되는 방법입니다. EC2 인스턴스에 AWS역할을 할당하고 해당 역할을 모든 애플리케이션에서 사용할 수 있도록 하려면 인스턴스에 연결된 인스턴스 프로필을 생성합니다. 인스턴스 프로필에는 역할이 포함되어 있으며 EC2 인스턴스에서 실행되는 프로그램이 임시 보안 인증을 얻을 수 있습니다. 자세한 정보는 *IAM 사용 설명서*의 [IAM 역할을 사용하여 Amazon EC2 인스턴스에서 실행되는 애플리케이션에 권한 부여](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2.html)를 참조하세요.

IAM 역할을 사용할지 여부를 알아보려면 *IAM 사용 설명서*의 [사용자 대신 IAM 역할을 생성해야 하는 경우](https://docs.aws.amazon.com/IAM/latest/UserGuide/id.html#id_which-to-choose_role)를 참조하십시오.

## 정책을 사용하여 액세스 관리
<a name="security_iam_access-manage"></a>

정책을 생성하고 IAM 자격 증명 또는 AWS 리소스에 연결하여 AWS에서 액세스를 제어합니다. 정책은 자격 증명이나 리소스와 연결될 때 해당 권한을 정의하는 AWS의 객체입니다. AWS는 엔터티(루트 사용자, 사용자 또는 IAM 역할)가 요청을 보낼 때 이러한 정책을 평가합니다. 정책에서 권한은 요청이 허용되거나 거부되는 지를 결정합니다. 대부분의 정책은 AWS에 JSON 문서로 저장됩니다. JSON 정책 문서의 구조와 콘텐츠에 대한 자세한 내용은 *IAM 사용 설명서*의 [JSON 정책 개요](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#access_policies-json)를 참조하세요.

관리자는 AWS 리소스에 액세스할 수 있는 사람과 해당 리소스에 대해 수행할 수 있는 작업을 지정할 수 있습니다. 모든 IAM 엔터티(권한 세트 또는 역할)는 처음에는 권한이 없습니다. 다시 말해, 기본적으로 사용자는 아무 작업도 수행할 수 없으며, 자신의 암호를 변경할 수도 없습니다. 사용자에게 태스크를 수행할 권한을 부여하기 위해 관리자는 사용자에게 권한 정책을 연결해야 합니다. 또한 관리자는 의도한 권한을 가지고 있는 그룹에 사용자를 추가할 수 있습니다. 관리자가 그룹에 권한을 부여하면 그룹의 모든 사용자가 해당 권한을 받습니다.

IAM 정책은 태스크를 수행하기 위해 사용하는 방법과 상관없이 작업에 대한 권한을 정의합니다. 예를 들어, `iam:GetRole` 작업을 허용하는 정책이 있다고 가정합니다. 해당 정책이 있는 사용자는 AWS Management Console, AWS CLI 또는 AWS API에서 역할 정보를 가져올 수 있습니다.

### ID 기반 정책
<a name="security_iam_access-manage-id-based-policies"></a>

자격 증명 기반 정책은 권한 세트나 역할과 같은 자격 증명에 연결할 수 있는 JSON 권한 정책 문서입니다. 이러한 정책은 자격 증명이 수행할 수 있는 작업, 대상 리소스 및 이에 관한 조건을 제어합니다. 자격 증명 기반 정책을 생성하는 방법을 알아보려면 *IAM 사용 설명서*의 [IAM 정책 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)을 참조하십시오.

보안 인증 기반 정책은 *인라인 정책* 또는 *관리형 정책*으로 한층 더 분류할 수 있습니다. 인라인 정책은 단일 권한 세트 또는 역할에 직접 포함됩니다. 관리형 정책은 AWS 계정에 속한 다수의 권한 세트 및 역할에 추가할 수 있는 독립형 정책입니다. 관리형 정책에는 AWS관리형 정책과 고객 관리형 정책이 포함되어 있습니다. 관리형 정책 또는 인라인 정책을 선택하는 방법을 알아보려면 *IAM 사용 설명서*의 [관리형 정책과 인라인 정책의 선택](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#choosing-managed-or-inline)을 참조하세요.

Amazon RDS와 관련된 AWS 관리형 정책에 대한 자세한 내용은 [AWSAmazon RDS에 대한 관리형 정책](rds-security-iam-awsmanpol.md) 섹션을 참조하세요.

### 기타 정책 타입
<a name="security_iam_access-manage-other-policies"></a>

AWS는 비교적 일반적이지 않은 추가 정책 유형을 지원합니다. 이러한 정책 타입은 더 일반적인 정책 유형에 따라 사용자에게 부여되는 최대 권한을 설정할 수 있습니다.
+ ****권한 경계 – 권한 경계는 자격 증명 기반 정책에 따라 IAM 엔터티(권한 세트 또는 역할)에 부여할 수 있는 최대 권한을 설정하는 고급 기능입니다. 엔터티에 대한 권한 경계를 설정할 수 있습니다. 그 결과로 얻는 권한은 개체의 자격 증명 기반 정책과 그 권한 경계의 교집합입니다. `Principal` 필드에서 권한 세트 또는 역할을 지정하는 리소스 기반 정책은 권한 경계를 통해 제한되지 않습니다. 이러한 정책 중 하나에 포함된 명시적 거부는 허용을 재정의합니다. 권한 경계에 대한 자세한 내용은 *IAM 사용 설명서*의 [IAM 개체에 대한 권한 경계](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html)를 참조하세요.
+ **서비스 제어 정책(SCP)** – SCP는 AWS Organizations에서 조직 또는 조직 단위(OU)에 최대 권한을 지정하는 JSON 정책입니다. AWS Organizations는 기업이 소유하는 여러 개의 AWS 계정을 그룹화하고 중앙에서 관리하기 위한 서비스입니다. 조직에서 모든 특성을 활성화할 경우, 서비스 제어 정책(SCP)을 임의의 또는 모든 계정에 적용할 수 있습니다. SCP는 각 AWS 계정 루트 사용자을 비롯하여 멤버 계정의 엔터티에 대한 권한을 제한합니다. 조직 및 SCP에 대한 자세한 정보는 *AWS Organizations 사용 설명서*의 [SCP 작동 방식](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_about-scps.html)을 참조하십시오.
+ **세션 정책** – 세션 정책은 역할 또는 페더레이션 사용자에 대해 임시 세션을 프로그래밍 방식으로 생성할 때 파라미터로 전달하는 고급 정책입니다. 결과적으로 얻는 세션의 권한은 권한 세트 또는 역할의 자격 증명 기반 정책과 세션 정책이 만나는 지점입니다. 또한 권한을 리소스 기반 정책에서 가져올 수도 있습니다. 이러한 정책 중 하나에 포함된 명시적 거부는 허용을 재정의합니다. 자세한 내용은 *IAM 사용 설명서*의 [세션 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session)을 참조하세요.

### 여러 정책 유형
<a name="security_iam_access-manage-multiple-policies"></a>

여러 정책 유형이 요청에 적용되는 경우, 결과 권한은 이해하기가 더 복잡합니다. 여러 정책 유형이 관련될 때 AWS가 요청을 허용할지를 결정하는 방법을 알아보려면 IAM 사용 설명서**의 [정책 평가 로직](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html)을 참조하세요.

# Amazon RDS에서 IAM을 사용하는 방법
<a name="security_iam_service-with-iam"></a>

IAM을 사용하여 Amazon RDS에 대한 액세스를 관리하려면 먼저 어떤 IAM 기능을 Amazon RDS에서 사용할 수 있는지를 이해해야 합니다.

다음 표에는 Amazon RDS에서 사용할 수 있는 IAM 기능이 나열되어 있습니다.


| IAM 특성 | Amazon RDS 지원 | 
| --- | --- | 
|  [자격 증명 기반 정책](#security_iam_service-with-iam-id-based-policies)  |  예  | 
|  [리소스 기반 정책](#security_iam_service-with-iam-resource-based-policies)  |  아니요  | 
|  [정책 작업](#security_iam_service-with-iam-id-based-policies-actions)  |  예  | 
|  [정책 리소스](#security_iam_service-with-iam-id-based-policies-resources)  |  예  | 
|  [정책 조건 키(서비스별)](#UsingWithRDS.IAM.Conditions)  |  예  | 
|  [ACL](#security_iam_service-with-iam-acls)  |  아니요  | 
|  [속성 기반 액세스 제어(ABAC)(정책 태그)](#security_iam_service-with-iam-tags)  |  예  | 
|  [임시 보안 인증](#security_iam_service-with-iam-roles-tempcreds)  |  예  | 
|  [전달 액세스 세션](#security_iam_service-with-iam-principal-permissions)  |  예  | 
|  [서비스 역할](#security_iam_service-with-iam-roles-service)  |  예  | 
|  [서비스 연결 역할](#security_iam_service-with-iam-roles-service-linked)  |  예  | 

Amazon RDS 및 기타 AWS 서비스에서 IAM을 사용하는 방법을 개괄적으로 알아보려면 [IAM 사용 설명서](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html)에서 *IAM으로 작업하는 AWS 서비스*를 참조하세요.

**Topics**
+ [Amazon RDS 자격 증명 기반 정책](#security_iam_service-with-iam-id-based-policies)
+ [Amazon RDS 내의 리소스 기반 정책](#security_iam_service-with-iam-resource-based-policies)
+ [Amazon RDS의 정책 작업](#security_iam_service-with-iam-id-based-policies-actions)
+ [Amazon RDS의 정책 리소스](#security_iam_service-with-iam-id-based-policies-resources)
+ [Amazon RDS의 정책 조건 키](#UsingWithRDS.IAM.Conditions)
+ [Amazon RDS의 액세스 제어 목록(ACL)](#security_iam_service-with-iam-acls)
+ [Amazon RDS 태그가 있는 정책의 속성 기반 액세스 제어(ABAC)](#security_iam_service-with-iam-tags)
+ [Amazon RDS에서 임시 자격 증명 사용](#security_iam_service-with-iam-roles-tempcreds)
+ [Amazon RDS를 위한 전달 액세스 세션](#security_iam_service-with-iam-principal-permissions)
+ [Amazon RDS에 대한 서비스 역할](#security_iam_service-with-iam-roles-service)
+ [Amazon RDS에 대한 서비스 연결 역할](#security_iam_service-with-iam-roles-service-linked)

## Amazon RDS 자격 증명 기반 정책
<a name="security_iam_service-with-iam-id-based-policies"></a>

**ID 기반 정책 지원:** 예.

ID 기반 정책은 IAM 사용자, 사용자 그룹 또는 역할과 같은 ID에 연결할 수 있는 JSON 권한 정책 문서입니다. 이러한 정책은 사용자 및 역할이 어떤 리소스와 어떤 조건에서 어떤 작업을 수행할 수 있는지를 제어합니다. 자격 증명 기반 정책을 생성하는 방법을 알아보려면 *IAM 사용 설명서*에서 [고객 관리형 정책으로 사용자 지정 IAM 권한 정의](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)를 참조하세요.

IAM ID 기반 정책을 사용하면 허용되거나 거부되는 작업과 리소스뿐 아니라 작업이 허용되거나 거부되는 조건을 지정할 수 있습니다. JSON 정책에서 사용할 수 있는 모든 요소에 대해 알아보려면 *IAM 사용 설명서*의 [IAM JSON 정책 요소 참조](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html)를 참조하세요.

### Amazon RDS 자격 증명 기반 정책 예
<a name="security_iam_service-with-iam-id-based-policies-examples"></a>

Amazon RDS 자격 증명 기반 정책 예제를 보려면 [Amazon RDS 자격 증명 기반 정책 예](security_iam_id-based-policy-examples.md) 단원을 참조하십시오.

## Amazon RDS 내의 리소스 기반 정책
<a name="security_iam_service-with-iam-resource-based-policies"></a>

**리소스 기반 정책 지원:** 아니요.

리소스 기반 정책은 리소스에 연결하는 JSON 정책 설명서입니다. 리소스 기반 정책의 예제는 IAM *역할 신뢰 정책*과 Amazon S3 *버킷 정책*입니다. 리소스 기반 정책을 지원하는 서비스에서 서비스 관리자는 이러한 정책을 사용하여 특정 리소스에 대한 액세스를 통제할 수 있습니다. 정책이 연결된 리소스의 경우 정책은 지정된 보안 주체가 해당 리소스와 어떤 조건에서 어떤 작업을 수행할 수 있는지를 정의합니다. 리소스 기반 정책에서 [보안 주체를 지정](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html)해야 합니다. 위탁자에는 계정, 사용자, 역할, 페더레이션 사용자 또는 AWS 서비스가 포함될 수 있습니다.

교차 계정 액세스를 활성화하려는 경우, 전체 계정이나 다른 계정의 IAM 개체를 리소스 기반 정책의 보안 주체로 지정할 수 있습니다. 자세한 내용은 *IAM 사용 설명서*의 [IAM에서 교차 계정 리소스 액세스](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html)를 참조하세요.

## Amazon RDS의 정책 작업
<a name="security_iam_service-with-iam-id-based-policies-actions"></a>

**정책 작업 지원:** 예.

관리자는 AWS JSON 정책을 사용하여 누가 무엇에 액세스할 수 있는지를 지정할 수 있습니다. 즉, 어떤 **보안 주체**가 어떤 **리소스**와 어떤 **조건**에서 **작업**을 수행할 수 있는지를 지정할 수 있습니다.

JSON 정책의 `Action`요소는 정책에서 액세스를 허용하거나 거부하는 데 사용할 수 있는 작업을 설명합니다. 연결된 작업을 수행할 수 있는 권한을 부여하기 위한 정책에 작업을 포함하세요.

Amazon RDS의 정책 작업은 작업 앞에 다음 접두사를 사용합니다. `rds:`. 예를 들어 Amazon RDS `DescribeDBInstances` API 작업으로 DB 인스턴스를 설명할 수 있는 권한을 부여하려면 해당 정책에 `rds:DescribeDBInstances` 작업을 포함합니다. 정책 문에는 `Action` 또는 `NotAction` 요소가 반드시 추가되어야 합니다. Amazon RDS는 이 서비스로 수행할 수 있는 태스크를 설명하는 고유한 작업 세트를 정의합니다.

명령문 하나에 여러 작업을 지정하려면 다음과 같이 쉼표로 구분합니다.

```
"Action": [
      "rds:action1",
      "rds:action2"
```

와일드카드(\$1)를 사용하여 여러 작업을 지정할 수 있습니다. 예를 들어, `Describe`라는 단어로 시작하는 모든 작업을 지정하려면 다음 작업을 포함합니다.

```
"Action": "rds:Describe*"
```



Amazon RDS 작업 목록을 보려면 *서비스 권한 부여 참조*에서 [Amazon RDS에서 정의한 작업](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonrds.html#amazonrds-actions-as-permissions)을 참조하세요.

## Amazon RDS의 정책 리소스
<a name="security_iam_service-with-iam-id-based-policies-resources"></a>

**정책 리소스 지원:** 예.

관리자는 AWS JSON 정책을 사용하여 누가 무엇에 액세스할 수 있는지를 지정할 수 있습니다. 즉, 어떤 **보안 주체**가 어떤 **리소스**와 어떤 **조건**에서 **작업**을 수행할 수 있는지를 지정할 수 있습니다.

`Resource` JSON 정책 요소는 작업이 적용되는 하나 이상의 객체를 지정합니다. 모범 사례에 따라 [Amazon 리소스 이름(ARN)](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference-arns.html)을 사용하여 리소스를 지정합니다. 리소스 수준 권한을 지원하지 않는 작업의 경우, 와일드카드(\$1)를 사용하여 해당 문이 모든 리소스에 적용됨을 나타냅니다.

```
"Resource": "*"
```

DB 인스턴스 리소스는 다음과 같은 Amazon 리소스 이름(ARN)을 갖습니다.

```
arn:${Partition}:rds:${Region}:${Account}:{ResourceType}/${Resource}
```

ARN 형식에 관한 자세한 내용은 [Amazon 리소스 이름(ARN) 및 AWS 서비스 네임스페이스](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) 섹션을 참조하세요.

예를 들어, 문에서 `dbtest` DB 인스턴스를 지정하려면 다음 ARN을 사용합니다.

```
"Resource": "arn:aws:rds:us-west-2:123456789012:db:dbtest"
```

특정 계정에 속하는 모든 DB 인스턴스를 지정하려면 와일드카드(\$1)를 사용합니다.

```
"Resource": "arn:aws:rds:us-east-1:123456789012:db:*"
```

리소스를 생성하기 위한 작업과 같은 일부 RDS API 작업은 특정 리소스에서 수행할 수 없습니다. 이러한 경우 와일드카드(\$1)를 사용하면 됩니다.

```
"Resource": "*"
```

다양한 Amazon RDS API 작업에는 여러 리소스가 관여합니다. 예를 들어 `CreateDBInstance`는 DB 인스턴스를 생성합니다. DB 인스턴스를 생성할 때는 사용자가 특정 보안 그룹과 파라미터 그룹을 사용해야 한다고 지정할 수 있습니다. 단일 문에서 여러 리소스를 지정하려면 ARN을 쉼표로 구분합니다.

```
"Resource": [
      "resource1",
      "resource2"
```

Amazon RDS 리소스 유형 및 해당 ARN의 목록을 보려면 *서비스 권한 부여 참조*에서 [Amazon RDS에서 정의한 리소스](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonrds.html#amazonrds-resources-for-iam-policies)를 참조하세요. 각 리소스의 ARN을 지정할 수 있는 작업을 알아보려면 [Amazon RDS에서 정의한 작업](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonrds.html#amazonrds-actions-as-permissions)을 참조하세요.

## Amazon RDS의 정책 조건 키
<a name="UsingWithRDS.IAM.Conditions"></a>

**서비스별 정책 조건 키 지원:** 예.

관리자는 AWS JSON 정책을 사용하여 누가 무엇에 액세스할 수 있는지를 지정할 수 있습니다. 즉, 어떤 **보안 주체**가 어떤 **리소스**와 어떤 **조건**에서 **작업**을 수행할 수 있는지를 지정할 수 있습니다.

`Condition` 요소는 정의된 기준에 따라 문이 실행되는 시기를 지정합니다. 같음(equals) 또는 미만(less than)과 같은 [조건 연산자](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html)를 사용하여 정책의 조건을 요청의 값과 일치시키는 조건식을 생성할 수 있습니다. 모든 AWS 전역 조건 키를 보려면 *IAM 사용자 설명서*의 [AWS 전역 조건 컨텍스트 키](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)를 참조하세요.

Amazon RDS에서는 자체 조건 키 집합을 정의하고 일부 전역 조건 키 사용도 지원합니다. 모든 AWS 글로벌 조건 키를 보려면 *IAM 사용 설명서*의 [AWS 글로벌 조건 컨텍스트 키](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)를 참조하세요.



 모든 RDS API 작업은 `aws:RequestedRegion` 조건 키를 지원합니다.

Amazon RDS 조건 키 목록을 보려면 *서비스 권한 부여 참조*에서 [Amazon RDS에서 정의한 조건 키](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonrds.html#amazonrds-policy-keys)를 참조하세요. 조건 키를 사용할 수 있는 작업과 리소스를 알아보려면 [Amazon RDS에서 정의한 작업](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonrds.html#amazonrds-actions-as-permissions)을 참조하세요.

## Amazon RDS의 액세스 제어 목록(ACL)
<a name="security_iam_service-with-iam-acls"></a>

**액세스 제어 목록(ACL) 지원;** 아니요.

액세스 제어 목록(ACL)은 어떤 보안 주체(계정 멤버, 사용자 또는 역할)가 리소스에 액세스할 수 있는 권한을 가지고 있는지를 제어합니다. ACL은 JSON 정책 문서 형식을 사용하지 않지만 리소스 기반 정책과 유사합니다.

## Amazon RDS 태그가 있는 정책의 속성 기반 액세스 제어(ABAC)
<a name="security_iam_service-with-iam-tags"></a>

**정책의 ABAC(속성 기반 액세스 제어) 태그 지원:** 예.

속성 기반 액세스 제어(ABAC)는 태그라고 불리는 속성을 기반으로 권한을 정의하는 권한 부여 전략입니다. IAM 엔터티 및 AWS 리소스에 태그를 연결하면 보안 주체의 태그가 리소스 태그와 일치할 때 작업을 허용하도록 ABAC 정책을 설계할 수 있습니다.

태그에 근거하여 액세스를 제어하려면 `aws:ResourceTag/key-name`, `aws:RequestTag/key-name`또는 `aws:TagKeys`조건 키를 사용하여 정책의 [조건 요소](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html)에 태그 정보를 제공합니다.

서비스가 모든 리소스 유형에 대해 세 가지 조건 키를 모두 지원하는 경우, 값은 서비스에 대해 **예**입니다. 서비스가 일부 리소스 유형에 대해서만 세 가지 조건 키를 모두 지원하는 경우, 값은 **부분적**입니다.

ABAC에 대한 자세한 내용은 *IAM 사용 설명서*의 [ABAC 권한 부여를 통한 권한 정의](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction_attribute-based-access-control.html)를 참조하세요. ABAC 설정 단계가 포함된 자습서를 보려면 *IAM 사용 설명서*의 [속성 기반 액세스 제어(ABAC) 사용](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_attribute-based-access-control.html)을 참조하세요.

Amazon RDS 리소스 태그 지정에 대한 자세한 내용은 [조건 지정: 사용자 지정 태그 사용](UsingWithRDS.IAM.SpecifyingCustomTags.md) 단원을 참조하십시오. 리소스의 태그를 기반으로 리소스에 대한 액세스를 제한하는 자격 증명 기반 정책의 예제는 [두 가지 값이 있는 특정 태그를 사용하는 리소스 작업에 대한 권한 부여](security_iam_id-based-policy-examples-create-and-modify-examples.md#security_iam_id-based-policy-examples-grant-permissions-tags)에서 확인할 수 있습니다.

## Amazon RDS에서 임시 자격 증명 사용
<a name="security_iam_service-with-iam-roles-tempcreds"></a>

**임시 자격 증명 지원:** 예.

임시 자격 증명은 AWS리소스에 대한 단기 액세스를 제공하며 페더레이션 또는 전환 역할을 사용할 때 자동으로 생성됩니다. AWS에서는 장기 액세스 키를 사용하는 대신 임시 자격 증명을 동적으로 생성할 것을 권장합니다. 자세한 내용은 *IAM 사용 설명서*의 [IAM의 임시 보안 자격 증명](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html) 및 [IAM으로 작업하는 AWS 서비스](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html) 섹션을 참조하세요.

## Amazon RDS를 위한 전달 액세스 세션
<a name="security_iam_service-with-iam-principal-permissions"></a>

**전달 액세스 세션 지원:** 예.

 전달 액세스 세션(FAS)은 AWS 서비스를 직접 호출하는 보안 주체의 권한과 요청하는 AWS 서비스를 함께 사용하여 다운스트림 서비스에 대한 요청을 수행합니다. FAS 요청 시 정책 세부 정보는 [전달 액세스 세션](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_forward_access_sessions.html)을 참조하세요.

## Amazon RDS에 대한 서비스 역할
<a name="security_iam_service-with-iam-roles-service"></a>

**서비스 역할 지원:** 예.

 서비스 역할은 서비스가 사용자를 대신하여 작업을 수행하는 것으로 가정하는 [IAM 역할](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)입니다. IAM 관리자는 IAM 내에서 서비스 역할을 생성, 수정 및 삭제할 수 있습니다. 자세한 내용은 *IAM 사용 설명서*의 [AWS 서비스 AWS에 권한을 위임할 역할 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)을 참조하세요.

**주의**  
서비스 역할에 대한 권한을 변경하면 Amazon RDS 기능이 중단될 수 있습니다. Amazon RDS에서 관련 지침을 제공하는 경우에만 서비스 역할을 편집합니다.

## Amazon RDS에 대한 서비스 연결 역할
<a name="security_iam_service-with-iam-roles-service-linked"></a>

**서비스 연결 역할 지원:** 예.

 서비스 연결 역할은 AWS 서비스에 연결된 서비스 역할의 한 유형입니다. 서비스는 사용자를 대신하여 작업을 수행하기 위해 역할을 수임할 수 있습니다. 서비스 연결 역할은 AWS 계정에 나타나고, 서비스가 소유합니다. IAM 관리자는 서비스 연결 역할의 권한을 볼 수 있지만 편집은 할 수 없습니다.

Amazon RDS 서비스 연결 역할을 사용하는 방법에 대한 자세한 내용은 [Amazon RDS에 서비스 연결 역할 사용](UsingWithRDS.IAM.ServiceLinkedRoles.md) 섹션을 참조하세요.

# Amazon RDS 자격 증명 기반 정책 예
<a name="security_iam_id-based-policy-examples"></a>

기본적으로 권한 세트 및 역할은 Amazon RDS 리소스를 생성하거나 수정할 수 있는 권한이 없습니다. 또한 AWS Management Console, AWS CLI 또는 AWS API를 사용해 태스크를 수행할 수 없습니다. 관리자는 필요한 지정된 리소스에서 특정 API 작업을 수행할 수 있는 권한을 권한 세트와 역할에 부여하는 IAM 정책을 생성해야 합니다. 그런 다음 관리자는 해당 권한이 필요한 권한 세트 또는 역할에 이러한 정책을 연결해야 합니다.

이러한 예제 JSON 정책 문서를 사용하여 IAM ID 기반 정책을 생성하는 방법을 알아보려면 *IAM 사용자 설명서*의 [JSON 탭에서 정책 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html#access_policies_create-json-editor)을 참조하세요.

**Topics**
+ [정책 모범 사례](#security_iam_service-with-iam-policy-best-practices)
+ [Amazon RDS 콘솔 사용](#security_iam_id-based-policy-examples-console)
+ [콘솔 사용에 필요한 권한](#UsingWithRDS.IAM.RequiredPermissions.Console)
+ [사용자가 자신의 고유한 권한을 볼 수 있도록 허용](#security_iam_id-based-policy-examples-view-own-permissions)
+ [Amazon RDS에서 리소스를 생성, 수정 및 삭제하기 위한 권한 정책](security_iam_id-based-policy-examples-create-and-modify-examples.md)
+ [정책 예: 조건 키 사용](UsingWithRDS.IAM.Conditions.Examples.md)
+ [조건 지정: 사용자 지정 태그 사용](UsingWithRDS.IAM.SpecifyingCustomTags.md)
+ [생성 시 Amazon RDS 리소스를 태그하는 권한 부여](security_iam_id-based-policy-examples-grant-permissions-tags-on-create.md)

## 정책 모범 사례
<a name="security_iam_service-with-iam-policy-best-practices"></a>

ID 기반 정책에 따라 계정에서 사용자가 Amazon RDS 리소스를 생성, 액세스 또는 삭제할 수 있는지 여부가 결정됩니다. 이 작업으로 인해 AWS 계정에 비용이 발생할 수 있습니다. ID 기반 정책을 생성하거나 편집할 때는 다음 지침과 권장 사항을 따르세요.
+ **AWS 관리형 정책으로 시작하고 최소 권한을 향해 나아가기** - 사용자 및 워크로드에 권한 부여를 시작하려면 많은 일반 사용 사례에 대한 권한을 부여하는 *AWS관리형 정책*을 사용합니다. AWS 계정에서 사용할 수 있습니다. 사용 사례에 고유한 AWS고객 관리형 정책을 정의하여 권한을 줄이는 것이 좋습니다. 자세한 내용은 *IAM 사용 설명서*의 [AWS 관리형 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies) 또는 [AWS직무에 대한 관리형 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_job-functions.html)을 참조하세요.
+ **최소 권한 적용** – IAM 정책을 사용하여 권한을 설정하는 경우, 작업을 수행하는 데 필요한 권한만 부여합니다. 이렇게 하려면 *최소 권한*으로 알려진 특정 조건에서 특정 리소스에 대해 수행할 수 있는 작업을 정의합니다. IAM을 사용하여 권한을 적용하는 방법에 대한 자세한 정보는 *IAM 사용 설명서*에 있는 [IAM의 정책 및 권한](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html)을 참조하세요.
+ **IAM 정책의 조건을 사용하여 액세스 추가 제한** – 정책에 조건을 추가하여 작업 및 리소스에 대한 액세스를 제한할 수 있습니다. 예를 들어, SSL을 사용하여 모든 요청을 전송해야 한다고 지정하는 정책 조건을 작성할 수 있습니다. CloudFormation와 같이, 특정 AWS 서비스를 통해 사용되는 경우에만 서비스 작업에 대한 액세스 권한을 부여할 수도 있습니다. 자세한 내용은 *IAM 사용자 설명서*의 [IAM JSON 정책 요소: 조건](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html)을 참조하세요.
+ **IAM Access Analyzer를 통해 IAM 정책을 확인하여 안전하고 기능적인 권한 보장** - IAM Access Analyzer에서는 IAM 정책 언어(JSON)와 모범 사례가 정책에서 준수되도록 새로운 및 기존 정책을 확인합니다. IAM Access Analyzer는 100개 이상의 정책 확인 항목과 실행 가능한 추천을 제공하여 안전하고 기능적인 정책을 작성하도록 돕습니다. 자세한 내용은 *IAM 사용 설명서*의 [IAM Access Analyzer에서 정책 검증](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-policy-validation.html)을 참조하세요.
+ **다중 인증(MFA) 필요** – AWS 계정에 IAM 사용자 또는 루트 사용자가 필요한 시나리오가 있는 경우, 추가 보안을 위해 MFA를 설정합니다. API 작업을 직접적으로 호출할 때 MFA가 필요하면 정책에 MFA 조건을 추가합니다. 자세한 내용은 *IAM 사용 설명서*의 [MFA를 통한 보안 API 액세스](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_mfa_configure-api-require.html)를 참조하세요.

IAM의 모범 사례에 대한 자세한 내용은 *IAM 사용 설명서*의 [IAM의 보안 모범 사례](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)를 참조하십시오.

## Amazon RDS 콘솔 사용
<a name="security_iam_id-based-policy-examples-console"></a>

Amazon RDS 콘솔에 액세스하려면 최소 권한 집합이 있어야 합니다. 이러한 권한을 통해 AWS 계정에서 Amazon RDS 리소스에 대한 세부 정보를 나열하고 볼 수 있어야 합니다. 최소 필수 권한보다 더 제한적인 ID 기반 정책을 생성하는 경우, 콘솔이 해당 정책에 연결된 엔티티(사용자 또는 역할)에 대해 의도대로 작동하지 않습니다.

AWS CLI 또는 AWS API만 직접적으로 호출하는 사용자에게 최소 콘솔 권한을 허용할 필요가 없습니다. 그 대신 수행하려는 API 작업과 일치하는 작업에만 액세스할 수 있도록 합니다.

해당 엔터티가 Amazon RDS 콘솔을 여전히 사용할 수 있도록 하려면 AWS 관리형 정책도 엔터티에 연결합니다.

```
AmazonRDSReadOnlyAccess
```

자세한 내용은 *IAM 사용 설명서*의 [사용자에게 권한 추가](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_change-permissions.html#users_change_permissions-add-console)를 참조하십시오.

## 콘솔 사용에 필요한 권한
<a name="UsingWithRDS.IAM.RequiredPermissions.Console"></a>

콘솔에서 작업하려면 최소한의 권한이 사용자에게 필요합니다. 이러한 권한이 있어야만 사용자가 자신의 AWS 계정에서 사용할 Amazon RDS 리소스를 설명하고, Amazon EC2 보안 및 네트워크 정보 등 다른 관련 정보를 입력할 수 있습니다.

최소 필수 권한보다 더 제한적인 IAM 정책을 만들면 콘솔은 해당 IAM 정책에 연결된 사용자에 대해 의도대로 작동하지 않습니다. 이 사용자가 콘솔을 사용할 수 있도록 하려면 `AmazonRDSReadOnlyAccess` 관리형 정책을 사용자에게 연결합니다([정책을 사용하여 액세스 관리](UsingWithRDS.IAM.md#security_iam_access-manage) 참조).

AWS CLI 또는 Amazon RDS API만 호출하는 사용자에게 최소 콘솔 권한을 허용할 필요가 없습니다.

다음 정책은 루트 AWS 계정의 모든 Amazon RDS 리소스에 대해 전체 액세스 권한을 부여합니다.

```
AmazonRDSFullAccess             
```

## 사용자가 자신의 고유한 권한을 볼 수 있도록 허용
<a name="security_iam_id-based-policy-examples-view-own-permissions"></a>

이 예제는 IAM 사용자가 자신의 사용자 ID에 연결된 인라인 및 관리형 정책을 볼 수 있도록 허용하는 정책을 생성하는 방법을 보여줍니다. 이 정책에는 콘솔에서 또는 AWS CLI나 AWS API를 사용하여 프로그래밍 방식으로 이 작업을 완료할 수 있는 권한이 포함됩니다.

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ViewOwnUserInfo",
            "Effect": "Allow",
            "Action": [
                "iam:GetUserPolicy",
                "iam:ListGroupsForUser",
                "iam:ListAttachedUserPolicies",
                "iam:ListUserPolicies",
                "iam:GetUser"
            ],
            "Resource": ["arn:aws:iam::*:user/${aws:username}"]
        },
        {
            "Sid": "NavigateInConsole",
            "Effect": "Allow",
            "Action": [
                "iam:GetGroupPolicy",
                "iam:GetPolicyVersion",
                "iam:GetPolicy",
                "iam:ListAttachedGroupPolicies",
                "iam:ListGroupPolicies",
                "iam:ListPolicyVersions",
                "iam:ListPolicies",
                "iam:ListUsers"
            ],
            "Resource": "*"
        }
    ]
}
```

# Amazon RDS에서 리소스를 생성, 수정 및 삭제하기 위한 권한 정책
<a name="security_iam_id-based-policy-examples-create-and-modify-examples"></a>

다음 섹션에는 리소스에 대한 액세스를 허용하고 제한하는 권한 정책의 예제가 나와 있습니다.

## 사용자에게 AWS 계정에서 DB 인스턴스를 생성하도록 허용
<a name="security_iam_id-based-policy-examples-create-db-instance-in-account"></a>

다음은 ID가 `123456789012`인 계정에 AWS 계정에 대한 DB 인스턴스를 생성하도록 허용하는 정책 예제입니다. 이 정책에 따라 새 DB 인스턴스의 이름은 `test`로 시작해야 합니다. 또한 새 DB 인스턴스는 MySQL 데이터베이스 엔진 및 `db.t2.micro` DB 인스턴스 클래스를 사용해야 합니다. 또한 새로운 DB 인스턴스는 `default`로 시작하는 옵션 그룹과 DB 파라미터 그룹을, 그리고 `default` 서브넷 그룹을 사용해야 합니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
      {
         "Sid": "AllowCreateDBInstanceOnly",
         "Effect": "Allow",
         "Action": [
            "rds:CreateDBInstance"
         ],
         "Resource": [
            "arn:aws:rds:*:123456789012:db:test*",
            "arn:aws:rds:*:123456789012:og:default*",
            "arn:aws:rds:*:123456789012:pg:default*",
            "arn:aws:rds:*:123456789012:subgrp:default"
         ],
         "Condition": {
            "StringEquals": {
               "rds:DatabaseEngine": "mysql",
               "rds:DatabaseClass": "db.t2.micro"
            }
         }
      }
   ]
}
```

------

다음 사용자 권한을 지정하는 단일 명령문이 정책에 포함됩니다.
+ 정책은 계정이 [CreateDBInstance](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstance.html) API 작업을 사용하여 DB 인스턴스를 생성할 수 있도록 허용합니다. 이는 [create-db-instance](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance.html) AWS CLI 명령과 AWS Management Console에도 적용됩니다.
+ `Resource` 요소는 사용자가 리소스 위치에서 또는 리소스를 사용하여 작업을 수행할 수 있도록 지정합니다. 리소스는 Amazon 리소스 이름(ARN)을 사용하여 지정합니다. 이 ARN에는 리소스가 속하는 서비스 이름(`rds`), AWS 리전(`*`는 위의 예제에서 사용하는 모든 리전을 의미함), AWS 계정 번호(이 예에서는 `123456789012`가 계정 번호임) 및 리소스 유형이 포함됩니다. ARN 생성에 대한 자세한 내용은 [Amazon RDS의 Amazon 리소스 이름(ARN)](USER_Tagging.ARN.md) 단원을 참조하십시오.

  위의 예제에서 `Resource` 요소는 사용자 리소스에 대해 다음과 같은 정책 제약 조건을 지정합니다.
  + 새 DB 인스턴스에 대한 DB 인스턴스 식별자는 `test`로 시작해야 합니다(예: `testCustomerData1`, `test-region2-data`).
  + 새로운 DB 인스턴스의 옵션 그룹은 `default`로 시작해야 합니다.
  + 새로운 DB 인스턴스의 DB 파라미터 그룹은 `default`로 시작해야 합니다.
  + 새로운 DB 인스턴스의 서브넷 그룹은 `default` 서브넷 그룹이 되어야 합니다.
+ `Condition` 요소는 DB 엔진은 MySQL이 되고, DB 인스턴스 클래스는 `db.t2.micro`가 되도록 지정합니다. `Condition` 요소는 정책 적용 시 조건을 지정합니다. 그 밖에도 `Condition` 요소를 사용하여 다른 권한이나 제한을 추가할 수 있습니다. 조건 지정에 대한 자세한 내용은 [Amazon RDS의 정책 조건 키](security_iam_service-with-iam.md#UsingWithRDS.IAM.Conditions) 단원을 참조하십시오. 이 예제에서는 `rds:DatabaseEngine` 및 `rds:DatabaseClass` 조건을 지정합니다. `rds:DatabaseEngine`의 유효 조건 값에 대한 정보는 [CreateDBInstance](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstance.html)의 `Engine` 파라미터 아래 목록을 참조하십시오. `rds:DatabaseClass`의 유효 조건 값에 대한 정보는 [DB 인스턴스 클래스에 지원되는 DB 엔진](Concepts.DBInstanceClass.Support.md) 단원을 참조하십시오.

자격 증명 기반 정책에서는 권한을 가질 보안 주체를 지정하지 않으므로 이 정책은 `Principal` 요소를 지정하지 않습니다. 정책을 사용자에게 연결할 경우 사용자는 암시적인 보안 주체입니다. IAM 역할에 권한 정책을 연결할 경우 역할의 신뢰 정책에 식별된 보안 주체는 권한을 가집니다.

Amazon RDS 작업 목록을 보려면 *서비스 권한 부여 참조*에서 [Amazon RDS에서 정의한 작업](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonrds.html#amazonrds-actions-as-permissions)을 참조하세요.

## 사용자가 모든 RDS 리소스에서 Describe 작업을 수행할 수 있도록 허용
<a name="IAMPolicyExamples-RDS-perform-describe-action"></a>

다음 권한 정책은 사용자에게 `Describe`로 시작하는 모든 작업을 실행할 수 있는 권한을 부여합니다. 이러한 작업은 DB 인스턴스와 같은 RDS 리소스에 대한 정보를 보여 줍니다. `Resource` 요소에 와일드카드 문자(\$1)가 있으면 계정이 소유한 모든 Amazon RDS 리소스에 대해 작업이 허용됩니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
      {
         "Sid": "AllowRDSDescribe",
         "Effect": "Allow",
         "Action": "rds:Describe*",
         "Resource": "*"
      }
   ]
}
```

------

## 사용자가 지정된 DB 파라미터 그룹 및 서브넷 그룹을 사용하는 DB 인스턴스를 생성할 수 있도록 허용
<a name="security_iam_id-based-policy-examples-create-db-instance-specified-groups"></a>

다음 권한 정책은 사용자가 `mydbpg` DB 파라미터 그룹 및 `mydbsubnetgroup` DB 서브넷 그룹을 사용해야 하는 DB 인스턴스만 생성할 수 있도록 허용하는 권한을 부여합니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
      {
         "Sid": "VisualEditor0",
         "Effect": "Allow",
         "Action": "rds:CreateDBInstance",
         "Resource": [
            "arn:aws:rds:*:*:pg:mydbpg",
            "arn:aws:rds:*:*:subgrp:mydbsubnetgroup"
         ]
      }
   ]
}
```

------

## 두 가지 값이 있는 특정 태그를 사용하는 리소스 작업에 대한 권한 부여
<a name="security_iam_id-based-policy-examples-grant-permissions-tags"></a>

자격 증명 기반 정책의 조건을 사용하여 태그를 기반으로 Amazon RDS 리소스에 대한 액세스를 제어할 수 있습니다. 다음 정책은 `development` 또는 `test`로 설정된 `stage` 태그를 사용하여 DB 인스턴스에서 `CreateDBSnapshot` API 작업을 수행할 수 있는 권한을 허용합니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Sid":"AllowAnySnapshotName",
         "Effect":"Allow",
         "Action":[
            "rds:CreateDBSnapshot"
         ],
         "Resource":"arn:aws:rds:*:123456789012:snapshot:*"
      },
      {
         "Sid":"AllowDevTestToCreateSnapshot",
         "Effect":"Allow",
         "Action":[
            "rds:CreateDBSnapshot"
         ],
         "Resource":"arn:aws:rds:*:123456789012:db:*",
         "Condition":{
            "StringEquals":{
                "rds:db-tag/stage":[
                  "development",
                  "test"
               ]
            }
         }
      }
   ]
}
```

------

다음 정책은 `development` 또는 `test`로 설정된 `stage` 태그를 사용하여 DB 인스턴스에서 `ModifyDBInstance` API 작업을 수행할 수 있는 권한을 허용합니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Sid":"AllowChangingParameterOptionSecurityGroups",
         "Effect":"Allow",
         "Action":[
            "rds:ModifyDBInstance"
         ],
         "Resource": [
            "arn:aws:rds:*:123456789012:pg:*",
            "arn:aws:rds:*:123456789012:secgrp:*",
            "arn:aws:rds:*:123456789012:og:*"
         ]
      },
      {
         "Sid":"AllowDevTestToModifyInstance",
         "Effect":"Allow",
         "Action":[
            "rds:ModifyDBInstance"
         ],
         "Resource":"arn:aws:rds:*:123456789012:db:*",
         "Condition":{
            "StringEquals":{
                "rds:db-tag/stage":[
                  "development",
                  "test"
               ]
            }
         }
      }
   ]
}
```

------

## 사용자의 DB 인스턴스 삭제 방지
<a name="IAMPolicyExamples-RDS-prevent-db-deletion"></a>

다음 권한 정책은 사용자의 특정 DB 인스턴스 삭제를 방지하는 권한을 부여합니다. 예를 들어, 관리자가 아닌 모든 사용자에 대해 프로덕션 DB 인스턴스를 삭제할 수 있는 권한을 거부해야 할 수 있습니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
      {
         "Sid": "DenyDelete1",
         "Effect": "Deny",
         "Action": "rds:DeleteDBInstance",
         "Resource": "arn:aws:rds:us-west-2:123456789012:db:my-mysql-instance"
      }
   ]
}
```

------

## 리소스에 대한 모든 액세스 거부
<a name="IAMPolicyExamples-RDS-deny-all-access"></a>

리소스에 대한 액세스를 명시적으로 거부할 수 있습니다. 거부 정책은 허용 정책보다 우선합니다. 다음 정책은 사용자가 리소스를 관리할 수 있는 권한을 명시적으로 거부합니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
      {
         "Effect": "Deny",
         "Action": "rds:*",
         "Resource": "arn:aws:rds:us-east-1:123456789012:db:mydb"
      }
   ]
}
```

------

# 정책 예: 조건 키 사용
<a name="UsingWithRDS.IAM.Conditions.Examples"></a>

다음은 Amazon RDS IAM 권한 정책에서 조건 키를 사용할 수 있는 방법의 예입니다.

## 예제 1: 특정 DB 엔진을 사용하고 MultiAZ가 아닌 DB 인스턴스를 생성할 수 있는 권한 부여
<a name="w2aac58c48c33c21b5"></a>

다음 정책은 RDS 조건 키를 사용하며, 사용자가 MySQL 데이터베이스 엔진을 사용하는 DB 인스턴스만 생성할 수 있도록 허용하며, MultiAZ를 사용하지 않습니다. `Condition` 요소는 데이터베이스 엔진이 MySQL이라는 요구 사항을 나타냅니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
      {
         "Sid": "AllowMySQLCreate",
         "Effect": "Allow",
         "Action": "rds:CreateDBInstance",
         "Resource": "*",
         "Condition": {
            "StringEquals": {
               "rds:DatabaseEngine": "mysql"
            },
            "Bool": {
               "rds:MultiAz": false
            }
         }
      }
   ]
}
```

------

## 예제 2: 특정 DB 인스턴스 클래스에 대한 DB 인스턴스를 만들고 프로비저닝된 IOPS를 사용하는 DB 인스턴스를 만들 수 있는 권한을 명시적으로 거부
<a name="w2aac58c48c33c21b7"></a>

다음 정책은 가장 크고 가장 비싼 DB 인스턴스 클래스인 DB 인스턴스 클래스 `r3.8xlarge` 및 `m4.10xlarge`를 사용하는 DB 인스턴스를 만들 수 있는 권한을 명시적으로 거부합니다. 또한 이 정책은 추가 비용이 발생하는 프로비저닝된 IOPS를 사용하는 DB 인스턴스를 사용자가 생성하지 못하도록 합니다.

명시적으로 거부하는 권한은 이미 부여된 다른 모든 권한에 우선합니다. 따라서 부여하지 않으려는 권한을 자격 증명이 우연히 획득하지 않도록 할 수 있습니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
      {
         "Sid": "DenyLargeCreate",
         "Effect": "Deny",
         "Action": "rds:CreateDBInstance",
         "Resource": "*",
         "Condition": {
            "StringEquals": {
               "rds:DatabaseClass": [
                  "db.r3.8xlarge",
                  "db.m4.10xlarge"
               ]
            }
         }
      },
      {
         "Sid": "DenyPIOPSCreate",
         "Effect": "Deny",
         "Action": "rds:CreateDBInstance",
         "Resource": "*",
         "Condition": {
            "NumericNotEquals": {
               "rds:Piops": "0"
            }
         }
      }
   ]
}
```

------

## 예제 3: 리소스에 태그 지정하는 데 사용할 수 있는 태그 키와 값 집합 제한
<a name="w2aac58c48c33c21b9"></a>

다음 정책은 RDS 조건 키를 사용하고 키가 `stage`인 태그를 값이 `test`, `qa`, `production`인 리소스에 추가할 수 있도록 허용합니다.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowTagEdits",
      "Effect": "Allow",
      "Action": [
        "rds:AddTagsToResource",
        "rds:RemoveTagsFromResource"
      ],
      "Resource": "arn:aws:rds:us-east-1:123456789012:db:db-123456",
      "Condition": {
        "StringEquals": {
          "rds:req-tag/stage": [
            "test",
            "qa",
            "production"
          ]
        }
      }
    }
  ]
}
```

------

# 조건 지정: 사용자 지정 태그 사용
<a name="UsingWithRDS.IAM.SpecifyingCustomTags"></a>

Amazon RDS에서는 사용자 지정 태그를 사용하여 IAM 정책에서 조건을 지정할 수 있습니다.

예를 들어 이름이 `environment`인 태그를 `beta`, `staging`, `production` 등의 값으로 DB 인스턴스에 추가한다고 가정하겠습니다. 그러면 `environment` 태그 값에 따라 특정 사용자를 DB 인스턴스로 제한하는 정책을 생성할 수 있습니다.

**참고**  
사용자 지정 태그 식별자는 대/소문자를 구분합니다.

다음 표에는 `Condition` 요소에서 사용할 수 있는 RDS 태그 식별자가 나와 있습니다.

<a name="rds-iam-condition-tag-reference"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/UsingWithRDS.IAM.SpecifyingCustomTags.html)

사용자 지정 태그 조건의 구문은 다음과 같습니다.

`"Condition":{"StringEquals":{"rds:rds-tag-identifier/tag-name": ["value"]} }` 

예를 들어, 다음 `Condition` 요소는 태그 이름이 `environment`이고 태그 값이 `production`인 DB 인스턴스에 적용됩니다.

` "Condition":{"StringEquals":{"rds:db-tag/environment": ["production"]} } ` 

태그 생성에 대한 자세한 내용은 [Amazon RDS 리소스에 태그 지정](USER_Tagging.md) 단원을 참조하십시오.

**중요**  
태깅을 사용하여 RDS 리소스에 대한 액세스를 관리하는 경우 RDS 리소스의 태그에 대한 액세스의 보안을 유지하는 것이 좋습니다. `AddTagsToResource` 및 `RemoveTagsFromResource` 작업에 대한 정책을 생성하여 태그에 대한 액세스를 관리할 수 있습니다. 예를 들어, 다음 정책은 모든 리소스에 대해 태그를 추가하거나 제거할 수 있는 사용자의 권한을 거부합니다. 그런 다음 특정 사용자가 태그를 추가하거나 제거할 수 있도록 허용하기 위한 정책을 생성할 수 있습니다.  

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Sid":"DenyTagUpdates",
         "Effect":"Deny",
         "Action":[
            "rds:AddTagsToResource",
            "rds:RemoveTagsFromResource"
         ],
         "Resource":"*"
      }
   ]
}
```

Amazon RDS 작업 목록을 보려면 *서비스 권한 부여 참조*에서 [Amazon RDS에서 정의한 작업](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonrds.html#amazonrds-actions-as-permissions)을 참조하세요.

## 정책 예: 사용자 지정 태그 사용
<a name="UsingWithRDS.IAM.Conditions.Tags.Examples"></a>

다음은 Amazon RDS IAM 권한 정책에서 사용자 지정 태그를 사용할 수 있는 방법의 예입니다. Amazon RDS 리소스에 태그를 추가하는 방법에 대한 자세한 내용은 [Amazon RDS의 Amazon 리소스 이름(ARN)](USER_Tagging.ARN.md) 단원을 참조하십시오.

**참고**  
모든 예는 us-west-2 리전을 사용하며 가상의 계정 ID를 포함합니다.

### 예제 1: 두 개의 값을 갖는 특정 태그를 사용하는 리소스 작업에 대한 권한 부여
<a name="w2aac58c48c33c23c29b6"></a>

다음 정책은 `development` 또는 `test`로 설정된 `stage` 태그를 사용하여 DB 인스턴스에서 `CreateDBSnapshot` API 작업을 수행할 수 있는 권한을 허용합니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Sid":"AllowAnySnapshotName",
         "Effect":"Allow",
         "Action":[
            "rds:CreateDBSnapshot"
         ],
         "Resource":"arn:aws:rds:*:123456789012:snapshot:*"
      },
      {
         "Sid":"AllowDevTestToCreateSnapshot",
         "Effect":"Allow",
         "Action":[
            "rds:CreateDBSnapshot"
         ],
         "Resource":"arn:aws:rds:*:123456789012:db:*",
         "Condition":{
            "StringEquals":{
                "rds:db-tag/stage":[
                  "development",
                  "test"
               ]
            }
         }
      }
   ]
}
```

------

다음 정책은 `development` 또는 `test`로 설정된 `stage` 태그를 사용하여 DB 인스턴스에서 `ModifyDBInstance` API 작업을 수행할 수 있는 권한을 허용합니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Sid":"AllowChangingParameterOptionSecurityGroups",
         "Effect":"Allow",
         "Action":[
            "rds:ModifyDBInstance"
            ],
          "Resource": [
            "arn:aws:rds:*:123456789012:pg:*",
            "arn:aws:rds:*:123456789012:secgrp:*",
            "arn:aws:rds:*:123456789012:og:*"
            ]
       },
       {
         "Sid":"AllowDevTestToModifyInstance",
         "Effect":"Allow",
         "Action":[
            "rds:ModifyDBInstance"
            ],
         "Resource":"arn:aws:rds:*:123456789012:db:*",
         "Condition":{
            "StringEquals":{
               "rds:db-tag/stage":[
                  "development",
                  "test"
                  ]
               }
            }
       }
    ]
}
```

------

### 예제 2: 지정된 DB 파라미터 그룹을 사용하는 DB 인스턴스를 만들 수 있는 권한을 명시적으로 거부
<a name="w2aac58c48c33c23c29b8"></a>

다음 정책은 특정 태그 값이 있는 DB 파라미터 그룹을 사용하는 DB 인스턴스를 만들 수 있는 권한을 명시적으로 거부합니다. DB 인스턴스를 생성할 때 특정 고객 생성 DB 파라미터 그룹을 사용해야 할 경우 이 정책을 적용할 수 있습니다. `Deny`를 사용하는 정책은 더 광범위한 정책에서 부여한 액세스 권한을 제한하기 위해 가장 자주 사용됩니다.

명시적으로 거부하는 권한은 이미 부여된 다른 모든 권한에 우선합니다. 따라서 부여하지 않으려는 권한을 자격 증명이 우연히 획득하지 않도록 할 수 있습니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Sid":"DenyProductionCreate",
         "Effect":"Deny",
         "Action":"rds:CreateDBInstance",
         "Resource":"arn:aws:rds:*:123456789012:pg:*",
         "Condition":{
            "StringEquals":{
               "rds:pg-tag/usage":"prod"
            }
         }
      }
   ]
}
```

------

### 예제 3: 인스턴스 이름에 사용자 이름이 접두사로 붙은 DB 인스턴스 작업에 대한 권한 부여
<a name="w2aac58c48c33c23c29c10"></a>

다음 정책은 DB 인스턴스 이름에 사용자 이름이 접두사로 붙어 있고 `AddTagsToResource`와 동일한 `RemoveTagsFromResource`라는 태그가 있거나 `stage`라는 태그가 없는 DB 인스턴스에서 API(`devo` 또는 `stage` 제외)를 호출할 수 있는 권한을 허용합니다.

정책의 `Resource` 줄은 Amazon 리소스 이름(ARN)을 기준으로 리소스를 식별합니다. Amazon RDS 리소스에서 ARN을 사용하는 방법에 대한 자세한 내용은 [Amazon RDS의 Amazon 리소스 이름(ARN)](USER_Tagging.ARN.md) 단원을 참조하십시오.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Sid":"AllowFullDevAccessNoTags",
         "Effect":"Allow",
         "NotAction":[
            "rds:AddTagsToResource",
            "rds:RemoveTagsFromResource"
         ],
         "Resource":"arn:aws:rds:*:123456789012:db:${aws:username}*",
         "Condition":{
            "StringEqualsIfExists":{
               "rds:db-tag/stage":"devo"
            }
         }
      }
   ]
}
```

------

# 생성 시 Amazon RDS 리소스를 태그하는 권한 부여
<a name="security_iam_id-based-policy-examples-grant-permissions-tags-on-create"></a>

일부 RDS API 작업을 사용하면 리소스를 생성할 때 태그를 지정할 수 있습니다. 리소스 태그를 사용하여 속성 기반 제어(ABAC)를 구현할 수 있습니다. 자세한 내용은 [What is ABAC for AWS?](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction_attribute-based-access-control.html) 및 [태그를 사용한 AWS 리소스 액세스 제어](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_tags.html)를 참조하세요.

사용자가 생성 시 리소스에 태그를 지정할 수 있으려면 `rds:CreateDBInstance`와 같은 리소스를 생성하는 작업을 사용할 권한이 있어야 합니다. 생성 작업에서 태그가 지정되면 RDS는 `rds:AddTagsToResource` 작업에서 추가 권한 부여를 수행해 사용자에게 태그를 생성할 권한이 있는지 확인합니다. 따라서 사용자는 `rds:AddTagsToResource` 작업을 사용할 명시적 권한도 가지고 있어야 합니다.

`rds:AddTagsToResource` 작업에 대한 IAM 정책 정의에서 `aws:RequestTag` 조건 키를 사용하여 리소스에 태그를 지정하는 요청에 태그를 요구할 수 있습니다.

예를 들어 다음 정책은 사용자가 DB 인스턴스를 생성하고 DB 인스턴스 생성 중에 태그를 적용할 수 있도록 허용하지만 특정 태그 키(`environment` 또는 `project`)를 사용해야 합니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
       {
           "Effect": "Allow",
           "Action": [
               "rds:CreateDBInstance"
           ],
           "Resource": "*"
       },
       {
           "Effect": "Allow",
           "Action": [
               "rds:AddTagsToResource"
           ],
           "Resource": "*",
           "Condition": {
               "StringEquals": {
                   "aws:RequestTag/environment": ["production", "development"],
                   "aws:RequestTag/project": ["dataanalytics", "webapp"]
               },
               "ForAllValues:StringEquals": {
                   "aws:TagKeys": ["environment", "project"]
               }
           }
       }
   ]
}
```

------

이 정책은 `environment` 또는 `project` 태그 이외의 태그를 포함하거나 이러한 태그를 지정하지 않는 DB 인스턴스 생성 요청을 거부합니다. 또한 사용자는 정책의 허용된 값과 일치하는 태그 값을 지정해야 합니다.

다음 정책은 사용자가 DB 클러스터를 생성하고 생성 중에 `environment=prod` 태그를 제외하고는 어떤 태그든 적용하도록 허용합니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
       {
           "Effect": "Allow",
           "Action": [
               "rds:CreateDBCluster"
           ],
           "Resource": "*"
       },
       {
           "Effect": "Allow",
           "Action": [
               "rds:AddTagsToResource"
           ],
           "Resource": "*",
           "Condition": {
               "StringNotEquals": {
                   "aws:RequestTag/environment": "prod"
               }
           }
       }
   ]
}
```

------

## 생성 시 태그 지정이 지원되는 RDS API 작업
<a name="security_iam_id-based-policy-examples-supported-rds-api-actions-tagging-creation"></a>

리소스를 생성할 때 태그를 지원하는 RDS API 작업은 다음과 같습니다. 이러한 작업의 경우 리소스를 생성할 때 태그를 지정할 수 있습니다.
+ `CreateBlueGreenDeployment`
+ `CreateCustomDBEngineVersion`
+ `CreateDBCluster`
+ `CreateDBClusterEndpoint`
+ `CreateDBClusterParameterGroup`
+ `CreateDBClusterSnapshot`
+ `CreateDBInstance`
+ `CreateDBInstanceReadReplica`
+ `CreateDBParameterGroup`
+ `CreateDBProxy`
+ `CreateDBProxyEndpoint`
+ `CreateDBSecurityGroup`
+ `CreateDBShardGroup`
+ `CreateDBSnapshot`
+ `CreateDBSubnetGroup`
+ `CreateEventSubscription`
+ `CreateGlobalCluster`
+ `CreateIntegration`
+ `CreateOptionGroup`
+ `CreateTenantDatabase`
+ `CopyDBClusterParameterGroup`
+ `CopyDBClusterSnapshot`
+ `CopyDBParameterGroup`
+ `CopyDBSnapshot`
+ `CopyOptionGroup`
+ `RestoreDBClusterFromS3`
+ `RestoreDBClusterFromSnapshot`
+ `RestoreDBClusterToPointInTime`
+ `RestoreDBInstanceFromDBSnapshot`
+ `RestoreDBInstanceFromS3`
+ `RestoreDBInstanceToPointInTime`
+ `PurchaseReservedDBInstancesOffering`

AWS CLI 또는 API를 사용하여 태그가 있는 리소스를 생성하는 경우 생성 중에 리소스에 태그를 적용하는 데 `Tags` 파라미터가 사용됩니다.

이러한 API 작업의 경우 태그 지정에 실패하면 리소스가 생성되지 않고 오류와 함께 요청이 실패합니다. 리소스가 태그와 함께 생성되거나 전혀 생성되지 않으므로 의도한 태그 없이는 리소스가 생성되지 않습니다.

# AWSAmazon RDS에 대한 관리형 정책
<a name="rds-security-iam-awsmanpol"></a>

권한 세트 및 역할에 권한을 추가하려면 정책을 직접 작성하는 것보다 AWS 관리형 정책을 사용하는 것이 편리합니다. 팀에 필요한 권한만 제공하는 [IAM 고객 관리형 정책을 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html)하려면 시간과 전문 지식이 필요합니다. 빠르게 시작하려면 AWS 관리형 정책을 사용하면 됩니다. 이 정책은 일반적인 사용 사례를 다루며 사용자의 AWS 계정에서 사용할 수 있습니다. AWS 관리형 정책에 대한 자세한 정보는 [IAM 사용 설명서](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies)에서 *AWS 관리형 정책*을 참조하세요.

AWS 서비스는 AWS 관리형 정책을 유지하고 업데이트합니다. AWS 관리형 정책에서는 권한을 변경할 수 없습니다. 서비스는 때때로 추가 권한을 AWS관리형 정책에 추가하여 새로운 기능을 지원합니다. 이 유형의 업데이트는 정책이 연결된 모든 자격 증명(권한 세트 및 역할)에 적용됩니다. 서비스는 새로운 기능이 시작되거나 새 작업을 사용할 수 있을 때 AWS 관리형 정책에 업데이트됩니다. 서비스는 AWS 관리형 정책에서 권한을 제거하지 않기 때문에 정책 업데이트로 인해 기존 권한이 손상되지 않습니다.

또한 AWS는 여러 서비스의 직무에 대한 관리형 정책을 지원합니다. 예를 들어 `ReadOnlyAccess` AWS 관리형 정책은 모든 AWS 서비스 및 리소스에 대한 읽기 전용 액세스 권한을 제공합니다. 서비스에서 새 기능을 시작하면 AWS가 새 작업 및 리소스에 대한 읽기 전용 권한을 추가합니다. 직무 정책의 목록과 설명은 *IAM 사용 설명서*의 [직무에 관한 AWS 관리형 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_job-functions.html)을 참조하세요.

**Topics**
+ [AWS 관리형 정책: AmazonRDSReadOnlyAccess](#rds-security-iam-awsmanpol-AmazonRDSReadOnlyAccess)
+ [AWS 관리형 정책: AmazonRDSFullAccess](#rds-security-iam-awsmanpol-AmazonRDSFullAccess)
+ [AWS 관리형 정책: AmazonRDSDataFullAccess](#rds-security-iam-awsmanpol-AmazonRDSDataFullAccess)
+ [AWS 관리형 정책: AmazonRDSEnhancedMonitoringRole](#rds-security-iam-awsmanpol-AmazonRDSEnhancedMonitoringRole)
+ [AWS 관리형 정책: AmazonRDSPerformanceInsightsReadOnly](#rds-security-iam-awsmanpol-AmazonRDSPerformanceInsightsReadOnly)
+ [AWS 관리형 정책: AmazonRDSPerformanceInsightsFullAccess](#rds-security-iam-awsmanpol-AmazonRDSPerformanceInsightsFullAccess)
+ [AWS 관리형 정책: AmazonRDSDirectoryServiceAccess](#rds-security-iam-awsmanpol-AmazonRDSDirectoryServiceAccess)
+ [AWS 관리형 정책: AmazonRDSServiceRolePolicy](#rds-security-iam-awsmanpol-AmazonRDSServiceRolePolicy)
+ [AWS 관리형 정책: AmazonRDSCustomServiceRolePolicy](#rds-security-iam-awsmanpol-AmazonRDSCustomServiceRolePolicy)
+ [AWS 관리형 정책: AmazonRDSCustomInstanceProfileRolePolicy](#rds-security-iam-awsmanpol-AmazonRDSCustomInstanceProfileRolePolicy)
+ [AWS 관리형 정책: AmazonRDSPreviewServiceRolePolicy](#rds-security-iam-awsmanpol-AmazonRDSPreviewServiceRolePolicy)
+ [AWS 관리형 정책: AmazonRDSBetaServiceRolePolicy](#rds-security-iam-awsmanpol-AmazonRDSBetaServiceRolePolicy)

## AWS 관리형 정책: AmazonRDSReadOnlyAccess
<a name="rds-security-iam-awsmanpol-AmazonRDSReadOnlyAccess"></a>

이 정책은 AWS Management Console을 통해 Amazon RDS에 대한 읽기 전용 액세스를 허용합니다.

**권한 세부 정보**

이 정책에는 다음 권한이 포함되어 있습니다.
+ `rds` - 보안 주체가 Amazon RDS 리소스를 설명하고 Amazon RDS 리소스의 태그를 나열하도록 허용합니다.
+ `cloudwatch` - 보안 주체가 Amazon CloudWatch 지표 통계를 가져오도록 허용합니다.
+ `ec2` - 보안 주체가 가용 영역 및 네트워킹 리소스를 설명하도록 허용합니다.
+ `logs` - 보안 주체가 로그 그룹의 CloudWatch Logs 로그 스트림을 설명하고 CloudWatch Logs 로그 이벤트를 가져오도록 허용합니다.
+ `devops-guru` - 보안 주체가 CloudFormation 스택 이름 또는 리소스 태그로 지정되는 Amazon DevOps Guru 적용 범위가 있는 리소스를 설명할 수 있습니다.

JSON 정책 문서를 포함하여 이 정책에 대한 자세한 내용은 *AWS 관리형 정책 참조 안내서*의 [AmazonRDSReadOnlyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonRDSReadOnlyAccess.html)를 참조하세요.

## AWS 관리형 정책: AmazonRDSFullAccess
<a name="rds-security-iam-awsmanpol-AmazonRDSFullAccess"></a>

이 정책은 AWS Management Console을 통해 Amazon RDS에 대한 전체 액세스 권한을 제공합니다.

**권한 세부 정보**

이 정책에는 다음 권한이 포함되어 있습니다.
+ `rds` – 보안 주체에게 Amazon RDS에 대한 전체 액세스 권한을 허용합니다.
+ `application-autoscaling` - 보안 주체가 Application Auto Scaling 크기 조정 대상 및 정책을 설명하고 관리하도록 허용합니다.
+ `cloudwatch` - 보안 주체가 CloudWatch 지표 통계를 가져오고 CloudWatch 경보를 관리하도록 허용합니다.
+ `ec2` - 보안 주체가 가용 영역 및 네트워킹 리소스를 설명하도록 허용합니다.
+ `logs` - 보안 주체가 로그 그룹의 CloudWatch Logs 로그 스트림을 설명하고 CloudWatch Logs 로그 이벤트를 가져오도록 허용합니다.
+ `outposts` - 보안 주체가 AWS Outposts 인스턴스 유형을 가져오도록 허용합니다.
+ `pi` - 보안 주체가 성능 개선 도우미 지표를 가져오도록 허용합니다.
+ `sns` - 보안 주체에게 Amazon Simple Notification Service(Amazon SNS) 구독 및 주제를 허용하고 Amazon SNS 메시지를 게시하도록 허용합니다.
+ `devops-guru` - 보안 주체가 CloudFormation 스택 이름 또는 리소스 태그로 지정되는 Amazon DevOps Guru 적용 범위가 있는 리소스를 설명할 수 있습니다.

JSON 정책 문서를 포함하여 이 정책에 대한 자세한 내용은 *AWS 관리형 정책 참조 안내서*의 [AmazonRDSFullAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonRDSFullAccess.html)를 참조하세요.

## AWS 관리형 정책: AmazonRDSDataFullAccess
<a name="rds-security-iam-awsmanpol-AmazonRDSDataFullAccess"></a>

이 정책은 특정 AWS 계정의 Aurora Serverless 클러스터에서 데이터 API 및 쿼리 편집기를 사용할 수 있는 전체 액세스 권한을 허용합니다. 이 정책은 AWS 계정가 AWS Secrets Manager에서 암호 값을 가져오도록 허용합니다.

`AmazonRDSDataFullAccess` 정책을 IAM ID에 연결할 수 있습니다.

**권한 세부 정보**

이 정책에는 다음 권한이 포함되어 있습니다.
+ `dbqms` - 보안 주체에게 쿼리를 액세스, 생성, 삭제, 설명, 업데이트를 할 수 있도록 허용합니다. Database Query Metadata Service(`dbqms`)는 내부 전용 서비스입니다. Amazon RDS를 포함한 여러 AWS 서비스에 사용되는 AWS Management Console의 쿼리 편집기에 대해 최근 쿼리와 저장된 쿼리를 제공합니다.
+ `rds-data` - 보안 주체가 Aurora Serverless 데이터베이스에 SQL 문을 실행하도록 허용합니다.
+ `secretsmanager` - 보안 주체가 에서 암호 값을 가져오도록 허용합니다.AWS Secrets Manager

JSON 정책 문서를 포함하여 이 정책에 대한 자세한 내용은 *AWS 관리형 정책 참조 안내서*의 [AmazonRDSDataFullAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonRDSDataFullAccess.html)를 참조하세요.

## AWS 관리형 정책: AmazonRDSEnhancedMonitoringRole
<a name="rds-security-iam-awsmanpol-AmazonRDSEnhancedMonitoringRole"></a>

이 정책은 Amazon RDS Enhanced Monitoring을 위해 Amazon CloudWatch Logs 로그에 대한 액세스를 제공합니다.

**권한 세부 정보**

이 정책에는 다음 권한이 포함되어 있습니다.
+ `logs` - 보안 주체가 CloudWatch Logs 로그 그룹 및 보존 정책을 생성하고 로그 그룹의 CloudWatch Logs 로그 스트림을 생성 및 설명하도록 허용합니다. 또한 보안 주체가 CloudWatch Logs 로그 이벤트를 배치하고 가져오도록 허용합니다.

JSON 정책 문서를 포함하여 이 정책에 대한 자세한 내용은 *AWS 관리형 정책 참조 안내서*의 [AmazonRDSEnhancedMonitoringRole](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonRDSEnhancedMonitoringRole.html)을 참조하세요.

## AWS 관리형 정책: AmazonRDSPerformanceInsightsReadOnly
<a name="rds-security-iam-awsmanpol-AmazonRDSPerformanceInsightsReadOnly"></a>

이 정책은 Amazon RDS DB 인스턴스 및 Amazon Aurora DB 클러스터에 대한 Amazon RDS 성능 개선 도우미에 읽기 전용 액세스를 제공합니다.

이제 이 정책에 `Sid`(문 ID)가 정책 문의 식별자로 포함됩니다.

**권한 세부 정보**

이 정책에는 다음 권한이 포함되어 있습니다.
+ `rds` - 보안 주체가 Amazon RDS DB 인스턴스와 Amazon Aurora DB 클러스터를 설명하도록 허용합니다.
+ `pi` - 보안 주체가 Amazon RDS 성능 개선 도우미 API를 호출하고 성능 개선 도우미 지표에 액세스하도록 허용합니다.

JSON 정책 문서를 포함하여 이 정책에 대한 자세한 내용은 *AWS 관리형 정책 참조 안내서*의 [AmazonRDSPerformanceInsightsReadOnly](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonRDSPerformanceInsightsReadOnly.html)를 참조하세요.

## AWS 관리형 정책: AmazonRDSPerformanceInsightsFullAccess
<a name="rds-security-iam-awsmanpol-AmazonRDSPerformanceInsightsFullAccess"></a>

이 정책은 Amazon RDS DB 인스턴스 및 Amazon Aurora DB 클러스터에 대해 Amazon RDS 성능 개선 도우미에 전체 액세스를 제공합니다.

이제 이 정책에 `Sid`(문 ID)가 정책 문의 식별자로 포함됩니다.

**권한 세부 정보**

이 정책에는 다음 권한이 포함되어 있습니다.
+ `rds` - 보안 주체가 Amazon RDS DB 인스턴스와 Amazon Aurora DB 클러스터를 설명하도록 허용합니다.
+ `pi` - 보안 주체가 Amazon RDS 성능 개선 도우미 API를 호출하고 성능 분석 보고서를 생성, 확인 및 삭제하도록 허용합니다.
+ `cloudwatch` - 보안 주체가 모든 Amazon CloudWatch 지표를 나열하고 지표 데이터와 통계를 가져오도록 허용합니다.

JSON 정책 문서를 포함하여 이 정책에 대한 자세한 내용은 AWS 관리형 정책 참조 가이드**의 [AmazonRDSPerformanceInsightsFullAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonRDSPerformanceInsightsFullAccess.html)를 참조하세요.

## AWS 관리형 정책: AmazonRDSDirectoryServiceAccess
<a name="rds-security-iam-awsmanpol-AmazonRDSDirectoryServiceAccess"></a>

이 정책은 Amazon RDS에서 Directory Service를 호출하도록 허용합니다.

**권한 세부 정보**

이 정책에는 다음 권한이 포함되어 있습니다.
+ `ds` - 보안 주체가 Directory Service 디렉터리를 설명하고 Directory Service 디렉터리에 대한 권한 부여를 제어하도록 허용합니다.

JSON 정책 문서를 포함하여 이 정책에 대한 자세한 내용은 *AWS 관리형 정책 참조 안내서*의 [AmazonRDSDirectoryServiceAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonRDSDirectoryServiceAccess.html)를 참조하세요.

## AWS 관리형 정책: AmazonRDSServiceRolePolicy
<a name="rds-security-iam-awsmanpol-AmazonRDSServiceRolePolicy"></a>

`AmazonRDSServiceRolePolicy` 정책을 IAM 엔터티에 연결할 수 없습니다. 이 정책은 Amazon RDS에 사용자를 대신하여 작업을 수행할 수 있도록 하는 서비스 연결 역할에 연결됩니다. 자세한 내용은 [Amazon RDS에 대한 서비스 연결 역할 권한](UsingWithRDS.IAM.ServiceLinkedRoles.md#service-linked-role-permissions) 섹션을 참조하세요.

## AWS 관리형 정책: AmazonRDSCustomServiceRolePolicy
<a name="rds-security-iam-awsmanpol-AmazonRDSCustomServiceRolePolicy"></a>

`AmazonRDSCustomServiceRolePolicy` 정책을 IAM 엔터티에 연결할 수 없습니다. 이 정책은 Amazon RDS가 RDS DB 리소스를 대신하여 AWS 서비스를 직접 호출할 수 있는 서비스 연결 역할에 연결되어 있습니다.

이 정책에는 다음 권한이 포함되어 있습니다.
+ `ec2` ‐ RDS Custom이 특정 시점 복원 기능을 제공하는 DB 인스턴스에서 백업 작업을 수행할 수 있도록 허용합니다.
+ `secretsmanager` ‐ RDS Custom이 RDS Custom으로 만든 DB 인스턴스별 암호를 관리할 수 있도록 허용합니다.
+ `cloudwatch` ‐ RDS Custom이 CloudWatch 에이전트를 통해 DB 인스턴스 지표와 로그를 CloudWatch에 업로드할 수 있도록 허용합니다.
+ `events`, `sqs` ‐ RDS Custom이 DB 인스턴스에 대한 상태 정보를 보내고 받을 수 있도록 허용합니다.
+ `cloudtrail` ‐ RDS Custom이 DB 인스턴스에 대한 변경 이벤트를 수신하도록 허용
+ `servicequotas` ‐ RDS Custom이 DB 인스턴스와 관련된 서비스 할당량을 읽을 수 있도록 허용
+ `ssm` ‐ RDS Custom이 DB 인스턴스의 기본 EC2 인스턴스를 관리할 수 있도록 허용
+ `rds` ‐ RDS Custom이 DB 인스턴스의 RDS 리소스를 관리하도록 허용
+ `iam` ‐ RDS Custom이 인스턴스 프로파일을 검증하고 DB 인스턴스의 기본 EC2 인스턴스에 연결할 수 있도록 허용

JSON 정책 문서를 포함하여 이 정책에 대한 자세한 내용은 *AWS 관리형 정책 참조 안내서*의 [AmazonRDSCustomServiceRolePolicy](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonRDSCustomServiceRolePolicy.html)를 참조하세요.

## AWS 관리형 정책: AmazonRDSCustomInstanceProfileRolePolicy
<a name="rds-security-iam-awsmanpol-AmazonRDSCustomInstanceProfileRolePolicy"></a>

`AmazonRDSCustomInstanceProfileRolePolicy`를 IAM 엔터티에 연결하면 안 됩니다. Amazon RDS Custom DB 인스턴스에 다양한 자동화 작업 및 데이터베이스 관리 작업을 수행할 수 있는 권한을 부여하는 데 사용되는 인스턴스 프로파일 역할에만 연결해야 합니다. RDS Custom 인스턴스 생성 중에 인스턴스 프로파일을 `custom-iam-instance-profile` 파라미터로 전달하면 RDS Custom에서 해당 인스턴스 프로파일을 DB 인스턴스에 연결합니다.

**권한 세부 정보**

이 정책에는 다음 권한이 포함되어 있습니다.
+ `ssm`, `ssmmessages`, `ec2messages` ‐ RDS Custom이 Systems Manager를 통해 DB 인스턴스에서 통신하고, 자동화를 실행하고, 에이전트를 유지 관리할 수 있도록 허용합니다.
+ `ec2`, `s3` ‐ RDS Custom이 특정 시점 복원 기능을 제공하는 DB 인스턴스에서 백업 작업을 수행할 수 있도록 허용합니다.
+ `secretsmanager` ‐ RDS Custom이 RDS Custom으로 만든 DB 인스턴스별 암호를 관리할 수 있도록 허용합니다.
+ `cloudwatch`, `logs` ‐ RDS Custom이 CloudWatch 에이전트를 통해 DB 인스턴스 지표와 로그를 CloudWatch에 업로드할 수 있도록 허용합니다.
+ `events`, `sqs` ‐ RDS Custom이 DB 인스턴스에 대한 상태 정보를 보내고 받을 수 있도록 허용합니다.
+ `kms` ‐ RDS Custom이 인스턴스별 KMS 키를 사용하여 RDS Custom이 관리하는 암호 및 S3 개체의 암호화를 수행할 수 있도록 허용합니다.

JSON 정책 문서를 포함하여 이 정책에 대한 자세한 내용은 **AWS 관리형 정책 참조 가이드의 [AmazonRDSCustomInstanceProfileRolePolicy](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonRDSCustomInstanceProfileRolePolicy.html)를 참조하세요.

## AWS 관리형 정책: AmazonRDSPreviewServiceRolePolicy
<a name="rds-security-iam-awsmanpol-AmazonRDSPreviewServiceRolePolicy"></a>

`AmazonRDSPreviewServiceRolePolicy`를 IAM 엔터티에 연결하면 안 됩니다. 이 정책은 Amazon RDS가 RDS DB 리소스를 대신하여 AWS 서비스를 직접 호출할 수 있는 서비스 연결 역할에 연결되어 있습니다. 자세한 내용은 [Amazon RDS 미리 보기에 대한 서비스 연결 역할](UsingWithRDS.IAM.ServiceLinkedRoles.md#slr-permissions-rdspreview) 섹션을 참조하세요.

**권한 세부 정보**

이 정책에는 다음 권한이 포함되어 있습니다.
+ `ec2` ‐ 보안 주체가 가용 영역 및 네트워킹 리소스를 설명하도록 허용합니다.
+ `secretsmanager` - 보안 주체가 에서 암호 값을 가져오도록 허용합니다.AWS Secrets Manager
+ `cloudwatch`, `logs` ‐ Amazon RDS가 CloudWatch 에이전트를 통해 DB 인스턴스 지표와 로그를 CloudWatch에 업로드할 수 있도록 허용합니다.

JSON 정책 문서를 포함하여 이 정책에 대한 자세한 내용은 *AWS 관리형 정책 참조 안내서*의 [AmazonRDSPreviewServiceRolePolicy](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonRDSPreviewServiceRolePolicy.html)를 참조하세요.

## AWS 관리형 정책: AmazonRDSBetaServiceRolePolicy
<a name="rds-security-iam-awsmanpol-AmazonRDSBetaServiceRolePolicy"></a>

`AmazonRDSBetaServiceRolePolicy`를 IAM 엔터티에 연결하면 안 됩니다. 이 정책은 Amazon RDS가 RDS DB 리소스를 대신하여 AWS 서비스를 직접 호출할 수 있는 서비스 연결 역할에 연결되어 있습니다. 자세한 내용은 [Amazon RDS 베타에 대한 서비스 연결 역할 권한](UsingWithRDS.IAM.ServiceLinkedRoles.md#slr-permissions-rdsbeta) 섹션을 참조하세요.

**권한 세부 정보**

이 정책에는 다음 권한이 포함되어 있습니다.
+ `ec2` ‐ Amazon RDS가 특정 시점 복원 기능을 제공하는 DB 인스턴스에서 백업 작업을 수행할 수 있도록 허용합니다.
+ `secretsmanager` ‐ Amazon RDS가 Amazon RDS로 만든 DB 인스턴스별 암호를 관리할 수 있도록 허용합니다.
+ `cloudwatch`, `logs` ‐ Amazon RDS가 CloudWatch 에이전트를 통해 DB 인스턴스 지표와 로그를 CloudWatch에 업로드할 수 있도록 허용합니다.

JSON 정책 문서를 포함하여 이 정책에 대한 자세한 내용은 *AWS 관리형 정책 참조 안내서*의 [AmazonRDSBetaServiceRolePolicy](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonRDSBetaServiceRolePolicy.html)를 참조하세요.

# AWS 관리형 정책에 대한 Amazon RDS 업데이트
<a name="rds-manpol-updates"></a>

이 서비스가 이러한 변경 내용을 추적하기 시작한 이후부터 Amazon RDS의 AWS 관리형 정책 업데이트에 대한 세부 정보를 봅니다. 이 페이지의 변경 사항에 대한 자동 알림을 받아보려면 Amazon RDS [문서 기록](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/WhatsNew.html) 페이지에서 RSS 피드를 구독하세요.




| 변경 사항 | 설명 | 날짜 | 
| --- | --- | --- | 
| [AWS 관리형 정책: AmazonRDSPreviewServiceRolePolicy](rds-security-iam-awsmanpol.md#rds-security-iam-awsmanpol-AmazonRDSPreviewServiceRolePolicy) - 기존 정책에 대한 업데이트 |  Amazon RDS는 `AWSServiceRoleForRDSPreview` 서비스 연결 역할의 `AmazonRDSPreviewServiceRolePolicy`에서 `sns:Publish` 권한을 제거했습니다. 자세한 내용은 [AWS 관리형 정책: AmazonRDSPreviewServiceRolePolicy](rds-security-iam-awsmanpol.md#rds-security-iam-awsmanpol-AmazonRDSPreviewServiceRolePolicy) 단원을 참조하십시오. | 2024년 8월 7일 | 
| [AWS 관리형 정책: AmazonRDSBetaServiceRolePolicy](rds-security-iam-awsmanpol.md#rds-security-iam-awsmanpol-AmazonRDSBetaServiceRolePolicy) - 기존 정책에 대한 업데이트 |  Amazon RDS는 `AWSServiceRoleForRDSBeta` 서비스 연결 역할의 `AmazonRDSBetaServiceRolePolicy`에서 `sns:Publish` 권한을 제거했습니다. 자세한 내용은 [AWS 관리형 정책: AmazonRDSBetaServiceRolePolicy](rds-security-iam-awsmanpol.md#rds-security-iam-awsmanpol-AmazonRDSBetaServiceRolePolicy) 단원을 참조하십시오.  | 2024년 8월 7일 | 
| [Amazon RDS Custom에 대한 서비스 연결 역할 권한](UsingWithRDS.IAM.ServiceLinkedRoles.md#slr-permissions-custom) - 기존 정책에 대한 업데이트 |  Amazon RDS는 `AWSServiceRoleForRDSCustom` 서비스 연결 역할의 `AmazonRDSCustomServiceRolePolicy`에 새로운 권한을 추가했습니다. 권한을 통해 RDS Custom은 다른 AWS 리전의 Amazon RDS 서비스와 통신하고 EC2 이미지를 복사할 수 있습니다. 자세한 내용은 [Amazon RDS Custom에 대한 서비스 연결 역할 권한](UsingWithRDS.IAM.ServiceLinkedRoles.md#slr-permissions-custom) 단원을 참조하십시오.  | 2024년 7월 18일 | 
| [AWS 관리형 정책: AmazonRDSServiceRolePolicy](rds-security-iam-awsmanpol.md#rds-security-iam-awsmanpol-AmazonRDSServiceRolePolicy) - 기존 정책에 대한 업데이트 |  Amazon RDS는 ` AWSServiceRoleForRDS` 서비스 연결 역할의 `AmazonRDSServiceRolePolicy`에서 `sns:Publish` 권한을 제거했습니다. 자세한 내용은 [AWS 관리형 정책: AmazonRDSServiceRolePolicy](rds-security-iam-awsmanpol.md#rds-security-iam-awsmanpol-AmazonRDSServiceRolePolicy) 단원을 참조하십시오.  | 2024년 7월 2일 | 
| [Amazon RDS Custom에 대한 서비스 연결 역할 권한](UsingWithRDS.IAM.ServiceLinkedRoles.md#slr-permissions-custom) - 기존 정책에 대한 업데이트 |  Amazon RDS는 `AWSServiceRoleForRDSCustom` 서비스 연결 역할의 `AmazonRDSCustomServiceRolePolicy`에 새로운 권한을 추가했습니다. 이 새 권한을 통해 RDS Custom이 RDS Custom 인스턴스에 인스턴스 프로파일로 서비스 역할을 연결할 수 있습니다. 자세한 내용은 [Amazon RDS Custom에 대한 서비스 연결 역할 권한](UsingWithRDS.IAM.ServiceLinkedRoles.md#slr-permissions-custom) 단원을 참조하십시오.  | 2024년 4월 19일 | 
| [AWSAmazon RDS에 대한 관리형 정책](rds-security-iam-awsmanpol.md) - 기존 정책에 대한 업데이트 |  Amazon RDS는 RDS Custom for SQL Server가 기본 데이터베이스 호스트 인스턴스 유형을 수정할 수 있도록 `AWSServiceRoleForRDSCustom` 서비스 연결 역할의 `AmazonRDSCustomServiceRolePolicy`에 새 권한을 추가했습니다. 또한 RDS는 데이터베이스 호스트의 인스턴스 유형 정보를 가져올 수 있는 `ec2:DescribeInstanceTypes` 권한을 추가했습니다. 자세한 내용은 [AWSAmazon RDS에 대한 관리형 정책](rds-security-iam-awsmanpol.md) 단원을 참조하십시오.  | 2024년 4월 8일 | 
|  [AWSAmazon RDS에 대한 관리형 정책](rds-security-iam-awsmanpol.md) - 새 정책  | Amazon RDS는 RDS Custom이 EC2 인스턴스 프로파일을 통해 자동화 작업 및 데이터베이스 관리 작업을 수행할 수 있도록 AmazonRDSCustomInstanceProfileRolePolicy로 이름이 지정된 새 관리형 정책을 추가했습니다. 자세한 내용은 [AWSAmazon RDS에 대한 관리형 정책](rds-security-iam-awsmanpol.md) 단원을 참조하십시오. | 2024년 2월 27일 | 
|  [Amazon RDS에 대한 서비스 연결 역할 권한](UsingWithRDS.IAM.ServiceLinkedRoles.md#service-linked-role-permissions) -기존 정책 업데이트 | Amazon RDS는 `AWSServiceRoleForRDS` 서비스 연결 역할의 `AmazonRDSServiceRolePolicy`에 새로운 문 ID를 추가했습니다. 자세한 내용은 [Amazon RDS에 대한 서비스 연결 역할 권한](UsingWithRDS.IAM.ServiceLinkedRoles.md#service-linked-role-permissions) 단원을 참조하십시오.  |  2024년 1월 19일  | 
|  [AWSAmazon RDS에 대한 관리형 정책](rds-security-iam-awsmanpol.md) - 기존 정책에 대한 업데이트  |  `AmazonRDSPerformanceInsightsReadOnly` 및 `AmazonRDSPerformanceInsightsFullAccess` 관리형 정책에서 이제 정책 문에 `Sid`(문 ID)를 식별자로 포함합니다. 자세한 정보는 [AWS 관리형 정책: AmazonRDSPerformanceInsightsReadOnly](rds-security-iam-awsmanpol.md#rds-security-iam-awsmanpol-AmazonRDSPerformanceInsightsReadOnly) 및 [AWS 관리형 정책: AmazonRDSPerformanceInsightsFullAccess](rds-security-iam-awsmanpol.md#rds-security-iam-awsmanpol-AmazonRDSPerformanceInsightsFullAccess) 섹션을 참조하세요.  |  2023년 10월 23일  | 
|  [Amazon RDS에 대한 서비스 연결 역할 권한](UsingWithRDS.IAM.ServiceLinkedRoles.md#service-linked-role-permissions) -기존 정책 업데이트  |  Amazon RDS는 `AWSServiceRoleForRDSCustom` 서비스 연결 역할의 `AmazonRDSCustomServiceRolePolicy`에 새로운 권한을 추가했습니다. 이 새로운 권한을 통해 RDS Custom for Oracle이 EventBridge 관리형 규칙을 생성, 수정 및 삭제할 수 있습니다. 자세한 내용은 [Amazon RDS Custom에 대한 서비스 연결 역할 권한](UsingWithRDS.IAM.ServiceLinkedRoles.md#slr-permissions-custom) 단원을 참조하십시오.  |  2023년 9월 20일  | 
|  [AWSAmazon RDS에 대한 관리형 정책](rds-security-iam-awsmanpol.md) - 기존 정책에 대한 업데이트  |  Amazon RDS에서 `AmazonRDSFullAccess` 관리형 정책에 대한 새로운 권한을 추가했습니다. 이 권한을 통해 일정 기간 동안 성능 분석 보고서를 생성, 확인 및 삭제할 수 있습니다. 성능 개선 도우미의 액세스 정책 구성에 대한 자세한 내용은 [Performance Insights에 대한 액세스 정책 구성](USER_PerfInsights.access-control.md) 섹션을 참조하세요.  |  2023년 8월 17일  | 
|  [AWSAmazon RDS에 대한 관리형 정책](rds-security-iam-awsmanpol.md) – 신규 정책 및 기존 정책에 대한 업데이트  |  Amazon RDS에서 `AmazonRDSPerformanceInsightsReadOnly` 관리형 정책 및 `AmazonRDSPerformanceInsightsFullAccess`라는 신규 관리형 정책에 대한 새로운 권한을 추가했습니다. 이러한 권한을 통해 일정 기간 동안 성능 개선 도우미를 분석하고, 권장 사항과 함께 분석 결과를 보고, 보고서를 삭제할 수 있습니다. 성능 개선 도우미의 액세스 정책 구성에 대한 자세한 내용은 [Performance Insights에 대한 액세스 정책 구성](USER_PerfInsights.access-control.md) 섹션을 참조하세요.  |  2023년 8월 16일  | 
|  [Amazon RDS에 대한 서비스 연결 역할 권한](UsingWithRDS.IAM.ServiceLinkedRoles.md#service-linked-role-permissions) -기존 정책 업데이트  |  Amazon RDS는 `AWSServiceRoleForRDSCustom` 서비스 연결 역할의 `AmazonRDSCustomServiceRolePolicy`에 새로운 권한을 추가했습니다. 이 새로운 권한은 RDS Custom for Oracle이 DB 스냅샷을 사용하도록 허용합니다. 자세한 내용은 [Amazon RDS Custom에 대한 서비스 연결 역할 권한](UsingWithRDS.IAM.ServiceLinkedRoles.md#slr-permissions-custom) 단원을 참조하십시오.  |  2023년 6월 23일  | 
|  [Amazon RDS에 대한 서비스 연결 역할 권한](UsingWithRDS.IAM.ServiceLinkedRoles.md#service-linked-role-permissions) -기존 정책 업데이트  |  Amazon RDS는 `AWSServiceRoleForRDSCustom` 서비스 연결 역할의 `AmazonRDSCustomServiceRolePolicy`에 새로운 권한을 추가했습니다. 이 새로운 권한은 RDS Custom for Oracle이 DB 스냅샷을 사용하도록 허용합니다. 자세한 내용은 [Amazon RDS Custom에 대한 서비스 연결 역할 권한](UsingWithRDS.IAM.ServiceLinkedRoles.md#slr-permissions-custom) 단원을 참조하십시오.  |  2023년 6월 23일  | 
|  [Amazon RDS에 대한 서비스 연결 역할 권한](UsingWithRDS.IAM.ServiceLinkedRoles.md#service-linked-role-permissions) -기존 정책 업데이트  |  Amazon RDS는 `AWSServiceRoleForRDSCustom` 서비스 연결 역할의 `AmazonRDSCustomServiceRolePolicy`에 새로운 권한을 추가했습니다. 이 새로운 권한은 RDS Custom이 네트워크 인터페이스를 생성하도록 허용합니다. 자세한 내용은 [Amazon RDS Custom에 대한 서비스 연결 역할 권한](UsingWithRDS.IAM.ServiceLinkedRoles.md#slr-permissions-custom) 단원을 참조하십시오.  |  2023년 5월 30일  | 
|  [Amazon RDS에 대한 서비스 연결 역할 권한](UsingWithRDS.IAM.ServiceLinkedRoles.md#service-linked-role-permissions) -기존 정책 업데이트  |  Amazon RDS는 `AWSServiceRoleForRDSCustom` 서비스 연결 역할의 `AmazonRDSCustomServiceRolePolicy`에 새로운 권한을 추가했습니다. RDS Custom은 이러한 새 권한을 사용하여 Amazon EBS를 호출해 스토리지 할당량을 확인할 수 있습니다. 자세한 내용은 [Amazon RDS Custom에 대한 서비스 연결 역할 권한](UsingWithRDS.IAM.ServiceLinkedRoles.md#slr-permissions-custom) 단원을 참조하십시오.  |  2023년 4월 18일  | 
|  [Amazon RDS에 대한 서비스 연결 역할 권한](UsingWithRDS.IAM.ServiceLinkedRoles.md#service-linked-role-permissions) -기존 정책 업데이트  |  Amazon RDS Custom에 Amazon SQS와의 통합을 위해 `AWSServiceRoleForRDSCustom` 서비스 연결 역할의 `AmazonRDSCustomServiceRolePolicy`에 대한 새로운 권한이 추가되었습니다. RDS Custom을 사용하려면 Amazon SQS와 통합하여 고객 계정의 SQS 대기열을 생성하고 관리해야 합니다. SQS 대기열 이름은 `do-not-delete-rds-custom-[identifier]` 형식을 따르며 `Amazon RDS Custom`이라는 태그가 지정됩니다. RDS Custom이 인스턴스에 연결된 볼륨에 대한 백업을 생성할 수 있도록 `ec2:CreateSnapshot`에 대한 권한도 추가되었습니다. 자세한 내용은 [Amazon RDS Custom에 대한 서비스 연결 역할 권한](UsingWithRDS.IAM.ServiceLinkedRoles.md#slr-permissions-custom) 단원을 참조하십시오.  |  2023년 4월 6일  | 
|  [AWSAmazon RDS에 대한 관리형 정책](rds-security-iam-awsmanpol.md) -기존 정책 업데이트  |  Amazon RDS에서는 새로운 Amazon CloudWatch 네임스페이스 `ListMetrics`를 `AmazonRDSFullAccess` 및 `AmazonRDSReadOnlyAccess`에 추가했습니다. 이 네임스페이스는 Amazon RDS가 특정한 리소스 사용량 지표를 나열하는 데 필요합니다. 자세한 내용은 *Amazon CloudWatch 사용 설명서*의 [CloudWatch 리소스에 대한 액세스 권한 관리 개요](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/iam-access-control-overview-cw.html)를 참조하세요.  |  2023년 4월 4일  | 
|  [AWSAmazon RDS에 대한 관리형 정책](rds-security-iam-awsmanpol.md) -기존 정책 업데이트  |  Amazon RDS는 RDS 콘솔에서 Amazon DevOps Guru를 사용할 수 있도록 `AmazonRDSFullAccess` 및 `AmazonRDSReadOnlyAccess` 관리형 정책에 새로운 권한을 추가했습니다. 이 권한은 DevOps Guru의 결과를 표시하는 데 필요합니다. 자세한 내용은 [AWS 관리형 정책에 대한 Amazon RDS 업데이트](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-manpol-updates.html)를 참조하세요.  |  2023년 3월 30일  | 
|  [Amazon RDS에 대한 서비스 연결 역할 권한](UsingWithRDS.IAM.ServiceLinkedRoles.md#service-linked-role-permissions) -기존 정책 업데이트  |  Amazon RDS는 AWS Secrets Manager와의 통합을 위해 `AWSServiceRoleForRDS` 서비스 연결 역할의 `AmazonRDSServiceRolePolicy`에 새로운 권한을 추가했습니다. Secrets Manager에서 마스터 사용자 암호를 관리하려면 RDS와 Secrets Manager의 통합이 필요합니다. 암호는 예약된 명명 규칙을 사용하며 고객 업데이트를 제한합니다. 자세한 내용은 [Amazon RDS 및 AWS Secrets Manager를 통한 암호 관리](rds-secrets-manager.md) 단원을 참조하십시오.  |  2022년 12월 22일  | 
|  [Amazon RDS에 대한 서비스 연결 역할 권한](UsingWithRDS.IAM.ServiceLinkedRoles.md#service-linked-role-permissions) -기존 정책 업데이트  |  Amazon RDS는 `AWSServiceRoleForRDSCustom` 서비스 연결 역할의 `AmazonRDSCustomServiceRolePolicy`에 새로운 권한을 추가했습니다. RDS Custom은 DB 클러스터를 지원합니다. 정책의 이러한 새 권한을 통해 RDS Custom이 DB 클러스터를 대신하여 AWS 서비스를 호출할 수 있습니다. 자세한 내용은 [Amazon RDS Custom에 대한 서비스 연결 역할 권한](UsingWithRDS.IAM.ServiceLinkedRoles.md#slr-permissions-custom) 단원을 참조하십시오.  |  2022년 11월 9일  | 
|  [Amazon RDS에 대한 서비스 연결 역할 권한](UsingWithRDS.IAM.ServiceLinkedRoles.md#service-linked-role-permissions) - 기존 정책에 대한 업데이트  |  Amazon RDS는 AWS Secrets Manager와의 통합을 위해 `AWSServiceRoleForRDS` 서비스 연결 역할에 새로운 권한을 추가했습니다. SSRS(SQL Server Reporting Services) 이메일이 RDS에서 작동하려면 Secrets Manager와 통합해야 합니다. SSRS 이메일은 고객을 대신하여 암호를 생성합니다. 암호는 예약된 명명 규칙을 사용하며 고객 업데이트를 제한합니다. 자세한 정보는 [SSRS 이메일을 사용하여 보고서 보내기](SSRS.Email.md)을 참조하세요.  |  2022년 8월 26일  | 
|  [Amazon RDS에 대한 서비스 연결 역할 권한](UsingWithRDS.IAM.ServiceLinkedRoles.md#service-linked-role-permissions) -기존 정책 업데이트  |  Amazon RDS에서는 `PutMetricData`용 `AmazonRDSPreviewServiceRolePolicy`에 새로운 Amazon CloudWatch 네임스페이스를 추가했습니다. 이 네임스페이스는 Amazon RDS가 리소스 사용량 지표를 게시하는 데 필요합니다. 자세한 내용은 *Amazon CloudWatch 사용 설명서*의 [조건 키를 사용하여 CloudWatch 네임스페이스에 대한 액세스 제한](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/iam-cw-condition-keys-namespace.html)을 참조하세요.  |  2022년 6월 7일  | 
|  [Amazon RDS에 대한 서비스 연결 역할 권한](UsingWithRDS.IAM.ServiceLinkedRoles.md#service-linked-role-permissions) -기존 정책 업데이트  |  Amazon RDS에서는 `PutMetricData`용 `AmazonRDSBetaServiceRolePolicy`에 새로운 Amazon CloudWatch 네임스페이스를 추가했습니다. 이 네임스페이스는 Amazon RDS가 리소스 사용량 지표를 게시하는 데 필요합니다. 자세한 내용은 *Amazon CloudWatch 사용 설명서*의 [조건 키를 사용하여 CloudWatch 네임스페이스에 대한 액세스 제한](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/iam-cw-condition-keys-namespace.html)을 참조하세요.  |  2022년 6월 7일  | 
|  [Amazon RDS에 대한 서비스 연결 역할 권한](UsingWithRDS.IAM.ServiceLinkedRoles.md#service-linked-role-permissions) -기존 정책 업데이트  |  Amazon RDS에서는 `PutMetricData`용 `AWSServiceRoleForRDS`에 새로운 Amazon CloudWatch 네임스페이스를 추가했습니다. 이 네임스페이스는 Amazon RDS가 리소스 사용량 지표를 게시하는 데 필요합니다. 자세한 내용은 *Amazon CloudWatch 사용 설명서*의 [조건 키를 사용하여 CloudWatch 네임스페이스에 대한 액세스 제한](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/iam-cw-condition-keys-namespace.html)을 참조하세요.  |  2022년 4월 22일  | 
|  [Amazon RDS에 대한 서비스 연결 역할 권한](UsingWithRDS.IAM.ServiceLinkedRoles.md#service-linked-role-permissions) -기존 정책 업데이트  |  고객 소유 IP 풀 및 로컬 게이트웨이 라우팅 테이블(LGW-RTB)에 대한 권한을 관리하기 위해 Amazon RDS에서 `AWSServiceRoleForRDS` 서비스 연결 역할에 새 권한을 추가했습니다. 이 권한은 RDS on Outposts가 Outposts의 여러 로컬 네트워크에서 다중 AZ 복제를 수행하는 데 필요합니다. 자세한 내용은 [AWS Outposts의 Amazon RDS 다중 AZ 배포 작업](rds-on-outposts.maz.md) 단원을 참조하십시오.  |  2022년 4월 19일  | 
|  [ID 기반 정책](UsingWithRDS.IAM.md#security_iam_access-manage-id-based-policies) -기존 정책 업데이트  |  LGW-RTB에 대한 권한을 설명하기 위해 Amazon RDS에서 `AmazonRDSFullAccess` 관리형 정책에 새 권한을 추가했습니다. 이 권한은 RDS on Outposts가 Outposts의 여러 로컬 네트워크에서 다중 AZ 복제를 수행하기 위해 권한을 설명하는 데 필요합니다. 자세한 내용은 [AWS Outposts의 Amazon RDS 다중 AZ 배포 작업](rds-on-outposts.maz.md) 단원을 참조하십시오.  |  2022년 4월 19일  | 
|  [AWSAmazon RDS에 대한 관리형 정책](rds-security-iam-awsmanpol.md) - 새 정책  |  Amazon RDS에서는 Amazon RDS가 DB 인스턴스를 대신하여 AWS를 호출할 수 있도록 `AmazonRDSPerformanceInsightsReadOnly`라는 새로운 관리형 정책을 추가했습니다. 성능 개선 도우미의 액세스 정책 구성에 대한 자세한 내용은 [Performance Insights에 대한 액세스 정책 구성](USER_PerfInsights.access-control.md) 섹션을 참조하세요.  |  2022년 3월 10일  | 
|  [Amazon RDS에 대한 서비스 연결 역할 권한](UsingWithRDS.IAM.ServiceLinkedRoles.md#service-linked-role-permissions) -기존 정책 업데이트  |  Amazon RDS에서는 `PutMetricData`용 `AWSServiceRoleForRDS`에 새로운 Amazon CloudWatch 네임스페이스를 추가했습니다. Amazon DocumentDB(MongoDB 호환) 및 Amazon Neptune에서 CloudWatch 지표를 게시하려면 이러한 네임스페이스가 필요합니다. 자세한 내용은 *Amazon CloudWatch 사용 설명서*의 [조건 키를 사용하여 CloudWatch 네임스페이스에 대한 액세스 제한](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/iam-cw-condition-keys-namespace.html)을 참조하세요.  |  2022년 3월 4일  | 
|  [Amazon RDS Custom에 대한 서비스 연결 역할 권한](UsingWithRDS.IAM.ServiceLinkedRoles.md#slr-permissions-custom) - 새 정책  |  Amazon RDS에서는 RDS Custom이 DB 인스턴스를 대신하여 AWS 서비스를 호출할 수 있도록 `AWSServiceRoleForRDSCustom`라는 새로운 서비스 연결 역할을 추가했습니다.  |  2021년 10월 26일  | 
|  Amazon RDS에서 변경 사항 추적 시작  |  Amazon RDS가 AWS 관리형 정책에 대한 변경 사항 추적을 시작했습니다.  |  2021년 10월 26일  | 

# 교차 서비스 혼동된 대리자 문제 방지
<a name="cross-service-confused-deputy-prevention"></a>

*혼동된 대리자 문제*는 작업을 수행할 권한이 없는 엔터티가 권한이 더 많은 엔터티에 작업을 수행하도록 강요할 수 있는 보안 문제입니다. AWS에서는 교차 서비스 가장으로 인해 혼동된 대리자 문제가 발생할 수 있습니다.

교차 서비스 가장은 한 서비스(*직접 호출하는 서비스*)가 다른 서비스(*직접 호출되는 서비스*)를 직접 호출할 때 발생할 수 있습니다. 다른 고객의 리소스에 대해 액세스 권한이 없는 방식으로 작동하게 권한을 사용하도록 호출 서비스를 조작할 수 있습니다. 이를 방지하기 위해 AWS에서는 계정의 리소스에 대한 액세스 권한이 부여된 서비스 보안 주체를 사용하여 모든 서비스에 대한 데이터를 보호하는 데 도움이 되는 도구를 제공합니다. 자세한 내용은 *IAM 사용 설명서*의 [혼동된 대리자 문제](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)를 참조하세요.

Amazon RDS가 다른 서비스에 제공하는 리소스에 대한 권한을 제한하려면 리소스 정책에서 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn) 및 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount) 전역 조건 컨텍스트 키를 사용하는 것이 좋습니다.

경우에 따라 `aws:SourceArn` 값에 계정 ID가 포함되지 않습니다. Amazon S3 버킷에 Amazon 리소스 이름(ARN)을 사용하는 경우를 예로 들 수 있습니다. 이러한 경우 두 전역 조건 컨텍스트 키를 모두 사용하여 권한을 제한해야 합니다. 경우에 따라 두 전역 조건 컨텍스트 키를 모두 사용하고 `aws:SourceArn` 값에 계정 ID가 포함됩니다. 이러한 경우 `aws:SourceAccount` 값과 `aws:SourceArn`의 계정이 동일한 정책 문에서 사용될 때 동일한 계정 ID를 사용하는지 확인합니다. 하나의 리소스만 교차 서비스 액세스와 연결되게 하려는 경우 `aws:SourceArn`을 사용합니다. 지정된 AWS 계정의 모든 리소스가 교차 서비스 사용과 연결되게 하려는 경우 `aws:SourceAccount`를 사용합니다.

`aws:SourceArn`의 값이 Amazon RDS 리소스 유형에 대한 ARN인지 확인하세요. 자세한 내용은 [Amazon RDS의 Amazon 리소스 이름(ARN)](USER_Tagging.ARN.md) 섹션을 참조하세요.

혼동된 대리인 문제로부터 보호하는 가장 효과적인 방법은 리소스의 전체 ARN이 포함된 `aws:SourceArn`글로벌 조건 컨텍스트 키를 사용하는 것입니다. 경우에 따라 리소스의 전체 ARN을 모르거나 여러 리소스를 지정하고 있을 수 있습니다. 이러한 경우 ARN의 알 수 없는 부분에 대해 와일드카드(`*`)와 함께 `aws:SourceArn` 전역 컨텍스트 조건 키를 사용하세요. 예를 들면, `arn:aws:rds:*:123456789012:*`입니다.

다음 예에서는 Amazon RDS에서 `aws:SourceArn` 및 `aws:SourceAccount` 전역 조건 컨텍스트 키를 사용하여 혼동된 대리자 문제를 방지하는 방법을 보여줍니다.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Sid": "ConfusedDeputyPreventionExamplePolicy",
    "Effect": "Allow",
    "Principal": {
      "Service": "rds.amazonaws.com"
    },
    "Action": "sts:AssumeRole",
    "Condition": {
      "ArnLike": {
        "aws:SourceArn": "arn:aws:rds:us-east-1:123456789012:db:mydbinstance"
      },
      "StringEquals": {
        "aws:SourceAccount": "123456789012"
      }
    }
  }
}
```

------

`aws:SourceArn` 및 `aws:SourceAccount` 전역 조건 컨텍스트 키를 사용하는 정책의 추가 예는 다음 섹션을 참조하세요.
+ [Amazon SNS 주제에 알림을 게시할 권한 부여](USER_Events.GrantingPermissions.md)
+ [기본 백업 및 복원을 위한 IAM 역할 수동으로 만들기](SQLServer.Procedural.Importing.Native.Enabling.md#SQLServer.Procedural.Importing.Native.Enabling.IAM)
+ [SQL Server DB 인스턴스에 대한 Windows 인증 설정](USER_SQLServerWinAuth.SettingUp.md)
+ [RDS for SQL Server와 S3를 통합하기 위한 사전 요구 사항](Appendix.SQLServer.Options.S3-integration.preparing.md)
+ [수동으로 SQL Server Audit에 대한 IAM 역할 생성](Appendix.SQLServer.Options.Audit.IAM.md)
+ [Amazon S3와 RDS for Oracle 통합을 위한 IAM 권한 구성](oracle-s3-integration.preparing.md)
+ [Amazon S3 버킷에 대한 액세스 권한 설정](USER_PostgreSQL.S3Import.AccessPermission.md)(PostgreSQL 가져오기)
+ [Amazon S3 버킷에 대한 액세스 권한 설정](postgresql-s3-export-access-bucket.md)(PostgreSQL 내보내기)

# MariaDB, MySQL 및 PostgreSQL IAM 데이터베이스 인증
<a name="UsingWithRDS.IAMDBAuth"></a>

AWS Identity and Access Management(IAM) 데이터베이스 인증을 사용하여 DB 인스턴스에 인증할 수 있습니다. IAM 데이터베이스 인증은 MariaDB, MySQL, PostgreSQL과 함께 작동합니다. 이러한 인증 방식은 DB 인스턴스에 연결할 때 암호를 사용할 필요 없습니다. 대신에 인증 토큰을 사용합니다.

*인증 토큰*이란 요청이 있을 때 Amazon RDS가 생성하는 고유 문자열입니다. 인증 토큰은 AWS 서명 버전 4를 통해 생성됩니다. 각 토큰의 수명은 15분입니다. 인증을 외부에서 IAM을 사용해 관리하기 때문에 사용자 자격 증명을 데이터베이스에 저장할 필요도 없습니다. 또한 표준 데이터베이스 인증 방식도 사용 가능합니다. 토큰은 인증에만 사용되며 설정된 후에는 세션에 영향을 주지 않습니다.

IAM 데이터베이스 인증은 다음과 같은 이점이 있습니다.
+ 데이터베이스를 오가는 네트워크 트래픽은 SSL(Secure Sockets Layer) 또는 TLS(Transport Layer Security)를 통해 암호화됩니다. Amazon RDS에서 SSL/TLS를 사용하는 방법에 대한 자세한 내용은 [SSL/TLS를 사용하여 DB 인스턴스 또는 클러스터 에 대한 연결 암호화](UsingWithRDS.SSL.md) 섹션을 참조하십시오.
+ 데이터베이스 리소스에 대한 액세스는 DB 인스턴스에서 개별적으로 관리할 필요 없이 IAM을 통해 중앙에서 관리할 수 있습니다.
+ Amazon EC2에서 실행되는 애플리케이션의 경우, 암호가 아닌 EC2 인스턴스용 프로파일 자격 증명을 사용해 데이터베이스에 액세스하기 때문에 보안을 더욱 강화하는 효과가 있습니다.

일반적으로 애플리케이션에서 초당 200개 미만의 연결을 생성하고 애플리케이션 코드에서 사용자 이름과 암호를 직접 관리하지 않으려는 경우 IAM 데이터베이스 인증을 사용하는 것이 좋습니다.

Amazon Web Services(AWS) JDBC 드라이버는 IAM 데이터베이스 인증을 지원합니다. 자세한 내용은 [Amazon Web Services (AWS) JDBC Driver GitHub repository](https://github.com/aws/aws-advanced-jdbc-wrapper)에서 [AWS IAM Authentication Plugin](https://github.com/aws/aws-advanced-jdbc-wrapper/blob/main/docs/using-the-jdbc-driver/using-plugins/UsingTheIamAuthenticationPlugin.md)을 참조하세요.

Amazon Web Services(AWS) Python 드라이버는 IAM 데이터베이스 인증을 지원합니다. 자세한 내용은 [Amazon Web Services (AWS) Python Driver GitHub repository](https://github.com/aws/aws-advanced-python-wrapper)에서 [AWS IAM Authentication Plugin](https://github.com/aws/aws-advanced-python-wrapper/blob/main/docs/using-the-python-driver/using-plugins/UsingTheIamAuthenticationPlugin.md)을 참조하세요.

다음 주제를 탐색하여 DB 인증을 위한 IAM을 설정하는 프로세스를 알아봅니다.
+ [IAM 데이터베이스 인증의 활성화 및 비활성화](UsingWithRDS.IAMDBAuth.Enabling.md)
+ [IAM 데이터베이스 액세스를 위한 IAM 정책 생성 및 사용](UsingWithRDS.IAMDBAuth.IAMPolicy.md)
+ [IAM 인증을 사용하여 데이터베이스 계정 생성](UsingWithRDS.IAMDBAuth.DBAccounts.md)
+ [IAM 인증을 사용하여 DB 인스턴스에 연결](UsingWithRDS.IAMDBAuth.Connecting.md) 

## 리전 및 버전 사용 가능 여부
<a name="UsingWithRDS.IAMDBAuth.Availability"></a>

기능 가용성 및 해당 지원은 각 데이터베이스 엔진의 특정 버전에 따라 다릅니다. Amazon RDS 및 IAM 데이터베이스 인증을 통한 엔진, 버전 및 리전 가용성에 대한 자세한 내용은 [Amazon RDS에서 IAM 데이터베이스 인증을 지원하는 리전 및 DB 엔진](Concepts.RDS_Fea_Regions_DB-eng.Feature.IamDatabaseAuthentication.md) 섹션을 참조하세요.

## CLI 및 SDK 지원
<a name="UsingWithRDS.IAMDBAuth.cli-sdk"></a>

[AWS CLI](https://docs.aws.amazon.com/cli/latest/reference/rds/generate-db-auth-token.html) 및 다음 언어별 AWS SDK에서 IAM 데이터베이스 인증을 사용할 수 있습니다.
+ [AWS SDK for .NET](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/RDS/TRDSAuthTokenGenerator.html)
+ [AWS SDK for C\$1\$1](https://docs.aws.amazon.com/sdk-for-cpp/latest/api/class_aws_1_1_r_d_s_1_1_r_d_s_client.html#ae134ffffed5d7672f6156d324e7bd392)
+ [AWS SDK for Go](https://docs.aws.amazon.com/sdk-for-go/api/service/rds/#pkg-overview)
+ [AWS SDK for Java](https://docs.aws.amazon.com/sdk-for-java/latest/reference/software/amazon/awssdk/services/rds/RdsUtilities.html)
+ [AWS SDK for JavaScript](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/modules/_aws_sdk_rds_signer.html)
+ [AWS SDK for PHP](https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.Rds.AuthTokenGenerator.html)
+ [AWS SDK for Python (Boto3)](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/rds.html#RDS.Client.generate_db_auth_token)
+ [AWS SDK for Ruby](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/RDS/AuthTokenGenerator.html)

## IAM 데이터베이스 인증 방식의 제한 사항
<a name="UsingWithRDS.IAMDBAuth.Limitations"></a>

IAM 데이터베이스 인증을 사용하는 경우, 다음 한도가 적용됩니다.
+ 현재 IAM 데이터베이스 인증은 모든 전역 조건 컨텍스트 키를 지원하지 않습니다.

  전역 조건 컨텍스트 키에 대한 자세한 내용은 *IAM 사용 설명서*의 [AWS 전역 조건 컨텍스트 키](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)를 참조하세요.
+ PostgreSQL의 경우 IAM 역할(`rds_iam`)이 사용자(마스터 사용자 RDS 포함)에 추가되면 IAM 인증이 암호 인증보다 우선하므로, 사용자는 IAM 사용자로 로그인해야 합니다.
+ PostgreSQL의 경우 Amazon RDS는 IAM 및 Kerberos 인증 방법을 모두 동시에 활성화하는 것을 지원하지 않습니다.
+ PostgreSQL의 경우 IAM 인증을 사용하여 복제 연결을 설정할 수 없습니다.
+ 인증 토큰을 생성할 때는 DB 인스턴스 엔드포인트 대신 사용자 지정 Route 53 DNS 레코드를 사용할 수 없습니다.
+ CloudWatch와 CloudTrail은 IAM 인증을 로깅하지 않습니다. 이러한 서비스는 데이터베이스 연결을 활성화하도록 IAM 역할을 승인하는 `generate-db-auth-token` API 직접 호출을 추적하지 않습니다.
+ IAM DB 권한 부여에는 데이터베이스 인스턴스의 컴퓨팅 리소스가 필요합니다. 신뢰할 수 있는 연결을 위해 데이터베이스에 300MiB 및 1,000MiB 사이의 추가 메모리가 있어야 합니다. 워크로드에 필요한 메모리를 보려면 IAM DB 인증을 사용하기 전과 후에 확장 모니터링 프로세스 목록에서 RDS 프로세스에 대한 RES 열을 비교합니다. [RDS 콘솔에서 OS 지표 보기](USER_Monitoring.OS.Viewing.md)을(를) 참조하세요.

  버스트 가능 클래스 인스턴스를 사용하는 경우 버퍼 및 캐시와 같은 다른 파라미터에서 사용되는 메모리를 동일한 양만큼 줄여 메모리가 부족하지 않도록 합니다.
+ 엔진에 상관없이 RDS on Outposts에서는 IAM DB 인증이 지원되지 않습니다.

## IAM 데이터베이스 인증에 대한 권장 사항
<a name="UsingWithRDS.IAMDBAuth.ConnectionsPerSecond"></a>

IAM 데이터베이스 인증을 사용할 경우 다음을 따르는 게 좋습니다.
+ 애플리케이션에 초당 200개 미만의 새 IAM 데이터베이스 인증 연결이 필요한 경우에는 IAM 데이터베이스 인증 방식을 사용합니다.

  Amazon RDS에서 작동하는 데이터베이스 엔진은 초당 인증 횟수에 제한이 없습니다. 하지만 IAM 데이터베이스 인증 방식을 사용할 때는 애플리케이션이 인증 토큰을 생성해야 합니다. 이렇게 생성된 토큰은 애플리케이션이 DB 인스턴스에 연결하는 데 사용됩니다. 초당 허용되는 새 연결의 최대 수를 초과하면 IAM 데이터베이스 인증에 오버헤드가 추가로 발생하여 연결 병목 현상이 발생할 수 있습니다.

  지속적인 연결 생성을 줄이려면 애플리케이션에서 연결 풀링을 사용하는 것이 좋습니다. 이렇게 하면 IAM DB 인증으로 인한 오버헤드를 줄이고 애플리케이션이 기존 연결을 재사용할 수 있습니다. 또는 이러한 사용 사례에 RDS 프록시를 사용하는 것도 좋습니다. RDS 프록시에는 추가 비용이 부과됩니다. [RDS 프록시 요금](https://aws.amazon.com/rds/proxy/pricing/)을 참조하세요.
+ IAM 데이터베이스 인증 토큰의 크기는 IAM 태그 수, IAM 서비스 정책, ARN 길이, 기타 IAM 및 데이터베이스 속성 등 여러 요소에 따라 달라집니다. 이 토큰의 최소 크기는 일반적으로 약 1KB지만 더 클 수도 있습니다. 이 토큰은 IAM 인증을 사용하는 데이터베이스에 대한 연결 문자열에서 암호로 사용되므로 데이터베이스 드라이버(예: ODBC) 및/또는 어떤 도구도 크기로 인해 이 토큰을 제한하거나 자르지 않도록 해야 합니다. 토큰이 잘리면 데이터베이스와 IAM에서 수행하는 인증 검증이 실패합니다.
+ IAM 데이터베이스 인증 토큰을 생성할 때 임시 보안 인증 정보를 사용하는 경우, IAM 데이터베이스 인증 토큰을 사용하여 연결을 요청할 때 임시 보안 인증 정보가 여전히 유효해야 합니다.

## 지원되지 않는 AWS 전역 조건 컨텍스트 키
<a name="UsingWithRDS.IAMDBAuth.GlobalContextKeys"></a>

 IAM 데이터베이스 인증은 다음과 같은 AWS 전역 조건 컨텍스트 키의 하위 집합을 지원하지 않습니다.
+ `aws:Referer`
+ `aws:SourceIp`
+ `aws:SourceVpc`
+ `aws:SourceVpce`
+ `aws:UserAgent`
+ `aws:VpcSourceIp`

자세한 내용은 *IAM 사용 설명서*의 [AWS 글로벌 조건 컨텍스트 키](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)를 참조하세요.

# IAM 데이터베이스 인증의 활성화 및 비활성화
<a name="UsingWithRDS.IAMDBAuth.Enabling"></a>

DB 인스턴스에서는 기본적으로 IAM 데이터베이스 인증이 비활성화되어 있습니다. IAM 데이터베이스 인증은 AWS Management Console, AWS CLI 또는 API를 사용하여 활성화하거나 비활성화할 수 있습니다.

다음 작업 중 하나를 수행할 때 IAM 데이터베이스 인증을 활성화할 수 있습니다.
+ IAM 데이터베이스 인증이 활성화된 새 DB 인스턴스를 생성하려면 [Amazon RDS DB 인스턴스 생성](USER_CreateDBInstance.md) 섹션을 참조하세요.
+ IAM 데이터베이스 인증을 사용하도록 DB 인스턴스를 수정하려면 [Amazon RDS DB 인스턴스 수정](Overview.DBInstance.Modifying.md) 섹션을 참조하세요.
+ IAM 데이터베이스 인증이 활성화된 스냅샷에서 DB 인스턴스를 복원하려면 [DB 인스턴스 복원](USER_RestoreFromSnapshot.md) 섹션을 참조하세요.
+ IAM 데이터베이스 인증이 사용 설정된 시점으로 DB 인스턴스를 복원하려면 [Amazon RDS에서 DB 인스턴스를 지정된 시간으로 복원](USER_PIT.md) 섹션을 참조하세요.

## 콘솔
<a name="UsingWithRDS.IAMDBAuth.Enabling.Console"></a>

각 생성 또는 수정 워크플로에는 IAM 데이터베이스 인증을 활성화하거나 비활성화할 수 있는 **데이터베이스 인증(Database authentication)** 섹션이 있습니다. 이 섹션에서 **암호 및 IAM 데이터베이스 인증(Password and IAM database authentication)**을 선택하여 IAM 데이터베이스 인증을 활성화합니다.

**기존 DB 인스턴스에서 IAM 데이터베이스 인증을 활성화하거나 비활성화하려면**

1. [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)에서 Amazon RDS 콘솔을 엽니다.

1. 탐색 창에서 **데이터베이스**를 선택합니다.

1. 수정하려는 DB 인스턴스를 선택합니다.
**참고**  
 DB 인스턴스가 IAM 인증과 호환되는지 확인합니다. 호환성 요구 사항은 [리전 및 버전 사용 가능 여부](UsingWithRDS.IAMDBAuth.md#UsingWithRDS.IAMDBAuth.Availability) 섹션을 참조하십시오.

1. **수정**을 선택합니다.

1. **데이터베이스 인증** 섹션에서 **암호 및 IAM 데이터베이스 인증** 을 선택하여 IAM 데이터베이스 인증을 활성화합니다. **암호 인증** 또는 **암호 및 Kerberos 인증**을 선택하여 IAM 인증을 비활성화합니다.

1. 또한 CloudWatch Logs에 IAM DB 인증 로그 게시를 사용하도록 선택할 수 있습니다. **로그 내보내기**에서 **iam-db-auth-error 로그** 옵션을 선택합니다. CloudWatch Logs에 로그를 게시하면 스토리지가 사용되며 해당 스토리지에 대한 요금이 부과됩니다. 더 이상 필요하지 않은 CloudWatch Logs는 삭제해야 합니다.

1. [**Continue**]를 선택합니다.

1. 변경 사항을 즉시 적용하려면 **수정 예약(Scheduling of modifications)** 섹션에서 **즉시(Immediately)**를 선택합니다.

1. **DB 인스턴스 수정** 을 선택합니다.

## AWS CLI
<a name="UsingWithRDS.IAMDBAuth.Enabling.CLI"></a>

AWS CLI를 사용하여 새로운 DB 인스턴스를 IAM 인증 방식으로 생성하려면 [https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance.html](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance.html) 명령을 사용하십시오. 다음 예제와 같이 `--enable-iam-database-authentication` 옵션을 지정합니다.

```
aws rds create-db-instance \
    --db-instance-identifier mydbinstance \
    --db-instance-class db.m3.medium \
    --engine MySQL \
    --allocated-storage 20 \
    --master-username masterawsuser \
    --manage-master-user-password \
    --enable-iam-database-authentication
```

기존 DB 인스턴스를 업데이트하여 IAM 인증을 사용하게 하거나 사용하지 않게 하려면 AWS CLI 명령 [https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-instance.html](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-instance.html)를 사용합니다. 상황에 따라 `--enable-iam-database-authentication` 또는 `--no-enable-iam-database-authentication` 옵션을 지정합니다.

**참고**  
 DB 인스턴스가 IAM 인증과 호환되는지 확인합니다. 호환성 요구 사항은 [리전 및 버전 사용 가능 여부](UsingWithRDS.IAMDBAuth.md#UsingWithRDS.IAMDBAuth.Availability) 섹션을 참조하십시오.

기본적으로 Amazon RDS는 다음 유지 관리 기간에 수정 작업을 수행합니다. 이러한 기본 설정을 무시하고 IAM DB 인증을 최대한 빠르게 활성화하려면 `--apply-immediately` 파라미터를 사용합니다.

다음은 기존 DB 인스턴스일 때 IAM 인증을 바로 활성화하는 방법을 설명한 예제입니다.

```
aws rds modify-db-instance \
    --db-instance-identifier mydbinstance \
    --apply-immediately \
    --enable-iam-database-authentication
```

DB 인스턴스를 복원하는 경우에는 다음 AWS CLI 명령 중 하나를 사용하십시오.
+ `[restore-db-instance-to-point-in-time](https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-instance-to-point-in-time.html)`
+ `[restore-db-instance-from-db-snapshot](https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-instance-from-db-snapshot.html)`

IAM 데이터베이스 인증은 기본적으로 원본 스냅샷으로 기본 설정됩니다. 이 설정을 변경하려면 상황에 따라 `--enable-iam-database-authentication` 또는 `--no-enable-iam-database-authentication` 옵션을 설정합니다.

## RDS API
<a name="UsingWithRDS.IAMDBAuth.Enabling.API"></a>

API를 사용하여 새로운 DB 인스턴스를 IAM 인증 방식으로 생성하려면 API 작업 [https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstance.html](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstance.html)를 사용하십시오. `EnableIAMDatabaseAuthentication` 파라미터를 `true`로 설정합니다.

기존 DB 인스턴스를 업데이트하여 IAM 인증을 사용하게 하거나 사용하지 않게 하려면 API 작업 [https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBInstance.html](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBInstance.html)를 사용합니다. `EnableIAMDatabaseAuthentication` 파라미터를 `true`로 설정하여 IAM 인증을 활성화하거나, `false`로 설정하여 비활성화합니다.

**참고**  
 DB 인스턴스가 IAM 인증과 호환되는지 확인합니다. 호환성 요구 사항은 [리전 및 버전 사용 가능 여부](UsingWithRDS.IAMDBAuth.md#UsingWithRDS.IAMDBAuth.Availability) 섹션을 참조하십시오.

DB 인스턴스를 복원하는 경우에는 다음 API 작업 중 하나를 사용하십시오.
+ [https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_RestoreDBInstanceFromDBSnapshot.html](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_RestoreDBInstanceFromDBSnapshot.html)
+  [https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_RestoreDBInstanceToPointInTime.html](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_RestoreDBInstanceToPointInTime.html)

IAM 데이터베이스 인증은 기본적으로 원본 스냅샷으로 기본 설정됩니다. 이 설정을 변경하려면 `EnableIAMDatabaseAuthentication` 파라미터를 `true`로 설정하여 IAM 인증을 활성화하거나, 혹은 `false`로 설정하여 비활성화합니다.

# IAM 데이터베이스 액세스를 위한 IAM 정책 생성 및 사용
<a name="UsingWithRDS.IAMDBAuth.IAMPolicy"></a>

사용자 또는 역할이 DB 인스턴스에 연결할 수 있도록 허용하려면 IAM 정책을 생성해야 합니다. 그런 다음 정책을 권한 세트 또는 역할에 연결합니다.

**참고**  
IAM 정책에 대한 자세한 정보는 [Amazon RDS의 자격 증명 및 액세스 관리](UsingWithRDS.IAM.md) 섹션을 참조하십시오.

다음은 사용자가 IAM 데이터베이스 인증 방식을 사용해 DB 인스턴스 에 연결할 수 있도록 허용하는 정책 예제입니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "rds-db:connect"
            ],
            "Resource": [
                "arn:aws:rds-db:us-east-2:111122223333:dbuser:db-ABCDEFGHIJKL01234/db_user"
            ]
        }
    ]
}
```

------

**중요**  
관리자 권한이 있는 사용자는 IAM 정책에서 명시적 권한 없이도 DB 인스턴스에 액세스할 수 있습니다. DB 인스턴스에 대한 관리자 액세스를 제한하고 싶은 경우에는 더 적은 적정 권한을 가진 IAM 역할을 생성하고 이를 관리자에게 할당할 수 있습니다.

**참고**  
`rds-db:` 접두사를 `rds:`로 시작하는 다른 RDS API 작업 접두사와 혼동하지 마십시오. `rds-db:` 접두사와 `rds-db:connect` 작업은 IAM 데이터베이스 인증 전용입니다. 다른 컨텍스트에서는 유효하지 않습니다.

위의 예제 정책에는 다음 요소와 함께 단일 문이 포함되어 있습니다.
+ `Effect` – `Allow`를 지정하여 DB 인스턴스에 대한 액세스를 부여합니다. 액세스를 명시적으로 허용하지 않으면 액세스가 기본적으로 거부됩니다.
+ `Action` – `rds-db:connect`를 지정하여 DB 인스턴스에 대한 연결을 허용합니다.
+ `Resource` – 하나의 DB 인스턴스의 한 데이터베이스 계정을 기술하는 Amazon 리소스 이름(ARN)을 지정합니다. ARN 형식은 다음과 같습니다.

  ```
  arn:aws:rds-db:region:account-id:dbuser:DbiResourceId/db-user-name
  ```

  이 형식에서 다음 항목을 교체합니다.
  + `region`은 DB 인스턴스의 AWS 리전입니다. 정책 예제에서 사용되는 AWS 리전은 `us-east-2`입니다.
  + `account-id`은 DB 인스턴스의 AWS 계정 번호입니다. 정책 예제에서 사용되는 계정 번호는 `1234567890`입니다. 사용자는 DB 인스턴스의 계정과 동일한 계정에 있어야 합니다.

    크로스 계정 액세스를 수행하려면 DB 인스턴스의 계정에서 위에 있는 정책을 사용하여 IAM 역할을 생성하고 다른 계정이 해당 역할을 맡도록 허용합니다.
  + `DbiResourceId`는 DB 인스턴스의 식별자입니다. 이 식별자는 AWS 리전에 고유하며, 절대로 바뀌지 않습니다. 정책 예제에서 사용되는 식별자는 `db-ABCDEFGHIJKL01234`입니다.

    Amazon RDS용 AWS Management Console에서 인스턴스 리소스 ID를 찾으려면 DB 인스턴스를 선택하여 세부 정보를 확인하세요. 그런 다음 **구성** 탭을 선택합니다. 그러면 **리소스 ID**가 **구성** 섹션에 표시됩니다.

    그 밖에 다음과 같이 AWS CLI 명령을 사용하여 현재 AWS 리전에 속한 모든 DB 인스턴스의 식별자와 리소스 ID 목록을 조회하는 방법도 있습니다.

    ```
    aws rds describe-db-instances --query "DBInstances[*].[DBInstanceIdentifier,DbiResourceId]"
    ```

    Amazon Aurora를 사용하는 경우 `DbiResourceId` 대신 `DbClusterResourceId`를 지정하세요. 자세한 내용은 *Amazon Aurora 사용 설명서*에서 [IAM 데이터베이스 액세스를 위한 IAM 정책 생성 및 사용](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/UsingWithRDS.IAMDBAuth.IAMPolicy.html)을 참조하세요.
**참고**  
RDS 프록시를 통해 데이터베이스에 연결하는 경우, 프록시 리소스 ID(예: `prx-ABCDEFGHIJKL01234`)를 지정합니다. RDS 프록시에서 IAM 데이터베이스 인증을 사용하는 방법에 대한 자세한 내용은 [IAM 인증을 사용하여 데이터베이스에 연결](rds-proxy-connecting.md#rds-proxy-connecting-iam) 섹션을 참조하십시오.
  + `db-user-name`은 IAM 인증과 연결할 데이터베이스 계정 이름입니다. 정책 예제에서 사용되는 데이터베이스 계정은 `db_user`입니다.

다른 ARN을 구성하여 다양한 액세스 패턴을 지원할 수 있습니다. 다음 정책에서는 DB 인스턴스에서 서로 다른 데이터베이스 계정 2개에 대한 액세스를 허용합니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
      {
         "Effect": "Allow",
         "Action": [
             "rds-db:connect"
         ],
         "Resource": [
             "arn:aws:rds-db:us-east-2:123456789012:dbuser:db-ABCDEFGHIJKL01234/jane_doe",
             "arn:aws:rds-db:us-east-2:123456789012:dbuser:db-ABCDEFGHIJKL01234/mary_roe"
         ]
      }
   ]
}
```

------

다음 정책에서는 "\$1" 문자를 사용하여 특정 AWS 계정과 AWS 리전의 모든 DB 인스턴스 및 데이터베이스 계정을 일치시킵니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "rds-db:connect"
            ],
            "Resource": [
                "arn:aws:rds-db:us-east-2:111122223333:dbuser:*/*"
            ]
        }
    ]
}
```

------

다음 정책은 특정 AWS 계정과 AWS 리전의 모든 DB 인스턴스를 일치시킵니다. 하지만 정책에 따라 `jane_doe` 데이터베이스 계정을 가지고 있는 DB 인스턴스에게만 액세스 권한이 부여됩니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
      {
         "Effect": "Allow",
         "Action": [
             "rds-db:connect"
         ],
         "Resource": [
             "arn:aws:rds-db:us-east-2:123456789012:dbuser:*/jane_doe"
         ]
      }
   ]
}
```

------

사용자 또는 역할은 데이터베이스 사용자가 액세스할 수 있는 데이터베이스에만 액세스할 수 있습니다. 예를 들어 DB 인스턴스에 이름이 *dev*인 데이터베이스와 *test*인 데이터베이스가 있다고 가정하겠습니다. 이때 데이터베이스 사용자인 `jane_doe`가 *dev*에 대한 액세스 권한만 가지고 있다면 사용자 `jane_doe`와 함께 해당 DB 인스턴스에 액세스하는 모든 사용자 또는 역할도 *dev* 액세스 권한만 갖게 됩니다. 이러한 액세스 제한은 테이블, 뷰 등 다른 데이터베이스 객체에 대해서도 똑같이 적용됩니다.

관리자는 지정된 필요한 리소스에서 특정 API 작업을 수행할 수 있는 권한을 엔티티에 부여하는 IAM 정책을 생성해야 합니다. 그런 다음 관리자는 해당 권한이 필요한 권한 세트 또는 역할에 이러한 정책을 연결해야 합니다. 정책에 대한 예시는 [Amazon RDS 자격 증명 기반 정책 예](security_iam_id-based-policy-examples.md) 섹션을 참조하십시오.

## 권한 세트 또는 역할에 IAM 정책 연결
<a name="UsingWithRDS.IAMDBAuth.IAMPolicy.Attaching"></a>

데이터베이스 인증을 위한 IAM 정책을 생성하였으면 이제 정책을 권한 세트 또는 역할에 연결해야 합니다. 이번 주제에 대한 자습서는 *IAM 사용자 안내서*의 [첫 번째 고객 관리형 정책 생성 및 연결](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_managed-policies.html)을 참조하십시오.

자습서를 읽어보면 이번 단원에서 소개하는 정책 예제 중 한 가지를 출발점으로 자신만의 요건에 따라 지정하여 사용할 수 있습니다. 자습서를 끝까지 따르다 보면 연결된 정책을 통해 `rds-db:connect` 작업이 가능한 권한 세트를 얻게 될 것입니다.

**참고**  
여러 권한 세트 또는 역할을 동일한 데이터베이스 사용자 계정에 매핑할 수 있습니다. 예를 들어 IAM 정책이 다음과 같은 리소스 ARN을 지정하였다고 가정하겠습니다.  

```
arn:aws:rds-db:us-east-2:123456789012:dbuser:db-12ABC34DEFG5HIJ6KLMNOP78QR/jane_doe
```
*Jane*, *Bob* 및 *Diego*에게 정책을 연결하면 각 사용자는 `jane_doe` 데이터베이스 계정을 사용하여 지정된 DB 인스턴스에 연결할 수 있습니다.

# IAM 인증을 사용하여 데이터베이스 계정 생성
<a name="UsingWithRDS.IAMDBAuth.DBAccounts"></a>

IAM 데이터베이스 인증 방식에서는 데이터베이스 암호를 사용자 계정에 할당할 필요 없습니다. 데이터베이스 계정에 매핑되어 있는 사용자를 제거할 경우에는 `DROP USER` 문으로 데이터베이스 계정도 제거해야 합니다.

**참고**  
IAM 인증에 사용되는 사용자 이름은 데이터베이스에 있는 사용자 이름과 대소문자가 일치해야 합니다.

**Topics**
+ [MariaDB 및 MySQL에서 IAM 인증 사용](#UsingWithRDS.IAMDBAuth.DBAccounts.MySQL)
+ [PostgreSQL에서 IAM 인증 사용](#UsingWithRDS.IAMDBAuth.DBAccounts.PostgreSQL)

## MariaDB 및 MySQL에서 IAM 인증 사용
<a name="UsingWithRDS.IAMDBAuth.DBAccounts.MySQL"></a>

MariaDB 및 MySQL에서는 AWS에서 제공하는 플러그인인 `AWSAuthenticationPlugin`에서 인증을 처리합니다. 이 플러그인은 IAM과 원활하게 연동되어 사용자를 인증합니다. 마스터 사용자 또는 사용자를 생성하고 권한을 부여할 수 있는 다른 사용자로 DB 인스턴스에 연결합니다. 연결한 후 다음 예제와 같이 `CREATE USER` 문을 실행합니다.

```
CREATE USER 'jane_doe' IDENTIFIED WITH AWSAuthenticationPlugin AS 'RDS'; 
```

`IDENTIFIED WITH` 절을 사용하면 MariaDB 및 MySQL이 `AWSAuthenticationPlugin`을 통해 데이터베이스 계정(`jane_doe`)을 인증할 수 있습니다. `AS 'RDS'` 절은 인증 방법을 참조합니다. 지정한 데이터베이스 사용자 이름이 IAM 데이터베이스 액세스에 대한 IAM 정책의 리소스와 같은지 확인합니다. 자세한 내용은 [IAM 데이터베이스 액세스를 위한 IAM 정책 생성 및 사용](UsingWithRDS.IAMDBAuth.IAMPolicy.md) 섹션을 참조하세요.

**참고**  
다음과 같은 메시지가 표시되면 현재 DB 인스턴스에서 AWS 제공 플러그인을 사용할 수 없는 것입니다.  
`ERROR 1524 (HY000): Plugin 'AWSAuthenticationPlugin' is not loaded`  
위와 같은 오류 문제를 해결하려면 지원되는 구성을 사용하고 있는지, 그리고 DB 인스턴스 에서 IAM 데이터베이스 인증이 활성화되어 있는지 확인하십시오. 자세한 내용은 [리전 및 버전 사용 가능 여부](UsingWithRDS.IAMDBAuth.md#UsingWithRDS.IAMDBAuth.Availability) 및 [IAM 데이터베이스 인증의 활성화 및 비활성화](UsingWithRDS.IAMDBAuth.Enabling.md) 단원을 참조하십시오.

`AWSAuthenticationPlugin`을 사용하여 계정을 생성한 이후 계정 관리 방법은 다른 데이터베이스 계정과 동일합니다. 예를 들어 `GRANT` 및 `REVOKE` 문으로 계정 권한을 수정하거나, 혹은 `ALTER USER` 문으로 여러 가지 계정 속성을 변경할 수 있습니다.

IAM을 사용하는 경우 데이터베이스 네트워크 트래픽은 SSL/TLS를 사용하여 암호화됩니다. SSL 연결을 허용하려면 다음 명령을 사용해 사용자 계정을 수정합니다.

```
ALTER USER 'jane_doe'@'%' REQUIRE SSL;     
```

 

## PostgreSQL에서 IAM 인증 사용
<a name="UsingWithRDS.IAMDBAuth.DBAccounts.PostgreSQL"></a>

 PostgreSQL에서 IAM 인증을 사용하려면 마스터 사용자 또는 사용자를 생성하고 권한을 부여할 수 있는 다른 사용자로 DB 인스턴스에 연결해야 합니다. 연결한 후 데이터베이스 사용자를 생성하고 다음 예제에 나온 것처럼 사용자에게 `rds_iam` 역할을 부여합니다.

```
CREATE USER db_userx; 
GRANT rds_iam TO db_userx;
```

지정한 데이터베이스 사용자 이름이 IAM 데이터베이스 액세스에 대한 IAM 정책의 리소스와 같은지 확인합니다. 자세한 내용은 [IAM 데이터베이스 액세스를 위한 IAM 정책 생성 및 사용](UsingWithRDS.IAMDBAuth.IAMPolicy.md) 섹션을 참조하세요. IAM 인증을 사용하려면 `rds_iam` 역할을 부여해야 합니다. 중첩된 멤버십이나 역할의 간접 부여도 사용할 수 있습니다.

# IAM 인증을 사용하여 DB 인스턴스에 연결
<a name="UsingWithRDS.IAMDBAuth.Connecting"></a>

IAM 데이터베이스 인증 방식에서는 DB 인스턴스 에 연결할 때 인증 토큰을 사용합니다. *인증 토큰*이란 암호 대신 사용하는 문자열을 말합니다. 인증 토큰은 생성 후 15분 동안만 유효하며 이 시간이 지나면 만료됩니다. 만료된 토큰을 사용하여 연결하려고 하면 연결 요청이 거부됩니다.

모든 인증 토큰은 AWS 서명 버전 4를 사용하여 유효한 서명이 있어야 합니다. (자세한 내용은 *AWS 일반 참조*의 [서명 버전 4 서명 프로세스](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html)를 참조하세요.) AWS SDK for Java 또는 AWS SDK for Python (Boto3)와 같은 AWS CLI 및 AWS SDK는 사용자가 생성한 각 토큰에 자동으로 서명할 수 있습니다.

AWS Lambda와 같은 AWS 서비스에서 Amazon RDS에 연결할 때 인증 토큰을 사용할 수 있습니다. 토큰을 사용하면 코드에 암호를 넣지 않아도 됩니다. 그 밖에 AWS SDK를 사용하여 인증 토큰을 프로그래밍 방식으로 생성하고 프로그래밍 방식으로 서명하는 방법도 있습니다.

IAM 인증 토큰에 서명까지 마쳤으면 이제 Amazon RDS DB 인스턴스에 연결할 수 있습니다. 다음 섹션에서는 명령줄 도구 또는 AWS SDK(예: AWS SDK for Java 또는 AWS SDK for Python (Boto3))를 사용하여 연결하는 방법에 대해 알아보겠습니다.

자세한 내용은 다음 블로그 게시물을 참조하십시오.
+ [IAM 인증을 사용하여 SQL Workbench/J를 Aurora MySQL 또는 Amazon RDS for MySQL에 연결](https://aws.amazon.com/blogs/database/use-iam-authentication-to-connect-with-sql-workbenchj-to-amazon-aurora-mysql-or-amazon-rds-for-mysql/)
+ [Using IAM authentication to connect with pgAdmin Amazon Aurora PostgreSQL or Amazon RDS for PostgreSQL](https://aws.amazon.com/blogs/database/using-iam-authentication-to-connect-with-pgadmin-amazon-aurora-postgresql-or-amazon-rds-for-postgresql/)

**사전 조건**  
다음은 IAM 인증을 사용하여 DB 인스턴스에 연결하기 위한 사전 조건입니다.
+ [IAM 데이터베이스 인증의 활성화 및 비활성화](UsingWithRDS.IAMDBAuth.Enabling.md)
+ [IAM 데이터베이스 액세스를 위한 IAM 정책 생성 및 사용](UsingWithRDS.IAMDBAuth.IAMPolicy.md)
+ [IAM 인증을 사용하여 데이터베이스 계정 생성](UsingWithRDS.IAMDBAuth.DBAccounts.md)

**Topics**
+ [AWS 드라이버와 함께 IAM 인증을 사용하여 DB 인스턴스에 연결](IAMDBAuth.Connecting.Drivers.md)
+ [명령줄에서 IAM 인증을 사용하여 DB 인스턴스에 연결: AWS CLI 및 mysql 클라이언트](UsingWithRDS.IAMDBAuth.Connecting.AWSCLI.md)
+ [명령줄: AWS CLI 및 psql Client에서 IAM 인증을 사용하여 DB 인스턴스에 연결](UsingWithRDS.IAMDBAuth.Connecting.AWSCLI.PostgreSQL.md)
+ [IAM 인증 및 AWS SDK for .NET를 사용하여 DB 인스턴스에 연결](UsingWithRDS.IAMDBAuth.Connecting.NET.md)
+ [IAM 인증 및 AWS SDK for Go를 사용하여 DB 인스턴스에 연결](UsingWithRDS.IAMDBAuth.Connecting.Go.md)
+ [IAM 인증 및 AWS SDK for Java를 사용하여 DB 인스턴스에 연결](UsingWithRDS.IAMDBAuth.Connecting.Java.md)
+ [IAM 인증 및 AWS SDK for Python (Boto3)를 사용하여 DB 인스턴스에 연결](UsingWithRDS.IAMDBAuth.Connecting.Python.md)

# AWS 드라이버와 함께 IAM 인증을 사용하여 DB 인스턴스에 연결
<a name="IAMDBAuth.Connecting.Drivers"></a>

더 빠른 전환 및 장애 조치 시간, AWS Secrets Manager, AWS Identity and Access Management(IAM) 및 페더레이션 ID를 사용한 인증을 지원하도록 설계된 AWS 드라이버 제품군입니다. AWS 드라이버는 DB 인스턴스 상태 모니터링과 인스턴스 토폴로지 파악을 통해 새 라이터를 결정합니다. 이 접근 방식은 전환 및 장애 조치 시간을 오픈 소스 드라이버의 경우 수십 초였던 것에 비해 10초 미만으로 단축합니다.

AWS 드라이버에 대한 자세한 내용은 [RDS for MariaDB](MariaDB.Connecting.Drivers.md#MariaDB.Connecting.JDBCDriver), [RDS for MySQL](MySQL.Connecting.Drivers.md#MySQL.Connecting.JDBCDriver) 또는 [RDS for PostgreSQL](PostgreSQL.Connecting.JDBCDriver.md) DB 인스턴스에 대한 해당 언어 드라이버를 참조하세요.

**참고**  
RDS for MariaDB에서 지원되는 유일한 기능은 AWS Secrets Manager, AWS Identity and Access Management(IAM) 및 페더레이션 ID를 사용한 인증입니다.

# 명령줄에서 IAM 인증을 사용하여 DB 인스턴스에 연결: AWS CLI 및 mysql 클라이언트
<a name="UsingWithRDS.IAMDBAuth.Connecting.AWSCLI"></a>

아래 설명과 같이 AWS CLI 및 `mysql` 명령줄 도구를 사용하여 명령줄에서 Amazon RDS DB 인스턴스로 연결할 수 있습니다.

**사전 조건**  
다음은 IAM 인증을 사용하여 DB 인스턴스에 연결하기 위한 사전 조건입니다.
+ [IAM 데이터베이스 인증의 활성화 및 비활성화](UsingWithRDS.IAMDBAuth.Enabling.md)
+ [IAM 데이터베이스 액세스를 위한 IAM 정책 생성 및 사용](UsingWithRDS.IAMDBAuth.IAMPolicy.md)
+ [IAM 인증을 사용하여 데이터베이스 계정 생성](UsingWithRDS.IAMDBAuth.DBAccounts.md)

**참고**  
IAM 인증을 통한 SQL Workbench/J를 사용하여 데이터베이스에 연결하는 방법에 대한 자세한 내용은 블로그 게시물 [IAM 인증을 사용하여 SQL Workbench/J를 Aurora MySQL 또는 Amazon RDS for MySQL에 연결](https://aws.amazon.com/blogs/database/use-iam-authentication-to-connect-with-sql-workbenchj-to-amazon-aurora-mysql-or-amazon-rds-for-mysql/)을 참조하세요.

**Topics**
+ [IAM 인증 토크 생성](#UsingWithRDS.IAMDBAuth.Connecting.AWSCLI.AuthToken)
+ [DB 인스턴스에 연결](#UsingWithRDS.IAMDBAuth.Connecting.AWSCLI.Connect)

## IAM 인증 토크 생성
<a name="UsingWithRDS.IAMDBAuth.Connecting.AWSCLI.AuthToken"></a>

다음은 AWS CLI를 사용하여 서명이 되어 있는 인증 토큰을 생성하는 방법을 설명한 예제입니다.

```
aws rds generate-db-auth-token \
   --hostname rdsmysql.123456789012.us-west-2.rds.amazonaws.com \
   --port 3306 \
   --region us-west-2 \
   --username jane_doe
```

위의 예제에서 각 파라미터는 다음과 같습니다.
+ `--hostname` – 액세스할 DB 인스턴스의 호스트 이름입니다.
+ `--port` – DB 인스턴스에 연결할 때 사용할 포트 번호입니다.
+ `--region` - DB 인스턴스가 실행되는 AWS 리전입니다.
+ `--username` – 액세스할 데이터베이스 계정입니다.

토큰에서 가장 앞의 일부 문자는 다음과 같은 모습입니다.

```
rdsmysql.123456789012.us-west-2.rds.amazonaws.com:3306/?Action=connect&DBUser=jane_doe&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Expires=900...
```

**참고**  
인증 토큰을 생성할 때는 DB 인스턴스 엔드포인트 대신 사용자 지정 Route 53 DNS 레코드를 사용할 수 없습니다.

## DB 인스턴스에 연결
<a name="UsingWithRDS.IAMDBAuth.Connecting.AWSCLI.Connect"></a>

일반적인 연결 형식은 다음과 같습니다.

```
mysql --host=hostName --port=portNumber --ssl-ca=full_path_to_ssl_certificate --enable-cleartext-plugin --user=userName --password=authToken
```

파라미터는 다음과 같습니다.
+ `--host` – 액세스할 DB 인스턴스의 호스트 이름입니다.
+ `--port` – DB 인스턴스에 연결할 때 사용할 포트 번호입니다.
+ `--ssl-ca` - 퍼블릭 키를 포함하는 SSL 인증서 파일의 전체 경로

  MariaDB용 SSL/TLS 지원 방법에 대한 자세한 내용은 [Amazon RDS의 MariaDB DB 인스턴스에 대한 SSL/TLS 지원](MariaDB.Concepts.SSLSupport.md) 섹션을 참조하세요.

  MySQL용 SSL/TLS 지원 방법에 대한 자세한 내용은 [Amazon RDS의 MySQL DB 인스턴스에 대한 SSL/TLS 지원](MySQL.Concepts.SSLSupport.md) 섹션을 참조하세요.

  SSL 인증서를 다운로드하려면 [SSL/TLS를 사용하여 DB 인스턴스 또는 클러스터 에 대한 연결 암호화](UsingWithRDS.SSL.md) 섹션을 참조하세요.
+ `--enable-cleartext-plugin` – 현재 연결에서 `AWSAuthenticationPlugin`을 사용하도록 지정하는 값입니다.

  MariaDB 클라이언트를 사용하는 경우 `--enable-cleartext-plugin` 옵션이 필요하지 않습니다.
+ `--user` – 액세스할 데이터베이스 계정입니다.
+ `--password` – 서명된 IAM 인증 토큰입니다.

인증 토큰은 수백 자의 문자로 구성됩니다. 그렇기 때문에 명령줄에서는 다루지 불편할 수도 있습니다. 이러한 문제를 해결하기 위해 토큰을 환경 변수로 저장한 후 연결할 때 이 변수를 사용하는 것도 한 가지 방법입니다. 다음은 이러한 문제 해결 방법을 설명한 예제입니다. 이 예에서 */sample\$1dir/*는 퍼블릭 키를 포함하는 SSL 인증서 파일의 전체 경로입니다.

```
RDSHOST="mysqldb.123456789012.us-east-1.rds.amazonaws.com"
TOKEN="$(aws rds generate-db-auth-token --hostname $RDSHOST --port 3306 --region us-west-2 --username jane_doe )"

mysql --host=$RDSHOST --port=3306 --ssl-ca=/sample_dir/global-bundle.pem --enable-cleartext-plugin --user=jane_doe --password=$TOKEN
```

`AWSAuthenticationPlugin`을 사용하여 연결할 때는 SSL을 통해 보안을 유지합니다. 이러한 보안 여부를 확인하려면 `mysql>` 명령 프롬프트에 다음과 같이 입력합니다.

```
show status like 'Ssl%';
```

그러면 출력 시 다음과 같이 자세하게 표시됩니다.

```
+---------------+-------------+
| Variable_name | Value                                                                                                                                                                                                                                |
+---------------+-------------+
| ...           | ...
| Ssl_cipher    | AES256-SHA                                                                                                                                                                                                                           |
| ...           | ...
| Ssl_version   | TLSv1.1                                                                                                                                                                                                                              |
| ...           | ...
+-----------------------------+
```

프록시를 통해 DB 인스턴스에 연결하려는 경우 [IAM 인증을 사용하여 데이터베이스에 연결](rds-proxy-connecting.md#rds-proxy-connecting-iam)을 참조하세요.

# 명령줄: AWS CLI 및 psql Client에서 IAM 인증을 사용하여 DB 인스턴스에 연결
<a name="UsingWithRDS.IAMDBAuth.Connecting.AWSCLI.PostgreSQL"></a>

아래 설명과 같이 AWS CLI 및 psql 명령줄 도구를 사용하여 명령줄에서 Amazon RDS for PostgreSQL DB 인스턴스에 연결할 수 있습니다.

**사전 조건**  
다음은 IAM 인증을 사용하여 DB 인스턴스에 연결하기 위한 사전 조건입니다.
+ [IAM 데이터베이스 인증의 활성화 및 비활성화](UsingWithRDS.IAMDBAuth.Enabling.md)
+ [IAM 데이터베이스 액세스를 위한 IAM 정책 생성 및 사용](UsingWithRDS.IAMDBAuth.IAMPolicy.md)
+ [IAM 인증을 사용하여 데이터베이스 계정 생성](UsingWithRDS.IAMDBAuth.DBAccounts.md)

**참고**  
IAM 인증을 통한 pgAdmin을 사용하여 데이터베이스에 연결하는 방법에 대한 자세한 내용은 블로그 게시물 [Using IAM authentication to connect with pgAdmin Amazon Aurora PostgreSQL or Amazon RDS for PostgreSQL](https://aws.amazon.com/blogs/database/using-iam-authentication-to-connect-with-pgadmin-amazon-aurora-postgresql-or-amazon-rds-for-postgresql/)을 참조하세요.

**Topics**
+ [IAM 인증 토크 생성](#UsingWithRDS.IAMDBAuth.Connecting.AWSCLI.AuthToken.PostgreSQL)
+ [Amazon RDS PostgreSQL 인스턴스 에 연결](#UsingWithRDS.IAMDBAuth.Connecting.AWSCLI.Connect.PostgreSQL)

## IAM 인증 토크 생성
<a name="UsingWithRDS.IAMDBAuth.Connecting.AWSCLI.AuthToken.PostgreSQL"></a>

인증 토큰은 수백 자의 문자로 구성되므로 명령줄에서는 다루기 불편할 수 있습니다. 이러한 문제를 해결하기 위해 토큰을 환경 변수로 저장한 후 연결할 때 이 변수를 사용하는 것도 한 가지 방법입니다. 다음 예제는 AWS CLI에서 `generate-db-auth-token` 명령을 사용하여 서명된 인증 토큰을 받고 이를 `PGPASSWORD` 환경 변수에 저장하는 방법을 보여 줍니다.

```
export RDSHOST="rdspostgres.123456789012.us-west-2.rds.amazonaws.com"
export PGPASSWORD="$(aws rds generate-db-auth-token --hostname $RDSHOST --port 5432 --region us-west-2 --username jane_doe )"
```

예제에서 `generate-db-auth-token` 명령에 대한 파라미터는 다음과 같습니다.
+ `--hostname` – 액세스할 DB 인스턴스의 호스트 이름입니다.
+ `--port` – DB 인스턴스에 연결할 때 사용할 포트 번호입니다.
+ `--region` - DB 인스턴스가 실행되는 AWS 리전입니다.
+ `--username` – 액세스할 데이터베이스 계정입니다.

생성된 토큰에서 처음 몇 글자는 다음과 같은 모습입니다.

```
rdspostgres.123456789012.us-west-2.rds.amazonaws.com:5432/?Action=connect&DBUser=jane_doe&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Expires=900...
```

**참고**  
인증 토큰을 생성할 때는 DB 인스턴스 엔드포인트 대신 사용자 지정 Route 53 DNS 레코드를 사용할 수 없습니다.

## Amazon RDS PostgreSQL 인스턴스 에 연결
<a name="UsingWithRDS.IAMDBAuth.Connecting.AWSCLI.Connect.PostgreSQL"></a>

psql을 사용한 일반적인 연결 형식은 다음과 같습니다.

```
psql "host=hostName port=portNumber sslmode=verify-full sslrootcert=full_path_to_ssl_certificate dbname=DBName user=userName password=authToken"
```

파라미터는 다음과 같습니다.
+ `host` – 액세스할 DB 인스턴스의 호스트 이름입니다.
+ `port` – DB 인스턴스에 연결할 때 사용할 포트 번호입니다.
+ `sslmode` – 사용할 SSL 모드입니다.

  `sslmode=verify-full`을 사용하면 SSL 연결에서 SSL 인증서의 엔드포인트와 비교하여 DB 인스턴스 엔드포인트를 확인합니다.
+ `sslrootcert` - 퍼블릭 키를 포함하는 SSL 인증서 파일의 전체 경로

  자세한 내용은 [PostgreSQL DB 인스턴스와 함께 SSL 사용](PostgreSQL.Concepts.General.SSL.md) 섹션을 참조하세요.

  SSL 인증서를 다운로드하려면 [SSL/TLS를 사용하여 DB 인스턴스 또는 클러스터 에 대한 연결 암호화](UsingWithRDS.SSL.md) 섹션을 참조하세요.
+ `dbname` – 액세스할 데이터베이스입니다.
+ `user` – 액세스할 데이터베이스 계정입니다.
+ `password` – 서명된 IAM 인증 토큰입니다.

**참고**  
인증 토큰을 생성할 때는 DB 인스턴스 엔드포인트 대신 사용자 지정 Route 53 DNS 레코드를 사용할 수 없습니다.

다음 예제는 psql을 사용하여 연결하는 방법을 보여줍니다. 예에서 psql은 호스트에 대해 환경 변수 `RDSHOST`를 사용하고 생성된 토큰에 대해 환경 변수 `PGPASSWORD`를 사용합니다. 또한 */sample\$1dir/*은 퍼블릭 키를 포함하는 SSL 인증서 파일의 전체 경로입니다.

```
export RDSHOST="rdspostgres.123456789012.us-west-2.rds.amazonaws.com"
export PGPASSWORD="$(aws rds generate-db-auth-token --hostname $RDSHOST --port 5432 --region us-west-2 --username jane_doe )"
                    
psql "host=$RDSHOST port=5432 sslmode=verify-full sslrootcert=/sample_dir/global-bundle.pem dbname=DBName user=jane_doe password=$PGPASSWORD"
```

프록시를 통해 DB 인스턴스에 연결하려는 경우 [IAM 인증을 사용하여 데이터베이스에 연결](rds-proxy-connecting.md#rds-proxy-connecting-iam)을 참조하세요.

# IAM 인증 및 AWS SDK for .NET를 사용하여 DB 인스턴스에 연결
<a name="UsingWithRDS.IAMDBAuth.Connecting.NET"></a>

아래 설명과 같이 AWS SDK for .NET를 사용하여 RDS for MariaDB, MySQL 또는 PostgreSQL DB 인스턴스에 연결할 수 있습니다.

**사전 조건**  
다음은 IAM 인증을 사용하여 DB 인스턴스에 연결하기 위한 사전 조건입니다.
+ [IAM 데이터베이스 인증의 활성화 및 비활성화](UsingWithRDS.IAMDBAuth.Enabling.md)
+ [IAM 데이터베이스 액세스를 위한 IAM 정책 생성 및 사용](UsingWithRDS.IAMDBAuth.IAMPolicy.md)
+ [IAM 인증을 사용하여 데이터베이스 계정 생성](UsingWithRDS.IAMDBAuth.DBAccounts.md)

**예제**  
다음 코드 예제는 인증 토큰을 생성한 다음 이 토큰을 사용하여 DB 인스턴스에 연결하는 방법을 보여줍니다.

이 코드 예제를 실행하려면 [AWS SDK for .NET](https://aws.amazon.com/sdk-for-net/)가 필요하며 이는 AWS 사이트에서 받을 수 있습니다. `AWSSDK.CORE` 및 `AWSSDK.RDS` 패키지가 필요합니다. DB 인스턴스에 연결하려면 DB 엔진용 .NET 데이터베이스 커넥터(예: MariaDB 또는 MySQL용 MySQL커넥터 또는 PostgreSQL용 Npgsql)를 사용합니다.

이 코드는 MariaDB 또는 MySQL DB 인스턴스에 연결됩니다. 필요하다면 다음 변수 값을 변경합니다.
+ `server` - 액세스할 DB 인스턴스의 엔드포인트입니다.
+ `user` – 액세스할 데이터베이스 계정입니다.
+ `database` – 액세스할 데이터베이스입니다.
+ `port` – DB 인스턴스에 연결할 때 사용할 포트 번호입니다.
+ `SslMode` – 사용할 SSL 모드입니다.

  `SslMode=Required`을 사용하면 SSL 연결에서 SSL 인증서의 엔드포인트와 비교하여 DB 인스턴스 엔드포인트를 확인합니다.
+ `SslCa` - Amazon RDS에 대한 SSL 인증서의 전체 경로입니다.

  인증서를 다운로드하려면 [SSL/TLS를 사용하여 DB 인스턴스 또는 클러스터 에 대한 연결 암호화](UsingWithRDS.SSL.md) 섹션을 참조하세요.

**참고**  
인증 토큰을 생성할 때는 DB 인스턴스 엔드포인트 대신 사용자 지정 Route 53 DNS 레코드를 사용할 수 없습니다.

```
using System;
using System.Data;
using MySql.Data;
using MySql.Data.MySqlClient;
using Amazon;

namespace ubuntu
{
  class Program
  {
    static void Main(string[] args)
    {
      var pwd = Amazon.RDS.Util.RDSAuthTokenGenerator.GenerateAuthToken(RegionEndpoint.USEast1, "mysqldb.123456789012.us-east-1.rds.amazonaws.com", 3306, "jane_doe");
      // for debug only Console.Write("{0}\n", pwd);  //this verifies the token is generated

      MySqlConnection conn = new MySqlConnection($"server=mysqldb.123456789012.us-east-1.rds.amazonaws.com;user=jane_doe;database=mydB;port=3306;password={pwd};SslMode=Required;SslCa=full_path_to_ssl_certificate");
      conn.Open();

      // Define a query
      MySqlCommand sampleCommand = new MySqlCommand("SHOW DATABASES;", conn);

      // Execute a query
      MySqlDataReader mysqlDataRdr = sampleCommand.ExecuteReader();

      // Read all rows and output the first column in each row
      while (mysqlDataRdr.Read())
        Console.WriteLine(mysqlDataRdr[0]);

      mysqlDataRdr.Close();
      // Close connection
      conn.Close();
    }
  }
}
```

이 코드는 PostgreSQL DB 인스턴스에 연결됩니다.

필요하다면 다음 변수 값을 변경합니다.
+ `Server` - 액세스할 DB 인스턴스의 엔드포인트입니다.
+ `User ID` – 액세스할 데이터베이스 계정입니다.
+ `Database` – 액세스할 데이터베이스입니다.
+ `Port` – DB 인스턴스에 연결할 때 사용할 포트 번호입니다.
+ `SSL Mode` – 사용할 SSL 모드입니다.

  `SSL Mode=Required`을 사용하면 SSL 연결에서 SSL 인증서의 엔드포인트와 비교하여 DB 인스턴스 엔드포인트를 확인합니다.
+ `Root Certificate` - Amazon RDS에 대한 SSL 인증서의 전체 경로입니다.

  인증서를 다운로드하려면 [SSL/TLS를 사용하여 DB 인스턴스 또는 클러스터 에 대한 연결 암호화](UsingWithRDS.SSL.md) 섹션을 참조하세요.

**참고**  
인증 토큰을 생성할 때는 DB 인스턴스 엔드포인트 대신 사용자 지정 Route 53 DNS 레코드를 사용할 수 없습니다.

```
using System;
using Npgsql;
using Amazon.RDS.Util;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var pwd = RDSAuthTokenGenerator.GenerateAuthToken("postgresmydb.123456789012.us-east-1.rds.amazonaws.com", 5432, "jane_doe");
// for debug only Console.Write("{0}\n", pwd);  //this verifies the token is generated

            NpgsqlConnection conn = new NpgsqlConnection($"Server=postgresmydb.123456789012.us-east-1.rds.amazonaws.com;User Id=jane_doe;Password={pwd};Database=mydb;SSL Mode=Require;Root Certificate=full_path_to_ssl_certificate");
            conn.Open();

            // Define a query
                   NpgsqlCommand cmd = new NpgsqlCommand("select count(*) FROM pg_user", conn);

            // Execute a query
            NpgsqlDataReader dr = cmd.ExecuteReader();

            // Read all rows and output the first column in each row
            while (dr.Read())
                Console.Write("{0}\n", dr[0]);

            // Close connection
            conn.Close();
        }
    }
}
```

프록시를 통해 DB 인스턴스에 연결하려는 경우 [IAM 인증을 사용하여 데이터베이스에 연결](rds-proxy-connecting.md#rds-proxy-connecting-iam)을 참조하세요.

# IAM 인증 및 AWS SDK for Go를 사용하여 DB 인스턴스에 연결
<a name="UsingWithRDS.IAMDBAuth.Connecting.Go"></a>

아래 설명과 같이 AWS SDK for Go를 사용하여 RDS for MariaDB, MySQL 또는 PostgreSQL DB 인스턴스에 연결할 수 있습니다.

**사전 조건**  
다음은 IAM 인증을 사용하여 DB 인스턴스에 연결하기 위한 사전 조건입니다.
+ [IAM 데이터베이스 인증의 활성화 및 비활성화](UsingWithRDS.IAMDBAuth.Enabling.md)
+ [IAM 데이터베이스 액세스를 위한 IAM 정책 생성 및 사용](UsingWithRDS.IAMDBAuth.IAMPolicy.md)
+ [IAM 인증을 사용하여 데이터베이스 계정 생성](UsingWithRDS.IAMDBAuth.DBAccounts.md)

**예제**  
이 코드 예제를 실행하려면 [AWS SDK for Go](https://aws.amazon.com/sdk-for-go/)가 필요하며 이는 AWS 사이트에서 받을 수 있습니다.

필요하다면 다음 변수 값을 변경합니다.
+ `dbName` – 액세스할 데이터베이스입니다.
+ `dbUser` – 액세스할 데이터베이스 계정입니다.
+ `dbHost` - 액세스할 DB 인스턴스의 엔드포인트입니다.
**참고**  
인증 토큰을 생성할 때는 DB 인스턴스 엔드포인트 대신 사용자 지정 Route 53 DNS 레코드를 사용할 수 없습니다.
+ `dbPort` – DB 인스턴스에 연결할 때 사용할 포트 번호입니다.
+ `region` - DB 인스턴스가 실행되는 AWS 리전입니다.

또한 샘플 코드에서 가져온 라이브러리가 시스템에 있는지 확인합니다.

**중요**  
이 섹션의 예에서는 다음 코드를 사용하여 로컬 환경에서 데이터베이스에 액세스하는 자격 증명을 제공합니다.  
`creds := credentials.NewEnvCredentials()`  
Amazon EC2 또는 Amazon ECS 같은 AWS 서비스에서 데이터베이스에 액세스하는 경우 코드를 다음 코드로 바꿀 수 있습니다.  
`sess := session.Must(session.NewSession())`  
`creds := sess.Config.Credentials`  
이 변경 작업을 수행하는 경우 다음 가져오기를 추가해야 합니다.  
`"github.com/aws/aws-sdk-go/aws/session"`

**Topics**
+ [IAM 인증 및 AWS SDK for Go V2를 사용하여 연결](#UsingWithRDS.IAMDBAuth.Connecting.GoV2)
+ [IAM 인증 및 AWS SDK for Go V1을 사용하여 연결](#UsingWithRDS.IAMDBAuth.Connecting.GoV1)

## IAM 인증 및 AWS SDK for Go V2를 사용하여 연결
<a name="UsingWithRDS.IAMDBAuth.Connecting.GoV2"></a>

IAM 인증 및 AWS SDK for Go V2를 사용하여 DB 인스턴스에 연결할 수 있습니다.

다음 코드 예제는 인증 토큰을 생성한 다음 이 토큰을 사용하여 DB 인스턴스에 연결하는 방법을 보여줍니다.

이 코드는 MariaDB 또는 MySQL DB 인스턴스에 연결됩니다.

```
package main
                
import (
     "context"
     "database/sql"
     "fmt"

     "github.com/aws/aws-sdk-go-v2/config"
     "github.com/aws/aws-sdk-go-v2/feature/rds/auth"
     _ "github.com/go-sql-driver/mysql"
)

func main() {

     var dbName string = "DatabaseName"
     var dbUser string = "DatabaseUser"
     var dbHost string = "mysqldb.123456789012.us-east-1.rds.amazonaws.com"
     var dbPort int = 3306
     var dbEndpoint string = fmt.Sprintf("%s:%d", dbHost, dbPort)
     var region string = "us-east-1"

    cfg, err := config.LoadDefaultConfig(context.TODO())
    if err != nil {
    	panic("configuration error: " + err.Error())
    }

    authenticationToken, err := auth.BuildAuthToken(
    	context.TODO(), dbEndpoint, region, dbUser, cfg.Credentials)
    if err != nil {
	    panic("failed to create authentication token: " + err.Error())
    }

    dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?tls=true&allowCleartextPasswords=true",
        dbUser, authenticationToken, dbEndpoint, dbName,
    )

    db, err := sql.Open("mysql", dsn)
    if err != nil {
        panic(err)
    }

    err = db.Ping()
    if err != nil {
        panic(err)
    }
}
```

이 코드는 PostgreSQL DB 인스턴스에 연결됩니다.

```
package main

import (
     "context"
     "database/sql"
     "fmt"

     "github.com/aws/aws-sdk-go-v2/config"
     "github.com/aws/aws-sdk-go-v2/feature/rds/auth"
     _ "github.com/lib/pq"
)

func main() {

     var dbName string = "DatabaseName"
     var dbUser string = "DatabaseUser"
     var dbHost string = "postgresmydb.123456789012.us-east-1.rds.amazonaws.com"
     var dbPort int = 5432
     var dbEndpoint string = fmt.Sprintf("%s:%d", dbHost, dbPort)
     var region string = "us-east-1"

    cfg, err := config.LoadDefaultConfig(context.TODO())
    if err != nil {
    	panic("configuration error: " + err.Error())
    }

    authenticationToken, err := auth.BuildAuthToken(
    	context.TODO(), dbEndpoint, region, dbUser, cfg.Credentials)
    if err != nil {
	    panic("failed to create authentication token: " + err.Error())
    }

    dsn := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s",
        dbHost, dbPort, dbUser, authenticationToken, dbName,
    )

    db, err := sql.Open("postgres", dsn)
    if err != nil {
        panic(err)
    }

    err = db.Ping()
    if err != nil {
        panic(err)
    }
}
```

프록시를 통해 DB 인스턴스에 연결하려는 경우 [IAM 인증을 사용하여 데이터베이스에 연결](rds-proxy-connecting.md#rds-proxy-connecting-iam)을 참조하세요.

## IAM 인증 및 AWS SDK for Go V1을 사용하여 연결
<a name="UsingWithRDS.IAMDBAuth.Connecting.GoV1"></a>

IAM 인증 및 AWS SDK for Go V1을 사용하여 DB 인스턴스에 연결할 수 있습니다.

다음 코드 예제는 인증 토큰을 생성한 다음 이 토큰을 사용하여 DB 인스턴스에 연결하는 방법을 보여줍니다.

이 코드는 MariaDB 또는 MySQL DB 인스턴스에 연결됩니다.

```
package main
         
import (
    "database/sql"
    "fmt"
    "log"

    "github.com/aws/aws-sdk-go/aws/credentials"
    "github.com/aws/aws-sdk-go/service/rds/rdsutils"
    _ "github.com/go-sql-driver/mysql"
)

func main() {
    dbName := "app"
    dbUser := "jane_doe"
    dbHost := "mysqldb.123456789012.us-east-1.rds.amazonaws.com"
    dbPort := 3306
    dbEndpoint := fmt.Sprintf("%s:%d", dbHost, dbPort)
    region := "us-east-1"

    creds := credentials.NewEnvCredentials()
    authToken, err := rdsutils.BuildAuthToken(dbEndpoint, region, dbUser, creds)
    if err != nil {
        panic(err)
    }

    dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?tls=true&allowCleartextPasswords=true",
        dbUser, authToken, dbEndpoint, dbName,
    )

    db, err := sql.Open("mysql", dsn)
    if err != nil {
        panic(err)
    }

    err = db.Ping()
    if err != nil {
        panic(err)
    }
}
```

이 코드는 PostgreSQL DB 인스턴스에 연결됩니다.

```
package main

import (
	"database/sql"
	"fmt"

	"github.com/aws/aws-sdk-go/aws/credentials"
	"github.com/aws/aws-sdk-go/service/rds/rdsutils"
	_ "github.com/lib/pq"
)

func main() {
    dbName := "app"
    dbUser := "jane_doe"
    dbHost := "postgresmydb.123456789012.us-east-1.rds.amazonaws.com"
    dbPort := 5432
    dbEndpoint := fmt.Sprintf("%s:%d", dbHost, dbPort)
    region := "us-east-1"

    creds := credentials.NewEnvCredentials()
    authToken, err := rdsutils.BuildAuthToken(dbEndpoint, region, dbUser, creds)
    if err != nil {
        panic(err)
    }

    dsn := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s",
        dbHost, dbPort, dbUser, authToken, dbName,
    )

    db, err := sql.Open("postgres", dsn)
    if err != nil {
        panic(err)
    }

    err = db.Ping()
    if err != nil {
        panic(err)
    }
}
```

프록시를 통해 DB 인스턴스에 연결하려는 경우 [IAM 인증을 사용하여 데이터베이스에 연결](rds-proxy-connecting.md#rds-proxy-connecting-iam)을 참조하세요.

# IAM 인증 및 AWS SDK for Java를 사용하여 DB 인스턴스에 연결
<a name="UsingWithRDS.IAMDBAuth.Connecting.Java"></a>

아래 설명과 같이 AWS SDK for Java를 사용하여 RDS for MariaDB, MySQL 또는 PostgreSQL DB 인스턴스에 연결할 수 있습니다.

**사전 조건**  
다음은 IAM 인증을 사용하여 DB 인스턴스에 연결하기 위한 사전 조건입니다.
+ [IAM 데이터베이스 인증의 활성화 및 비활성화](UsingWithRDS.IAMDBAuth.Enabling.md)
+ [IAM 데이터베이스 액세스를 위한 IAM 정책 생성 및 사용](UsingWithRDS.IAMDBAuth.IAMPolicy.md)
+ [IAM 인증을 사용하여 데이터베이스 계정 생성](UsingWithRDS.IAMDBAuth.DBAccounts.md)
+ [AWS SDK for Java 설정](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-install.html)

Java 2.x용 SDK를 사용하는 방법에 대한 예제는 [Java 2.x용 SDK를 사용한 Amazon RDS 예제](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/java_rds_code_examples.html)를 참조하세요. 또한 AWS 고급 JDBC 래퍼를 사용할 수 있습니다. [AWS Advanced JDBC Wrapper documentation](https://github.com/aws/aws-advanced-jdbc-wrapper/blob/main/docs/Documentation.md)을 참조하세요.

**Topics**
+ [IAM 인증 토크 생성](#UsingWithRDS.IAMDBAuth.Connecting.Java.AuthToken)
+ [IAM 인증 토큰 수동 구성](#UsingWithRDS.IAMDBAuth.Connecting.Java.AuthToken2)
+ [DB 인스턴스에 연결](#UsingWithRDS.IAMDBAuth.Connecting.Java.AuthToken.Connect)

## IAM 인증 토크 생성
<a name="UsingWithRDS.IAMDBAuth.Connecting.Java.AuthToken"></a>

AWS SDK for Java로 프로그램을 개발할 때는 `RdsIamAuthTokenGenerator` 클래스를 사용하여 서명된 인증 토큰을 가져올 수 있습니다. 이 클래스를 사용하려면 AWS 자격 증명을 입력해야 합니다. 이렇게 하려면 `DefaultAWSCredentialsProviderChain` 클래스의 인스턴스를 생성합니다. `DefaultAWSCredentialsProviderChain`은 [기본 자격 증명 공급자 체인](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/credentials.html#credentials-default)에서 찾은 첫 번째 AWS 액세스 키와 보안 키를 사용합니다. AWS 액세스 키에 대한 자세한 내용은 [사용자의 액세스 키 관리](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html)를 참조하세요.

**참고**  
인증 토큰을 생성할 때는 DB 인스턴스 엔드포인트 대신 사용자 지정 Route 53 DNS 레코드를 사용할 수 없습니다.

`RdsIamAuthTokenGenerator` 인스턴스를 생성한 후에는 `getAuthToken` 메서드를 호출하여 서명된 토큰을 가져올 수 있습니다. 이때 AWS 리전, 호스트 이름, 포트 이름 및 사용자 이름을 입력합니다. 다음은 각 정보의 입력 방법을 설명한 코드 예제입니다.

```
package com.amazonaws.codesamples;

import com.amazonaws.auth.DefaultAWSCredentialsProviderChain;
import com.amazonaws.services.rds.auth.GetIamAuthTokenRequest;
import com.amazonaws.services.rds.auth.RdsIamAuthTokenGenerator;

public class GenerateRDSAuthToken {

    public static void main(String[] args) {

	    String region = "us-west-2";
	    String hostname = "rdsmysql.123456789012.us-west-2.rds.amazonaws.com";
	    String port = "3306";
	    String username = "jane_doe";
	
	    System.out.println(generateAuthToken(region, hostname, port, username));
    }

    static String generateAuthToken(String region, String hostName, String port, String username) {

	    RdsIamAuthTokenGenerator generator = RdsIamAuthTokenGenerator.builder()
		    .credentials(new DefaultAWSCredentialsProviderChain())
		    .region(region)
		    .build();

	    String authToken = generator.getAuthToken(
		    GetIamAuthTokenRequest.builder()
		    .hostname(hostName)
		    .port(Integer.parseInt(port))
		    .userName(username)
		    .build());
	    
	    return authToken;
    }

}
```

## IAM 인증 토큰 수동 구성
<a name="UsingWithRDS.IAMDBAuth.Connecting.Java.AuthToken2"></a>

Java에서 인증 토큰을 가장 쉽게 생성할 수 있는 방법은 `RdsIamAuthTokenGenerator`를 사용하는 것입니다. 이 클래스는 인증 토큰을 생성한 후 AWS 서명 버전 4를 사용해 서명까지 마칩니다. (자세한 내용은 *AWS 일반 참조*의 [서명 버전 4 서명 프로세스](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html)를 참조하세요.)

그 밖에 다음 코드 예제와 같이 인증 토큰을 수동으로 구성하여 서명하는 방법도 있습니다.

```
package com.amazonaws.codesamples;

import com.amazonaws.SdkClientException;
import com.amazonaws.auth.DefaultAWSCredentialsProviderChain;
import com.amazonaws.auth.SigningAlgorithm;
import com.amazonaws.util.BinaryUtils;
import org.apache.commons.lang3.StringUtils;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.Charset;
import java.security.MessageDigest;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.SortedMap;
import java.util.TreeMap;

import static com.amazonaws.auth.internal.SignerConstants.AWS4_TERMINATOR;
import static com.amazonaws.util.StringUtils.UTF8;

public class CreateRDSAuthTokenManually {
    public static String httpMethod = "GET";
    public static String action = "connect";
    public static String canonicalURIParameter = "/";
    public static SortedMap<String, String> canonicalQueryParameters = new TreeMap();
    public static String payload = StringUtils.EMPTY;
    public static String signedHeader = "host";
    public static String algorithm = "AWS4-HMAC-SHA256";
    public static String serviceName = "rds-db";
    public static String requestWithoutSignature;

    public static void main(String[] args) throws Exception {

        String region = "us-west-2";
        String instanceName = "rdsmysql.123456789012.us-west-2.rds.amazonaws.com";
        String port = "3306";
        String username = "jane_doe";
	
        Date now = new Date();
        String date = new SimpleDateFormat("yyyyMMdd").format(now);
        String dateTimeStamp = new SimpleDateFormat("yyyyMMdd'T'HHmmss'Z'").format(now);
        DefaultAWSCredentialsProviderChain creds = new DefaultAWSCredentialsProviderChain();
	    String awsAccessKey = creds.getCredentials().getAWSAccessKeyId();
	    String awsSecretKey = creds.getCredentials().getAWSSecretKey();
        String expiryMinutes = "900";
        
        System.out.println("Step 1:  Create a canonical request:");
        String canonicalString = createCanonicalString(username, awsAccessKey, date, dateTimeStamp, region, expiryMinutes, instanceName, port);
        System.out.println(canonicalString);
        System.out.println();

        System.out.println("Step 2:  Create a string to sign:");        
        String stringToSign = createStringToSign(dateTimeStamp, canonicalString, awsAccessKey, date, region);
        System.out.println(stringToSign);
        System.out.println();

        System.out.println("Step 3:  Calculate the signature:");        
        String signature = BinaryUtils.toHex(calculateSignature(stringToSign, newSigningKey(awsSecretKey, date, region, serviceName)));
        System.out.println(signature);
        System.out.println();

        System.out.println("Step 4:  Add the signing info to the request");                
        System.out.println(appendSignature(signature));
        System.out.println();
        
    }

    //Step 1: Create a canonical request date should be in format YYYYMMDD and dateTime should be in format YYYYMMDDTHHMMSSZ
    public static String createCanonicalString(String user, String accessKey, String date, String dateTime, String region, String expiryPeriod, String hostName, String port) throws Exception {
        canonicalQueryParameters.put("Action", action);
        canonicalQueryParameters.put("DBUser", user);
        canonicalQueryParameters.put("X-Amz-Algorithm", "AWS4-HMAC-SHA256");
        canonicalQueryParameters.put("X-Amz-Credential", accessKey + "%2F" + date + "%2F" + region + "%2F" + serviceName + "%2Faws4_request");
        canonicalQueryParameters.put("X-Amz-Date", dateTime);
        canonicalQueryParameters.put("X-Amz-Expires", expiryPeriod);
        canonicalQueryParameters.put("X-Amz-SignedHeaders", signedHeader);
        String canonicalQueryString = "";
        while(!canonicalQueryParameters.isEmpty()) {
            String currentQueryParameter = canonicalQueryParameters.firstKey();
            String currentQueryParameterValue = canonicalQueryParameters.remove(currentQueryParameter);
            canonicalQueryString = canonicalQueryString + currentQueryParameter + "=" + currentQueryParameterValue;
            if (!currentQueryParameter.equals("X-Amz-SignedHeaders")) {
                canonicalQueryString += "&";
            }
        }
        String canonicalHeaders = "host:" + hostName + ":" + port + '\n';
        requestWithoutSignature = hostName + ":" + port + "/?" + canonicalQueryString;

        String hashedPayload = BinaryUtils.toHex(hash(payload));
        return httpMethod + '\n' + canonicalURIParameter + '\n' + canonicalQueryString + '\n' + canonicalHeaders + '\n' + signedHeader + '\n' + hashedPayload;

    }

    //Step 2: Create a string to sign using sig v4
    public static String createStringToSign(String dateTime, String canonicalRequest, String accessKey, String date, String region) throws Exception {
        String credentialScope = date + "/" + region + "/" + serviceName + "/aws4_request";
        return algorithm + '\n' + dateTime + '\n' + credentialScope + '\n' + BinaryUtils.toHex(hash(canonicalRequest));

    }

    //Step 3: Calculate signature
    /**
     * Step 3 of the &AWS; Signature version 4 calculation. It involves deriving
     * the signing key and computing the signature. Refer to
     * http://docs.aws.amazon
     * .com/general/latest/gr/sigv4-calculate-signature.html
     */
    public static byte[] calculateSignature(String stringToSign,
                                            byte[] signingKey) {
        return sign(stringToSign.getBytes(Charset.forName("UTF-8")), signingKey,
                SigningAlgorithm.HmacSHA256);
    }

    public static byte[] sign(byte[] data, byte[] key,
                          SigningAlgorithm algorithm) throws SdkClientException {
        try {
            Mac mac = algorithm.getMac();
            mac.init(new SecretKeySpec(key, algorithm.toString()));
            return mac.doFinal(data);
        } catch (Exception e) {
            throw new SdkClientException(
                    "Unable to calculate a request signature: "
                            + e.getMessage(), e);
        }
    }

    public static byte[] newSigningKey(String secretKey,
                                   String dateStamp, String regionName, String serviceName) {
        byte[] kSecret = ("AWS4" + secretKey).getBytes(Charset.forName("UTF-8"));
        byte[] kDate = sign(dateStamp, kSecret, SigningAlgorithm.HmacSHA256);
        byte[] kRegion = sign(regionName, kDate, SigningAlgorithm.HmacSHA256);
        byte[] kService = sign(serviceName, kRegion,
                SigningAlgorithm.HmacSHA256);
        return sign(AWS4_TERMINATOR, kService, SigningAlgorithm.HmacSHA256);
    }

    public static byte[] sign(String stringData, byte[] key,
                       SigningAlgorithm algorithm) throws SdkClientException {
        try {
            byte[] data = stringData.getBytes(UTF8);
            return sign(data, key, algorithm);
        } catch (Exception e) {
            throw new SdkClientException(
                    "Unable to calculate a request signature: "
                            + e.getMessage(), e);
        }
    }

    //Step 4: append the signature
    public static String appendSignature(String signature) {
        return requestWithoutSignature + "&X-Amz-Signature=" + signature;
    }

    public static byte[] hash(String s) throws Exception {
        try {
            MessageDigest md = MessageDigest.getInstance("SHA-256");
            md.update(s.getBytes(UTF8));
            return md.digest();
        } catch (Exception e) {
            throw new SdkClientException(
                    "Unable to compute hash while signing request: "
                            + e.getMessage(), e);
        }
    }
}
```

## DB 인스턴스에 연결
<a name="UsingWithRDS.IAMDBAuth.Connecting.Java.AuthToken.Connect"></a>

다음은 인증 토큰을 생성하고, 이를 사용하여 MariaDB 또는 MySQL을 실행하는 인스턴스에 연결하는 방법을 보여주는 코드 예입니다.

이 코드 예제를 실행하려면 [AWS SDK for Java](https://aws.amazon.com/sdk-for-java/)가 필요하며 이는 AWS 사이트에서 받을 수 있습니다. 또한 다음이 필요합니다.
+ MySQL Connector/J. 이 코드 예제는 `mysql-connector-java-5.1.33-bin.jar`로 테스트됩니다.
+ AWS 리전에 고유한 Amazon RDS에 대한 중간 인증서입니다. (자세한 내용은 [SSL/TLS를 사용하여 DB 인스턴스 또는 클러스터 에 대한 연결 암호화](UsingWithRDS.SSL.md) 섹션을 참조하세요.) 예제가 실행되면 클래스 로더가 쉽게 찾을 수 있도록 이 Java 코드 예제와 동일한 디렉터리에서 인증서를 찾기 시작합니다.
+ 필요하다면 다음 변수 값을 변경합니다.
  + `RDS_INSTANCE_HOSTNAME` – 액세스할 DB 인스턴스의 호스트 이름입니다.
  + `RDS_INSTANCE_PORT` - PostgreSQL DB 인스턴스에 연결할 때 사용할 포트 이름입니다.
  + `REGION_NAME` - DB 인스턴스가 실행되는 AWS 리전입니다.
  + `DB_USER` – 액세스할 데이터베이스 계정입니다.
  + `SSL_CERTIFICATE` - AWS 리전에 고유한 Amazon RDS에 대한 SSL 인증서입니다.

    AWS 리전에 대한 인증서를 다운로드하려면 [SSL/TLS를 사용하여 DB 인스턴스 또는 클러스터 에 대한 연결 암호화](UsingWithRDS.SSL.md) 섹션을 참조하세요. SSL 인증서는 예제 실행 시 클래스 로더가 인증서를 찾을 수 있도록 이 Java 프로그램 파일과 동일한 디렉터리에 설치합니다.

다음은 [기본 자격 증명 공급자 체인](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/credentials.html#credentials-default)에서 AWS 자격 증명을 가져오는 코드 예제입니다.

**참고**  
보안 모범 사례로 여기에 표시된 프롬프트 이외에 `DEFAULT_KEY_STORE_PASSWORD`에 대한 암호를 지정하는 것이 좋습니다.

```
package com.amazonaws.samples;

import com.amazonaws.services.rds.auth.RdsIamAuthTokenGenerator;
import com.amazonaws.services.rds.auth.GetIamAuthTokenRequest;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.auth.DefaultAWSCredentialsProviderChain;
import com.amazonaws.auth.AWSStaticCredentialsProvider;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.security.KeyStore;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;

import java.net.URL;

public class IAMDatabaseAuthenticationTester {
    //&AWS; Credentials of the IAM user with policy enabling IAM Database Authenticated access to the db by the db user.
    private static final DefaultAWSCredentialsProviderChain creds = new DefaultAWSCredentialsProviderChain();
    private static final String AWS_ACCESS_KEY = creds.getCredentials().getAWSAccessKeyId();
    private static final String AWS_SECRET_KEY = creds.getCredentials().getAWSSecretKey();

    //Configuration parameters for the generation of the IAM Database Authentication token
    private static final String RDS_INSTANCE_HOSTNAME = "rdsmysql.123456789012.us-west-2.rds.amazonaws.com";
    private static final int RDS_INSTANCE_PORT = 3306;
    private static final String REGION_NAME = "us-west-2";
    private static final String DB_USER = "jane_doe";
    private static final String JDBC_URL = "jdbc:mysql://" + RDS_INSTANCE_HOSTNAME + ":" + RDS_INSTANCE_PORT;

    private static final String SSL_CERTIFICATE = "rds-ca-2019-us-west-2.pem";

    private static final String KEY_STORE_TYPE = "JKS";
    private static final String KEY_STORE_PROVIDER = "SUN";
    private static final String KEY_STORE_FILE_PREFIX = "sys-connect-via-ssl-test-cacerts";
    private static final String KEY_STORE_FILE_SUFFIX = ".jks";
    private static final String DEFAULT_KEY_STORE_PASSWORD = "changeit";

    public static void main(String[] args) throws Exception {
        //get the connection
        Connection connection = getDBConnectionUsingIam();

        //verify the connection is successful
        Statement stmt= connection.createStatement();
        ResultSet rs=stmt.executeQuery("SELECT 'Success!' FROM DUAL;");
        while (rs.next()) {
        	    String id = rs.getString(1);
            System.out.println(id); //Should print "Success!"
        }

        //close the connection
        stmt.close();
        connection.close();
        
        clearSslProperties();
        
    }

    /**
     * This method returns a connection to the db instance authenticated using IAM Database Authentication
     * @return
     * @throws Exception
     */
    private static Connection getDBConnectionUsingIam() throws Exception {
        setSslProperties();
        return DriverManager.getConnection(JDBC_URL, setMySqlConnectionProperties());
    }

    /**
     * This method sets the mysql connection properties which includes the IAM Database Authentication token
     * as the password. It also specifies that SSL verification is required.
     * @return
     */
    private static Properties setMySqlConnectionProperties() {
        Properties mysqlConnectionProperties = new Properties();
        mysqlConnectionProperties.setProperty("verifyServerCertificate","true");
        mysqlConnectionProperties.setProperty("useSSL", "true");
        mysqlConnectionProperties.setProperty("user",DB_USER);
        mysqlConnectionProperties.setProperty("password",generateAuthToken());
        return mysqlConnectionProperties;
    }

    /**
     * This method generates the IAM Auth Token.
     * An example IAM Auth Token would look like follows:
     * btusi123---cmz7kenwo2ye---rds---cn-north-1.amazonaws.com.rproxy.goskope.com.cn:3306/?Action=connect&DBUser=iamtestuser&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20171003T010726Z&X-Amz-SignedHeaders=host&X-Amz-Expires=899&X-Amz-Credential=AKIAPFXHGVDI5RNFO4AQ%2F20171003%2Fcn-north-1%2Frds-db%2Faws4_request&X-Amz-Signature=f9f45ef96c1f770cdad11a53e33ffa4c3730bc03fdee820cfdf1322eed15483b
     * @return
     */
    private static String generateAuthToken() {
        BasicAWSCredentials awsCredentials = new BasicAWSCredentials(AWS_ACCESS_KEY, AWS_SECRET_KEY);

        RdsIamAuthTokenGenerator generator = RdsIamAuthTokenGenerator.builder()
                .credentials(new AWSStaticCredentialsProvider(awsCredentials)).region(REGION_NAME).build();
        return generator.getAuthToken(GetIamAuthTokenRequest.builder()
                .hostname(RDS_INSTANCE_HOSTNAME).port(RDS_INSTANCE_PORT).userName(DB_USER).build());
    }

    /**
     * This method sets the SSL properties which specify the key store file, its type and password:
     * @throws Exception
     */
    private static void setSslProperties() throws Exception {
        System.setProperty("javax.net.ssl.trustStore", createKeyStoreFile());
        System.setProperty("javax.net.ssl.trustStoreType", KEY_STORE_TYPE);
        System.setProperty("javax.net.ssl.trustStorePassword", DEFAULT_KEY_STORE_PASSWORD);
    }

    /**
     * This method returns the path of the Key Store File needed for the SSL verification during the IAM Database Authentication to
     * the db instance.
     * @return
     * @throws Exception
     */
    private static String createKeyStoreFile() throws Exception {
        return createKeyStoreFile(createCertificate()).getPath();
    }

    /**
     *  This method generates the SSL certificate
     * @return
     * @throws Exception
     */
    private static X509Certificate createCertificate() throws Exception {
        CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
        URL url = new File(SSL_CERTIFICATE).toURI().toURL();
        if (url == null) {
            throw new Exception();
        }
        try (InputStream certInputStream = url.openStream()) {
            return (X509Certificate) certFactory.generateCertificate(certInputStream);
        }
    }

    /**
     * This method creates the Key Store File
     * @param rootX509Certificate - the SSL certificate to be stored in the KeyStore
     * @return
     * @throws Exception
     */
    private static File createKeyStoreFile(X509Certificate rootX509Certificate) throws Exception {
        File keyStoreFile = File.createTempFile(KEY_STORE_FILE_PREFIX, KEY_STORE_FILE_SUFFIX);
        try (FileOutputStream fos = new FileOutputStream(keyStoreFile.getPath())) {
            KeyStore ks = KeyStore.getInstance(KEY_STORE_TYPE, KEY_STORE_PROVIDER);
            ks.load(null);
            ks.setCertificateEntry("rootCaCertificate", rootX509Certificate);
            ks.store(fos, DEFAULT_KEY_STORE_PASSWORD.toCharArray());
        }
        return keyStoreFile;
    }
    
    /**
     * This method clears the SSL properties.
     * @throws Exception
     */
    private static void clearSslProperties() throws Exception {
           System.clearProperty("javax.net.ssl.trustStore");
           System.clearProperty("javax.net.ssl.trustStoreType");
           System.clearProperty("javax.net.ssl.trustStorePassword"); 
    }
    
}
```

프록시를 통해 DB 인스턴스에 연결하려는 경우 [IAM 인증을 사용하여 데이터베이스에 연결](rds-proxy-connecting.md#rds-proxy-connecting-iam)을 참조하세요.

# IAM 인증 및 AWS SDK for Python (Boto3)를 사용하여 DB 인스턴스에 연결
<a name="UsingWithRDS.IAMDBAuth.Connecting.Python"></a>

아래 설명과 같이 AWS SDK for Python (Boto3)를 사용하여 RDS for MariaDB, MySQL 또는 PostgreSQL DB 인스턴스에 연결할 수 있습니다.

**사전 조건**  
다음은 IAM 인증을 사용하여 DB 인스턴스에 연결하기 위한 사전 조건입니다.
+ [IAM 데이터베이스 인증의 활성화 및 비활성화](UsingWithRDS.IAMDBAuth.Enabling.md)
+ [IAM 데이터베이스 액세스를 위한 IAM 정책 생성 및 사용](UsingWithRDS.IAMDBAuth.IAMPolicy.md)
+ [IAM 인증을 사용하여 데이터베이스 계정 생성](UsingWithRDS.IAMDBAuth.DBAccounts.md)

또한 샘플 코드에서 가져온 라이브러리가 시스템에 있는지 확인합니다.

**예제**  
코드 예제에서는 공유 자격 증명에 프로필을 사용합니다. 자격 증명 지정에 대한 자세한 내용은 AWS SDK for Python (Boto3) 설명서의 [자격 증명](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/credentials.html)을 참조하십시오.

다음 코드 예제는 인증 토큰을 생성한 다음 이 토큰을 사용하여 DB 인스턴스에 연결하는 방법을 보여줍니다.

이 코드 예제를 실행하려면 [AWS SDK for Python (Boto3)](https://aws.amazon.com/sdk-for-python/)가 필요하며 이는 AWS 사이트에서 받을 수 있습니다.

필요하다면 다음 변수 값을 변경합니다.
+ `ENDPOINT` - 액세스할 DB 인스턴스의 엔드포인트입니다.
+ `PORT` – DB 인스턴스에 연결할 때 사용할 포트 번호입니다.
+ `USER` – 액세스할 데이터베이스 계정입니다.
+ `REGION` - DB 인스턴스가 실행되는 AWS 리전입니다.
+ `DBNAME` – 액세스할 데이터베이스입니다.
+ `SSLCERTIFICATE` - Amazon RDS에 대한 SSL 인증서의 전체 경로입니다.

  `ssl_ca`의 경우 SSL 인증서를 지정합니다. SSL 인증서를 다운로드하려면 [SSL/TLS를 사용하여 DB 인스턴스 또는 클러스터 에 대한 연결 암호화](UsingWithRDS.SSL.md) 섹션을 참조하세요.

**참고**  
인증 토큰을 생성할 때는 DB 인스턴스 엔드포인트 대신 사용자 지정 Route 53 DNS 레코드를 사용할 수 없습니다.

이 코드는 MariaDB 또는 MySQL DB 인스턴스에 연결됩니다.

이 코드를 실행하기 전에 [Python Package 색인](https://pypi.org/project/PyMySQL/)에 있는 지침에 따라 PyMySQL 드라이버를 설치하세요.

```
import pymysql
import sys
import boto3
import os

ENDPOINT="mysqldb.123456789012.us-east-1.rds.amazonaws.com"
PORT="3306"
USER="jane_doe"
REGION="us-east-1"
DBNAME="mydb"
os.environ['LIBMYSQL_ENABLE_CLEARTEXT_PLUGIN'] = '1'

#gets the credentials from .aws/credentials
session = boto3.Session(profile_name='default')
client = session.client('rds')

token = client.generate_db_auth_token(DBHostname=ENDPOINT, Port=PORT, DBUsername=USER, Region=REGION)

try:
    conn =  pymysql.connect(auth_plugin_map={'mysql_clear_password':None},host=ENDPOINT, user=USER, password=token, port=PORT, database=DBNAME, ssl_ca='SSLCERTIFICATE', ssl_verify_identity=True, ssl_verify_cert=True)
    cur = conn.cursor()
    cur.execute("""SELECT now()""")
    query_results = cur.fetchall()
    print(query_results)
except Exception as e:
    print("Database connection failed due to {}".format(e))
```

이 코드는 PostgreSQL DB 인스턴스에 연결됩니다.

이 코드를 실행하기 전에 [Psycopg 설명서](https://pypi.org/project/psycopg2/)의 지침에 따라 `psycopg2`를 설치하세요.

```
import psycopg2
import sys
import boto3
import os

ENDPOINT="postgresmydb.123456789012.us-east-1.rds.amazonaws.com"
PORT="5432"
USER="jane_doe"
REGION="us-east-1"
DBNAME="mydb"

#gets the credentials from .aws/credentials
session = boto3.Session(profile_name='RDSCreds')
client = session.client('rds')

token = client.generate_db_auth_token(DBHostname=ENDPOINT, Port=PORT, DBUsername=USER, Region=REGION)

try:
    conn = psycopg2.connect(host=ENDPOINT, port=PORT, database=DBNAME, user=USER, password=token, sslrootcert="SSLCERTIFICATE")
    cur = conn.cursor()
    cur.execute("""SELECT now()""")
    query_results = cur.fetchall()
    print(query_results)
except Exception as e:
    print("Database connection failed due to {}".format(e))
```

프록시를 통해 DB 인스턴스에 연결하려는 경우 [IAM 인증을 사용하여 데이터베이스에 연결](rds-proxy-connecting.md#rds-proxy-connecting-iam)을 참조하세요.

# IAM DB 인증 문제 해결
<a name="UsingWithRDS.IAMDBAuth.Troubleshooting"></a>

여기에서는 몇 가지 일반적인 IAM DB 인증 문제에 대한 문제 해결 아이디어와 IAM DB 인증에 대한 CloudWatch 로그 관련 정보를 확인할 수 있습니다.

## IAM DB 인증 오류 로그를 CloudWatch Logs로 내보내기
<a name="UsingWithRDS.IAMDBAuth.Troubleshooting.ErrorLogs"></a>

IAM DB 인증 오류 로그는 데이터베이스 호스트에 저장되며 이러한 로그를 CloudWatch Logs 계정으로 내보낼 수 있습니다. 이 페이지의 로그 및 문제 해결 방법을 사용하여 IAM DB 인증 문제를 해결합니다.

콘솔, AWS CLI 및 RDS API에서 CloudWatch Logs로 로그 내보내기를 사용 설정할 수 있습니다. 콘솔 지침은 [Amazon CloudWatch Logs에 데이터베이스 로그 게시](USER_LogAccess.Procedural.UploadtoCloudWatch.md)(을)를 참조하세요.

AWS CLI에서 DB 인스턴스 를 만들 때 IAM DB 인증 오류 로그를 CloudWatch Logs로 내보내려면 다음 명령을 사용합니다.

```
aws rds create-db-instance --db-instance-identifier mydbinstance \
--region us-east-1 \
--db-instance-class db.t3.large \
--allocated-storage 50 \
--engine postgres \
--engine-version 16 \
--port 5432 \
--master-username master \
--master-user-password password \
--publicly-accessible \
--enable-iam-database-authentication \
--enable-cloudwatch-logs-exports=iam-db-auth-error
```

AWS CLI에서 DB 인스턴스 를 수정할 때 IAM DB 인증 오류 로그를 CloudWatch Logs로 내보내려면 다음 명령을 사용합니다.

```
aws rds modify-db-instance --db-instance-identifier mydbinstance \
--region us-east-1 \
--cloudwatch-logs-export-configuration '{"EnableLogTypes":["iam-db-auth-error"]}'
```

DB 인스턴스 가 IAM DB 인증 로그를 CloudWatch Logs로 내보내고 있는지 확인하려면 `describe-db-instances` 명령의 출력에서 `EnabledCloudwatchLogsExports` 파라미터가 `iam-db-auth-error`로 설정되어 있는지 확인합니다.

```
aws rds describe-db-instances --region us-east-1 --db-instance-identifier mydbinstance
            ...
            
             "EnabledCloudwatchLogsExports": [
                "iam-db-auth-error"
            ],
            ...
```

## IAM DB 인증 CloudWatch 지표
<a name="UsingWithRDS.IAMDBAuth.Troubleshooting.CWMetrics"></a>

Amazon RDS 는 IAM DB 인증에 대한 실시간에 가까운 지표를 Amazon CloudWatch 계정에 제공합니다. 다음 표에는 CloudWatch를 사용하여 사용할 수 있는 IAM DB 인증 지표가 나열되어 있습니다.


| 지표 | 설명 | 
| --- | --- | 
|  `IamDbAuthConnectionRequests`  |  IAM DB 인증으로 구성된 총 연결 요청 개수입니다.  | 
|  `IamDbAuthConnectionSuccess`  |  성공한 IAM DB 인증 요청의 총 개수입니다.  | 
|  `IamDbAuthConnectionFailure`  |  실패한 IAM DB 인증 요청의 총 개수입니다.  | 
|  `IamDbAuthConnectionFailureInvalidToken`  | 유효하지 않은 토큰으로 인해 실패한 IAM DB 인증 요청의 총 개수입니다. | 
|  `IamDbAuthConnectionFailureInsufficientPermissions`  |  잘못된 정책 또는 권한으로 인해 실패한 IAM DB 인증 요청의 총 개수입니다.  | 
|  `IamDbAuthConnectionFailureThrottling`  |  IAM DB 인증 스로틀링으로 인해 실패한 IAM DB 인증 요청의 총 개수입니다.  | 
|  `IamDbAuthConnectionFailureServerError`  |  IAM DB 인증 기능의 내부 서버 오류로 인해 실패한 IAM DB 인증 요청의 총 개수입니다.  | 

## 일반적인 문제 및 해결 방법
<a name="UsingWithRDS.IAMDBAuth.Troubleshooting.IssuesSolutions"></a>

 IAM DB 인증 사용 시 다음과 같은 문제가 발생할 수 있습니다. 표에 나와 있는 문제 해결 단계를 사용하여 문제를 해결합니다.


| 오류 | 지표 | 원인 | 솔루션 | 
| --- | --- | --- | --- | 
|  `[ERROR] Failed to authenticate the connection request for user db_user because the provided token is malformed or otherwise invalid. (Status Code: 400, Error Code: InvalidToken)`  |  `IamDbAuthConnectionFailure` `IamDbAuthConnectionFailureInvalidToken`  |  연결 요청의 IAM DB 인증 토큰이 유효한 SigV4a 토큰이 아니거나 올바른 형식이 아닙니다.  |  애플리케이션에서 토큰 생성 전략을 확인합니다. 경우에 따라 토큰을 유효한 형식으로 전달해야 합니다. 토큰을 잘라내거나 잘못된 문자열 형식으로 지정하면 토큰이 무효화됩니다.  | 
|  `[ERROR] Failed to authenticate the connection request for user db_user because the token age is longer than 15 minutes. (Status Code: 400, Error Code:ExpiredToken)`  |  `IamDbAuthConnectionFailure` `IamDbAuthConnectionFailureInvalidToken`  |  IAM DB 인증 토큰이 만료되었습니다. 토큰은 15분 동안만 유효합니다.  |  애플리케이션에서 토큰 캐싱 및/또는 토큰 재사용 로직을 확인합니다. 15분보다 오래된 토큰은 재사용해서는 안 됩니다.  | 
|  `[ERROR] Failed to authorize the connection request for user db_user because the IAM policy assumed by the caller 'arn:aws:sts::123456789012:assumed-role/ <RoleName>/ <RoleSession>' is not authorized to perform `rds-db:connect` on the DB instance. (Status Code: 403, Error Code:NotAuthorized)`  |  `IamDbAuthConnectionFailure` `IamDbAuthConnectionFailureInsufficientPermissions`  |  이 오류는 다음과 같은 이유 때문일 수 있습니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.Troubleshooting.html)  |  애플리케이션에서 수임하는 IAM 역할 및/또는 정책을 확인합니다. DB에 연결할 때와 동일한 정책을 수임하여 토큰을 생성해야 합니다.  | 
|  `[ERROR] Failed to authorize the connection request for user db_user due to IAM DB authentication throttling. (Status Code: 429, Error Code: ThrottlingException)`  |  `IamDbAuthConnectionFailure` `IamDbAuthConnectionFailureThrottling`  | 짧은 시간 내에 DB에 너무 많은 연결 요청을 하고 있습니다. IAM DB 인증 스로틀링 한도는 초당 200개의 연결입니다. |  IAM 인증으로 새 연결을 설정하는 속도를 줄입니다. 애플리케이션에서 설정된 연결을 재사용하려면 RDS 프록시를 사용하여 연결 풀링을 구현하는 것이 좋습니다.  | 
|  `[ERROR] Failed to authorize the connection request for user db_user due to an internal IAM DB authentication error. (Status Code: 500, Error Code: InternalError)`  |  `IamDbAuthConnectionFailure` `IamDbAuthConnectionFailureThrottling` |  IAM DB 인증으로 DB 연결을 승인하는 동안 내부 오류가 발생했습니다.  |  문제를 조사하려면 https://aws.amazon.com/premiumsupport/를 통해 문의하시기 바랍니다.  | 

# Amazon RDS 자격 증명 및 액세스 문제 해결
<a name="security_iam_troubleshoot"></a>

다음 정보를 사용하여 Amazon RDS 및 IAM에서 발생할 수 있는 공통적인 문제를 진단하고 수정할 수 있습니다.

**Topics**
+ [Amazon RDS에서 작업을 수행할 권한이 없음](#security_iam_troubleshoot-no-permissions)
+ [iam:PassRole을 수행하도록 인증되지 않음](#security_iam_troubleshoot-passrole)
+ [내 AWS 계정 외부의 사용자가 내 Amazon RDS 리소스에 액세스할 수 있도록 하려고 합니다.](#security_iam_troubleshoot-cross-account-access)

## Amazon RDS에서 작업을 수행할 권한이 없음
<a name="security_iam_troubleshoot-no-permissions"></a>

AWS Management Console에서 작업을 수행할 권한이 없다는 메시지가 나타나는 경우 관리자에게 문의하여 도움을 받아야 합니다. 관리자는 로그인 보안 인증 정보를 제공한 사람입니다.

다음 예제 오류는 `mateojackson` 사용자가 콘솔을 사용하여 *위젯*에 대한 세부 정보를 보려고 하지만 `rds:GetWidget` 권한이 없는 경우에 발생합니다.

```
User: arn:aws:iam::123456789012:user/mateojackson is not authorized to perform: rds:GetWidget on resource: my-example-widget
```

이 경우, Mateo는 `my-example-widget` 작업을 사용하여 `rds:GetWidget` 리소스에 액세스하도록 허용하는 정책을 업데이트하라고 관리자에게 요청합니다.

## iam:PassRole을 수행하도록 인증되지 않음
<a name="security_iam_troubleshoot-passrole"></a>

`iam:PassRole` 태스크를 수행할 권한이 없다는 오류가 수신되면 관리자에게 문의하여 도움을 받아야 합니다. 관리자는 로그인 보안 인증 정보를 제공한 사람입니다. 역할을 Amazon RDS로 전달하도록 허용하는 정책을 업데이트하라고 관리자에게 요청합니다.

일부 AWS 서비스에서는 새 서비스 역할 또는 서비스 연결 역할을 생성하는 대신, 해당 서비스에 기존 역할을 전달할 수 있습니다. 이렇게 하려면 사용자가 서비스에 역할을 전달할 수 있는 권한을 가지고 있어야 합니다.

다음 예제 오류는 이름이 `marymajor`인 사용자가 콘솔을 사용하여 Amazon RDS에서 작업을 수행하려고 하는 경우에 발생합니다. 하지만 태스크를 수행하려면 서비스에 서비스 역할이 부여한 권한이 있어야 합니다. Mary는 서비스에 역할을 전달할 수 있는 권한을 가지고 있지 않습니다.

```
User: arn:aws:iam::123456789012:user/marymajor is not authorized to perform: iam:PassRole
```

이 경우 Mary는 `iam:PassRole` 태스크를 수행하도록 허용하는 정책을 업데이트하라고 관리자에게 요청합니다.

## 내 AWS 계정 외부의 사용자가 내 Amazon RDS 리소스에 액세스할 수 있도록 하려고 합니다.
<a name="security_iam_troubleshoot-cross-account-access"></a>

다른 계정의 사용자 또는 조직 외부의 사람이 리소스에 액세스할 때 사용할 수 있는 역할을 생성할 수 있습니다. 역할을 수임할 신뢰할 수 있는 사람을 지정할 수 있습니다. 리소스 기반 정책 또는 액세스 제어 목록(ACL)을 지원하는 서비스의 경우, 이러한 정책을 사용하여 다른 사람에게 리소스에 대한 액세스 권한을 부여할 수 있습니다.

자세히 알아보려면 다음을 참조하십시오.
+ Amazon RDS에서 이러한 기능을 지원하는지 여부를 알아보려면 [Amazon RDS에서 IAM을 사용하는 방법](security_iam_service-with-iam.md) 단원을 참조하십시오.
+ 소유하고 있는 AWS 계정의 리소스에 대한 액세스 권한을 제공하는 방법을 알아보려면 *IAM 사용 설명서*의 [자신이 소유한 다른 AWS 계정의 IAM 사용자에 대한 액세스 권한 제공](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_aws-accounts.html)을 참조하세요.
+ 리소스에 대한 액세스 권한을 서드 파티 AWS 계정에게 제공하는 방법을 알아보려면 *IAM 사용 설명서의 [서드 파티](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_third-party.html)가 소유한 AWS 계정에 대한 액세스 제공*을참조하세요.
+ ID 페더레이션을 통해 액세스 권한을 제공하는 방법을 알아보려면 *IAM 사용 설명서*의 [외부에서 인증된 사용자에게 액세스 권한 제공(ID 페더레이션)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_federated-users.html)을 참조하십시오.
+ 교차 계정 액세스를 위한 역할과 리소스 기반 정책 사용의 차이점을 알아보려면 *IAM 사용 설명서*의 [IAM 역할과 리소스 기반 정책의 차이](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_compare-resource-policies.html)를 참조하십시오.