

# Amazon RDS의 Microsoft SQL Server 추가 기능
<a name="User.SQLServer.AdditionalFeatures"></a>

다음 섹션에서는 Microsoft SQL Server DB 엔진을 실행하는 Amazon RDS 인스턴스의 강화에 대한 정보를 찾을 수 있습니다.

**Topics**
+ [RDS for SQL Server에서 SQL Server 로그인에 암호 정책 사용](SQLServer.Concepts.General.PasswordPolicy.Using.md)
+ [Amazon RDS for SQL Server DB 인스턴스와 Amazon S3 통합](User.SQLServer.Options.S3-integration.md)
+ [Amazon RDS for SQL Server에 Database Mail 사용](SQLServer.DBMail.md)
+ [Amazon RDS for SQL Server의 tempdb 데이터베이스에 대한 인스턴스 스토어 지원](SQLServer.InstanceStore.md)
+ [Amazon RDS for Microsoft SQL Server에 확장 이벤트 사용](SQLServer.ExtendedEvents.md)
+ [RDS for SQL Server를 사용하여 트랜잭션 로그 백업에 액세스](USER.SQLServer.AddlFeat.TransactionLogAccess.md)

# RDS for SQL Server에서 SQL Server 로그인에 암호 정책 사용
<a name="SQLServer.Concepts.General.PasswordPolicy.Using"></a>

Amazon RDS를 사용하면 Microsoft SQL Server를 실행하는 Amazon RDS DB 인스턴스에 암호 정책을 설정할 수 있습니다. 이를 사용하여 SQL Server 인증으로 DB 인스턴스를 인증하는 로그인의 복잡성, 길이 및 잠금 요구 사항을 설정할 수 있습니다.

## 주요 용어
<a name="SQLServer.Concepts.General.PasswordPolicy.Using.KT"></a>

**로그인**  
SQL Server에서는 데이터베이스 인스턴스에 대해 인증할 수 있는 서버 수준 보안 주체를 **로그인**이라고 합니다. 다른 데이터베이스 엔진에서는 이 보안 주체를 사용자로 지칭할 수 있습니다.** RDS for SQL Server에서는 SQL Server 인증 또는 Windows 인증을 사용하여 로그인을 인증할 수 있습니다.

**SQL Server 로그인**  
SQL Server 인증을 사용하여 사용자 이름과 암호를 통해 인증하는 로그인은 SQL Server 로그인입니다. DB 파라미터를 통해 구성한 암호 정책은 SQL Server 로그인에만 적용됩니다.

**Windows 로그인**  
Windows 보안 주체를 기반으로 하고 Windows 인증을 사용하여 인증하는 로그인은 Windows 로그인입니다. Active Directory에서 Windows 로그인에 대한 암호 정책을 구성할 수 있습니다. 자세한 내용은 [RDS for SQL Server를 사용하여 Active Directory 작업](User.SQLServer.ActiveDirectoryWindowsAuth.md) 단원을 참조하십시오.

## 각 로그인에 대한 정책 활성화 및 비활성화
<a name="SQLServer.Concepts.General.PasswordPolicy.EnableDisable"></a>

 각 SQL Server 로그인에는 `CHECK_POLICY` 및 `CHECK_EXPIRATION` 플래그가 있습니다. 기본적으로 새 로그인은 `ON`으로 설정된 `CHECK_POLICY`와 `OFF`로 설정된 `CHECK_EXPIRATION`으로 생성됩니다.

로그인에 대해 `CHECK_POLICY`가 활성화된 경우 RDS for SQL Server는 복잡성 및 최소 길이 요구 사항을 기준으로 암호의 유효성을 검사합니다. 잠금 정책 또한 적용됩니다. `CHECK_POLICY` 및 `CHECK_EXPIRATION`을 활성화하기 위한 예제 T-SQL 문: 

```
ALTER LOGIN [master_user] WITH CHECK_POLICY = ON, CHECK_EXPIRATION = ON;
```

`CHECK_EXPIRATION`이 활성화된 경우 암호에는 암호 수명 정책이 적용됩니다. `CHECK_POLICY` 및 `CHECK_EXPIRATION` 설정 여부를 확인하기 위한 T-SQL 문:

```
SELECT name, is_policy_checked, is_expiration_checked FROM sys.sql_logins;
```

## 암호 정책 파라미터
<a name="SQLServer.Concepts.General.PasswordPolicy.PWDPolicyParams"></a>

모든 암호 정책 파라미터는 동적이므로 DB를 재부팅하지 않아도 적용됩니다. 다음 표에는 SQL Server 로그인에 대한 암호 정책을 수정하기 위해 설정할 수 있는 DB 파라미터가 나열되어 있습니다.


****  

| DB 파라미터 | 설명 | 허용된 값 | 기본 값 | 
| --- | --- | --- | --- | 
| rds.password\$1complexity\$1enabled | SQL Server 로그인을 위한 암호를 만들거나 변경할 때는 암호 복잡성 요구 사항을 충족해야 합니다. 다음 제약 조건을 충족해야 합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/SQLServer.Concepts.General.PasswordPolicy.Using.html)  | 0,1 | 0 | 
| rds.password\$1min\$1length | SQL Server 로그인을 위한 암호에 필요한 최소 문자 수입니다. | 0\$114 | 0 | 
| rds.password\$1min\$1age | 사용자가 SQL Server 로그인 암호를 변경할 수 있기 전에 사용해야 하는 최소 일수입니다. 0으로 설정되어 있는 경우 암호를 즉시 변경할 수 있습니다. | 0\$1998 | 0 | 
| rds.password\$1max\$1age | SQL Server 로그인 암호를 사용할 수 있는 최대 일수입니다. 이 기간이 지나면 사용자가 암호를 변경해야 합니다. 0으로 설정되어 있는 경우 암호가 만료되지 않습니다. | 0\$1999 | 42 | 
| rds.password\$1lockout\$1threshold | SQL Server 로그인이 잠기기 전에 연속으로 실패할 수 있는 로그인 시도 횟수입니다. | 0\$1999 | 0 | 
| rds.password\$1lockout\$1duration | 잠긴 SQL Server 로그인이 잠금 해제될 때까지 기다려야 하는 시간(분)입니다. | 1\$160 | 10 | 
| rds.password\$1lockout\$1reset\$1counter\$1after | 로그인 시도 실패 후 로그인 시도 실패 카운터가 0으로 재설정되기 전에 경과해야 하는 시간(분)입니다. | 1\$160 | 10 | 

**참고**  
SQL Server 암호 정책에 대한 자세한 내용은 [암호 정책](https://learn.microsoft.com/en-us/sql/relational-databases/security/password-policy)을 참조하세요.  
암호 복잡성 및 최소 길이 정책은 포함된 데이터베이스의 DB 사용자에게도 적용됩니다. 자세한 내용은 [포함된 데이터베이스](https://learn.microsoft.com/en-us/sql/relational-databases/databases/contained-databases)를 참조하세요.

암호 정책 매개변수에는 다음 제약 조건이 적용됩니다.
+ `rds.password_max_age`가 0으로 설정되어 있지 않는 한 `rds.password_min_age` 파라미터는 `rds.password_max_age parameter`보다 작아야 합니다.
+ `rds.password_lockout_reset_counter_after` 파라미터는 `rds.password_lockout_duration` 파라미터보다 작거나 같아야 합니다.
+ `rds.password_lockout_threshold`가 0으로 설정되어 있으면 `rds.password_lockout_duration` 및 `rds.password_lockout_reset_counter_after`는 적용되지 않습니다.

### 기존 로그인에 대한 고려 사항
<a name="SQLServer.Concepts.General.PasswordPolicy.ExistingLogins"></a>

인스턴스의 암호 정책을 수정한 후에는 로그인을 위한 기존 암호가 새로운 암호 복잡성 및 길이 요구 사항을 기준으로 소급 평가되지 **않습니다**. 새 암호만 새 정책을 기준으로 검증됩니다.

SQL Server는 수명 요구 사항을 기준으로 기존 암호를 **평가합니다**.

암호 정책이 수정되는 즉시 암호가 만료될 수도 있습니다. 예를 들어 로그인에 `CHECK_EXPIRATION`이 활성화되어 있고 100일 전에 암호를 마지막으로 변경했으며 `rds.password_max_age` 파라미터를 5일로 설정한 경우 암호가 즉시 만료되므로 다음 로그인 시도 시 암호를 변경해야 합니다.

**참고**  
RDS for SQL Server는 암호 기록 정책을 지원하지 않습니다. 기록 정책은 로그인이 이전에 사용한 암호를 재사용하지 못하도록 합니다.

### 다중 AZ 배포에 대한 고려 사항
<a name="SQLServer.Concepts.General.PasswordPolicy.MAZPasswords"></a>

다중 AZ 인스턴스의 로그인 시도 실패 카운터 및 잠금 상태는 노드 간에 복제되지 않습니다. 다중 AZ 인스턴스가 장애 조치될 때 로그인이 잠기는 경우 새 노드에서 로그인이 이미 잠금 해제되어 있을 수 있습니다.

# 마스터 로그인에 대한 암호 고려 사항
<a name="SQLServer.Concepts.General.PasswordPolicy.MasterLogin"></a>

RDS for SQL Server DB 인스턴스를 생성하면 마스터 사용자 암호가 암호 정책을 기준으로 평가되지 않습니다. 마스터 사용자에게 작업을 수행할 때, 특히 `ModifyDBInstance` 명령에서 `MasterUserPassword`를 설정할 때도 새 마스터 암호는 암호를 기준으로 평가되지 않습니다. 두 경우 모두 암호 정책을 충족하지 않는 마스터 사용자 암호를 설정할 수 있으며, 이 경우에도 작업은 성공합니다. 정책이 충족되지 않으면 RDS는 강력한 암호를 설정하라는 권장 사항이 포함된 RDS 이벤트를 발생시키려고 시도합니다. 마스터 사용자에는 강력한 암호만 사용해야 합니다.

마스터 사용자 암호가 암호 정책 요구 사항을 충족하지 않는 경우 RDS는 다음 이벤트 메시지를 생성하려고 시도합니다.
+ 마스터 사용자가 생성되었지만 암호가 암호 정책의 최소 길이 요구 사항을 충족하지 않습니다. 더 강력한 암호를 사용해 보세요.
+ 마스터 사용자가 생성되었지만 암호가 암호 정책의 복잡성 요구 사항을 충족하지 않습니다. 더 강력한 암호를 사용해 보세요.
+ 마스터 사용자 암호가 재설정되었지만 암호가 암호 정책의 최소 길이 요구 사항을 충족하지 않습니다. 더 강력한 암호를 사용해 보세요.
+ 마스터 사용자 암호가 재설정되었지만 암호가 암호 정책의 복잡성 요구 사항을 충족하지 않습니다. 더 강력한 암호를 사용해 보세요.

기본적으로 마스터 사용자는 `CHECK_POLICY` 및 `CHECK_EXPIRATION`으로 생성되고 `OFF`로 설정됩니다. 마스터 사용자에게 암호 정책을 적용하려면 DB 인스턴스 생성 후 마스터 사용자에 대해 이러한 플래그를 수동으로 활성화해야 합니다. 이러한 플래그를 활성화한 후에는 SQL Server에서 직접 마스터 사용자 암호를 수정하여(예: T-SQL 문 또는 SSMS를 통해) 암호 정책을 기준으로 새 암호의 유효성을 검사합니다.

**참고**  
마스터 사용자가 잠긴 경우 `ModifyDBInstance` 명령으로 마스터 사용자 암호를 재설정하여 사용자를 잠금 해제할 수 있습니다.

## 마스터 사용자 암호 수정
<a name="SQLServer.Concepts.General.PasswordPolicy.MasterLogin.Reset"></a>

[ModifyDBInstance](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBInstance.html) 명령을 사용하여 마스터 사용자 암호를 수정할 수 있습니다.

**참고**  
마스터 사용자 암호를 재설정하면 RDS는 마스터 사용자에 대한 다양한 권한을 재설정하므로 마스터 사용자는 특정 권한을 잃을 수 있습니다. 또한 마스터 사용자 암호를 재설정하면 마스터 사용자의 잠금이 해제됩니다(잠겨 있던 경우).

RDS는 새 마스터 사용자 암호의 유효성을 검사하고 암호가 정책을 충족하지 않는 경우 RDS 이벤트를 내보내려고 시도합니다. RDS는 암호 정책을 충족하지 않는 경우에도 암호를 설정합니다.

# Amazon RDS for SQL Server DB 인스턴스와 Amazon S3 통합
<a name="User.SQLServer.Options.S3-integration"></a>

Amazon RDS for SQL Server를 실행 중인 DB 인스턴스와 Amazon S3 버킷 사이에서 파일을 전송할 수 있습니다. 그러면 BULK INSERT와 같은 SQL Server 기능으로 Amazon S3를 사용할 수 있습니다. 예를 들어 Amazon S3의 .csv, .xml, .txt 및 기타 파일을 DB 인스턴스 호스트로 다운로드하고 `D:\S3\`에서 데이터베이스로 데이터를 가져올 수 있습니다. 모든 파일은 DB 인스턴스 기반으로 `D:\S3\`에 저장됩니다.

다음과 같은 제한이 적용됩니다.

**참고**  
RDS 호스트와 S3 간의 트래픽은 S3를 사용하는 모든 SQL Server 기능의 경우 RDS 내부 VPC의 VPC 엔드포인트를 통해 라우팅됩니다. 이 트래픽은 RDS 인스턴스 엔드포인트 ENI를 사용하지 않습니다. S3 버킷 정책은 네트워킹 조건에 따라 RDS 트래픽을 제한할 수 없습니다.
+ 다중 AZ 인스턴스에서 장애 조치 후 `D:\S3` 폴더의 파일이 예비 복제본에서 삭제됩니다. 자세한 내용은 [S3 통합에 대한 다중 AZ 제한 사항](#S3-MAZ) 섹션을 참조하세요.
+ DB 인스턴스와 S3 버킷은 같은 AWS 리전에 있어야 합니다.
+ 한 번에 둘 이상의 S3 통합 작업을 실행하는 경우 작업은 병렬이 아닌 순차적으로 실행됩니다.
**참고**  
S3 통합 작업은 기본 백업 및 복원 작업과 동일한 대기열을 공유합니다. 이 대기열에서는 언제든 최대 두 개의 작업만 진행할 수 있습니다. 따라서 두 개의 기본 백업 및 복원 작업을 실행하면 S3 통합 작업이 차단됩니다.
+ 복원된 인스턴스에서 S3 통합 기능을 다시 활성화해야 합니다. S3 통합은 소스 인스턴스에서 복원된 인스턴스로 전파되지 않습니다. `D:\S3`의 파일은 복원된 인스턴스에서 삭제됩니다.
+ DB 인스턴스로 다운로드하는 파일은 100개로 제한됩니다. 즉, `D:\S3\`에 있는 파일이 100개를 초과할 수 없습니다.
+ 파일 확장명이 없거나, 파일 확장명이 .abf, .asdatabase, .bcp, .configsettings, .csv, .dat, .deploymentoptions, .deploymenttargets, .fmt, .info, .ispac, .lst, .tbl, .txt, .xml, .xmla인 파일만 다운로드할 수 있습니다.
+ S3 버킷의 소유자는 관련 AWS Identity and Access Management(IAM) 역할과 동일해야 합니다. 따라서 교차 계정 S3 통합은 지원되지 않습니다.
+ S3 버킷은 공개할 수 없습니다.
+ RDS에서 S3로의 업로드 파일 크기는 파일당 50GB로 제한됩니다.
+ S3에서 RDS로의 다운로드 파일 크기는 S3에서 지원하는 최대 크기로 제한됩니다.

**Topics**
+ [RDS for SQL Server와 S3를 통합하기 위한 사전 요구 사항](Appendix.SQLServer.Options.S3-integration.preparing.md)
+ [RDS for SQL Server와 S3 통합 활성화](Appendix.SQLServer.Options.S3-integration.enabling.md)
+ [RDS for SQL Server와 Amazon S3 간 파일 전송](Appendix.SQLServer.Options.S3-integration.using.md)
+ [RDS DB 인스턴스의 파일 나열](Appendix.SQLServer.Options.S3-integration.using.listing-files.md)
+ [RDS DB 인스턴스의 파일 삭제](Appendix.SQLServer.Options.S3-integration.using.deleting-files.md)
+ [파일 전송 작업 상태 모니터링](Appendix.SQLServer.Options.S3-integration.using.monitortasks.md)
+ [작업 취소](Appendix.SQLServer.Options.S3-integration.canceltasks.md)
+ [S3 통합에 대한 다중 AZ 제한 사항](#S3-MAZ)
+ [RDS for SQL Server와 S3 통합 비활성화](Appendix.SQLServer.Options.S3-integration.disabling.md)

Amazon S3의 파일 작업에 대한 자세한 내용은 [Amazon Simple Storage Service 시작하기](https://docs.aws.amazon.com/AmazonS3/latest/userguide/GetStartedWithS3)를 참조하십시오.

# RDS for SQL Server와 S3를 통합하기 위한 사전 요구 사항
<a name="Appendix.SQLServer.Options.S3-integration.preparing"></a>

시작하기 전에, 사용하려는 S3 버킷을 찾거나 생성하십시오. 또한 RDS DB 인스턴스가 S3 버킷에 액세스할 수 있도록 권한을 추가하십시오. 이 액세스를 구성하려면 IAM 정책과 IAM 역할을 모두 생성하십시오.

## 콘솔
<a name="Appendix.SQLServer.Options.S3-integration.preparing.console"></a>

**Amazon S3 액세스를 위한 IAM 정책을 생성하려면**

1. [IAM Management Console](https://console.aws.amazon.com/iam/home?#home)의 탐색 창에서 **정책**을 선택합니다.

1. 새 정책을 생성하고 다음 단계에 대해 **시각적 편집기** 탭을 사용하십시오.

1. **서비스**에 **S3**를 입력한 후 **S3** 서비스를 선택하십시오.

1. **작업**에서 DB 인스턴스에 필요한 액세스 권한을 부여하려면 다음을 선택하십시오.
   + `ListAllMyBuckets` - 필수
   + `ListBucket` - 필수
   + `GetBucketAcl` - 필수
   + `GetBucketLocation` - 필수
   + `GetObject` – S3에서 로 파일을 다운로드하는 데 필요`D:\S3\`
   + `PutObject` – `D:\S3\`에서 S3로 파일을 업로드하는 데 필요
   + `ListMultipartUploadParts` – `D:\S3\`에서 S3로 파일을 업로드하는 데 필요
   + `AbortMultipartUpload` – `D:\S3\`에서 S3로 파일을 업로드하는 데 필요

1. **리소스**의 경우, 표시되는 옵션은 이전 단계에서 선택한 작업에 따라 다릅니다. **버킷**, **객체** 또는 두 항목 모두의 옵션이 표시될 수 있습니다. 이들 각각에 대해 적절한 Amazon 리소스 이름(ARN)을 추가하십시오.

   **버킷**의 경우 사용할 버킷의 ARN을 추가하십시오. 예를 들어, 버킷 이름이 *amzn-s3-demo-bucket*인 경우 ARN을 `arn:aws:s3:::amzn-s3-demo-bucket`으로 설정하세요.

   **객체**의 경우, 버킷의 ARN을 입력한 후 다음 중 하나를 선택하십시오.
   + 지정된 버킷의 모든 파일에 대한 액세스 권한을 부여하려면 **버킷 이름** 및 **객체 이름**에 대해 동일하게 **모두**를 선택하십시오.
   + 버킷의 특정 파일 또는 폴더에 대한 액세스 권한을 부여하려면 SQL Server가 액세스할 특정 버킷과 객체의 ARN을 제공하십시오.

1. 정책 생성을 완료할 때까지 콘솔의 지침을 따르십시오.

   위의 내용은 정책 설정을 위한 약어 형태의 안내서입니다. IAM 정책 생성에 대한 자세한 지침은 *IAM 사용 설명서*에서 [IAM 정책 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)을 참조하세요.

**이전 절차의 IAM 정책을 사용하는 IAM 역할을 생성하려면**

1. [IAM Management Console](https://console.aws.amazon.com/iam/home?#home)의 탐색 창에서 **역할**을 선택합니다.

1. 새 IAM 역할을 생성하고 콘솔에 표시되는 다음 옵션을 선택하십시오.
   + **AWS 서비스**
   + **RDS**
   + **RDS – Add Role to Database(데이터베이스에 역할 추가**

   그런 다음 하단의 **다음: 권한**을 선택합니다.

1. **Attach permissions policies(권한 정책 연결)**에 이전에 생성한 IAM 정책의 이름을 입력하십시오. 그런 다음 목록에서 그 정책을 선택합니다.

1. 역할 생성을 완료할 때까지 콘솔의 지침을 따르십시오.

   위의 내용은 역할 설정을 위한 약어 형태의 안내서입니다. 역할 생성에 대한 자세한 지침은 *IAM 사용 설명서*에서 [IAM 역할](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)을 참조하세요.

## AWS CLI
<a name="Appendix.SQLServer.Options.S3-integration.preparing.CLI"></a>

Amazon RDS에 Amazon S3 버킷에 대한 액세스 권한을 부여하려면 다음 프로세스를 사용합니다.

1. Amazon RDS에 S3 버킷 액세스 권한을 부여하는 IAM 정책을 생성합니다.

1. Amazon RDS가 S3 버킷에 액세스하기 위해 사용자 대신 가정할 수 있는 IAM 역할을 만듭니다.

   자세한 내용은 *IAM 사용 설명서*의 [IAM 사용자에게 권한을 위임하기 위한 역할 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html)을 참조하십시오.

1. 생성한 IAM 역할에 생성한 IAM 정책을 연결합니다.

**IAM 정책을 생성하려면**

DB 인스턴스에 필요한 액세스 권한을 부여하려면 적절한 조치를 포함하십시오.
+ `ListAllMyBuckets` - 필수
+ `ListBucket` - 필수
+ `GetBucketAcl` - 필수
+ `GetBucketLocation` - 필수
+ `GetObject` – S3에서 로 파일을 다운로드하는 데 필요`D:\S3\`
+ `PutObject` – `D:\S3\`에서 S3로 파일을 업로드하는 데 필요
+ `ListMultipartUploadParts` – `D:\S3\`에서 S3로 파일을 업로드하는 데 필요
+ `AbortMultipartUpload` – `D:\S3\`에서 S3로 파일을 업로드하는 데 필요

1. 다음 AWS CLI 명령은 이 옵션으로 `rds-s3-integration-policy`라는 IAM 정책을 만듭니다. *amzn-s3-demo-bucket*이라는 버킷에 대한 액세스 권한을 부여합니다.  
**Example**  

   대상 LinuxmacOS, 또는Unix:

   ```
   aws iam create-policy \
   	 --policy-name rds-s3-integration-policy \
   	 --policy-document '{
   	        "Version": "2012-10-17",		 	 	 
   	        "Statement": [
   	            {
   	                "Effect": "Allow",
   	                "Action": "s3:ListAllMyBuckets",
   	                "Resource": "*"
   	            },
   	            {
   	                "Effect": "Allow",
   	                "Action": [
   	                    "s3:ListBucket",
   	                    "s3:GetBucketAcl",
   	                    "s3:GetBucketLocation"
   	                ],
   	                "Resource": "arn:aws:s3:::amzn-s3-demo-bucket"
   	            },
   	            {
   	                "Effect": "Allow",
   	                "Action": [
   	                    "s3:GetObject",
   	                    "s3:PutObject",
   	                    "s3:ListMultipartUploadParts",
   	                    "s3:AbortMultipartUpload"
   	                ],
   	                "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/key_prefix/*"
   	            }
   	        ]
   	    }'
   ```

   Windows의 경우:

   행 끝을 인터페이스에서 지원하는 것으로 바꾸십시오(`^` 대신 `\`). 또한 Windows에서는 `\`로 모든 큰 따옴표를 이스케이프해야 합니다. JSON에서 따옴표를 이스케이프하지 않으려면, 파일에 대신 저장하고 파라미터로 전달하면 됩니다.

   먼저 다음 권한 정책을 사용하여 `policy.json` 파일을 생성하십시오.

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "s3:ListAllMyBuckets",
               "Resource": "*"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "s3:ListBucket",
                   "s3:GetBucketACL",
                   "s3:GetBucketLocation"
               ],
               "Resource": "arn:aws:s3:::amzn-s3-demo-bucket"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "s3:GetObject",
                   "s3:PutObject",
                   "s3:ListMultipartUploadParts",
                   "s3:AbortMultipartUpload"
               ],
               "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/key_prefix/*"
           }
       ]
   }
   ```

------

   그리고 다음 명령을 사용하여 정책을 만듭니다.

   ```
   aws iam create-policy ^
        --policy-name rds-s3-integration-policy ^
        --policy-document file://file_path/assume_role_policy.json
   ```

1. 정책을 만든 후에 정책의 Amazon 리소스 이름(ARN)을 기록하십시오. 이후 단계에 이 ARN이 필요합니다.

**IAM 역할을 만들려면**
+ 다음 AWS CLI 명령은 이 목적으로 `rds-s3-integration-role` IAM 역할을 생성합니다.  
**Example**  

  대상 LinuxmacOS, 또는Unix:

  ```
  aws iam create-role \
  	   --role-name rds-s3-integration-role \
  	   --assume-role-policy-document '{
  	     "Version": "2012-10-17",		 	 	 
  	     "Statement": [
  	       {
  	         "Effect": "Allow",
  	         "Principal": {
  	            "Service": "rds.amazonaws.com"
  	          },
  	         "Action": "sts:AssumeRole"
  	       }
  	     ]
  	   }'
  ```

  Windows의 경우:

  행 끝을 인터페이스에서 지원하는 것으로 바꾸십시오(`^` 대신 `\`). 또한 Windows에서는 `\`로 모든 큰 따옴표를 이스케이프해야 합니다. JSON에서 따옴표를 이스케이프하지 않으려면, 파일에 대신 저장하고 파라미터로 전달하면 됩니다.

  먼저, 다음 정책이 포함된 `assume_role_policy.json` 파일을 생성합니다.

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

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Principal": {
                  "Service": [
                      "rds.amazonaws.com"
                  ]
              },
              "Action": "sts:AssumeRole"
          }
      ]
  }
  ```

------

  그러고 나서 다음 명령을 사용하여 IAM 역할을 만듭니다.

  ```
  aws iam create-role ^
       --role-name rds-s3-integration-role ^
       --assume-role-policy-document file://file_path/assume_role_policy.json
  ```  
**Example 전역 조건 컨텍스트 키를 사용하여 IAM 역할 생성**  

  서비스 권한을 특정 리소스로 제한하는 리소스 기반 정책의 [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) 전역 조건 컨텍스트 키를 사용하는 것이 좋습니다. 이는 [혼동된 대리자 문제](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)를 방지하는 가장 효과적인 방법입니다.

  전역 조건 컨텍스트 키를 모두 사용하고 `aws:SourceArn` 값에 계정 ID가 포함되도록 할 수 있습니다. 이 경우 `aws:SourceAccount` 값과 `aws:SourceArn` 값의 계정이 동일한 정책 문에서 사용될 때 동일한 계정 ID를 사용해야 합니다.
  + 단일 리소스에 대한 교차 서비스 액세스를 원하는 경우 `aws:SourceArn`을 사용하세요.
  + 해당 계정의 모든 리소스가 교차 서비스 사용과 연결되도록 허용하려는 경우 `aws:SourceAccount`를 사용하세요.

  정책에서는 역할에 액세스하는 리소스의 전체 Amazon 리소스 이름(ARN)이 포함된 `aws:SourceArn` 전역 조건 컨텍스트 키를 사용해야 합니다. S3 통합의 경우 다음 예와 같이 DB 인스턴스 ARN을 포함해야 합니다.

  대상 LinuxmacOS, 또는Unix:

  ```
  aws iam create-role \
  	   --role-name rds-s3-integration-role \
  	   --assume-role-policy-document '{
  	     "Version": "2012-10-17",		 	 	 
  	     "Statement": [
  	       {
  	         "Effect": "Allow",
  	         "Principal": {
  	            "Service": "rds.amazonaws.com"
  	          },
  	         "Action": "sts:AssumeRole",
                  "Condition": {
                      "StringEquals": {
                          "aws:SourceArn":"arn:aws:rds:Region:my_account_ID:db:db_instance_identifier"
                      }
                  }
  	       }
  	     ]
  	   }'
  ```

  Windows의 경우:

  `assume_role_policy.json`에 전역 조건 컨텍스트 키를 추가합니다.

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

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Principal": {
                  "Service": [
                      "rds.amazonaws.com"
                  ]
              },
              "Action": "sts:AssumeRole",
              "Condition": {
                  "StringEquals": {
                      "aws:SourceArn":"arn:aws:rds:Region:my_account_ID:db:db_instance_identifier"
                  }
              }
          }
      ]
  }
  ```

------

**IAM 역할에 IAM 정책 연결**
+ 다음 AWS CLI 명령은 정책을 `rds-s3-integration-role`이라는 역할에 연결합니다. `your-policy-arn`을 이전 단계에서 기록한 정책 ARN으로 바꾸세요.  
**Example**  

  대상 LinuxmacOS, 또는Unix:

  ```
  aws iam attach-role-policy \
  	   --policy-arn your-policy-arn \
  	   --role-name rds-s3-integration-role
  ```

  Windows의 경우:

  ```
  aws iam attach-role-policy ^
  	   --policy-arn your-policy-arn ^
  	   --role-name rds-s3-integration-role
  ```

# RDS for SQL Server와 S3 통합 활성화
<a name="Appendix.SQLServer.Options.S3-integration.enabling"></a>

다음 섹션에서는 Amazon S3와 Amazon RDS for SQL Server의 통합을 활성화하는 방법을 배울 수 있습니다. S3 통합 작업을 위해, `S3_INTEGRATION` feature-name 파라미터를 사용하기 전에 생성한 IAM 역할과 DB 인스턴스를 연결해야 합니다.

**참고**  
DB 인스턴스에 IAM 역할을 추가하려면 DB 인스턴스 상태가 **사용 가능**이어야 합니다.

## 콘솔
<a name="Appendix.SQLServer.Options.S3-integration.enabling.console"></a>

**IAM 역할을 DB 인스턴스와 연결하려면**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)에서 Amazon RDS 콘솔을 엽니다.

1. 세부 정보를 표시하고자 하는 RDS for SQL Server DB 인스턴스 이름을 선택합니다.

1. **Connectivity & security(연결성 및 보안)** 탭에 있는 **Manage IAM roles(IAM 역할 관리)** 섹션의 **이 인스턴스에 IAM 역할 추가**에서 추가할 IAM 역할을 선택합니다.

1. **기능**에서 **S3\$1INTEGRATION**을 선택하십시오.  
![\[S3_INTEGRATION 역할 추가\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/images/ora-s3-integration-role.png)

1. [**Add role**]을 선택합니다.

## AWS CLI
<a name="Appendix.SQLServer.Options.S3-integration.enabling.cli"></a>

**RDS for SQL Server DB 인스턴스에 IAM 역할을 추가하려면**
+ 다음 AWS CLI 명령은 `mydbinstance`라는 RDS for SQL Server DB 인스턴스에 IAM 역할을 추가합니다.  
**Example**  

  대상 LinuxmacOS, 또는Unix:

  ```
  aws rds add-role-to-db-instance \
  	   --db-instance-identifier mydbinstance \
  	   --feature-name S3_INTEGRATION \
  	   --role-arn your-role-arn
  ```

  Windows의 경우:

  ```
  aws rds add-role-to-db-instance ^
  	   --db-instance-identifier mydbinstance ^
  	   --feature-name S3_INTEGRATION ^
  	   --role-arn your-role-arn
  ```

  `your-role-arn`을 이전 단계에서 기록한 역할 ARN으로 바꿉니다. `S3_INTEGRATION` 옵션에 대해 `--feature-name`을 지정해야 합니다.

# RDS for SQL Server와 Amazon S3 간 파일 전송
<a name="Appendix.SQLServer.Options.S3-integration.using"></a>

Amazon RDS 저장 프로시저를 사용하여 Amazon S3와 RDS DB 인스턴스 간에 파일을 다운로드하고 업로드할 수 있습니다. Amazon RDS 저장 프로시저를 사용하여 RDS 인스턴스의 파일을 나열하고 삭제할 수도 있습니다.

S3에서 다운로드 및 업로드한 파일은 `D:\S3` 폴더에 저장됩니다. 파일에 액세스하는 데 사용할 수 있는 유일한 폴더입니다. 다운로드하는 동안 대상 폴더를 포함할 때 생성되는 하위 폴더에 파일을 구성할 수 있습니다.

저장 프로시저 중에는 S3 버킷과 파일에 Amazon 리소스 이름(ARN)을 제공해야 하는 것도 있습니다. ARN의 형식은 `arn:aws:s3:::amzn-s3-demo-bucket/file_name`입니다. Amazon S3에서는 ARN에 계정 번호나 AWS 리전을 요구하지 않습니다.

S3 통합 작업은 순차적으로 실행되며 기본 백업 및 복원 작업과 동일한 대기열을 공유합니다. 이 대기열에서는 언제든 최대 두 개의 작업만 진행할 수 있습니다. 작업이 처리를 시작하는 데 최대 5분이 걸릴 수 있습니다.

## Amazon S3 버킷의 파일을 SQL Server DB 인스턴스로 다운로드
<a name="Appendix.SQLServer.Options.S3-integration.using.download"></a>

S3 버킷에서 RDS for SQL Server DB 인스턴스로 파일을 다운로드하려면 다음 파라미터와 함께 Amazon RDS 저장 프로시저 `msdb.dbo.rds_download_from_s3`를 사용합니다.


| 파라미터 이름 | 데이터 형식 | 기본값 | 필수 | 설명 | 
| --- | --- | --- | --- | --- | 
|  `@s3_arn_of_file`  |  NVARCHAR  |  –  |  필수  |  다운로드할 파일의 S3 ARN(예: `arn:aws:s3:::amzn-s3-demo-bucket/mydata.csv`)  | 
|  `@rds_file_path`  |  NVARCHAR  |  –  |  선택  |  RDS 인스턴스의 파일 경로입니다. 지정하지 않으면 파일 경로는 `D:\S3\<filename in s3>`입니다. RDS는 절대 경로와 상대 경로를 지원합니다. 하위 폴더를 생성하려면 파일 경로에 포함하십시오.  | 
|  `@overwrite_file`  |  INT  |  0  |  선택  | 기존 파일을 덮어씁니다. 0 = 덮어쓰지 않음 1 = 덮어쓰기 | 

파일 확장명이 없는 파일과 파일 확장명이 .bcp, .csv, .dat, .fmt, .info, .lst, .tbl, .txt 및 .xml인 파일을 다운로드할 수 있습니다.

**참고**  
SQL Server Integration Services가 활성화된 경우 파일 확장명이 .ispac인 파일을 다운로드할 수 있습니다. SSIS 활성화에 대한 자세한 내용은 [SQL Server Integration Services](Appendix.SQLServer.Options.SSIS.md) 단원을 참조하십시오.  
SQL Server Analysis Services가 활성화된 경우 파일 확장명이 .abf, .asdatabase, .configsettings, .deploymentoptions, .deploymenttargets 및 .xmla인 파일을 다운로드할 수 있습니다. SSAS 활성화에 대한 자세한 내용은 [SQL Server Analysis Services](Appendix.SQLServer.Options.SSAS.md) 단원을 참조하십시오.

다음 예는 S3에서 파일을 다운로드하는 저장 프로시저를 보여줍니다.

```
exec msdb.dbo.rds_download_from_s3
	    @s3_arn_of_file='arn:aws:s3:::amzn-s3-demo-bucket/bulk_data.csv',
	    @rds_file_path='D:\S3\seed_data\data.csv',
	    @overwrite_file=1;
```

예제 `rds_download_from_s3` 작업은 폴더가 없는 경우에 `seed_data`에 `D:\S3\`라는 폴더를 만듭니다. 그런 다음 이 예제에서는 S3의 원본 파일 `bulk_data.csv`를 DB 인스턴스에 `data.csv`라는 새 파일로 다운로드합니다. 파일이 이전에 존재한 경우, `@overwrite_file` 파라미터가 `1`로 설정되어 있으므로 덮어쓰기됩니다.

## SQL Server DB 인스턴스의 파일을 Amazon S3 버킷으로 업로드
<a name="Appendix.SQLServer.Options.S3-integration.using.upload"></a>

RDS for SQL Server DB 인스턴스의 파일을 S3 버킷에 업로드하려면 다음 파라미터와 함께 Amazon RDS 저장 프로시저 `msdb.dbo.rds_upload_to_s3`를 사용합니다.


| 파라미터 이름 | 데이터 형식 | 기본값 | 필수 | 설명 | 
| --- | --- | --- | --- | --- | 
|  `@s3_arn_of_file`  |  NVARCHAR  |  –  |  필수  |  S3에 생성할 파일의 S3 ARN(예: `arn:aws:s3:::amzn-s3-demo-bucket/mydata.csv`)  | 
|  `@rds_file_path`  |  NVARCHAR  |  –  |  필수  | S3에 업로드할 파일의 파일 경로입니다. 절대 경로와 상대 경로가 지원됩니다. | 
|  `@overwrite_file`  |  INT  |  –  |  선택  |  기존 파일을 덮어씁니다. 0 = 덮어쓰지 않음 1 = 덮어쓰기  | 

다음 예제에서는 `data.csv`에서 지정된 위치의 `D:\S3\seed_data\`라는 파일을 ARN이 지정한 S3 버킷의 파일 `new_data.csv`에 업로드합니다.

```
exec msdb.dbo.rds_upload_to_s3 
		@rds_file_path='D:\S3\seed_data\data.csv',
		@s3_arn_of_file='arn:aws:s3:::amzn-s3-demo-bucket/new_data.csv',
		@overwrite_file=1;
```

S3에 파일이 이전에 존재한 경우, @overwrite\$1file 파라미터가 `1`로 설정되어 있으므로 덮어쓰기됩니다.

# RDS DB 인스턴스의 파일 나열
<a name="Appendix.SQLServer.Options.S3-integration.using.listing-files"></a>

DB 인스턴스에서 사용 가능한 파일을 나열하려면 저장 프로시저와 함수를 모두 사용하십시오. 먼저, 다음 저장 프로시저를 실행하여 `D:\S3\`의 파일에서 파일 세부 정보를 수집하십시오.

```
exec msdb.dbo.rds_gather_file_details;
```

저장 프로시저는 작업 ID를 반환합니다. 다른 작업과 마찬가지로 이 저장 프로시저는 비동기적으로 실행됩니다. 작업 상태가 `SUCCESS`가 되는 즉시, 다음과 같이 `rds_fn_list_file_details` 함수의 작업 ID를 사용하여 D:\$1S3\$1의 기존 파일과 디렉터리를 나열할 수 있습니다.

```
SELECT * FROM msdb.dbo.rds_fn_list_file_details(TASK_ID);
```

이 `rds_fn_list_file_details` 함수는 다음 열이 포함된 테이블을 반환합니다.


| 출력 파라미터 | 설명 | 
| --- | --- | 
| filepath | 파일의 절대 경로(예: D:\$1S3\$1mydata.csv) | 
| size\$1in\$1bytes | 파일 크기(바이트 단위) | 
| last\$1modified\$1utc | UTC 형식의 마지막 수정 날짜 및 시간 | 
| is\$1directory | 항목이 디렉터리인지 나타내는 옵션(true/false) | 

# RDS DB 인스턴스의 파일 삭제
<a name="Appendix.SQLServer.Options.S3-integration.using.deleting-files"></a>

DB 인스턴스에서 사용 가능한 파일을 삭제하려면 다음 파라미터와 함께 Amazon RDS 저장 프로시저 `msdb.dbo.rds_delete_from_filesystem`을 사용하십시오.


| 파라미터 이름 | 데이터 형식 | 기본값 | 필수 | 설명 | 
| --- | --- | --- | --- | --- | 
|  `@rds_file_path`  |  NVARCHAR  |  –  |  필수  | 삭제할 파일의 파일 경로입니다. 절대 경로와 상대 경로가 지원됩니다. | 
|  `@force_delete`  |  INT  | 0 |  선택  |  디렉터리를 삭제하려면 이 플래그를 포함하고 `1`로 설정해야 합니다. `1` = 디렉터리 삭제 파일을 삭제하는 경우 이 파라미터는 무시됩니다.  | 

디렉터리를 삭제하려면 `@rds_file_path`가 백슬래시(`\`)로 끝나야 하며 `@force_delete`가 `1`로 설정되어야 합니다.

다음 예제에서는 `D:\S3\delete_me.txt` 파일을 삭제합니다.

```
exec msdb.dbo.rds_delete_from_filesystem
    @rds_file_path='D:\S3\delete_me.txt';
```

다음은 `D:\S3\example_folder\` 디렉터리를 삭제하는 예제입니다.

```
exec msdb.dbo.rds_delete_from_filesystem
    @rds_file_path='D:\S3\example_folder\',
    @force_delete=1;
```

# 파일 전송 작업 상태 모니터링
<a name="Appendix.SQLServer.Options.S3-integration.using.monitortasks"></a>

S3 통합 작업의 상태를 추적하려면 `rds_fn_task_status` 함수를 호출하십시오. 두 가지 파라미터가 필요합니다. 첫 번째 파라미터는 S3 통합에 적용되지 않기 때문에 항상 `NULL`이어야 합니다. 두 번째 파라미터는 작업 ID를 수락합니다.

모든 작업 목록을 보려면 다음 예와 같이 첫 번째 파라미터를 `NULL`로, 두 번째 파라미터를 `0`으로 설정하십시오.

```
SELECT * FROM msdb.dbo.rds_fn_task_status(NULL,0);
```

특정 작업을 수행하려면 다음 예와 같이 첫 번째 파라미터를 `NULL`로, 두 번째 파라미터를 작업 ID로 설정하십시오.

```
SELECT * FROM msdb.dbo.rds_fn_task_status(NULL,42);
```

`rds_fn_task_status` 함수는 다음 정보를 반환합니다.


|  출력 파라미터  |  설명  | 
| --- | --- | 
|  `task_id`  |  작업의 ID입니다.  | 
|  `task_type`  |  S3 통합의 경우 작업 유형은 다음과 같을 수 있습니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/Appendix.SQLServer.Options.S3-integration.using.monitortasks.html)  | 
|  `database_name`  | S3 통합 작업에는 적용되지 않습니다. | 
|  `% complete`  |  백분율로 나타낸 작업의 진행률입니다.  | 
|  `duration(mins)`  |  작업에 소요된 시간입니다(분).  | 
|  `lifecycle`  |  작업의 상태입니다. 가능한 상태는 다음과 같습니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/Appendix.SQLServer.Options.S3-integration.using.monitortasks.html)  | 
|  `task_info`  |  작업에 대한 추가 정보입니다. 처리 중에 오류가 발생하면 이 열에 오류 정보가 포함됩니다.  | 
|  `last_updated`  |  작업 상태를 마지막으로 업데이트한 날짜와 시간입니다.  | 
|  `created_at`  |  작업을 생성한 날짜와 시간입니다.  | 
|  `S3_object_arn`  |  다운로드하거나 업로드할 S3 객체의 ARN입니다.  | 
|  `overwrite_S3_backup_file`  |  S3 통합 작업에는 적용되지 않습니다.  | 
|  `KMS_master_key_arn`  |  S3 통합 작업에는 적용되지 않습니다.  | 
|  `filepath`  |  RDS DB 인스턴스의 파일 경로입니다.  | 
|  `overwrite_file`  |  기존 파일이 덮어쓰기되는지 나타내는 옵션입니다.  | 
|  `task_metadata`  |  S3 통합 작업에는 적용되지 않습니다.  | 

# 작업 취소
<a name="Appendix.SQLServer.Options.S3-integration.canceltasks"></a>

S3 통합 작업을 취소하려면 `msdb.dbo.rds_cancel_task` 파라미터와 함께 `task_id` 저장 프로시저를 사용하십시오. 진행 중인 작업 삭제 및 나열은 취소할 수 없습니다. 다음은 작업을 취소하는 요청 예제입니다.

```
exec msdb.dbo.rds_cancel_task @task_id = 1234;
```

모든 작업 및 해당 작업 ID에 대한 개요를 보려면 `rds_fn_task_status`에 설명된 [파일 전송 작업 상태 모니터링](Appendix.SQLServer.Options.S3-integration.using.monitortasks.md) 함수를 사용하십시오.

## S3 통합에 대한 다중 AZ 제한 사항
<a name="S3-MAZ"></a>

다중 AZ 인스턴스에서 장애 조치 후 `D:\S3` 폴더의 파일이 예비 복제본에서 삭제됩니다. 예를 들어 인스턴스 클래스 변경 또는 엔진 버전 업그레이드와 같은 DB 인스턴스 수정 시 계획된 장애 조치를 수행할 수 있습니다. 또는 주 인스턴스 중단 시 계획되지 않은 장애 조치를 수행할 수 있습니다.

**참고**  
파일 저장에 `D:\S3` 폴더를 사용하지 않는 것이 좋습니다. 가장 좋은 방법은 생성한 파일을 Amazon S3에 업로드하여 지속성 있게 만들고 데이터를 가져와야 할 때 파일을 다운로드하는 것입니다.

마지막 장애 조치 시간을 확인하려면 `msdb.dbo.rds_failover_time` 저장 프로시저를 사용합니다. 자세한 내용은 [Amazon RDS for SQL Server의 마지막 장애 조치 시간 결정](Appendix.SQLServer.CommonDBATasks.LastFailover.md) 섹션을 참조하세요.

**Example 최근 장애 조치 없음**  
이 예에서는 오류 로그에 최근 장애 조치가 없는 경우의 출력을 보여 줍니다. 2020-04-29 23:59:00.01 이후로 장애 조치가 발생하지 않았습니다.  
따라서 이 시간 이후에 다운로드되고 `rds_delete_from_filesystem` 저장 프로시저를 사용하여 삭제되지 않은 모든 파일은 현재 호스트에서 계속 액세스할 수 있습니다. 이 시간 이전에 다운로드한 파일도 사용 가능할 수 있습니다.  


| errorlog\$1available\$1from | recent\$1failover\$1time | 
| --- | --- | 
|  2020-04-29 23:59:00.0100000  |  null  | 

**Example 최근 장애 조치**  
이 예에서는 오류 로그에 장애 조치가 있는 경우의 출력을 보여 줍니다. 가장 최근의 장애 조치는 2020-05-05 18:57:51.89에 있었습니다.  
이 시간 이후에 다운로드되고 `rds_delete_from_filesystem` 저장 프로시저를 사용하여 삭제되지 않은 모든 파일은 현재 호스트에서 계속 액세스할 수 있습니다.  


| errorlog\$1available\$1from | recent\$1failover\$1time | 
| --- | --- | 
|  2020-04-29 23:59:00.0100000  |  2020-05-05 18:57:51.8900000  | 

# RDS for SQL Server와 S3 통합 비활성화
<a name="Appendix.SQLServer.Options.S3-integration.disabling"></a>

다음으로, Amazon S3와 Amazon RDS for SQL Server의 통합을 비활성화하는 방법을 배울 수 있습니다. S3 통합을 비활성화해도 `D:\S3\`의 파일은 삭제되지 않습니다.

**참고**  
DB 인스턴스에서 IAM 역할을 삭제하려면 DB 인스턴스 상태가 `available`이어야 합니다.

## 콘솔
<a name="Appendix.SQLServer.Options.S3-integration.disabling.console"></a>

**DB 인스턴스에서 IAM 역할 연결을 해제하려면**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)에서 Amazon RDS 콘솔을 엽니다.

1. 세부 정보를 표시하고자 하는 RDS for SQL Server DB 인스턴스 이름을 선택합니다.

1. **Connectivity & security(연결성 및 보안)** 탭에 있는 **Manage IAM roles(IAM 역할 관리)** 섹션에서 삭제할 IAM 역할을 선택합니다.

1. **Delete**(삭제)를 선택합니다.

## AWS CLI
<a name="Appendix.SQLServer.Options.S3-integration.disabling.cli"></a>

**RDS for SQL Server DB 인스턴스에서 IAM 역할을 제거하려면**
+ 다음 AWS CLI 명령은 `mydbinstance`라는 RDS for SQL Server DB 인스턴스에서 IAM 역할을 삭제합니다.  
**Example**  

  대상 LinuxmacOS, 또는Unix:

  ```
  aws rds remove-role-from-db-instance \
  	   --db-instance-identifier mydbinstance \
  	   --feature-name S3_INTEGRATION \
  	   --role-arn your-role-arn
  ```

  Windows의 경우:

  ```
  aws rds remove-role-from-db-instance ^
  	   --db-instance-identifier mydbinstance ^
  	   --feature-name S3_INTEGRATION ^
  	   --role-arn your-role-arn
  ```

  `your-role-arn`을 `--feature-name` 옵션에 적합한 IAM 역할 ARN으로 바꿉니다.

# Amazon RDS for SQL Server에 Database Mail 사용
<a name="SQLServer.DBMail"></a>

Database Mail을 사용하여 Amazon RDS for SQL Server 데이터베이스 인스턴스에서 사용자에게 이메일 메시지를 보낼 수 있습니다. 메시지에는 파일 및 쿼리 결과가 포함될 수 있습니다. Database Mail은 다음 구성 요소를 포함합니다.
+ **구성 및 보안 객체** – 이 객체는 프로파일과 계정을 생성하며 `msdb` 데이터베이스에 저장됩니다.
+ **메시징 객체** – 이 객체에는 메시지를 보내는 데 사용되는 [sp\$1send\$1dbmail](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-send-dbmail-transact-sql) 저장 프로시저, 그리고 메시지에 대한 정보가 들어 있는 데이터 구조가 포함됩니다. 이들 객체는 `msdb` 데이터베이스에 저장됩니다.
+ **로깅 및 감사 객체** – Database Mail은 `msdb` 데이터베이스 및 Microsoft Windows 애플리케이션 이벤트 로그에 로깅 정보를 기록합니다.
+ **Database Mail 실행 파일** – `DatabaseMail.exe`은 `msdb` 데이터베이스의 대기열에서 데이터를 읽고 이메일 메시지를 전송합니다.

RDS는 Web, Standard 및 Enterprise Edition의 모든 SQL Server 버전에 대해 데이터베이스 Database Mail지원합니다.

## 제한 사항
<a name="SQLServer.DBMail.Limitations"></a>

SQL Server DB 인스턴스에 Database Mail을 사용할 경우 다음 제한 사항이 적용됩니다.
+ Database Mail은 SQL Server Express Edition에 대해 지원되지 않습니다.
+ Database Mail 구성 파라미터 수정은 지원되지 않습니다. 사전 설정(기본값) 값을 보려면 [sysmail\$1help\$1configure\$1sp](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-help-configure-sp-transact-sql) 저장 프로시저를 사용합니다.
+ 첨부 파일은 완전하게 지원되지 않습니다. 자세한 내용은 [첨부 파일 작업](#SQLServer.DBMail.Files) 섹션을 참조하세요.
+ 최대 첨부 파일 크기는 1MB입니다.
+ Database Mail에는 다중 AZ DB 인스턴스에 대한 추가 구성이 필요합니다. 자세한 내용은 [다중 AZ 배포에 대한 고려 사항](#SQLServer.DBMail.MAZ) 섹션을 참조하세요.
+ 미리 정의된 운영자에게 이메일 메시지를 보내도록 SQL Server 에이전트를 구성하는 것은 지원되지 않습니다.

# Database Mail 활성화
<a name="SQLServer.DBMail.Enable"></a>

DB 인스턴스에 대해 Database Mail을 활성화하려면 다음 프로세스를 따릅니다.

1. 새 파라미터 그룹을 생성해야 합니다.

1. 파라미터 그룹을 수정하여 `database mail xps` 파라미터를 1로 설정합니다.

1. 파라미터 그룹을 DB 인스턴스에 연결합니다.

## Database Mail의 파라미터 그룹 생성
<a name="DBMail.CreateParamGroup"></a>

DB 인스턴스의 SQL Server 에디션 및 버전에 해당하는 `database mail xps` 파라미터의 파라미터 그룹을 생성합니다.

**참고**  
기존 파라미터 그룹을 수정할 수도 있습니다. [Database Mail을 활성화하는 파라미터 수정](#DBMail.ModifyParamGroup)의 절차를 따르십시오.

### 콘솔
<a name="DBMail.CreateParamGroup.Console"></a>

다음 예에서는 SQL Server Standard Edition 2016에 대한 파라미터 그룹을 생성합니다.

**파라미터 그룹을 생성하려면**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)에서 Amazon RDS 콘솔을 엽니다.

1. 탐색 창에서 **파라미터 그룹**을 선택합니다.

1. [**Create parameter group**]을 선택합니다.

1. **서브넷 그룹 생성** 창에서 다음을 수행합니다.

   1. **파라미터 그룹 패밀리**에서 **sqlserver-se-13.0**을 선택합니다.

   1. **그룹 이름**에 파라미터 그룹의 식별자(예: **dbmail-sqlserver-se-13**)를 입력합니다.

   1. **설명**에 **Database Mail XPs**를 입력합니다.

1. **생성(Create)**을 선택합니다.

### CLI
<a name="DBMail.CreateParamGroup.CLI"></a>

다음 예에서는 SQL Server Standard Edition 2016에 대한 파라미터 그룹을 생성합니다.

**파라미터 그룹을 생성하려면**
+ 다음 명령 중 하나를 사용합니다.  
**Example**  

  대상 LinuxmacOS, 또는Unix:

  ```
  aws rds create-db-parameter-group \
      --db-parameter-group-name dbmail-sqlserver-se-13 \
      --db-parameter-group-family "sqlserver-se-13.0" \
      --description "Database Mail XPs"
  ```

  Windows의 경우:

  ```
  aws rds create-db-parameter-group ^
      --db-parameter-group-name dbmail-sqlserver-se-13 ^
      --db-parameter-group-family "sqlserver-se-13.0" ^
      --description "Database Mail XPs"
  ```

## Database Mail을 활성화하는 파라미터 수정
<a name="DBMail.ModifyParamGroup"></a>

SQL Server 에디션 및 DB 인스턴스의 버전에 해당하는 파라미터 그룹의 `database mail xps` 파라미터를 수정합니다.

Database Mail을 활성화하려면 `database mail xps` 파라미터를 1로 설정합니다.

### 콘솔
<a name="DBMail.ModifyParamGroup.Console"></a>

다음 예에서는 SQL Server Standard Edition 2016에 대해 생성한 파라미터 그룹을 수정합니다.

**파라미터 그룹을 수정하려면**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)에서 Amazon RDS 콘솔을 엽니다.

1. 탐색 창에서 **파라미터 그룹**을 선택합니다.

1. 파라미터 그룹(예: **ssis-sqlserver-se-13**)을 선택합니다.

1. **파라미터**에서 파라미터 목록을 **mail**로 필터링합니다.

1. [**database mail xps**]를 선택합니다.

1. **파라미터 편집**을 선택합니다.

1. **1**를 입력합니다.

1. **변경 사항 저장**을 선택합니다.

### CLI
<a name="DBMail.ModifyParamGroup.CLI"></a>

다음 예에서는 SQL Server Standard Edition 2016에 대해 생성한 파라미터 그룹을 수정합니다.

**파라미터 그룹을 수정하려면**
+ 다음 명령 중 하나를 사용합니다.  
**Example**  

  대상 LinuxmacOS, 또는Unix:

  ```
  aws rds modify-db-parameter-group \
      --db-parameter-group-name dbmail-sqlserver-se-13 \
      --parameters "ParameterName='database mail xps',ParameterValue=1,ApplyMethod=immediate"
  ```

  Windows의 경우:

  ```
  aws rds modify-db-parameter-group ^
      --db-parameter-group-name dbmail-sqlserver-se-13 ^
      --parameters "ParameterName='database mail xps',ParameterValue=1,ApplyMethod=immediate"
  ```

## 파라미터 그룹과 DB 인스턴스 연결
<a name="DBMail.AssocParamGroup"></a>

AWS Management Console 또는 AWS CLI를 사용하여 Database Mail 파라미터 그룹을 DB 인스턴스와 연결할 수 있습니다.

### 콘솔
<a name="DBMail.AssocParamGroup.Console"></a>

Database Mail 파라미터 그룹을 신규 또는 기존 DB 인스턴스와 연결할 수 있습니다.
+ 새 DB 인스턴스의 경우 인스턴스를 시작할 때 연결합니다. 자세한 내용은 [Amazon RDS DB 인스턴스 생성](USER_CreateDBInstance.md) 섹션을 참조하세요.
+ 기존 DB 인스턴스의 경우 인스턴스를 수정하여 연결합니다. 자세한 내용은 [Amazon RDS DB 인스턴스 수정](Overview.DBInstance.Modifying.md) 섹션을 참조하세요.

### CLI
<a name="DBMail.AssocParamGroup.CLI"></a>

Database Mail 파라미터 그룹을 신규 또는 기존 DB 인스턴스와 연결할 수 있습니다.

**Database Mail 파라미터 그룹을 사용하여 DB 인스턴스를 생성하려면**
+ 파라미터 그룹을 생성할 때 사용한 것과 동일한 DB 엔진 유형과 메이저 버전을 지정합니다.  
**Example**  

  대상 LinuxmacOS, 또는Unix:

  ```
  aws rds create-db-instance \
      --db-instance-identifier mydbinstance \
      --db-instance-class db.m5.2xlarge \
      --engine sqlserver-se \
      --engine-version 13.00.5426.0.v1 \
      --allocated-storage 100 \
      --manage-master-user-password \
      --master-username admin \
      --storage-type gp2 \
      --license-model li
      --db-parameter-group-name dbmail-sqlserver-se-13
  ```

  Windows의 경우:

  ```
  aws rds create-db-instance ^
      --db-instance-identifier mydbinstance ^
      --db-instance-class db.m5.2xlarge ^
      --engine sqlserver-se ^
      --engine-version 13.00.5426.0.v1 ^
      --allocated-storage 100 ^
      --manage-master-user-password ^
      --master-username admin ^
      --storage-type gp2 ^
      --license-model li ^
      --db-parameter-group-name dbmail-sqlserver-se-13
  ```

**DB 인스턴스를 수정하고 Database Mail 파라미터 그룹을 연결하려면**
+ 다음 명령 중 하나를 사용합니다.  
**Example**  

  대상 LinuxmacOS, 또는Unix:

  ```
  aws rds modify-db-instance \
      --db-instance-identifier mydbinstance \
      --db-parameter-group-name dbmail-sqlserver-se-13 \
      --apply-immediately
  ```

  Windows의 경우:

  ```
  aws rds modify-db-instance ^
      --db-instance-identifier mydbinstance ^
      --db-parameter-group-name dbmail-sqlserver-se-13 ^
      --apply-immediately
  ```

# Database Mail 구성
<a name="SQLServer.DBMail.Configure"></a>

Database Mail을 구성하려면 다음 태스크를 수행합니다.

1. Database Mail 프로파일을 생성합니다.

1. Database Mail 계정을 생성합니다.

1. Database Mail 계정을 Database Mail 프로파일에 추가합니다.

1. Database Mail 프로파일에 사용자를 추가합니다.

**참고**  
Database Mail을 구성하려면 `execute` 데이터베이스의 저장 프로시저에 대한 `msdb` 권한이 있는지 확인합니다.

## Database Mail 프로파일 생성
<a name="SQLServer.DBMail.Configure.Profile"></a>

Database Mail 프로파일을 생성하려면 [sysmail\$1add\$1profile\$1sp](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-add-profile-sp-transact-sql) 저장 프로시저를 사용합니다. 다음 예제에서는 `Notifications`라는 프로파일을 생성합니다.

**프로파일을 생성하려면**
+ 다음 SQL 문을 사용합니다.

  ```
  USE msdb
  GO
  
  EXECUTE msdb.dbo.sysmail_add_profile_sp  
      @profile_name         = 'Notifications',  
      @description          = 'Profile used for sending outgoing notifications using Amazon SES.';
  GO
  ```

## Database Mail 계정 생성
<a name="SQLServer.DBMail.Configure.Account"></a>

Database Mail 계정을 생성하려면 [sysmail\$1add\$1account\$1sp](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-add-account-sp-transact-sql) 저장 프로시저를 사용합니다. 다음 예에서는 Amazon Simple Email Service를 사용하여 프라이빗 VPC 내의 RDS for SQL Server DB 인스턴스에서 `SES`라는 이름의 계정을 생성합니다.

Amazon SES를 사용하려면 다음 파라미터가 필요합니다.
+ `@email_address` - Amazon SES에서 확인된 자격 증명입니다. 자세한 내용은 [Amazon SES에서 확인된 자격 증명](https://docs.aws.amazon.com/ses/latest/dg/verify-addresses-and-domains.html)을 참조하세요.
+ `@mailserver_name` - Amazon SES SMTP 엔드포인트입니다. 자세한 내용은 [Amazon SES SMTP 엔드포인트에 연결](https://docs.aws.amazon.com/ses/latest/dg/smtp-connect.html)을 참조하세요.
+ `@username` - Amazon SES SMTP 사용자 이름입니다. 자세한 내용은 [Amazon SES SMTP 자격 증명 받기](https://docs.aws.amazon.com/ses/latest/dg/smtp-credentials.html)를 참조하세요.

  AWS Identity and Access Management 사용자 이름을 사용하지 마세요.
+ `@password` - Amazon SES SMTP 암호입니다. 자세한 내용은 [Amazon SES SMTP 자격 증명 받기](https://docs.aws.amazon.com/ses/latest/dg/smtp-credentials.html)를 참조하세요.

**계정을 생성하려면**
+ 다음 SQL 문을 사용합니다.

  ```
  USE msdb
  GO
  
  EXECUTE msdb.dbo.sysmail_add_account_sp
      @account_name        = 'SES',
      @description         = 'Mail account for sending outgoing notifications.',
      @email_address       = 'nobody@example.com',
      @display_name        = 'Automated Mailer',
      @mailserver_name     = 'vpce-0a1b2c3d4e5f-01234567.email-smtp.us-west-2.vpce.amazonaws.com',
      @port                = 587,
      @enable_ssl          = 1,
      @username            = 'Smtp_Username',
      @password            = 'Smtp_Password';
  GO
  ```
**참고**  
보안 모범 사례로 여기에 표시된 프롬프트 이외의 보안 인증 정보를 지정하는 것이 좋습니다.

## Database Mail 프로파일에 Database Mail 계정 추가
<a name="SQLServer.DBMail.Configure.AddAccount"></a>

Database Mail 계정을 Database Mail 프로파일에 추가하려면 [sysmail\$1add\$1profileaccount\$1sp](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-add-profileaccount-sp-transact-sql) 저장 프로시저를 사용합니다. 다음 예에서는 `SES` 프로파일에 `Notifications` 계정을 추가합니다.

**프로파일에 계정을 추가하려면**
+ 다음 SQL 문을 사용합니다.

  ```
  USE msdb
  GO
  
  EXECUTE msdb.dbo.sysmail_add_profileaccount_sp
      @profile_name        = 'Notifications',
      @account_name        = 'SES',
      @sequence_number     = 1;
  GO
  ```

## Database Mail 프로파일에 사용자 추가
<a name="SQLServer.DBMail.Configure.AddUser"></a>

`msdb` 데이터베이스 보안 주체에 Database Mail 프로파일을 사용할 권한을 부여하려면 [sysmail\$1add\$1principalprofile\$1sp](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-add-principalprofile-sp-transact-sql) 저장 프로시저를 사용합니다. *보안 주체*는 SQL Server 리소스를 요청할 수 있는 엔터티입니다. 데이터베이스 보안 주체는 SQL Server 인증 사용자, Windows 인증 사용자 또는 Windows 인증 그룹에 매핑되어야 합니다.

다음 예에서는 `Notifications` 프로파일에 대한 퍼블릭 액세스 권한을 부여합니다.

**프로파일에 사용자를 추가하려면**
+ 다음 SQL 문을 사용합니다.

  ```
  USE msdb
  GO
  
  EXECUTE msdb.dbo.sysmail_add_principalprofile_sp  
      @profile_name       = 'Notifications',  
      @principal_name     = 'public',  
      @is_default         = 1;
  GO
  ```

## Amazon RDS Database Mail에 대한 저장 프로시저 및 함수
<a name="SQLServer.DBMail.StoredProc"></a>

Microsoft는 계정 및 프로필 생성, 나열, 업데이트, 삭제하는 등, Database Mail을 사용할 수 있도록 [저장 프로시저](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/database-mail-stored-procedures-transact-sql)를 제공합니다. 또한 RDS는 다음 표에 나와 있는 Database Mail용 저장 프로시저 및 함수도 제공합니다.


| 프로시저/함수 | 설명 | 
| --- | --- | 
| rds\$1fn\$1sysmail\$1allitems | 다른 사용자가 전송한 메시지를 포함하여 전송된 메시지를 표시합니다. | 
| rds\$1fn\$1sysmail\$1event\$1log | 다른 사용자가 전송한 메시지에 대한 이벤트를 포함하여 이벤트를 표시합니다. | 
| rds\$1fn\$1sysmail\$1mailattachments | 다른 사용자가 전송한 메시지의 첨부 파일을 포함하여 첨부 파일을 표시합니다. | 
| rds\$1sysmail\$1control | 메일 대기열을 시작하고 중지합니다(DatabaseMail.exe 프로세스). | 
| rds\$1sysmail\$1delete\$1mailitems\$1sp | Database Mail 내부 테이블에서 모든 사용자가 보낸 이메일 메시지를 삭제합니다. | 

# Database Mail을 사용하여 이메일 메시지 보내기
<a name="SQLServer.DBMail.Send"></a>

[sp\$1send\$1dbmail](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-send-dbmail-transact-sql) 저장 프로시저를 사용하여 Database Mail을 통해 이메일 메시지를 보낼 수 있습니다.

## 사용법
<a name="SQLServer.DBMail.Send.Usage"></a>

```
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'profile_name',
@recipients = 'recipient1@example.com[; recipient2; ... recipientn]',
@subject = 'subject',
@body = 'message_body',
[@body_format = 'HTML'],
[@file_attachments = 'file_path1; file_path2; ... file_pathn'],
[@query = 'SQL_query'],
[@attach_query_result_as_file = 0|1]';
```

다음 파라미터는 필수 파라미터입니다.
+ `@profile_name` – 메시지를 보낼 Database Mail 프로파일의 이름입니다.
+ `@recipients` – 메시지를 보낼 이메일 주소의 세미콜론으로 구분된 목록입니다.
+ `@subject` – 메시지의 제목입니다.
+ `@body` – 메시지의 본문입니다. 선언된 변수를 본문으로 사용할 수도 있습니다.

다음 파라미터는 선택적입니다.
+ `@body_format` – 이 파라미터는 HTML 형식으로 이메일을 보내도록 선언된 변수와 함께 사용됩니다.
+ `@file_attachments` – 메시지 첨부 파일의 세미콜론으로 구분된 목록입니다. 파일 경로는 절대 경로여야 합니다.
+ `@query` – 실행할 SQL 쿼리입니다. 쿼리 결과는 파일로 첨부되거나 메시지 본문에 포함될 수 있습니다.
+ `@attach_query_result_as_file` – 쿼리 결과를 파일로 첨부할지 여부를 나타냅니다. 아니요(No)인 경우 0, 예(Yes)인 경우 1로 설정합니다. 기본값은 0입니다.

## 예제
<a name="SQLServer.DBMail.Send.Examples"></a>

다음 예에서는 이메일 메시지를 보내는 방법을 보여 줍니다.

**Example 한 명의 수신자에게 메시지 전송**  

```
USE msdb
GO

EXEC msdb.dbo.sp_send_dbmail
     @profile_name       = 'Notifications',
     @recipients         = 'nobody@example.com',
     @subject            = 'Automated DBMail message - 1',
     @body               = 'Database Mail configuration was successful.';
GO
```

**Example 여러 수신자에게 메시지 전송**  

```
USE msdb
GO

EXEC msdb.dbo.sp_send_dbmail
     @profile_name       = 'Notifications',
     @recipients         = 'recipient1@example.com;recipient2@example.com',
     @subject            = 'Automated DBMail message - 2',
     @body               = 'This is a message.';
GO
```

**Example SQL 쿼리 결과를 첨부 파일로 전송**  

```
USE msdb
GO

EXEC msdb.dbo.sp_send_dbmail
     @profile_name       = 'Notifications',
     @recipients         = 'nobody@example.com',
     @subject            = 'Test SQL query',
     @body               = 'This is a SQL query test.',
     @query              = 'SELECT * FROM abc.dbo.test',
     @attach_query_result_as_file = 1;
GO
```

**Example HTML 형식으로 메시지 전송**  

```
USE msdb
GO

DECLARE @HTML_Body as NVARCHAR(500) = 'Hi, <h4> Heading </h4> </br> See the report. <b> Regards </b>';

EXEC msdb.dbo.sp_send_dbmail
     @profile_name       = 'Notifications',
     @recipients         = 'nobody@example.com',
     @subject            = 'Test HTML message',
     @body               = @HTML_Body,
     @body_format        = 'HTML';
GO
```

**Example 데이터베이스에서 특정 이벤트가 발생할 때 트리거를 사용하여 메시지 전송**  

```
USE AdventureWorks2017
GO
IF OBJECT_ID ('Production.iProductNotification', 'TR') IS NOT NULL
DROP TRIGGER Purchasing.iProductNotification
GO

CREATE TRIGGER iProductNotification ON Production.Product
   FOR INSERT
   AS
   DECLARE @ProductInformation nvarchar(255);
   SELECT
   @ProductInformation = 'A new product, ' + Name + ', is now available for $' + CAST(StandardCost AS nvarchar(20)) + '!'
   FROM INSERTED i;

EXEC msdb.dbo.sp_send_dbmail
     @profile_name       = 'Notifications',
     @recipients         = 'nobody@example.com',
     @subject            = 'New product information',
     @body               = @ProductInformation;
GO
```

# 메시지, 로그 및 첨부 파일 보기
<a name="SQLServer.DBMail.View"></a>

RDS 저장 프로시저를 사용하여 메시지, 이벤트 로그 및 첨부 파일을 볼 수 있습니다.

**모든 이메일 메시지를 보려면**
+ 다음 SQL 쿼리를 사용합니다.

  ```
  SELECT * FROM msdb.dbo.rds_fn_sysmail_allitems(); --WHERE sent_status='sent' or 'failed' or 'unsent'
  ```

**모든 이메일 이벤트 로그를 보려면**
+ 다음 SQL 쿼리를 사용합니다.

  ```
  SELECT * FROM msdb.dbo.rds_fn_sysmail_event_log();
  ```

**모든 이메일 첨부 파일을 보려면**
+ 다음 SQL 쿼리를 사용합니다.

  ```
  SELECT * FROM msdb.dbo.rds_fn_sysmail_mailattachments();
  ```

# 메시지 삭제
<a name="SQLServer.DBMail.Delete"></a>

`rds_sysmail_delete_mailitems_sp` 저장 프로시저를 사용하여 메시지를 삭제합니다.

**참고**  
RDS는 DBMail 기록 데이터의 크기가 1GB에 도달하고 보존 기간이 24시간 이상인 경우 메일 테이블 항목을 자동으로 삭제합니다.  
메일 항목을 장기간 보존하려는 경우 아카이빙할 수 있습니다. 자세한 내용은 Microsoft 설명서의 [Database Mail 메시지 및 이벤트 로그를 아카이빙하기 위한 SQL Server 에이전트 작업 생성](https://docs.microsoft.com/en-us/sql/relational-databases/database-mail/create-a-sql-server-agent-job-to-archive-database-mail-messages-and-event-logs)을 참조하세요.

**모든 이메일 메시지를 삭제하려면**
+ 다음 SQL 문을 사용합니다.

  ```
  DECLARE @GETDATE datetime
  SET @GETDATE = GETDATE();
  EXECUTE msdb.dbo.rds_sysmail_delete_mailitems_sp @sent_before = @GETDATE;
  GO
  ```

**특정 상태의 이메일 메시지를 모두 삭제하려면**
+ 실패한 메시지를 모두 삭제하려면 다음 SQL 문을 사용합니다.

  ```
  DECLARE @GETDATE datetime
  SET @GETDATE = GETDATE();
  EXECUTE msdb.dbo.rds_sysmail_delete_mailitems_sp @sent_status = 'failed';
  GO
  ```

# 메일 대기열 시작 및 중지
<a name="SQLServer.DBMail.StartStop"></a>

다음 지침을 사용하여 DB 메일 대기열을 시작하고 중지합니다.

**Topics**
+ [메일 대기열 시작](#SQLServer.DBMail.Start)
+ [메일 대기열 중지](#SQLServer.DBMail.Stop)

## 메일 대기열 시작
<a name="SQLServer.DBMail.Start"></a>

`rds_sysmail_control` 저장 프로시저를 사용하여 Database Mail 프로세스를 시작합니다.

**참고**  
Database Mail을 활성화하면 메일 대기열이 자동으로 시작됩니다.

**메일 대기열을 시작하려면**
+ 다음 SQL 문을 사용합니다.

  ```
  EXECUTE msdb.dbo.rds_sysmail_control start;
  GO
  ```

## 메일 대기열 중지
<a name="SQLServer.DBMail.Stop"></a>

`rds_sysmail_control` 저장 프로시저를 사용하여 Database Mail 프로세스를 중지합니다.

**메일 대기열을 중지하려면**
+ 다음 SQL 문을 사용합니다.

  ```
  EXECUTE msdb.dbo.rds_sysmail_control stop;
  GO
  ```

## 첨부 파일 작업
<a name="SQLServer.DBMail.Files"></a>

다음 첨부 파일 확장명은 RDS on SQL Server에서 보낸 Database Mail 메시지에서 지원되지 않습니다. .ade, .adp, .apk, .appx, .appxbundle, .bat, .bak, .cab, .chm, .cmd, .com, .cpl, .dll, .dmg, .exe, .hta, .inf1, .ins, .isp, .iso, .jar, .job, .js, .jse, .ldf, .lib, .lnk, .mde, .mdf, .msc, .msi, .msix, .msixbundle, .msp, .mst, .nsh, .pif, .ps, .ps1, .psc1, .reg, .rgs, .scr, .sct, .shb, .shs, .svg, .sys, .u3p, .vb, .vbe, .vbs, .vbscript, .vxd, .ws, .wsc, .wsf, .wsh.

Database Mail은 현재 사용자의 Microsoft Windows 보안 컨텍스트를 사용하여 파일에 대한 액세스를 제어합니다. SQL Server 인증을 사용하여 로그인하는 사용자는 `@file_attachments` 저장 프로시저와 함께 `sp_send_dbmail` 파라미터를 사용하여 파일을 첨부할 수 없습니다. Windows에서는 SQL Server가 원격 컴퓨터에서 다른 원격 컴퓨터로 자격 증명을 제공할 수 없습니다. 따라서 SQL Server를 실행하는 컴퓨터가 아닌 다른 컴퓨터에서 이 명령을 실행하면 Database Mail이 네트워크 공유에서 파일을 연결할 수 없습니다.

하지만 SQL Server 에이전트 작업을 사용하면 파일을 첨부할 수 있습니다. SQL Server 에이전트에 대한 자세한 내용은 Microsoft 설명서에서 [Amazon RDS에 SQL Server Agent 사용](Appendix.SQLServer.CommonDBATasks.Agent.md) 및 [SQL Server 에이전트](https://docs.microsoft.com/en-us/sql/ssms/agent/sql-server-agent)를 참조하세요.

## 다중 AZ 배포에 대한 고려 사항
<a name="SQLServer.DBMail.MAZ"></a>

다중 AZ DB 인스턴스에 Database Mail을 구성하면 해당 구성이 보조 인스턴스에 자동으로 전파되지 않습니다. 다중 AZ 인스턴스를 단일 AZ 인스턴스로 변환하고 Database Mail을 구성한 다음 DB 인스턴스를 다시 다중 AZ로 변환하는 것이 좋습니다. 그러면 기본 노드와 보조 노드 모두에 Database Mail 구성이 적용됩니다.

Database Mail이 구성된 다중 AZ 인스턴스에서 읽기 전용 복제본을 생성하는 경우 해당 복제본은 구성을 상속하지만 SMTP 서버에 대한 암호는 상속하지 않습니다. 해당 암호로 Database Mail 계정을 업데이트합니다.

## SMTP(포트 25) 제한 사항 제거
<a name="SQLServer.DBMail.SMTP"></a>

기본적으로 AWS는 RDS for SQL Server DB 인스턴스에 대한 SMTP(포트 25)의 아웃바운드 트래픽을 차단합니다. 이는 탄력적 네트워크 인터페이스 소유자의 정책에 따라 스팸을 방지하기 위해 수행됩니다. 필요한 경우 이 제한사항을 제거할 수 있습니다. 자세한 내용은 에서 [Amazon EC2 인스턴스 또는 Lamda 함수에서 포트 25와 관련한 제한을 없애려면 어떻게 해야 하나요?](https://repost.aws/knowledge-center/ec2-port-25-throttle)를 참조하세요.

# Amazon RDS for SQL Server의 tempdb 데이터베이스에 대한 인스턴스 스토어 지원
<a name="SQLServer.InstanceStore"></a>

*인스턴스 스토어*는 DB 인스턴스에 블록 수준의 임시 스토리지를 제공합니다. 스토리지는 호스트 컴퓨터에 물리적으로 연결된 디스크에 위치합니다. 이러한 디스크에는 SSD(솔리드 스테이트 드라이브)를 기반으로 하는 NVMe(Non-Volatile Memory Express) 인스턴스 스토리지가 있습니다. 이 스토리지는 짧은 지연 시간, 매우 높은 임의 I/O 성능, 높은 순차 읽기 처리량에 최적화되어 있습니다.

인스턴스 스토어에 `tempdb` 데이터 파일과 `tempdb` 로그 파일을 배치하면 Amazon EBS를 기반으로 하는 표준 스토리지에 비해 읽기 및 쓰기 지연 시간을 줄일 수 있습니다.

**참고**  
SQL Server 데이터베이스 파일 및 데이터베이스 로그 파일은 인스턴스 스토어에 저장되지 않습니다.

## 인스턴스 스토어 활성화
<a name="SQLServer.InstanceStore.Enable"></a>

RDS가 다음 인스턴스 클래스 중 하나로 DB 인스턴스를 프로비저닝하면 `tempdb` 데이터베이스가 인스턴스 스토어에 자동으로 배치됩니다.
+ db.m5d
+ db.r5d
+ db.x2iedn

인스턴스 스토어를 활성화하려면 다음 중 하나를 수행합니다.
+ 이러한 인스턴스 유형 중 하나를 사용하여 SQL Server DB 인스턴스를 생성합니다. 자세한 내용은 [Amazon RDS DB 인스턴스 생성](USER_CreateDBInstance.md) 섹션을 참조하세요.
+ 기존 SQL Server DB 인스턴스 중 하나를 사용할 수 있도록 수정합니다. 자세한 내용은 [Amazon RDS DB 인스턴스 수정](Overview.DBInstance.Modifying.md) 섹션을 참조하세요.

인스턴스 스토어는 이러한 인스턴스 유형 중 하나 이상이 지원되는 모든 AWS 리전에서 사용 가능합니다. `db.m5d` 및 `db.r5d` 인스턴스 클래스에 대한 자세한 내용은 [DB 인스턴스 클래스](Concepts.DBInstanceClass.md) 섹션을 참조하세요. Amazon RDS for SQL Server에서 지원하는 인스턴스 클래스에 대한 자세한 내용은 [Microsoft SQL Server를 위한 DB 인스턴스 클래스 지원](SQLServer.Concepts.General.InstanceClasses.md) 단원을 참조하세요.

## 파일 위치와 크기 고려 사항
<a name="SQLServer.InstanceStore.Files"></a>

인스턴스 스토어가 없는 인스턴스에서는 RDS가 `tempdb` 데이터 및 로그 파일을 `D:\rdsdbdata\DATA` 디렉터리에 저장합니다. 두 파일은 기본적으로 8MB에서 시작합니다.

인스턴스 스토어가 있는 인스턴스에서는 RDS가 `tempdb` 데이터 및 로그 파일을 `T:\rdsdbdata\DATA` 디렉터리에 저장합니다.

`tempdb`에는 하나의 데이터 파일(`tempdb.mdf`)과 하나의 로그 파일(`templog.ldf`)만 있지만, `templog.ldf`는 기본적으로 8MB에서 시작하며, `tempdb.mdf`는 인스턴스 스토리지 용량의 80% 이상에서 시작합니다. 스토리지 용량의 20% 또는 200GB 중 더 적은 용량에서 자유롭게 시작할 수 있습니다. 여러 `tempdb` 데이터 파일은 80% 디스크 공간을 균등하게 분할하지만 로그 파일은 항상 초기 크기가 8MB입니다.

예를 들어 DB 인스턴스 클래스를 `db.m5.2xlarge`에서 `db.m5d.2xlarge`로 수정하면 `tempdb` 데이터 파일 크기가 각각 8MB에서 총 234GB로 늘어납니다.

**참고**  
인스턴스 스토어(`tempdb`)의 `T:\rdsdbdata\DATA` 데이터 및 로그 파일 외에, 데이터 볼륨(`tempdb`)에도 `D:\rdsdbdata\DATA` 데이터 및 로그 파일을 추가로 생성할 수 있습니다. 해당 파일의 초기 크기는 항상 8MB입니다.

## 백업 고려 사항
<a name="SQLServer.InstanceStore.Backups"></a>

오랫동안 백업을 보존해야 할 수 있으므로 시간이 지나면서 비용이 발생합니다. `tempdb` 데이터와 로그 블록은 워크로드에 따라 매우 자주 변경될 수 있습니다. 이렇게 하면 DB 스냅샷 크기가 크게 증가할 수 있습니다.

`tempdb`이(가) 인스턴스 스토어에 있는 경우 스냅샷에 임시 파일이 포함되지 않습니다. 즉, EBS 전용 스토리지에 비해 스냅샷 크기가 더 작고 더 적은 여유 백업 할당량을 사용합니다.

## 디스크 가득 참 오류
<a name="SQLServer.InstanceStore.DiskFull"></a>

인스턴스 스토어에서 사용 가능한 공간을 모두 사용하면 다음과 같은 오류가 발생할 수 있습니다.
+  데이터베이스 'tempdb'에 대한 트랜잭션 로그가 'ACTIVE\$1TRANSACTION' 때문에 가득 찼습니다.  
+ PRIMARY' 파일 그룹이 가득 찼기 때문에 데이터베이스 'tempdb'에 있는 객체 'dbo.SORT 임시 실행 스토리지: 140738941419520’에 대한 공간을 할당할 수 없습니다. 불필요한 파일을 삭제하거나, 파일 그룹에서 객체를 삭제하거나, 파일 그룹에 파일을 추가하거나, 파일 그룹의 기존 파일에 대해 자동 증가를 설정하여 디스크 공간을 생성합니다.

인스턴스 스토어가 가득 차면 다음 중 하나 이상을 수행할 수 있습니다.
+ 워크로드 또는 `tempdb` 사용 방식을 조정합니다.
+ DB 인스턴스 클래스를 더 많은 NVMe 스토리지와 함께 사용하도록 확장합니다.
+ 인스턴스 스토어 사용을 중지하고, EBS 스토리지만 있는 인스턴스 클래스를 사용합니다.
+ EBS 볼륨에서 `tempdb`에 대한 보조 데이터 또는 로그 파일을 추가하여 혼합 모드를 사용합니다.

## 인스턴스 스토어 제거
<a name="SQLServer.InstanceStore.Disable"></a>

인스턴스 스토어를 제거하려면 db.m5, db.r5 또는 db.x1e등 인스턴스 스토어를 지원하지 않는 인스턴스 유형을 사용하도록 SQL Server DB 인스턴스를 수정합니다.

**참고**  
인스턴스 스토어를 제거하면 임시 파일이 `D:\rdsdbdata\DATA` 디렉터리로 이동되고 크기가 8MB로 줄어듭니다.

# Amazon RDS for Microsoft SQL Server에 확장 이벤트 사용
<a name="SQLServer.ExtendedEvents"></a>

Microsoft SQL Server의 확장 이벤트를 사용하여 Amazon RDS for SQL Server에 대한 디버깅 및 문제 해결 정보를 캡처할 수 있습니다. 확장 이벤트는 Microsoft에서 더 이상 사용되지 않는 SQL 추적 및 서버 프로파일러를 대체합니다. 확장 이벤트는 프로파일러 추적과 유사하지만 추적되는 이벤트를 보다 세부적으로 제어할 수 있습니다. Amazon RDS에서 확장 이벤트는 SQL Server 버전 2016 이상에 대해 지원됩니다. 자세한 내용은 Microsoft 설명서의 [Extended events overview](https://docs.microsoft.com/en-us/sql/relational-databases/extended-events/extended-events)를 참조하세요.

확장 이벤트는 Amazon RDS for SQL Server에서 마스터 사용자 권한이 있는 사용자에 대해 자동으로 활성화됩니다.

**Topics**
+ [제한 및 권장 사항](#SQLServer.ExtendedEvents.Limits)
+ [RDS for SQL Server에 대한 확장 이벤트 구성](#SQLServer.ExtendedEvents.Config)
+ [다중 AZ 배포에 대한 고려 사항](#SQLServer.ExtendedEvents.MAZ)
+ [확장 이벤트 파일 쿼리](#SQLServer.ExtendedEvents.Querying)

## 제한 및 권장 사항
<a name="SQLServer.ExtendedEvents.Limits"></a>

RDS for SQL Server에서 확장 이벤트를 사용하는 경우 다음과 같은 제한 사항이 적용됩니다.
+ 확장 이벤트는 Enterprise 및 Standard Edition에 대해서만 지원됩니다.
+ 기본 확장 이벤트 세션은 변경할 수 없습니다.
+ 세션 메모리 파티션 모드를 `NONE`으로 설정해야 합니다.
+ 세션 이벤트 보존 모드는 `ALLOW_SINGLE_EVENT_LOSS` 또는 `ALLOW_MULTIPLE_EVENT_LOSS`일 수 있습니다.
+ ETW(Event Tracing for Windows) 대상은 지원되지 않습니다.
+ 파일 대상이 `D:\rdsdbdata\log` 디렉터리에 있어야 합니다.
+ 페어 매칭 대상의 경우 `respond_to_memory_pressure` 속성을 `1`로 설정합니다.
+ 링 버퍼 대상 메모리는 4MB를 초과할 수 없습니다.
+ 다음은 지원되지 않는 작업입니다.
  + `debug_break`
  + `create_dump_all_threads`
  + `create_dump_single_threads`
+ `rpc_completed` 이벤트는 다음 버전 이상에서 지원됩니다. 15.0.4083.2, 14.0.3370.1, 13.0.5865.1, 12.0.6433.1, 11.0.7507.2.

## RDS for SQL Server에 대한 확장 이벤트 구성
<a name="SQLServer.ExtendedEvents.Config"></a>

RDS for SQL Server에서 확장 이벤트 세션의 특정 파라미터 값을 구성할 수 있습니다. 다음 표에서는 구성 가능한 파라미터에 대해 설명합니다.


| 파라미터 이름 | 설명 | RDS 기본값 | 최소값 | 최대값 | 
| --- | --- | --- | --- | --- | 
| xe\$1session\$1max\$1memory | 이벤트 버퍼링을 위해 세션에 할당할 최대 메모리 양을 지정합니다. 이 값은 이벤트 세션의 max\$1memory 설정에 해당합니다. | 4MB | 4MB | 8MB | 
| xe\$1session\$1max\$1event\$1size | 큰 이벤트에 허용되는 최대 메모리 크기를 지정합니다. 이 값은 이벤트 세션의 max\$1event\$1size 설정에 해당합니다. | 4MB | 4MB | 8MB | 
| xe\$1session\$1max\$1dispatch\$1latency | 이벤트가 확장 이벤트 세션 대상으로 전달되기 전에 메모리에서 버퍼링되는 시간을 지정합니다. 이 값은 이벤트 세션의 max\$1dispatch\$1latency 설정에 해당합니다. | 30초 | 1초 | 30초 | 
| xe\$1file\$1target\$1size | 파일 대상의 최대 크기를 지정합니다. 이 값은 파일 대상의 max\$1file\$1size 설정에 해당합니다. | 100MB | 10MB | 1GB | 
| xe\$1file\$1retention | 이벤트 세션의 파일 대상에서 생성된 파일의 보존 시간(일)을 지정합니다. | 7일 | 0일 | 7일 | 

**참고**  
`xe_file_retention`을 0으로 설정하면 SQL Server가 해당 파일에 대한 잠금을 해제한 후에 .xel 파일이 자동으로 제거됩니다. .xel 파일이 `xe_file_target_size`에 설정된 크기 제한에 도달할 때마다 잠금이 해제됩니다.

`rdsadmin.dbo.rds_show_configuration` 저장 프로시저를 사용하여 이러한 파라미터의 현재 값을 표시할 수 있습니다. 예를 들어 `xe_session_max_memory`의 현재 설정을 보려면 다음 SQL 문을 사용합니다.

```
exec rdsadmin.dbo.rds_show_configuration 'xe_session_max_memory'
```

`rdsadmin.dbo.rds_set_configuration` 저장 프로시저를 사용하여 설정을 수정할 수 있습니다. 예를 들어 `xe_session_max_memory`를 4MB로 설정하려면 다음 SQL 문을 사용합니다.

```
exec rdsadmin.dbo.rds_set_configuration 'xe_session_max_memory', 4
```

## 다중 AZ 배포에 대한 고려 사항
<a name="SQLServer.ExtendedEvents.MAZ"></a>

기본 DB 인스턴스에서 확장 이벤트 세션을 생성하면 예비 복제본으로 전파되지 않습니다. 장애 조치하고, 새 기본 DB 인스턴스에서 확장 이벤트 세션을 생성할 수 있습니다. 또는 다중 AZ 구성을 제거한 다음 다시 추가하여 확장 이벤트 세션을 대기 복제본에 전파할 수 있습니다. RDS는 대기 복제본에서 기본이 아닌 모든 확장 이벤트 세션을 중지하므로, 이러한 세션은 대기 복제본에서 리소스를 소모하지 않습니다. 따라서 예비 복제본이 기본 DB 인스턴스가 된 후에는 새 기본 복제본에서 확장 이벤트 세션을 수동으로 시작해야 합니다.

**참고**  
이 방법은 Always On 가용성 그룹과 데이터베이스 미러링에 모두 적용됩니다.

SQL Server 에이전트 작업을 사용하여 대기 복제본을 추적하고, 대기 복제본이 기본 복제본이 될 경우 세션을 시작할 수도 있습니다. 예를 들어 SQL Server 에이전트 작업 단계에서 다음 쿼리를 사용하여 기본 DB 인스턴스의 이벤트 세션을 다시 시작합니다.

```
BEGIN
    IF (DATABASEPROPERTYEX('rdsadmin','Updateability')='READ_WRITE'
    AND DATABASEPROPERTYEX('rdsadmin','status')='ONLINE'
    AND (DATABASEPROPERTYEX('rdsadmin','Collation') IS NOT NULL OR DATABASEPROPERTYEX('rdsadmin','IsAutoClose')=1)
    )
    BEGIN
        IF NOT EXISTS (SELECT 1 FROM sys.dm_xe_sessions WHERE name='xe1')
            ALTER EVENT SESSION xe1 ON SERVER STATE=START
        IF NOT EXISTS (SELECT 1 FROM sys.dm_xe_sessions WHERE name='xe2')
            ALTER EVENT SESSION xe2 ON SERVER STATE=START
    END
END
```

이 쿼리는 해당 세션이 중지 상태인 경우, 기본 DB 인스턴스에서 이벤트 세션 `xe1` 및 `xe2`를 다시 시작합니다. 이 쿼리에 편리한 간격으로 일정을 추가할 수도 있습니다.

## 확장 이벤트 파일 쿼리
<a name="SQLServer.ExtendedEvents.Querying"></a>

SQL Server Management Studio 또는 `sys.fn_xe_file_target_read_file` 함수를 사용하여 파일 대상을 사용하는 확장 이벤트의 데이터를 볼 수 있습니다. 이 함수에 대한 자세한 내용은 Microsoft 설명서의 [sys.fn\$1xe\$1file\$1target\$1read\$1file(Transact-SQL)](https://docs.microsoft.com/en-us/sql/relational-databases/system-functions/sys-fn-xe-file-target-read-file-transact-sql)을 참조하세요.

확장 이벤트 파일 대상은 RDS for SQL Server의 `D:\rdsdbdata\log` 디렉터리에만 파일을 쓸 수 있습니다.

예를 들어 이름이 `xe`로 시작하는 확장 이벤트 세션의 모든 파일의 내용을 나열하려면 다음 SQL 쿼리를 사용합니다.

```
SELECT * FROM sys.fn_xe_file_target_read_file('d:\rdsdbdata\log\xe*', null,null,null);
```

# RDS for SQL Server를 사용하여 트랜잭션 로그 백업에 액세스
<a name="USER.SQLServer.AddlFeat.TransactionLogAccess"></a>

RDS for SQL Server 트랜잭션 로그 백업에 액세스하면 데이터베이스의 트랜잭션 로그 백업 파일을 나열하고 대상 Amazon S3 버킷에 복사할 수 있습니다. Amazon S3 버킷의 트랜잭션 로그 백업을 복사하면 전체 및 차등 데이터베이스 백업과 함께 사용하여 특정 시점 데이터베이스 복원을 수행할 수 있습니다. RDS 저장 프로시저를 사용하여 트랜잭션 로그 백업에 대한 액세스를 설정하고, 사용 가능한 트랜잭션 로그 백업을 나열하고, 이를 Amazon S3 버킷에 복사합니다.

트랜잭션 로그 백업에 대한 액세스가 제공하는 기능과 이점은 다음과 같습니다.
+ RDS for SQL Server DB 인스턴스에 있는 데이터베이스의 사용 가능한 트랜잭션 로그 백업의 메타데이터를 나열하고 볼 수 있습니다.
+ RDS for SQL Server에서 대상 Amazon S3 버킷으로 사용 가능한 트랜잭션 로그 백업을 복사합니다.
+ 전체 DB 인스턴스를 복원할 필요 없이 특정 시점 데이터베이스 복원을 수행합니다. DB 인스턴스 특정 시점 복원에 대한 자세한 내용은 [Amazon RDS에서 DB 인스턴스를 지정된 시간으로 복원](USER_PIT.md)을 참조하세요.

## 가용성 및 지원
<a name="USER.SQLServer.AddlFeat.TransactionLogAccess.Availability"></a>

트랜잭션 로그 백업에 대한 액세스는 모든 AWS 리전에서 지원합니다. 트랜잭션 로그 백업에 대한 액세스는 Amazon RDS에서 지원되는 모든 버전의 Microsoft SQL Server에서 사용할 수 있습니다.

## 요구 사항
<a name="USER.SQLServer.AddlFeat.TransactionLogAccess.Requirements"></a>

트랜잭션 로그 백업에 대한 액세스를 활성화하려면 먼저 다음 요구 사항을 충족해야 합니다.
+  DB 인스턴스에서 자동 백업을 활성화하고 백업 보존을 1일 이상의 값으로 설정해야 합니다. 자동 백업 활성화 및 보존 정책 구성에 대한 자세한 내용은 [자동 백업 활성화](USER_WorkingWithAutomatedBackups.Enabling.md)을 참조하세요.
+ Amazon S3 버킷이 소스 DB 인스턴스와 동일한 계정 및 리전에 있어야 합니다. 트랜잭션 로그 백업에 대한 액세스를 활성화하기 전에 트랜잭션 로그 백업 파일에 사용할 기존 Amazon S3 버킷을 선택하거나 [새 버킷을 생성](https://docs.aws.amazon.com/AmazonS3/latest/userguide/CreatingaBucket.html)합니다.
+ Amazon RDS가 트랜잭션 로그 파일을 복사할 수 있도록 Amazon S3 버킷 권한 정책을 다음과 같이 구성해야 합니다.

  1. 버킷의 객체 계정 소유권 속성을 **Bucket Owner Preferred**(버킷 소유자 선호)로 설정합니다.

  1. 다음 정책을 추가합니다. 기본적으로 정책이 없으므로 버킷 ACL(액세스 제어 목록)을 사용하여 버킷 정책을 편집하고 추가합니다.

  

  다음 예에서는 ARN을 사용하여 리소스를 지정합니다. 서비스 권한을 특정 리소스로 제한하는 리소스 기반 신뢰 관계의 `SourceArn` 및 `SourceAccount` 전역 조건 컨텍스트 키를 사용하는 것이 좋습니다. ARN 작업에 대한 자세한 내용은 [Amazon 리소스 이름(ARN)](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) 및 [Amazon RDS의 Amazon 리소스 이름(ARN)](USER_Tagging.ARN.md)을 참조하세요.

    
**Example 트랜잭션 로그 백업 액세스를 위한 Amazon S3 권한 정책 예**  

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

****  

  ```
      {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Sid": "Only allow writes to my bucket with bucket owner full control",
              "Effect": "Allow",
              "Principal": {
                  "Service": "backups.rds.amazonaws.com"
              },
              "Action": "s3:PutObject",
              "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/{customer_path}/*",
              "Condition": {
                  "StringEquals": {
                      "s3:x-amz-acl": "bucket-owner-full-control",
                      "aws:sourceAccount": "{customer_account}",
                      "aws:sourceArn": "{db_instance_arn}"
                  }
              }
          }
      ]
  }
  ```

------
+ Amazon S3 버킷에 액세스하기 위한 AWS Identity and Access Management(IAM) 역할. 이미 IAM 역할이 있으면 그 역할을 사용하면 됩니다. AWS Management Console을 사용하여 `SQLSERVER_BACKUP_RESTORE` 옵션을 추가할 때 새 IAM 역할이 생성되도록 선택할 수도 있습니다. 또는 수동으로 역할을 새로 만들 수 있습니다. `SQLSERVER_BACKUP_RESTORE`를 사용하여 IAM 역할을 생성하고 구성하는 방법에 대한 자세한 내용은 [기본 백업 및 복원을 위한 IAM 역할 수동으로 만들기](SQLServer.Procedural.Importing.Native.Enabling.md#SQLServer.Procedural.Importing.Native.Enabling.IAM)을 참조하세요.
+ DB 인스턴스의 옵션 그룹에 `SQLSERVER_BACKUP_RESTORE` 옵션을 추가해야 합니다. `SQLSERVER_BACKUP_RESTORE` 옵션 추가 방법에 대한 자세한 내용은 [SQL Server에서 기본 백업 및 복원 지원](Appendix.SQLServer.Options.BackupRestore.md)을 참조하세요.
**참고**  
DB 인스턴스에 스토리지 암호화가 활성화된 경우 기본 백업 및 복원 옵션 그룹에 제공된 IAM 역할에 AWS KMS(KMS) 작업 및 키를 제공해야 합니다.

  필요에 따라 `rds_restore_log` 저장 프로시저를 사용하여 특정 시점 데이터베이스 복원을 수행하려는 경우, 기본 백업 및 복원 옵션 그룹과 트랜잭션 로그 백업에 대한 액세스에 동일한 Amazon S3 경로를 사용하는 것이 좋습니다. 이 방법을 사용하면 Amazon RDS가 옵션 그룹의 역할을 맡아 복원 로그 기능을 수행할 때 동일한 Amazon S3 경로에서 트랜잭션 로그 백업을 검색할 수 있습니다.
+ DB 인스턴스가 암호화된 경우 암호화 유형(AWS 관리형 키 또는 고객 관리형 키)과 관계없이 IAM 역할 및`rds_tlog_backup_copy_to_S3` 저장 프로시저에 고객 관리형 KMS 키를 제공해야 합니다.

## 제한 및 권장 사항
<a name="USER.SQLServer.AddlFeat.TransactionLogAccess.Limitations"></a>

트랜잭션 로그 백업에 대한 액세스에는 다음과 같은 제한 및 권장 사항이 있습니다.
+  백업 보존 기간이 1\$135일로 구성된 DB 인스턴스의 경우 최대 지난 7일간의 트랜잭션 로그 백업을 나열하고 복사할 수 있습니다.
+  트랜잭션 로그 백업 액세스에 사용되는 Amazon S3 버킷은 소스 DB 인스턴스와 동일한 계정 및 리전에 있어야 합니다. 계정 간 및 리전 간 복사는 지원되지 않습니다.
+  하나의 Amazon S3 버킷만 트랜잭션 로그 백업을 복사할 대상으로 구성할 수 있습니다. `rds_tlog_copy_setup` 저장 프로시저를 사용하여 새 대상 Amazon S3 버킷을 선택할 수 있습니다. 새 대상 Amazon S3 버킷 선택에 대한 자세한 내용은 [트랜잭션 로그 백업에 대한 액세스 설정](USER.SQLServer.AddlFeat.TransactionLogAccess.Enabling.md)을 참조하세요.
+  RDS 인스턴스에 스토리지 암호화가 활성화되지 않은 경우 `rds_tlog_backup_copy_to_S3` 저장 프로시저를 사용할 때 KMS 키를 지정할 수 없습니다.
+  다중 계정 복사는 지원되지 않습니다. 복사에 사용되는 IAM 역할은 DB 인스턴스 소유자 계정 내의 Amazon S3 버킷에 대한 쓰기 액세스만 허용합니다.
+  RDS for SQL Server DB 인스턴스에서는 유형에 관계없이 두 개의 동시 작업만 실행할 수 있습니다.
+  지정된 시간에 단일 데이터베이스에 대해 하나의 복사 작업만 실행할 수 있습니다. DB 인스턴스에 있는 여러 데이터베이스의 트랜잭션 로그 백업을 복사하려면 각 데이터베이스마다 별도의 복사 작업을 사용하세요.
+  Amazon S3 버킷에 동일한 이름으로 이미 존재하는 트랜잭션 로그 백업을 복사하는 경우 기존 트랜잭션 로그 백업을 덮어씁니다.
+  기본 DB 인스턴스의 트랜잭션 로그 백업에 액세스할 수 있는 저장 프로시저만 실행할 수 있습니다. RDS for SQL Server 읽기 전용 복제본이나 다중 AZ DB 클러스터의 보조 인스턴스에서는 이러한 저장 프로시저를 실행할 수 없습니다.
+  `rds_tlog_backup_copy_to_S3` 저장 프로시저가 실행되는 동안 RDS for SQL Server DB 인스턴스를 재부팅하면 DB 인스턴스가 다시 온라인 상태가 될 때 작업이 처음부터 자동으로 다시 시작됩니다. 재부팅 전에 작업이 실행되는 동안 Amazon S3 버킷에 복사된 모든 트랜잭션 로그 백업이 덮어쓰기됩니다.
+ Microsoft SQL Server 시스템 데이터베이스와 `RDSAdmin` 데이터베이스는 트랜잭션 로그 백업에 액세스하도록 구성할 수 없습니다.
+  SSE-KMS로 암호화된 버킷에 복사하는 것은 지원되지 않습니다.

# 트랜잭션 로그 백업에 대한 액세스 설정
<a name="USER.SQLServer.AddlFeat.TransactionLogAccess.Enabling"></a>

트랜잭션 로그 백업에 대한 액세스를 설정하려면 [요구 사항](USER.SQLServer.AddlFeat.TransactionLogAccess.md#USER.SQLServer.AddlFeat.TransactionLogAccess.Requirements) 섹션의 요구 사항 목록을 완료한 다음 `rds_tlog_copy_setup` 저장 프로시저를 실행합니다. 이 프로시저를 통해 DB 인스턴스 수준에서 트랜잭션 로그 백업 기능에 액세스할 수 있습니다. DB 인스턴스의 개별 데이터베이스마다 이를 실행할 필요는 없습니다.

**중요**  
각 데이터베이스의 SQL Server 내에서 트랜잭션 로그 백업에 대한 액세스를 구성하고 사용할 수 있는 `db_owner` 역할을 데이터베이스 사용자에게 부여해야 합니다.

**Example 사용법:**  

```
exec msdb.dbo.rds_tlog_copy_setup
@target_s3_arn='arn:aws:s3:::amzn-s3-demo-bucket/myfolder';
```

다음 파라미터는 필수입니다.
+ `@target_s3_arn` - 트랜잭션 로그 백업 파일을 복사할 대상 Amazon S3 버킷의 ARN입니다.

**Example Amazon S3 대상 버킷 설정 예:**  

```
exec msdb.dbo.rds_tlog_copy_setup @target_s3_arn='arn:aws:s3:::amzn-s3-demo-logging-bucket/mytestdb1';
```

구성을 검증하려면 `rds_show_configuration` 저장 프로시저를 호출합니다.

**Example 구성 검증 예:**  

```
exec rdsadmin.dbo.rds_show_configuration @name='target_s3_arn_for_tlog_copy';
```

트랜잭션 로그 백업에 대한 액세스를 수정하여 다른 Amazon S3 버킷을 가리키도록 하려면 현재 Amazon S3 버킷 값을 확인하고 `@target_s3_arn`의 새 값을 사용하여 `rds_tlog_copy_setup` 저장 프로시저를 다시 실행하면 됩니다.

**Example 트랜잭션 로그 백업 액세스가 구성된 기존 Amazon S3 버킷 보기 예**  

```
exec rdsadmin.dbo.rds_show_configuration @name='target_s3_arn_for_tlog_copy';
```

**Example 새 대상 Amazon S3 버킷으로 업데이트 예**  

```
exec msdb.dbo.rds_tlog_copy_setup @target_s3_arn='arn:aws:s3:::amzn-s3-demo-logging-bucket1/mynewfolder';
```

# 사용 가능한 트랜잭션 로그 백업 나열
<a name="USER.SQLServer.AddlFeat.TransactionLogAccess.Listing"></a>

RDS for SQL Server를 사용하면 전체 복구 모델과 백업 보존 기간이 1일 이상으로 설정된 DB 인스턴스를 사용하도록 구성된 데이터베이스는 트랜잭션 로그 백업이 자동으로 활성화됩니다. 트랜잭션 로그 백업에 대한 액세스를 활성화하면 최대 7일간의 해당 트랜잭션 로그 백업을 Amazon S3 버킷에 복사할 수 있습니다.

트랜잭션 로그 백업에 대한 액세스를 활성화한 후에는 이를 사용하여 사용 가능한 트랜잭션 로그 백업 파일을 나열하고 복사할 수 있습니다.

**트랜잭션 로그 백업 나열**

개별 데이터베이스에 사용할 수 있는 모든 트랜잭션 로그 백업을 나열하려면 `rds_fn_list_tlog_backup_metadata` 함수를 호출합니다. 함수를 호출할 때 `ORDER BY` 또는 `WHERE` 절을 사용할 수 있습니다.

**Example 사용 가능한 트랜잭션 로그 백업 파일 나열 및 필터링 예**  

```
SELECT * from msdb.dbo.rds_fn_list_tlog_backup_metadata('mydatabasename');
SELECT * from msdb.dbo.rds_fn_list_tlog_backup_metadata('mydatabasename') WHERE rds_backup_seq_id = 3507;
SELECT * from msdb.dbo.rds_fn_list_tlog_backup_metadata('mydatabasename') WHERE backup_file_time_utc > '2022-09-15 20:44:01' ORDER BY backup_file_time_utc DESC;
```

![\[rds_fn_list_tlog_backup_metadata의 출력\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/images/sql_accesstransactionlogs_func.png)


`rds_fn_list_tlog_backup_metadata` 함수는 다음과 같은 출력을 반환합니다.


****  

| 열 이름 | 데이터 유형 | 설명 | 
| --- | --- | --- | 
| `db_name` | sysname | 트랜잭션 로그 백업을 나열하기 위해 제공된 데이터베이스 이름입니다. | 
| `db_id` | int | 입력 파라미터 `db_name`의 내부 데이터베이스 식별자입니다. | 
| `family_guid` | uniqueidentifier | 생성 시 원본 데이터베이스의 고유 ID입니다. 이 값은 데이터베이스가 복원될 때 동일하게 유지되며 다른 데이터베이스 이름으로 복원되더라도 마찬가지입니다. | 
| `rds_backup_seq_id` | int | RDS가 각 트랜잭션 로그 백업 파일의 시퀀스 번호를 유지하기 위해 내부적으로 사용하는 ID입니다. | 
| `backup_file_epoch` | bigint | 트랜잭션 백업 파일이 생성된 에포크 시간입니다. | 
| `backup_file_time_utc` | datetime | `backup_file_epoch` 값의 UTC 시간 변환 값입니다. | 
| `starting_lsn` | numeric(25,0) | 트랜잭션 로그 백업 파일의 첫 번째 또는 가장 오래된 로그 레코드의 로그 시퀀스 번호입니다. | 
| `ending_lsn` | numeric(25,0) | 트랜잭션 로그 백업 파일의 마지막 또는 다음 로그 레코드의 로그 시퀀스 번호입니다. | 
| `is_log_chain_broken` | bit | 현재 트랜잭션 로그 백업 파일과 이전 트랜잭션 로그 백업 파일 간의 로그 체인이 끊어졌는지 여부를 나타내는 부울 값입니다. | 
| `file_size_bytes` | bigint | 트랜잭션 백업 세트의 크기(바이트)입니다. | 
| `Error` | varchar(4000) | `rds_fn_list_tlog_backup_metadata` 함수에서 예외가 발생하는 경우의 오류 메시지입니다. 예외가 없는 경우 NULL입니다. | 

# 트랜잭션 로그 백업 복사
<a name="USER.SQLServer.AddlFeat.TransactionLogAccess.Copying"></a>

개별 데이터베이스의 사용 가능한 트랜잭션 로그 백업 세트를 Amazon S3 버킷에 복사하려면 `rds_tlog_backup_copy_to_S3` 저장 프로시저를 호출합니다. `rds_tlog_backup_copy_to_S3` 저장 프로시저는 트랜잭션 로그 백업을 복사하는 새 작업을 시작합니다.

**참고**  
`rds_tlog_backup_copy_to_S3` 저장 프로시저는 `is_log_chain_broken` 속성에 대한 검증 없이 트랜잭션 로그 백업을 복사합니다. 따라서 `rds_tlog_backup_copy_to_S3` 저장 프로시저를 실행하기 전에 끊어지지 않은 로그 체인을 수동으로 확인해야 합니다. 자세한 설명은 [트랜잭션 로그 백업 로그 체인 검증](#USER.SQLServer.AddlFeat.TransactionLogAccess.Copying.LogChain)을 참조하세요.

**Example `rds_tlog_backup_copy_to_S3` 저장 프로시저 사용 예**  

```
exec msdb.dbo.rds_tlog_backup_copy_to_S3
	@db_name='mydatabasename',
	[@kms_key_arn='arn:aws:kms:region:account-id:key/key-id'],	
	[@backup_file_start_time='2022-09-01 01:00:15'],
	[@backup_file_end_time='2022-09-01 21:30:45'],
	[@starting_lsn=149000000112100001],
	[@ending_lsn=149000000120400001],
	[@rds_backup_starting_seq_id=5],
	[@rds_backup_ending_seq_id=10];
```

다음 입력 파라미터를 사용할 수 있습니다.


****  

| 파라미터 | 설명 | 
| --- | --- | 
| `@db_name` | 트랜잭션 로그 백업을 복사할 데이터베이스의 이름입니다. | 
| `@kms_key_arn` |  고객 관리형 KMS 키. AWS 관리형 KMS 키로 DB 인스턴스를 암호화하는 경우 고객 관리형 키를 생성해야 합니다. 고객 관리형 키로 DB 인스턴스를 암호화하는 경우 동일한 KMS 키 ARN을 사용할 수 있습니다. | 
| `@backup_file_start_time` | `rds_fn_list_tlog_backup_metadata` 함수의 `[backup_file_time_utc]` 열에서 제공된 UTC 타임스탬프입니다. | 
| `@backup_file_end_time` | `rds_fn_list_tlog_backup_metadata` 함수의 `[backup_file_time_utc]` 열에서 제공된 UTC 타임스탬프입니다. | 
| `@starting_lsn` | `rds_fn_list_tlog_backup_metadata` 함수의 `[starting_lsn]` 열에서 제공된 LSN(로그 시퀀스 번호)입니다. | 
| `@ending_lsn` | `rds_fn_list_tlog_backup_metadata` 함수의 `[ending_lsn]` 열에서 제공된 LSN(로그 시퀀스 번호)입니다. | 
| `@rds_backup_starting_seq_id` | `rds_fn_list_tlog_backup_metadata` 함수의 `[rds_backup_seq_id]` 열에서 제공된 시퀀스 ID입니다. | 
| `@rds_backup_ending_seq_id` | `rds_fn_list_tlog_backup_metadata` 함수의 `[rds_backup_seq_id]` 열에서 제공된 시퀀스 ID입니다. | 

시간, LSN 또는 시퀀스 ID 파라미터 세트를 지정할 수 있습니다. 한 세트의 파라미터만 필요합니다.

모든 세트에 하나의 파라미터만 지정할 수도 있습니다. 예를 들어 `backup_file_end_time` 파라미터의 값만 제공하면 7일 한도 내에서 해당 시간 이전에 사용 가능한 모든 트랜잭션 로그 백업 파일이 Amazon S3 버킷에 복사됩니다.

다음은 `rds_tlog_backup_copy_to_S3` 저장 프로시저의 유효한 입력 파라미터 조합입니다.


****  

| 제공된 파라미터 | 예상 결과 | 
| --- | --- | 
|  <pre>exec msdb.dbo.rds_tlog_backup_copy_to_S3  <br />	@db_name = 'testdb1',<br />            @backup_file_start_time='2022-08-23 00:00:00',<br />            @backup_file_end_time='2022-08-30 00:00:00';</pre>  | 제공된 `backup_file_start_time`과 `backup_file_end_time` 범위 사이에 존재하는 지난 7일간의 트랜잭션 로그 백업을 복사합니다. 이 예에서 저장 프로시저는 '2022-08-23 00:00:00'과 '2022-08-30 00:00:00' 사이에 생성된 트랜잭션 로그 백업을 복사합니다.  | 
|  <pre>exec msdb.dbo.rds_tlog_backup_copy_to_S3<br />           @db_name = 'testdb1',<br />           @backup_file_start_time='2022-08-23 00:00:00';</pre>  | 제공된 `backup_file_start_time`에서 시작하는 지난 7일간의 트랜잭션 로그 백업을 복사합니다. 이 예에서 저장 프로시저는 '2022-08-23 00:00:00'부터 최신 트랜잭션 로그 백업까지의 트랜잭션 로그 백업을 복사합니다.  | 
|  <pre>exec msdb.dbo.rds_tlog_backup_copy_to_S3<br />          @db_name = 'testdb1',<br />          @backup_file_end_time='2022-08-30 00:00:00';</pre>  | 제공된 `backup_file_end_time`까지의 지난 7일간의 트랜잭션 로그 백업을 복사합니다. 이 예에서 저장 프로시저는 '2022-08-23 00:00:00'부터 '2022-08-30 00:00:00'까지의 트랜잭션 로그 백업을 복사합니다.  | 
|  <pre>exec msdb.dbo.rds_tlog_backup_copy_to_S3<br />         @db_name='testdb1',<br />         @starting_lsn =1490000000040007,<br />         @ending_lsn =  1490000000050009;</pre>  | 제공된 `starting_lsn`과 `ending_lsn` 범위 사이의 지난 7일간의 사용 가능한 트랜잭션 로그 백업을 복사합니다. 이 예에서 저장 프로시저는 LSN 범위가 1490000000040007에서 1490000000050009 사이인 지난 7일간의 트랜잭션 로그 백업을 복사합니다.  | 
|  <pre>exec msdb.dbo.rds_tlog_backup_copy_to_S3<br />        @db_name='testdb1',<br />        @starting_lsn =1490000000040007;</pre>  |  제공된 `starting_lsn`에서 시작하는 지난 7일간의 사용 가능한 트랜잭션 로그 백업을 복사합니다. 이 예에서 저장 프로시저는 LSN 1490000000040007부터 최신 트랜잭션 로그 백업까지의 트랜잭션 로그 백업을 복사합니다.  | 
|  <pre>exec msdb.dbo.rds_tlog_backup_copy_to_S3<br />        @db_name='testdb1',<br />        @ending_lsn  =1490000000050009;</pre>  |  제공된 `ending_lsn`까지 지난 7일간의 사용 가능한 트랜잭션 로그 백업을 복사합니다. 이 예에서 저장 프로시저는 지난 7일부터 시작해 lsn 1490000000050009까지의 트랜잭션 로그 백업을 복사합니다.  | 
|  <pre>exec msdb.dbo.rds_tlog_backup_copy_to_S3<br />       @db_name='testdb1',<br />       @rds_backup_starting_seq_id= 2000,<br />       @rds_backup_ending_seq_id= 5000;</pre>  |  제공된 `rds_backup_starting_seq_id`과 `rds_backup_ending_seq_id` 범위 사이에 존재하는 지난 7일간의 사용 가능한 트랜잭션 로그 백업을 복사합니다. 이 예에서 저장 프로시저는 지난 7일부터 시작하여 seq\$1id 2000부터 seq\$1id 5000까지의 제공된 rds 백업 시퀀스 id 범위 내에 있는 트랜잭션 로그 백업을 복사합니다.  | 
|  <pre>exec msdb.dbo.rds_tlog_backup_copy_to_S3<br />       @db_name='testdb1',<br />       @rds_backup_starting_seq_id= 2000;</pre>  |  제공된 `rds_backup_starting_seq_id`에서 시작하는 지난 7일간의 사용 가능한 트랜잭션 로그 백업을 복사합니다. 이 예에서 저장 프로시저는 seq\$1id 2000부터 시작하여 최신 트랜잭션 로그 백업까지의 트랜잭션 로그 백업을 복사합니다.  | 
|  <pre>exec msdb.dbo.rds_tlog_backup_copy_to_S3<br />      @db_name='testdb1',<br />      @rds_backup_ending_seq_id= 5000;</pre>  |  제공된 `rds_backup_ending_seq_id`까지 지난 7일간의 사용 가능한 트랜잭션 로그 백업을 복사합니다. 이 예에서 저장 프로시저는 지난 7일부터 시작하여 seq\$1id 5000까지의 트랜잭션 로그 백업을 복사합니다.  | 
|  <pre>exec msdb.dbo.rds_tlog_backup_copy_to_S3<br />      @db_name='testdb1',<br />      @rds_backup_starting_seq_id= 2000;<br />      @rds_backup_ending_seq_id= 2000;</pre>  |  지난 7일 내에 사용 가능한 경우 제공된 `rds_backup_starting_seq_id`와 함께 단일 트랜잭션 로그 백업을 복사합니다. 이 예에서 저장 프로시저는 seq\$1id가 2000인 단일 트랜잭션 로그 백업을 복사합니다(지난 7일 내에 존재하는 경우).  | 

## 트랜잭션 로그 백업 로그 체인 검증
<a name="USER.SQLServer.AddlFeat.TransactionLogAccess.Copying.LogChain"></a>

 트랜잭션 로그 백업 액세스가 구성된 데이터베이스는 자동 백업 보존이 활성화되어 있어야 합니다. 자동 백업 보존은 DB 인스턴스의 데이터베이스를 `FULL` 복구 모델로 설정합니다. 데이터베이스의 특정 시점 복원을 지원하려면 데이터베이스 복구 모델을 변경하지 마세요. 로그 체인이 끊어질 수 있습니다. 데이터베이스를 `FULL` 복구 모델로 설정한 상태로 유지하는 것이 좋습니다.

트랜잭션 로그 백업을 복사하기 전에 로그 체인을 수동으로 검증하려면 `rds_fn_list_tlog_backup_metadata` 함수를 호출하고 `is_log_chain_broken` 열의 값을 검토하세요. 값이 ‘1’이면 현재 로그 백업과 이전 로그 백업 간 로그 체인이 끊어졌음을 나타냅니다.

다음 예는 `rds_fn_list_tlog_backup_metadata` 저장 프로시저의 출력에서 끊어진 로그 체인을 보여 줍니다.

![\[끊어진 로그 체인을 보여 주는 rds_fn_list_tlog_backup_metadata 출력.\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/images/sql_accesstransactionlogs_logchain_error.png)


일반적 로그 체인에서는 주어진 rds\$1sequence\$1id의 first\$1lsn 로그 시퀀스 번호(LSN) 값이 이전 rds\$1sequence\$1id의 last\$1lsn 값과 일치해야 합니다. 이미지에서 rds\$1sequence\$1id 45의 first\$1lsn 값 90987은 이전 rds\$1sequence\$1id 44의 last\$1lsn 값 90985와 일치하지 않습니다.

SQL Server 트랜잭션 로그 아키텍처 및 로그 시퀀스 번호에 대한 자세한 내용은 Microsoft SQL Server 설명서의 [트랜잭션 로그 논리적 아키텍처](https://learn.microsoft.com/en-us/sql/relational-databases/sql-server-transaction-log-architecture-and-management-guide?view=sql-server-ver15#Logical_Arch)를 참조하세요.

# Amazon S3 버킷 폴더 및 파일 구조
<a name="USER.SQLServer.AddlFeat.TransactionLogAccess.S3namingConvention"></a>

트랜잭션 로그 백업은 Amazon S3 버킷 내에서 다음과 같은 표준 구조 및 명명 규칙을 사용합니다.
+ 각 데이터베이스의 `target_s3_arn` 경로 아래에 `{db_id}.{family_guid}`와 같은 이름 지정 구조의 새 폴더가 생성됩니다.
+ 폴더 내에서 트랜잭션 로그 백업의 파일 이름 구조는 `{db_id}.{family_guid}.{rds_backup_seq_id}.{backup_file_epoch}`와 같습니다.
+ `rds_fn_list_tlog_backup_metadata` 함수를 사용하여 `family_guid,db_id,rds_backup_seq_id and backup_file_epoch` 세부 정보를 볼 수 있습니다.

다음 예는 Amazon S3 버킷에 있는 트랜잭션 로그 백업 세트의 폴더 및 파일 구조를 보여 줍니다.

![\[트랜잭션 로그에 액세스할 수 있는 Amazon S3 버킷 구조\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/images/sql_accesstransactionlogs_s3.png)


# 작업 상태 추적
<a name="USER.SQLServer.AddlFeat.TransactionLogAccess.TrackTaskStatus"></a>

 복사 작업의 상태를 추적하려면 `rds_task_status` 저장 프로시저를 호출합니다. 파라미터를 제공하지 않으면 이 저장 프로시저는 모든 작업의 상태를 반환합니다.

**Example 사용법:**  

```
exec msdb.dbo.rds_task_status
  @db_name='database_name',
  @task_id=ID_number;
```

다음 파라미터는 선택적입니다.
+ `@db_name` – 작업 상태를 표시할 데이터베이스의 이름입니다.
+ `@task_id` – 작업 상태를 표시할 작업의 ID입니다.

**Example 특정 작업의 상태 나열 예:**  

```
exec msdb.dbo.rds_task_status @task_id=5;
```

**Example 특정 데이터베이스 및 작업의 상태 나열 예:**  

```
exec msdb.dbo.rds_task_status@db_name='my_database',@task_id=5;
```

**Example 특정 데이터베이스의 모든 작업 및 상태 나열 예:**  

```
exec msdb.dbo.rds_task_status @db_name='my_database';
```

**Example 현재 DB 인스턴스의 모든 작업 및 상태 나열 예:**  

```
exec msdb.dbo.rds_task_status;
```

# 작업 취소
<a name="USER.SQLServer.AddlFeat.TransactionLogAccess.CancelTask"></a>

실행 중인 작업을 취소하려면 `rds_cancel_task` 저장 프로시저를 호출합니다.

**Example 사용법:**  

```
exec msdb.dbo.rds_cancel_task @task_id=ID_number;
```

다음 파라미터는 필수입니다.
+ `@task_id` – 취소할 작업의 ID입니다. `rds_task_status` 저장 프로시저를 호출하여 작업 ID를 볼 수 있습니다.

실행 중인 작업 보기 및 취소에 대한 자세한 내용은 [기본 백업 및 복원 기능을 사용하여 SQL Server 데이터베이스 가져오기 및 내보내기](SQLServer.Procedural.Importing.md)를 참조하세요.

# 트랜잭션 로그 백업 액세스 문제 해결
<a name="USER.SQLServer.AddlFeat.TransactionLogAccess.Troubleshooting"></a>

다음은 트랜잭션 로그 백업 액세스에 저장 프로시저를 사용할 때 발생할 수 있는 문제입니다.


****  

| 저장 프로시저 | 오류 메시지 | 문제 | 문제 해결 제안 | 
| --- | --- | --- | --- | 
| rds\$1tlog\$1copy\$1setup | 이 DB 인스턴스에서 백업이 비활성화되었습니다. 보존 기간이 ‘1’ 이상인 DB 인스턴스 백업을 활성화하고 다시 시도하십시오. | DB 인스턴스에서 자동 백업이 활성화되지 않았습니다. |  DB 인스턴스 백업 보존은 최소 1일 이상의 보존 기간으로 활성화해야 합니다. 자동 백업 활성화 및 백업 보존 구성에 대한 자세한 내용은 [백업 보존 기간](USER_WorkingWithAutomatedBackups.BackupRetention.md)을 참조하세요. | 
| rds\$1tlog\$1copy\$1setup | rds\$1tlog\$1copy\$1setup 저장 프로시저를 실행하는 동안 오류가 발생했습니다. RDS 엔드포인트에 다시 연결하고 다시 시도하십시오. | 내부 오류가 발생했습니다. | RDS 엔드포인트에 다시 연결하고 `rds_tlog_copy_setup` 저장 프로시저를 다시 실행합니다. | 
| rds\$1tlog\$1copy\$1setup | 트랜잭션 내에서 rds\$1tlog\$1backup\$1copy\$1setup 저장 프로시저를 실행하는 것은 지원되지 않습니다. 세션에 진행 중인 트랜잭션이 없는지 확인하고 다시 시도하십시오. | `BEGIN` 및 `END`를 사용하여 트랜잭션 내에서 저장 프로시저를 시도했습니다. | `rds_tlog_copy_setup` 저장 프로시저를 실행할 때는 `BEGIN` 및 `END`를 사용하지 마세요. | 
| rds\$1tlog\$1copy\$1setup | 입력 파라미터 `@target_s3_arn`의 S3 버킷 이름에는 공백 이외의 문자가 한 개 이상 포함되어야 합니다.   | 입력 파라미터 `@target_s3_arn`에 잘못된 값이 제공되었습니다. | 입력 파라미터 `@target_s3_arn`이 완전한 Amazon S3 버킷 ARN을 지정하는지 확인하세요. | 
| rds\$1tlog\$1copy\$1setup | `SQLSERVER_BACKUP_RESTORE` 옵션이 활성화되지 않았거나 활성화되는 중입니다. 이 옵션을 활성화하거나 나중에 다시 시도하십시오.   | `SQLSERVER_BACKUP_RESTORE` 옵션이 DB 인스턴스에서 활성화되지 않았거나 방금 활성화되어 내부 활성화 보류 중입니다. | 요구 사항 섹션에 지정된 대로 `SQLSERVER_BACKUP_RESTORE` 옵션을 활성화합니다. 몇 분 기다린 후 `rds_tlog_copy_setup` 저장 프로시저를 다시 실행합니다. | 
| rds\$1tlog\$1copy\$1setup | 입력 파라미터 `@target_s3_arn`의 대상 S3 arn은 비어 있거나 null일 수 없습니다.   | 입력 파라미터 `@target_s3_arn`에 `NULL` 값이 제공되었거나 값이 제공되지 않았습니다. | 입력 파라미터 `@target_s3_arn`이 완전한 Amazon S3 버킷 ARN을 지정하는지 확인하세요. | 
| rds\$1tlog\$1copy\$1setup | 입력 파라미터 `@target_s3_arn`의 대상 S3 arn은 arn:aws로 시작해야 합니다.   | 입력 파라미터 `@target_s3_arn`이 앞에 `arn:aws` 없이 제공되었습니다. | 입력 파라미터 `@target_s3_arn`이 완전한 Amazon S3 버킷 ARN을 지정하는지 확인하세요. | 
| rds\$1tlog\$1copy\$1setup | 대상 S3 ARN이 이미 제공된 값으로 설정되어 있습니다.   | `rds_tlog_copy_setup` 저장 프로시저가 이전에 실행되었고 Amazon S3 버킷 ARN으로 구성되었습니다. | 트랜잭션 로그 백업에 액세스할 수 있도록 Amazon S3 버킷 값을 수정하려면 다른 `target S3 ARN`을 제공하세요. | 
| rds\$1tlog\$1copy\$1setup | 트랜잭션 로그 백업에 대한 액세스를 활성화하기 위한 자격 증명을 생성할 수 없습니다. `rds_tlog_copy_setup`와 함께 제공된 S3 경로 ARN을 확인하고 나중에 다시 시도하십시오.   | 트랜잭션 로그 백업 액세스를 활성화하기 위해 자격 증명을 생성하는 동안 지정되지 않은 오류가 발생했습니다. | 설정 구성을 검토하고 다시 시도하세요. | 
| rds\$1tlog\$1copy\$1setup | 보류 중인 작업이 있는 동안에는 rds\$1tlog\$1copy\$1setup 저장 프로시저를 실행할 수 없습니다. 보류 중인 작업이 완료될 때까지 기다렸다가 다시 시도하십시오.   | 한 번에 두 개의 작업만 실행할 수 있습니다. 완료를 기다리고 있는 보류 중인 작업이 있습니다. | 보류 중인 작업을 보고 완료될 때까지 기다리세요. 작업 상태 모니터링에 대한 자세한 내용은 [작업 상태 추적](USER.SQLServer.AddlFeat.TransactionLogAccess.TrackTaskStatus.md)을 참조하세요. | 
| rds\$1tlog\$1backup\$1copy\$1to\$1S3 | 작업 ID: %d의 데이터베이스: %s에 대해 T-log 백업 파일 복사 작업이 이미 실행되었습니다. 나중에 다시 시도하십시오.   | 지정된 데이터베이스에 대해 언제든 하나의 복사 작업만 실행할 수 있습니다. 완료를 기다리고 있는 보류 중인 복사 작업이 있습니다. | 보류 중인 작업을 보고 완료될 때까지 기다리세요. 작업 상태 모니터링에 대한 자세한 내용은 [작업 상태 추적](USER.SQLServer.AddlFeat.TransactionLogAccess.TrackTaskStatus.md)을 참조하세요. | 
| rds\$1tlog\$1backup\$1copy\$1to\$1S3 | 다음 세 가지 파라미터 세트 중 하나 이상을 제공해야 합니다. SET-1:(@backup\$1file\$1start\$1time, @backup\$1file\$1end\$1time) \$1 SET-2:(@starting\$1lsn, @ending\$1lsn) \$1 SET-3:(@rds\$1backup\$1starting\$1seq\$1id, @rds\$1backup\$1ending\$1seq\$1id)  | 세 가지 파라미터 세트가 모두 제공되지 않았거나 제공된 파라미터 세트에 필수 파라미터가 누락되었습니다. | 시간, lsn 또는 시퀀스 ID 파라미터를 지정할 수 있습니다. 이 세 가지 파라미터 세트 중 한 세트가 필요합니다. 필수 파라미터에 대한 자세한 내용은 [트랜잭션 로그 백업 복사](USER.SQLServer.AddlFeat.TransactionLogAccess.Copying.md)를 참조하세요. | 
| rds\$1tlog\$1backup\$1copy\$1to\$1S3 | 인스턴스에서 백업이 비활성화되었습니다. 백업을 활성화하고 잠시 후 다시 시도하십시오. | DB 인스턴스에서 자동 백업이 활성화되지 않았습니다. |  자동 백업 활성화 및 백업 보존 구성에 대한 자세한 내용은 [백업 보존 기간](USER_WorkingWithAutomatedBackups.BackupRetention.md)을 참조하세요. | 
| rds\$1tlog\$1backup\$1copy\$1to\$1S3 | 지정된 데이터베이스 %s을(를) 찾을 수 없습니다.   | 입력 파라미터 `@db_name`에 제공된 값이 DB 인스턴스의 데이터베이스 이름과 일치하지 않습니다. | 올바른 데이터베이스 이름을 사용합니다. 모든 데이터베이스를 이름순으로 나열하려면 `SELECT * from sys.databases`를 실행합니다. | 
| rds\$1tlog\$1backup\$1copy\$1to\$1S3 | SQL Server 시스템 데이터베이스 또는 rdsadmin 데이터베이스에 대해 rds\$1tlog\$1backup\$1copy\$1to\$1S3 저장 프로시저를 실행할 수 없습니다.   | 입력 파라미터 `@db_name`에 제공된 값이 SQL Server 시스템 데이터베이스 이름 또는 RDSAdmin 데이터베이스와 일치합니다. | 다음 데이터베이스는 트랜잭션 로그 백업 액세스에 사용할 수 없습니다. `master, model, msdb, tempdb, RDSAdmin.`  | 
| rds\$1tlog\$1backup\$1copy\$1to\$1S3 | 입력 파라미터 @db\$1name의 데이터베이스 이름은 비어 있거나 null일 수 없습니다.   | 입력 파라미터 `@db_name`에 제공된 값이 비어 있거나 `NULL`입니다. | 올바른 데이터베이스 이름을 사용합니다. 모든 데이터베이스를 이름순으로 나열하려면 `SELECT * from sys.databases`를 실행합니다. | 
| rds\$1tlog\$1backup\$1copy\$1to\$1S3 | rds\$1tlog\$1backup\$1copy\$1setup 저장 프로시저를 실행하려면 DB 인스턴스 백업 보존 기간을 1 이상으로 설정해야 합니다.   | DB 인스턴스에서 자동 백업이 활성화되지 않았습니다. | 자동 백업 활성화 및 백업 보존 구성에 대한 자세한 내용은 [백업 보존 기간](USER_WorkingWithAutomatedBackups.BackupRetention.md)을 참조하세요. | 
| rds\$1tlog\$1backup\$1copy\$1to\$1S3 | 저장 프로시저 rds\$1tlog\$1backup\$1copy\$1to\$1S3를 실행하는 동안 오류가 발생했습니다. RDS 엔드포인트에 다시 연결하고 다시 시도하십시오.   | 내부 오류가 발생했습니다. | RDS 엔드포인트에 다시 연결하고 `rds_tlog_backup_copy_to_S3` 저장 프로시저를 다시 실행합니다. | 
| rds\$1tlog\$1backup\$1copy\$1to\$1S3 | 다음 세 가지 파라미터 세트 중 하나만 제공할 수 있습니다. SET-1:(@backup\$1file\$1start\$1time, @backup\$1file\$1end\$1time) \$1 SET-2:(@starting\$1lsn, @ending\$1lsn) \$1 SET-3:(@rds\$1backup\$1starting\$1seq\$1id, @rds\$1backup\$1ending\$1seq\$1id)  | 여러 파라미터 세트가 제공되었습니다. | 시간, lsn 또는 시퀀스 ID 파라미터를 지정할 수 있습니다. 이 세 가지 파라미터 세트 중 한 세트가 필요합니다. 필수 파라미터에 대한 자세한 내용은 [트랜잭션 로그 백업 복사](USER.SQLServer.AddlFeat.TransactionLogAccess.Copying.md)를 참조하세요. | 
| rds\$1tlog\$1backup\$1copy\$1to\$1S3 | 트랜잭션 내에서 rds\$1tlog\$1backup\$1copy\$1to\$1S3 저장 프로시저를 실행하는 것은 지원되지 않습니다. 세션에 진행 중인 트랜잭션이 없는지 확인하고 다시 시도하십시오.   | `BEGIN` 및 `END`를 사용하여 트랜잭션 내에서 저장 프로시저를 시도했습니다. | `rds_tlog_backup_copy_to_S3` 저장 프로시저를 실행할 때는 `BEGIN` 및 `END`를 사용하지 마세요. | 
| rds\$1tlog\$1backup\$1copy\$1to\$1S3 | 제공된 파라미터가 트랜잭션 백업 로그 보존 기간을 벗어납니다. 사용 가능한 트랜잭션 로그 백업 파일을 나열하려면 rds\$1fn\$1list\$1tlog\$1backup\$1메타데이터 함수를 실행합니다.  | 제공된 입력 파라미터에 대해 복사본 보존 기간에 맞는 사용 가능한 트랜잭션 로그 백업이 없습니다. | 유효한 파라미터 세트를 사용하여 다시 시도하세요. 필수 파라미터에 대한 자세한 내용은 [트랜잭션 로그 백업 복사](USER.SQLServer.AddlFeat.TransactionLogAccess.Copying.md)를 참조하세요. | 
| rds\$1tlog\$1backup\$1copy\$1to\$1S3 | 요청을 처리하는 동안 권한 오류가 발생했습니다. 버킷이 DB 인스턴스와 동일한 계정 및 지역에 있는지 확인하고, 공개 설명서의 템플릿과 비교하여 S3 버킷 정책 권한을 확인합니다.  | 제공된 S3 버킷 또는 해당 정책 권한에서 문제가 감지되었습니다. | 트랜잭션 로그 백업에 대한 액세스 설정이 올바른지 확인하세요. S3 버킷의 설정 요구 사항에 대한 자세한 내용은 [요구 사항](USER.SQLServer.AddlFeat.TransactionLogAccess.md#USER.SQLServer.AddlFeat.TransactionLogAccess.Requirements)을 참조하세요. | 
| rds\$1tlog\$1backup\$1copy\$1to\$1S3 | RDS 읽기 전용 복제본 인스턴스에서 `rds_tlog_backup_copy_to_S3` 저장 프로시저를 실행하는 것은 허용되지 않습니다.   | RDS 읽기 전용 복제본 인스턴스에서 저장 프로시저를 시도했습니다. | RDS 기본 DB 인스턴스에 연결하여 `rds_tlog_backup_copy_to_S3` 저장 프로시저를 실행합니다. | 
| rds\$1tlog\$1backup\$1copy\$1to\$1S3 | 입력 파라미터 `@starting_lsn`의 LSN은 `@ending_lsn`보다 작아야 합니다.   | 입력 파라미터 `@starting_lsn`에 제공된 값이 입력 파라미터 `@ending_lsn`에 제공된 값보다 큽니다. | 입력 파라미터 `@starting_lsn`에 제공된 값이 입력 파라미터 `@ending_lsn`에 제공된 값보다 작은지 확인합니다. | 
| rds\$1tlog\$1backup\$1copy\$1to\$1S3 | `rds_tlog_backup_copy_to_S3` 저장 프로시저는 소스 데이터베이스의 `db_owner` 역할 멤버만 수행할 수 있습니다.   | 제공된 `db_name`에서 `rds_tlog_backup_copy_to_S3` 저장 프로시저를 실행하려고 시도하는 계정에 `db_owner` 역할이 부여되지 않았습니다. | 저장 프로시저를 실행하는 계정에 제공된 `db_name`에 대한 `db_owner` 역할이 허용되었는지 확인하세요. | 
| rds\$1tlog\$1backup\$1copy\$1to\$1S3 | 입력 파라미터 `@rds_backup_starting_seq_id`의 시퀀스 ID는 `@rds_backup_ending_seq_id` 이하여야 합니다.   | 입력 파라미터 `@rds_backup_starting_seq_id`에 제공된 값이 입력 파라미터 `@rds_backup_ending_seq_id`에 제공된 값보다 큽니다. | 입력 파라미터 `@rds_backup_starting_seq_id`에 제공된 값이 입력 파라미터 `@rds_backup_ending_seq_id`에 제공된 값보다 작은지 확인합니다. | 
| rds\$1tlog\$1backup\$1copy\$1to\$1S3 | SQLSERVER\$1BACKUP\$1RESTORE 옵션이 활성화되지 않았거나 활성화되는 중입니다. 이 옵션을 활성화하거나 나중에 다시 시도하십시오.   | `SQLSERVER_BACKUP_RESTORE` 옵션이 DB 인스턴스에서 활성화되지 않았거나 방금 활성화되어 내부 활성화 보류 중입니다. | 요구 사항 섹션에 지정된 대로 `SQLSERVER_BACKUP_RESTORE` 옵션을 활성화합니다. 몇 분 기다린 후 `rds_tlog_backup_copy_to_S3` 저장 프로시저를 다시 실행합니다. | 
| rds\$1tlog\$1backup\$1copy\$1to\$1S3 | 입력 매개변수 `@backup_file_start_time`의 시작 시간은 `@backup_file_end_time`보다 작아야 합니다.   | 입력 파라미터 `@backup_file_start_time`에 제공된 값이 입력 파라미터 `@backup_file_end_time`에 제공된 값보다 큽니다. | 입력 파라미터 `@backup_file_start_time`에 제공된 값이 입력 파라미터 `@backup_file_end_time`에 제공된 값보다 작은지 확인합니다. | 
| rds\$1tlog\$1backup\$1copy\$1to\$1S3 | 액세스 권한이 부족하여 요청을 처리할 수 없었습니다. 기능에 대한 설정 및 권한을 확인하십시오.   | Amazon S3 버킷 권한에 문제가 있거나 제공된 Amazon S3 버킷이 다른 계정 또는 리전에 있을 수 있습니다. | Amazon S3 버킷 정책 권한이 RDS 액세스를 허용하도록 승인되었는지 확인합니다. Amazon S3 버킷이 소스 DB 인스턴스와 동일한 계정 및 리전에 있는지 확인합니다. | 
| rds\$1tlog\$1backup\$1copy\$1to\$1S3 | 스토리지 암호화되지 않은 인스턴스의 경우 KMS Key ARN을 저장 프로시저의 입력 파라미터로 제공할 수 없습니다.   | DB 인스턴스에서 스토리지 암호화가 활성화되지 않은 경우 입력 파라미터 `@kms_key_arn`을 제공하면 안 됩니다. | `@kms_key_arn`의 입력 파라미터를 제공하지 마세요. | 
| rds\$1tlog\$1backup\$1copy\$1to\$1S3 | 암호화된 스토리지 인스턴스의 경우 KMS Key ARN을 저장 프로시저의 입력 파라미터로 제공해야 합니다.   | DB 인스턴스에서 스토리지 암호화가 활성화된 경우 입력 파라미터 `@kms_key_arn`을 제공해야 합니다. | 트랜잭션 로그 백업에 사용할 Amazon S3 버킷의 ARN과 일치하는 값을 `@kms_key_arn`의 입력 파라미터에 제공합니다. | 
| rds\$1tlog\$1backup\$1copy\$1to\$1S3 | `rds_tlog_backup_copy_to_S3` 저장 프로시저를 실행하기 전에 `rds_tlog_copy_setup` 저장 프로시저를 실행하고 `@target_s3_arn`을 설정해야 합니다.   | `rds_tlog_backup_copy_to_S3` 저장 프로시저를 실행하기 전에 트랜잭션 로그 백업에 대한 액세스 설정 절차가 완료되지 않았습니다. | `rds_tlog_backup_copy_to_S3` 저장 프로시저를 실행하기 전에 `rds_tlog_copy_setup` 저장 프로시저를 실행합니다. 트랜잭션 로그 백업 액세스 설정 프로시저 실행에 대한 자세한 내용은 [트랜잭션 로그 백업에 대한 액세스 설정](USER.SQLServer.AddlFeat.TransactionLogAccess.Enabling.md)을 참조하세요. | 