

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# MemoryDB의 데이터 보호
<a name="data-protection"></a>

 AWS [공동 책임 모델](https://aws.amazon.com/compliance/shared-responsibility-model/)의 데이터 보호에 적용됩니다. 이 모델에 설명된 대로 AWS 는 모든를 실행하는 글로벌 인프라를 보호할 책임이 있습니다 AWS 클라우드. 사용자는 이 인프라에 호스팅되는 콘텐츠에 대한 통제 권한을 유지할 책임이 있습니다. 사용하는 AWS 서비스 의 보안 구성과 관리 태스크에 대한 책임도 사용자에게 있습니다. 데이터 프라이버시에 관한 자세한 내용은 [데이터 프라이버시 FAQ](https://aws.amazon.com/compliance/data-privacy-faq/)를 참조하세요. 유럽의 데이터 보호에 대한 자세한 내용은 *AWS 보안 블로그*의 [AWS 공동 책임 모델 및 GDPR](https://aws.amazon.com/blogs/security/the-aws-shared-responsibility-model-and-gdpr/) 블로그 게시물을 참조하세요.

데이터 보호를 위해 자격 증명을 보호하고 AWS 계정 AWS IAM Identity Center 또는 AWS Identity and Access Management (IAM)를 사용하여 개별 사용자를 설정하는 것이 좋습니다. 이렇게 하면 개별 사용자에게 자신의 직무를 충실히 이행하는 데 필요한 권한만 부여됩니다. 또한 다음과 같은 방법으로 데이터를 보호하는 것이 좋습니다.
+ 각 계정에 다중 인증(MFA)을 사용합니다.
+ SSL/TLS를 사용하여 AWS 리소스와 통신합니다. TLS 1.2는 필수이며 TLS 1.3을 권장합니다.
+ 를 사용하여 API 및 사용자 활동 로깅을 설정합니다 AWS CloudTrail. CloudTrail 추적을 사용하여 AWS 활동을 캡처하는 방법에 대한 자세한 내용은 *AWS CloudTrail 사용 설명서*의 [ CloudTrail 추적 작업을 참조하세요](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-trails.html).
+ 내부의 모든 기본 보안 제어와 함께 AWS 암호화 솔루션을 사용합니다 AWS 서비스.
+ Amazon S3에 저장된 민감한 데이터를 검색하고 보호하는 데 도움이 되는 Amazon Macie와 같은 고급 관리형 보안 서비스를 사용합니다.
+ 명령줄 인터페이스 또는 API를 AWS 통해에 액세스할 때 FIPS 140-3 검증 암호화 모듈이 필요한 경우 FIPS 엔드포인트를 사용합니다. 사용 가능한 FIPS 엔드포인트에 대한 자세한 내용은 [연방 정보 처리 표준(FIPS) 140-3](https://aws.amazon.com/compliance/fips/)을 참조하세요.

고객의 이메일 주소와 같은 기밀 정보나 중요한 정보는 태그나 **이름** 필드와 같은 자유 형식 텍스트 필드에 입력하지 않는 것이 좋습니다. 여기에는 또는 기타 AWS 서비스 에서 콘솔, API AWS CLI또는 AWS SDKs를 사용하여 작업하는 경우가 포함됩니다. 이름에 사용되는 태그 또는 자유 형식 텍스트 필드에 입력하는 모든 데이터는 청구 또는 진단 로그에 사용될 수 있습니다. 외부 서버에 URL을 제공할 때 해당 서버에 대한 요청을 검증하기 위해 자격 증명을 URL에 포함해서는 안 됩니다.



# MemoryDB의 데이터 보안
<a name="encryption"></a>

데이터를 안전하게 보관하기 위해 MemoryDB 및 Amazon EC2에서는 서버의 데이터에 대한 무단 액세스를 방지하는 메커니즘을 제공합니다.

MemoryDB는 클러스터의 데이터에 대한 암호화 기능도 제공합니다.
+ 전송 중 데이터 암호화는 클러스터 내 노드 사이 또는 클러스터와 애플리케이션 사이와 같이 한 위치에서 다른 위치로 데이터가 이동 중인 경우 항상 데이터를 암호화합니다.
+ 미사용 데이터 암호화는 스냅샷 작업 중 트랜잭션 로그 및 디스크 내 데이터를 암호화합니다.

[액세스 제어 목록(ACL)을 사용하여 사용자 인증](clusters.acls.md)을(를) 사용하여 클러스터에 대한 사용자 액세스를 제어할 수도 있습니다.

**Topics**
+ [MemoryDB의 데이터 보안](encryption.md)
+ [MemoryDB의 미사용 데이터 암호화](at-rest-encryption.md)
+ [MemoryDB에서 전송 중 데이터 암호화(TLS)](in-transit-encryption.md)
+ [액세스 제어 목록(ACL)을 사용하여 사용자 인증](clusters.acls.md)
+ [IAM을 통한 인증](auth-iam.md)

# MemoryDB의 미사용 데이터 암호화
<a name="at-rest-encryption"></a>

데이터를 안전하게 보관하기 위해 MemoryDB 및 Amazon S3에서는 클러스터에 대한 액세스를 제한하는 다양한 방식을 제공합니다. 자세한 내용은 [MemoryDB 및 Amazon VPC](vpcs.md) 및 [MemoryDB의 ID 및 액세스 관리](iam.md)(을)를 참조하세요.

영구 데이터를 암호화하여 데이터 보안을 강화하기 위해 MemoryDB 미사용 데이터 암호화는 항상 활성화됩니다. 다음과 같은 측면을 암호화합니다.
+ 트랜잭션 로그의 데이터 
+ 동기화, 스냅샷 및 스왑 작업 중 디스크 
+ Amazon S3에 저장된 스냅샷 

 MemoryDB는 기본(서비스 관리형) 유휴 데이터 암호화와 더불어 [AWS Key Management Service(KMS)](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html)에서 자체 대칭 고객 관리형 고객 마스터 키를 사용할 수 있는 기능을 제공합니다.

데이터 계층화가 활성화된 클러스터의 SSD(Solid-State Drive)에 저장된 데이터는 기본적으로 항상 암호화됩니다.

전송 중 데이터 암호화와 관련된 자세한 내용은 [MemoryDB에서 전송 중 데이터 암호화(TLS)](in-transit-encryption.md)을 참조하세요.

**Topics**
+ [AWS KMS에서 고객 관리형 키 사용](#using-customer-managed-keys-for-memorydb-security)
+ [참고](#at-rest-encryption-see-also)

## AWS KMS에서 고객 관리형 키 사용
<a name="using-customer-managed-keys-for-memorydb-security"></a>

MemoryDB는 저장된 데이터 암호화에 대한 대칭 고객 관리형 루트(KMS 키)를 지원합니다. 고객 관리형 KMS 키는 사용자가 생성, 소유 및 관리하는 AWS 계정의 암호화 키입니다. 자세한 내용은 *AWS Key Management Service 개발자 안내서*에서 [ 고객 루트 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#root_keys)를 참조하세요. MemoryDB와 함께 사용하기 전에 AWS KMS에서 키를 생성해야 합니다.

AWS KMS 루트 키 생성 방법을 알아보려면 *AWS Key Management Service 개발자 안내서*에서 [키 생성](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)을 참조하세요.

MemoryDB를 사용하면 AWS KMS와 통합할 수 있습니다. 자세한 내용은 *AWS Key Management Service 개발자 안내서*의 [권한 부여 사용](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html)을 참조하세요. MemoryDB와 AWS KMS의 통합을 활성화하기 위해 고객이 별도로 취해야 할 조치는 없습니다.

`kms:ViaService` 조건 키는 AWS KMS 키의 사용을 지정된 AWS 서비스로부터의 요청으로 제한합니다. MemoryDB에서 `kms:ViaService`를 사용하려면 조건 키 값 `memorydb.amazon_region.amazonaws.com`에 ViaService 이름을 모두 포함시켜야 합니다. 자세한 내용은 [kms:ViaService](https://docs.aws.amazon.com/kms/latest/developerguide/policy-conditions.html#conditions-kms-via-service) 섹션을 참조하세요.

[AWS CloudTrail](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html)을 사용하여 MemoryDB가 사용자 대신 AWS Key Management Service에 전송하는 요청을 추적할 수 있습니다. 고객 관리형 키와 관련된 AWS Key Management Service에 대한 모든 API 호출에는 해당 CloudTrail 로그가 있습니다. [ListGlants](https://docs.aws.amazon.com/kms/latest/APIReference/API_ListGrants.html) KMS API 직접 호출을 통해 MemoryDB가 생성하는 그랜트를 볼 수도 있습니다.

고객 관리형 키를 사용하여 클러스터를 암호화하면 클러스터의 모든 스냅샷이 다음과 같이 암호화됩니다.
+ 자동 일일 스냅샷은 클러스터와 연결된 고객 관리형 키를 사용하여 암호화됩니다.
+ 클러스터가 삭제될 때 생성된 최종 스냅샷은 클러스터와 연결된 고객 관리형 키를 사용하여 암호화됩니다.
+ 수동으로 생성한 스냅샷은 클러스터에 연결된 KMS 키를 사용하기 위해 기본적으로 암호화됩니다. 다른 고객 관리형 키를 선택하여 이를 재정의할 수 있습니다.
+ 스냅샷 복사는 기본적으로 소스 스냅샷과 연결된 고객 관리형 키를 사용합니다. 다른 고객 관리형 키를 선택하여 이를 재정의할 수 있습니다.

**참고**  
선택한 Amazon S3 버킷으로 스냅샷을 내보낼 때 고객 관리형 키를 사용할 수 없습니다. 그러나 Amazon S3으로 내보낸 모든 스냅샷은 [서버 측 암호화](https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingServerSideEncryption.html)를 사용하여 암호화됩니다. 스냅샷 파일을 새 S3 개체로 복사하고 고객 관리형 KMS 키를 사용하여 암호화하거나, KMS 키를 사용하여 기본 암호화로 설정된 다른 S3 버킷에 파일을 복사하거나, 파일 자체에서 암호화 옵션을 변경할 수 있습니다.
또한 고객 관리형 키를 사용하여 암호화에 고객 관리형 키를 사용하지 않는 수동으로 생성한 스냅샷을 암호화할 수도 있습니다. 이 옵션을 사용하면 원래 클러스터에서 데이터가 암호화되지 않더라도 KMS 키를 사용하여 Amazon S3에 저장된 스냅샷 파일이 암호화됩니다.
스냅샷에서 복원하면 새 클러스터를 생성할 때 사용할 수 있는 암호화 옵션과 유사한 암호화 옵션을 선택할 수 있습니다.
+ 클러스터를 암호화하는 데 사용한 키에 대해 키를 삭제하거나 키를 [비활성화](https://docs.aws.amazon.com/kms/latest/developerguide/enabling-keys.html)하고 그랜트를 [취소](https://docs.aws.amazon.com/kms/latest/APIReference/API_RevokeGrant.html)하면 클러스터를 복구할 수 없게 됩니다. 즉, 하드웨어 장애 후 이를 수정하거나 복구할 수 없습니다. AWS KMS에서는 최소 7일 이상의 대기 기간이 지난 후에만 루트 키를 삭제합니다. 키를 삭제한 후 다른 고객 관리형 키를 사용하여 보관용 스냅샷을 생성할 수 있습니다.
+ 자동 키 교체 기능은 AWS KMS 루트 키의 속성을 그대로 보존하기 때문에 키가 교체되더라도 MemoryDB 데이터에 대한 액세스 권한에는 아무런 영향도 끼치지 않습니다. 암호화된 MemoryDB 클러스터는 새로운 루트 키를 생성하거나 이전 키에 대한 모든 참조를 업데이트하는 수동 키 교체를 지원하지 않습니다. 자세한 내용은 *AWS Key Management Service 개발자 안내서*에서 [고객 루트 키 교체](https://docs.aws.amazon.com/kms/latest/developerguide/rotate-keys.html)를 참조하세요.
+ KMS 키를 사용하여 MemoryDB 클러스터를 암호화하려면 클러스터당 1개의 그랜트가 필요합니다. 이 그랜트는 클러스터의 수명 동안 사용됩니다. 또한 스냅샷을 생성하는 동안 스냅샷당 하나의 권한 부여가 사용됩니다. 이 그랜트는 스냅샷이 생성되면사용 중지됩니다.
+ AWS KMS 그랜트 및 제한에 대한 자세한 내용은 *AWS Key Management Service 개발자 안내서*에서 [할당량](https://docs.aws.amazon.com/kms/latest/developerguide/limits.html)을 참조하세요.

## 참고
<a name="at-rest-encryption-see-also"></a>
+ [MemoryDB에서 전송 중 데이터 암호화(TLS)](in-transit-encryption.md)
+ [MemoryDB 및 Amazon VPC](vpcs.md)
+ [MemoryDB의 ID 및 액세스 관리](iam.md)

# MemoryDB에서 전송 중 데이터 암호화(TLS)
<a name="in-transit-encryption"></a>

데이터를 안전하게 보관하기 위해 MemoryDB 및 Amazon EC2에서는 서버의 데이터에 대한 무단 액세스를 방지하는 메커니즘을 제공합니다. MemoryDB에서는 전송 중 데이터 암호화 기능을 제공해 한 위치에서 다른 위치로 데이터 이동 시 데이터를 보호할 수 있는 수단을 제공합니다. 예를 들어 클러스터 내 프라이머리 노드에서 읽기 전용 복제본 노드로 또는 클러스터와 애플리케이션 사이에서 데이터를 이동할 수 있습니다.

**Topics**
+ [전송 중 데이터 암호화 개요](#in-transit-encryption-overview)
+ [다음 사항도 참조하세요.](#in-transit-encryption-see-also)

## 전송 중 데이터 암호화 개요
<a name="in-transit-encryption-overview"></a>

MemoryDB 전송 중 암호화는 데이터가 한 위치에서 다른 위치로 전송 중일 때 가장 취약한 지점에서 데이터의 보안을 강화하는 기능입니다.

MemoryDB 전송 중 데이터 암호화는 다음 기능을 구현합니다.
+ **암호화된 연결** - 서버와 클라이언트 연결이 둘 다 암호화된 전송 계층 보안(TLS)입니다.
+ **암호화된 복제** - 기본 노드와 복제본 노드 간에 이동하는 데이터가 암호화됩니다.
+ **서버 인증** - 클라이언트가 자신이 올바른 서버에 연결 중임을 인증할 수 있습니다.

2023년 7월 20일부터 TLS 1.2는 신규 및 기존 클러스터에 지원되는 최소 버전입니다. AWS에서 TLS 1.2에 대해 자세히 알아보려면 이 [링크](https://aws.amazon.com/blogs/security/tls-1-2-required-for-aws-endpoints/)를 사용하세요.

MemoryDB 클러스터 연결에 대한 자세한 내용은 [redis-cli를 사용하여 MemoryDB 노드에 연결](getting-started.md#connect-tls) 단원을 참조하세요.

## 다음 사항도 참조하세요.
<a name="in-transit-encryption-see-also"></a>
+ [MemoryDB의 미사용 데이터 암호화](at-rest-encryption.md)
+ [액세스 제어 목록(ACL)으로 사용자 인증](https://docs.aws.amazon.com/memorydb/latest/devguide/clusters.acls.html)
+ [MemoryDB 및 Amazon VPC](vpcs.md)
+ [MemoryDB의 ID 및 액세스 관리](iam.md)

# 액세스 제어 목록(ACL)을 사용하여 사용자 인증
<a name="clusters.acls"></a>

액세스 제어 목록(ACL)을 사용하여 사용자를 인증할 수 있습니다.

ACL을 사용하면 사용자를 그룹화하여 클러스터 액세스를 제어할 수 있습니다. 이러한 액세스 제어 목록은 클러스터에 대한 액세스를 구성하는 방법으로 설계되었습니다.

ACL를 사용할 경우, 다음 섹션에 설명된 대로 액세스 문자열을 사용하여 사용자를 생성하고 특정 사용 권한을 할당합니다. 사용자를 특정 역할(관리자, 인사 관리)에 맞게 조정되어 있으며 하나 이상의 MemoryDB 클러스터에 배포되는 액세스 제어 목록에 할당합니다. 이렇게 하면 동일한 MemoryDB 클러스터 또는 클러스터를 사용하는 클라이언트 간에 보안 경계를 설정하고 클라이언트가 서로의 데이터에 액세스하지 못하게 할 수 있습니다.

ACL은 Redis OSS 6의 [ACL](https://valkey.io/docs/topics/acl/) 도입을 지원하도록 설계되었습니다. MemoryDB 클러스터에서 ACL을 사용할 때 몇 가지 제약 사항이 있습니다.
+ 액세스 문자열에는 암호를 지정할 수 없습니다. [CreateUser](https://docs.aws.amazon.com/memorydb/latest/APIReference/API_CreateUser.html) 또는 [UpdateUser](https://docs.aws.amazon.com/memorydb/latest/APIReference/API_UpdateUser.html) 직접 호출을 사용하여 암호를 설정합니다.
+ 사용자 권한의 경우 `on` 및 `off`를 액세스 문자열의 일부로 전달합니다. 액세스 문자열에 둘 다 지정되지 않은 경우, 사용자에게 `off`이(가) 할당되며 클러스터에 대한 액세스 권한이 없습니다.
+ 금지된 명령은 사용할 수 없습니다. 금지된 명령을 지정하면 예외가 발생합니다. 명령 전체 목록은 [제한된 명령](restrictedcommands.md) 단원을 참조하세요.
+ `reset` 명령을 액세스 문자열의 일부로 사용할 수 없습니다. API 파라미터에 암호를 지정하고 MemoryDB가 암호를 관리합니다. 따라서 사용자의 모든 암호를 제거할 수 있는 `reset`을 사용할 수 없습니다.
+ Redis OSS 6에 [ACL LIST](https://valkey.io/commands/acl-list) 명령이 도입되었습니다. 이 명령은 각 사용자에게 적용된 ACL 규칙과 함께 사용자 목록을 반환합니다. MemoryDB는 `ACL LIST` 명령을 지원하지만 Redis OSS와 마찬가지로 암호 해시에 대한 지원은 포함하지 않습니다. MemoryDB에서는 [DescribeUsers](https://docs.aws.amazon.com/memorydb/latest/APIReference/API_DescribeUsers.html) 작업을 사용하여 액세스 문자열에 포함된 규칙을 비롯한 유사한 정보를 얻을 수 있습니다. 그러나 [DescribeUsers](https://docs.aws.amazon.com/memorydb/latest/APIReference/API_DescribeUsers.html)는 사용자 암호를 검색하지 않습니다.

  MemoryDB에서 지원하는 다른 읽기 전용 명령에는 [ACL WHOAMI](https://valkey.io/commands/acl-whoami), [ACL USERS](https://valkey.io/commands/acl-users) 및 [ACL CAT](https://valkey.io/commands/acl-cat)가 포함됩니다. MemoryDB는 다른 쓰기 기반 ACL 명령을 지원하지 않습니다.

MemoryDB와 함께 ACL을 사용하는 방법은 다음에 자세히 설명되어 있습니다.

**Topics**
+ [액세스 문자열을 사용하여 권한 지정](#access-string)
+ [벡터 검색 기능](#access-vss)
+ [MemoryDB용 클러스터에 ACL 적용](#rbac-using)

## 액세스 문자열을 사용하여 권한 지정
<a name="access-string"></a>

MemoryDB 클러스터에 대한 권한을 지정하려면 AWS CLI 또는를 사용하여 액세스 문자열을 생성하고 사용자에게 할당합니다 AWS Management Console.

액세스 문자열은 사용자에게 적용되는 공백으로 구분된 규칙의 목록으로 정의됩니다. 사용자가 실행할 수 있는 명령과 사용자가 작업할 수 있는 키를 정의합니다. 명령을 실행하기 위해서는 사용자가 실행될 명령과 명령에 의해 액세스되는 모든 키에 액세스할 수 있어야 합니다. 규칙은 왼쪽에서 오른쪽으로 누적되어 적용되며, 제공된 문자열에 중복 항목이 있는 경우, 제공된 문자열 대신 단순화된 문자열이 사용될 수 있습니다.

ACL 규칙의 구문에 대한 자세한 내용은 [ACL](https://valkey.io/topics/acl) 섹션을 참조하세요.

다음 예에서 액세스 문자열은 사용 가능한 모든 키와 명령에 액세스할 수 있는 활성 사용자를 나타냅니다.

 `on ~* &* +@all`

액세스 문자열 구문은 다음과 같이 구분됩니다.
+ `on` - 사용자가 활성 사용자입니다.
+ `~*` - 사용 가능한 모든 키에 대한 액세스 권한을 부여합니다.
+ `&*` - 모든 pubsub 채널에 대한 액세스 권한을 부여합니다.
+ `+@all` - 사용 가능한 모든 명령에 대한 액세스 권한을 부여합니다.

이전 설정은 최소한의 제한적인 설정입니다. 이러한 설정을 수정하여 보안을 강화할 수 있습니다.

다음 예에서 액세스 문자열은 “app::” 키스페이스로 시작하는 키에 대한 읽기 액세스로 제한된 액세스 권한을 가진 사용자를 나타냅니다.

`on ~app::* -@all +@read`

사용자가 액세스할 수 있는 명령을 나열하여 이러한 권한을 세부적으로 조정할 수 있습니다.

`+command1` - 명령에 대한 사용자의 액세스는 *`command1`*로 제한됩니다.

 `+@category` - 사용자의 액세스는 명령 범주로 제한됩니다.

사용자에게 액세스 문자열을 할당하는 방법에 대한 자세한 내용은 [콘솔 및 CLI를 사용하여 사용자 및 액세스 제어 목록 생성](#users-management) 섹션을 참조하세요.

기존 워크로드를 MemoryDB로 마이그레이션하는 경우, `ACL LIST`을(를) 호출하여 사용자 및 암호 해시를 제외하는 방식으로 액세스 문자열을 검색할 수 있습니다.

## 벡터 검색 기능
<a name="access-vss"></a>

[벡터 검색](vector-search.md)의 경우, 모든 검색 명령은 `@search` 범주 및 기존 범주 `@read`, `@write`, `@fast`에 속하며 또한 `@slow`는 검색 명령을 포함하도록 업데이트되었습니다. 사용자에게 범주에 대한 액세스 권한이 없는 경우 사용자는 범주 내의 어떤 명령에도 액세스할 수 없습니다. 예를 들어 사용자가 `@search`에 대한 액세스 권한이 없는 경우, 사용자는 검색 관련 명령을 실행할 수 없습니다.

다음의 표는 검색 명령이 적절한 범주에 매핑되었음을 나타냅니다.


| VSS 명령 | @read | @write | @fast | @slow | 
| --- | --- | --- | --- | --- | 
| FT.CREATE |  | Y | Y |  | 
| FT.DROPINDEX |  | Y | Y |  | 
| FT.LIST | Y |  |  | Y | 
| FT.INFO | Y |  | Y |  | 
| FT.SEARCH | Y |  |  | Y | 
| FT.AGGREGATE | Y |  |  | Y | 
| FT.PROFILE | Y |  |  | Y | 
| FT.ALIASADD |  | Y | Y |  | 
| FT.ALIASDEL |  | Y | Y |  | 
| FT.ALIASUPDATE |  | Y | Y |  | 
| FT.\$1ALIASLIST | Y |  |  | Y | 
| FT.EXPLAIN | Y |  | Y |  | 
| FT.EXPLAINCLI | Y |  | Y |  | 
| FT.CONFIG | Y |  | Y |  | 

## MemoryDB용 클러스터에 ACL 적용
<a name="rbac-using"></a>

MemoryDB ACL을 사용하려면 다음 단계를 수행하세요.

1. 하나 이상의 사용자를 생성합니다.

1. ACL을 생성하고 사용자를 목록에 추가합니다.

1. 클러스터에 ACL을 할당합니다.

이러한 단계는 다음에 자세히 설명되어 있습니다.

**Topics**
+ [콘솔 및 CLI를 사용하여 사용자 및 액세스 제어 목록 생성](#users-management)
+ [콘솔 및 CLI를 사용하여 액세스 제어 목록 관리](#user-groups)
+ [클러스터에 액세스 제어 목록 할당](#users-groups-to-clusterss)

### 콘솔 및 CLI를 사용하여 사용자 및 액세스 제어 목록 생성
<a name="users-management"></a>

ACL 사용자에 대한 사용자 정보는 사용자 이름 및 선택적으로 암호 및 액세스 문자열로 구성됩니다. 액세스 문자열은 키와 명령에 대한 권한 수준을 제공합니다. 이름은 사용자마다 고유하며 엔진에 전달됩니다.

제공하는 사용자 권한이 ACL의 의도된 목적에 적합한지 확인합니다. 예를 들어, `Administrators`라는 ACL을 생성하는 경우, 해당 그룹에 추가하는 모든 사용자는 키 및 명령에 대한 전체 액세스 권한으로 설정된 액세스 문자열을 가져야 합니다. `e-commerce` ACL에 있는 사용자의 경우, 액세스 문자열을 읽기 전용 액세스로 설정할 수 있습니다.

MemoryDB는 `"default"` 사용자 이름을 사용하여 계정당 기본 사용자를 자동으로 구성합니다. ACL에 명시적으로 추가하지 않는 한 어떤 클러스터와도 연결되지 않습니다. 이 사용자는 수정하거나 삭제할 수 없습니다. 이 사용자는 이전 Redis OSS 버전의 기본 동작과의 호환성을 위해 만들어졌으며 모든 명령을 직접적으로 호출하고 모든 키에 액세스할 수 있는 액세스 문자열을 가지고 있습니다.

기본 사용자가 포함된 모든 계정에 대해 변경할 수 없는 “개방형 액세스” ACL이 생성됩니다. 이 ACL은 기본 사용자 한 명이 소속될 수 있는 유일한 ACL입니다. 클러스터를 생성할 때 클러스터와 연결할 ACL을 선택해야 합니다. 기본 사용자에게 “개방형 액세스” ACL을 적용할 수도 있지만, 업무상 필요에 따라 권한이 제한된 사용자를 사용하여 ACL을 생성하는 것이 좋습니다.

TLS가 활성화되지 않은 클러스터는 “개방형 액세스” ACL을 사용하여 개방형 인증을 제공해야 합니다.

사용자 없이 ACL을 생성할 수 있습니다. 빈 ACL은 클러스터에 액세스할 수 없으며 TLS 지원 클러스터와만 연결할 수 있습니다.

사용자를 생성할 때 최대 두 개의 암호를 설정할 수 있습니다. 암호를 수정해도 클러스터에 대한 모든 기존 연결이 유지됩니다.

특히 ACLs for MemoryDB을 사용할 때 이러한 사용자 암호 제약 조건에 유의해야 합니다.
+ 암호는 16\$1128자 길이의 인쇄 가능한 문자여야 합니다.
+ 영숫자가 아닌 다음과 같은 문자는 허용되지 않습니다. `,` `""` `/` `@`.

#### 콘솔 및 CLI를 사용하여 사용자 관리
<a name="users-console"></a>

##### 사용자 생성(콘솔)
<a name="users.Createclusters.viewdetails"></a>

**콘솔에서 사용자를 생성하려면**

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/memorydb/](https://console.aws.amazon.com/memorydb/) MemoryDB 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **Users(사용자)**를 선택합니다.

1. **사용자 생성(Create user)**을 선택합니다.

1. **사용자 생성** 페이지에서 **이름**을 입력합니다.

   클러스터 명명 제약 조건은 다음과 같습니다.
   + 1\$140자의 영숫자 또는 하이픈으로 구성되어야 합니다.
   + 문자로 시작해야 합니다.
   + 하이픈 2개가 연속될 수 없습니다.
   + 끝에 하이픈이 올 수 없습니다.

1. **암호**에서 최대 두 개의 암호를 입력할 수 있습니다.

1. **액세스 문자열**에 액세스 문자열을 입력합니다. 액세스 문자열은 사용자에게 허용할 키와 명령에 대한 권한 수준을 설정합니다.

1. **태그의** 경우 선택적으로 태그를 적용하여 사용자를 검색 및 필터링하거나 AWS 비용을 추적할 수 있습니다.

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

##### 를 사용하여 사용자 생성 AWS CLI
<a name="users.Create.cli"></a>

**CLI를 사용하여 사용자를 생성하려면**
+ [create-user](https://docs.aws.amazon.com/cli/latest/reference/memorydb/create-user.html) 명령을 사용하여 사용자를 생성합니다.

  Linux, macOS, Unix의 경우:

  ```
  aws memorydb create-user \
    --user-name user-name-1 \
    --access-string "~objects:* ~items:* ~public:*" \
    --authentication-mode \
          Passwords="abc",Type=password
  ```

  Windows의 경우:

  ```
  aws memorydb create-user ^
    --user-name user-name-1 ^
    --access-string "~objects:* ~items:* ~public:*" ^
    --authentication-mode \
          Passwords="abc",Type=password
  ```

##### 사용자 수정(콘솔)
<a name="users.modifyclusters.viewdetails"></a>

**콘솔에서 사용자를 수정하려면**

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/memorydb/](https://console.aws.amazon.com/memorydb/) MemoryDB 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **Users(사용자)**를 선택합니다.

1. 수정할 사용자 옆의 라디오 단추를 선택하고 **작업** -> **수정**을 선택합니다.

1. 비밀번호를 수정하려면 **암호 수정** 라디오 버튼을 선택합니다. 단, 암호가 두 개인 경우, 둘 중 하나를 수정할 때는 둘 다 입력해야 합니다.

1. 액세스 문자열을 업데이트하려면 새 문자열을 입력하세요.

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

##### 를 사용하여 사용자 수정 AWS CLI
<a name="users.modify.cli"></a>

**CLI를 사용하여 사용자를 수정하려면**

1. [update-user](https://docs.aws.amazon.com/cli/latest/reference/memorydb/update-user.html) 명령을 사용하여 사용자를 수정합니다.

1. 사용자를 수정하면 해당 사용자와 연결된 액세스 제어 목록이 업데이트되고 ACL과 연결된 클러스터도 업데이트됩니다. 기존 연결은 모두 유지됩니다. 예를 들면 다음과 같습니다.

   Linux, macOS, Unix의 경우:

   ```
   aws memorydb update-user \
     --user-name user-name-1 \
     --access-string "~objects:* ~items:* ~public:*"
   ```

   Windows의 경우:

   ```
   aws memorydb update-user ^
     --user-name user-name-1 ^
     --access-string "~objects:* ~items:* ~public:*"
   ```

##### 사용자 세부 정보 보기(콘솔)
<a name="users.viewclusters.viewdetails"></a>

**콘솔에서 사용자 세부 정보를 보려면**

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/memorydb/](https://console.aws.amazon.com/memorydb/) MemoryDB 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **Users(사용자)**를 선택합니다.

1. **사용자 이름**에서 사용자를 선택하거나 검색 상자를 사용하여 사용자를 찾습니다.

1. **사용자 설정**에서 사용자의 액세스 문자열, 암호 수, 상태 및 Amazon 리소스 이름(ARN) 을 검토할 수 있습니다.

1. **액세스 제어 목록(ACL)**에서 사용자가 속한 ACL을 검토할 수 있습니다.

1. **태그**에서 사용자와 관련된 모든 태그를 검토할 수 있습니다.

##### 를 사용하여 사용자 세부 정보 보기 AWS CLI
<a name="user.view.cli"></a>

[describe-users](https://docs.aws.amazon.com/cli/latest/reference/memorydb/describe-users.html) 명령을 사용하여 사용자의 세부 정보를 볼 수 있습니다.

```
aws memorydb describe-users \
  --user-name my-user-name
```

##### 사용자 삭제(콘솔)
<a name="users.deleteclusters"></a>

**콘솔에서 사용자를 삭제하려면**

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/memorydb/](https://console.aws.amazon.com/memorydb/) MemoryDB 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **Users(사용자)**를 선택합니다.

1. 수정하려는 사용자 옆의 라디오 단추를 선택하고 **작업** -> **삭제**를 선택합니다.

1. 확인하려면 확인 텍스트 상자에 `delete`을(를) 입력한 다음 **삭제**를 선택합니다.

1. 취소하려면 **취소**를 선택합니다.

##### 를 사용하여 사용자 삭제 AWS CLI
<a name="users.delete.cli"></a>

**CLI를 사용하여 사용자를 삭제하려면**
+ [delete-user](https://docs.aws.amazon.com/cli/latest/reference/memorydb/delete-user.html) 명령을 사용하여 사용자를 삭제합니다.

  계정이 삭제되고 해당 계정이 속한 모든 액세스 제어 목록에서 제거됩니다. 다음은 예입니다.

  Linux, macOS, Unix의 경우:

  ```
  aws memorydb delete-user \
    --user-name user-name-2
  ```

  Windows의 경우:

  ```
  aws memorydb delete-user ^
    --user-name user-name-2
  ```

### 콘솔 및 CLI를 사용하여 액세스 제어 목록 관리
<a name="user-groups"></a>

다음과 같이 액세스 제어 목록을 생성하여 하나 이상의 클러스터에 대한 사용자 액세스를 구성하고 제어할 수 있습니다.

콘솔에서 다음 절차에 따라 액세스 제어 목록을 관리합니다.

#### 액세스 제어 목록(ACL) 생성(콘솔)
<a name="acl.createclusters.viewdetails"></a>

**콘솔을 사용하여 액세스 제어 목록을 생성하려면**

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/memorydb/](https://console.aws.amazon.com/memorydb/) MemoryDB 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **액세스 제어 목록(ACL)** 을 선택합니다.

1. **ACL 생성**을 선택합니다.

1. **액세스 제어 목록(ACL) 생성** 페이지에서 ACL 이름을 입력합니다.

   클러스터 명명 제약 조건은 다음과 같습니다.
   + 1\$140자의 영숫자 또는 하이픈으로 구성되어야 합니다.
   + 문자로 시작해야 합니다.
   + 하이픈 2개가 연속될 수 없습니다.
   + 끝에 하이픈이 올 수 없습니다.

1. **선택된 사용자**에서 다음 작업 중 하나를 수행합니다.

   1. 새 사용자를 생성하려면 **사용자 생성**을 선택합니다.

   1. **관리**를 선택한 다음 **사용자 관리** 대화 상자에서 사용자를 선택한 다음 **선택**을 선택하여 사용자를 추가합니다.

1. **태그의** 경우 선택적으로 태그를 적용하여 ACLs을 검색 및 필터링하거나 AWS 비용을 추적할 수 있습니다.

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

#### 를 사용하여 액세스 제어 목록(ACL) 생성 AWS CLI
<a name="acl.create.cli"></a>

다음 절차에 따라 CLI를 사용하여 액세스 제어 목록을 생성합니다.

**CLI를 사용하여 새 ACL을 생성하고 사용자를 추가하려면**
+ [create-acl](https://docs.aws.amazon.com/cli/latest/reference/memorydb/create-acl.html) 명령을 사용하여 ACL을 생성합니다.

  Linux, macOS, Unix의 경우:

  ```
  aws memorydb create-acl \
    --acl-name "new-acl-1" \
    --user-names "user-name-1" "user-name-2"
  ```

  Windows의 경우:

  ```
  aws memorydb create-acl ^
    --acl-name "new-acl-1" ^
    --user-names "user-name-1" "user-name-2"
  ```

#### 액세스 제어 목록(ACL) 수정(콘솔)
<a name="acl.modifyclusters.viewdetails"></a>

**콘솔을 사용하여 액세스 제어 목록을 수정하려면**

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/memorydb/](https://console.aws.amazon.com/memorydb/) MemoryDB 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **액세스 제어 목록(ACL)** 을 선택합니다.

1. 수정할 ACL을 선택하고 **수정**을 선택합니다.

1. **수정** 페이지의 **선택된 사용자**에서 다음 중 하나를 수행합니다.

   1. ACL에 추가할 **사용자 생성**을 선택하여 새 사용자를 생성합니다.

   1. **관리**를 선택한 다음 **사용자 관리** 대화 상자에서 사용자를 선택하거나 선택 취소한 다음 **선택**을 선택하여 사용자를 추가하거나 제거합니다.

1. **액세스 제어 목록(ACL) 생성** 페이지에서 ACL 이름을 입력합니다.

   클러스터 명명 제약 조건은 다음과 같습니다.
   + 1\$140자의 영숫자 또는 하이픈으로 구성되어야 합니다.
   + 문자로 시작해야 합니다.
   + 하이픈 2개가 연속될 수 없습니다.
   + 끝에 하이픈이 올 수 없습니다.

1. **선택된 사용자**에서 다음 작업 중 하나를 수행합니다.

   1. 새 사용자를 생성하려면 **사용자 생성**을 선택합니다.

   1. **관리**를 선택한 다음 **사용자 관리** 대화 상자에서 사용자를 선택한 다음 **선택**을 선택하여 사용자를 추가합니다.

1. 변경 내용을 저장하려면 **수정**을 선택하고 변경 내용을 삭제하려면 **취소**를 선택합니다.

#### 를 사용하여 액세스 제어 목록(ACL) 수정 AWS CLI
<a name="acl.modify.acl"></a>

**CLI를 사용하여 새 사용자를 추가하거나 현재 멤버를 제거하여 ACL을 수정하려면**
+ [update-acl](https://docs.aws.amazon.com/cli/latest/reference/memorydb/update-acl.html) 명령을 사용하여 ACL을 수정합니다.

  Linux, macOS, Unix의 경우:

  ```
  aws memorydb update-acl --acl-name new-acl-1 \
  --user-names-to-add user-name-3 \
  --user-names-to-remove user-name-2
  ```

  Windows의 경우:

  ```
  aws memorydb update-acl --acl-name new-acl-1 ^
  --user-names-to-add user-name-3 ^
  --user-names-to-remove user-name-2
  ```

**참고**  
ACL 에서 제거된 사용자에게 속하는 열려 있는 모든 연결이 이 명령으로 종료됩니다.

#### 액세스 제어 목록(ACL) 세부 정보 보기(콘솔)
<a name="acls.viewclusters.viewdetails"></a>

**콘솔에서 ACL 세부 정보를 보려면**

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/memorydb/](https://console.aws.amazon.com/memorydb/) MemoryDB 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **액세스 제어 목록(ACL)**을 선택합니다.

1. **ACL 이름**에서 ACL을 선택하거나 검색 상자를 사용하여 ACL을 찾습니다.

1. **사용자**에서 ACL과 관련된 사용자 목록을 검토할 수 있습니다.

1. **관련 클러스터에**서 ACL이 속한 클러스터를 검토할 수 있습니다.

1. **태그**에서 ACL과 관련된 모든 태그를 검토할 수 있습니다.

#### 를 사용하여 액세스 제어 목록(ACL) 보기 AWS CLI
<a name="acl.view.cli"></a>

[describe-acls](https://docs.aws.amazon.com/cli/latest/reference/memorydb/describe-acls.html) 명령을 사용하여 ACL의 세부 정보를 볼 수 있습니다.

```
aws memorydb describe-acls \
  --acl-name test-group
```

#### 액세스 제어 목록(ACL) 삭제(콘솔)
<a name="acl.deleteacl"></a>

**콘솔을 사용하여 액세스 제어 목록을 삭제하려면**

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/memorydb/](https://console.aws.amazon.com/memorydb/) MemoryDB 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **액세스 제어 목록(ACL)**을 선택합니다.

1. 수정하려는 ACL을 선택한 다음 **삭제**를 선택합니다.

1. **삭제** 페이지에서 확인 상자에 `delete`를 입력하고 **삭제** 또는 **취소**를 선택하여 ACL이 삭제되지 않도록 합니다.

그룹에 속한 사용자가 아닌 ACL 자체가 삭제됩니다.

#### 를 사용하여 액세스 제어 목록(ACL) 삭제 AWS CLI
<a name="acl.delete.cli"></a>

**CLI를 사용하여 ACL을 삭제하려면**
+ [delete-acl](https://docs.aws.amazon.com/cli/latest/reference/memorydb/delete-acl.html) 명령을 사용하여 태그를 삭제합니다.

  Linux, macOS, Unix의 경우:

  ```
  aws memorydb delete-acl /
     --acl-name
  ```

  Windows의 경우:

  ```
  aws memorydb delete-acl ^
     --acl-name
  ```

  이전 예에서는 다음 응답을 반환합니다.

  ```
  aws memorydb delete-acl --acl-name "new-acl-1"
  {
      "ACLName": "new-acl-1",
      "Status": "deleting",
      "EngineVersion": "6.2",
      "UserNames": [
          "user-name-1", 
          "user-name-3"
      ],
      "clusters": [],
      "ARN":"arn:aws:memorydb:us-east-1:493071037918:acl/new-acl-1"
  }
  ```

### 클러스터에 액세스 제어 목록 할당
<a name="users-groups-to-clusterss"></a>

ACL을 생성하고 사용자를 추가한 후 ACL 구현의 마지막 단계는 ACL을 클러스터에 할당하는 것입니다.

#### 콘솔을 사용하여 클러스터에 액세스 제어 목록 할당
<a name="users-groups-to-clusters-con"></a>

를 사용하여 클러스터에 ACL을 추가하려면 섹션을 AWS Management Console참조하세요[MemoryDB 클러스터 생성](getting-started.md#clusters.create).

#### 를 사용하여 클러스터에 액세스 제어 목록 할당 AWS CLI
<a name="users-groups-to-clusters-CLI"></a>

 다음 AWS CLI 작업은 전송 중 암호화(TLS)가 활성화된 클러스터와 값이 인 **acl-name** 파라미터를 생성합니다`my-acl-name`. 서브넷 그룹 `subnet-group`는 존재하는 서브넷 그룹으로 대체합니다.

**키 파라미터**
+ **--engine-version** - 6.2가 되어야 합니다.
+ **--tls-enabled** - 인증 및 ACL 연결에 사용됩니다.
+ **--acl-name** - 이 값은 클러스터에 대해 지정된 액세스 권한을 가진 사용자로 구성된 액세스 제어 목록을 제공합니다.

Linux, macOS, Unix의 경우:

```
aws memorydb create-cluster \
    --cluster-name "new-cluster" \
    --description "new-cluster" \
    --engine-version "6.2" \
    --node-type db.r6g.large \
    --tls-enabled \
    --acl-name "new-acl-1" \
    --subnet-group-name "subnet-group"
```

Windows의 경우:

```
aws memorydb create-cluster ^
    --cluster-name "new-cluster" ^
    --cluster-description "new-cluster" ^
    --engine-version "6.2" ^
    --node-type db.r6g.large ^
    --tls-enabled ^
    --acl-name "new-acl-1" ^
    --subnet-group-name "subnet-group"
```

다음 AWS CLI 작업은 전송 중 암호화(TLS)가 활성화된 클러스터와 값이 인 **acl-name** 파라미터를 수정합니다`new-acl-2`.

Linux, macOS, Unix의 경우:

```
aws memorydb update-cluster \
    --cluster-name cluster-1 \
    --acl-name "new-acl-2"
```

Windows의 경우:

```
aws memorydb update-cluster ^
    --cluster-name cluster-1 ^
    --acl-name "new-acl-2"
```

# IAM을 통한 인증
<a name="auth-iam"></a>

**Topics**
+ [개요](#auth-iam-overview)
+ [제한 사항](#auth-iam-limits)
+ [설정](#auth-iam-setup)
+ [Connecting](#auth-iam-Connecting)

## 개요
<a name="auth-iam-overview"></a>

클러스터가 Valkey 또는 Redis OSS 버전 7 이상을 사용하도록 구성된 경우 IAM 인증을 통해 AWS IAM ID를 사용하여 MemoryDB에 대한 연결을 인증할 수 있습니다. 그러면 보안 모델이 강화되고 여러 보안 관리 작업이 단순화됩니다. IAM 인증을 사용하면 각 개별 MemoryDB 클러스터 및 MemoryDB 사용자별로 액세스 제어를 세분화해 구성하고 최소 권한 원칙을 고수할 수 있습니다. MemoryDB용 IAM 인증은 `AUTH` 또는 `HELLO` 명령 내에서 장수명 MemoryDB 사용자 암호 대신, 단수명 IAM 인증 토큰을 제공하여 작동합니다. IAM 인증 토큰에 대한 자세한 내용은 AWS 일반 참조 안내서의 [서명 버전 4 서명 프로세스](https://docs.aws.amazon.com//general/latest/gr/signature-version-4.html)와 아래 코드 예제를 참조하세요.

IAM ID 및 관련 정책을 사용하여 Valkey 또는 Redis OSS 액세스를 더욱 엄격히 제한할 수도 있습니다. 페더레이션 자격 증명 공급자로부터 제공받은 사용자에게 바로 MemoryDB 클러스터 액세스를 부여할 수도 있습니다.

MemoryDB에서 AWS IAM을 사용하려면 먼저 인증 모드가 IAM으로 설정된 MemoryDB 사용자를 생성한 다음 IAM 자격 증명을 생성하거나 재사용할 수 있습니다. IAM 자격 증명에 관련 정책이 있어야 MemoryDB 클러스터와 MemoryDB 사용자에게 `memorydb:Connect` 작업을 부여할 수 있습니다. 구성이 완료되면 IAM 사용자 또는 역할의 자격 AWS 증명을 사용하여 IAM 인증 토큰을 생성할 수 있습니다. 마지막으로, MemoryDB 클러스터 노드에 연결할 때 Valkey 또는 Redis OSS 클라이언트에서 암호로 단수명 IAM 인증 토큰을 제공해야 합니다. 자격 증명 공급자를 지원하는 클라이언트는 각각의 새 연결에 자동으로 임시 자격 증명을 자동 생성할 수 있습니다. MemoryDB는 IAM가 활성화된 MemoryDB 사용자의 연결 요청에 IAM 인증을 수행하고 IAM과의 연결 요청을 검증합니다.

## 제한 사항
<a name="auth-iam-limits"></a>

IAM 데이터베이스 인증을 사용할 때 다음 제한이 적용됩니다.
+ IAM 인증은 Valkey 또는 Redis OSS 엔진 버전 7.0 이상에 사용할 수 있습니다.
+ IAM 인증 토큰은 15분간 유효합니다. 장수명 연결의 경우, 자격 증명 공급자 인터페이스를 지원하는 Redis OSS 클라이언트를 사용하는 것이 좋습니다.
+ MemoryDB로의 IAM 인증 연결은 12시간 후에 자동으로 연결이 해제됩니다. `AUTH` 또는 `HELLO` 명령과 새 IAM 인증 토큰을 전송하여 연결을 12시간 연장할 수 있습니다.
+ IAM 인증은 `MULTI EXEC` 명령에서 지원되지 않습니다.
+ 현재 IAM 인증은 모든 전역 조건 컨텍스트 키를 지원하지 않습니다. 전역 조건 컨텍스트 키에 대한 자세한 내용은 IAM 사용 설명서의 [AWS 전역 조건 컨텍스트 키](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)를 참조하세요.

## 설정
<a name="auth-iam-setup"></a>

IAM 인증을 설정하려면:

1. 클러스터 생성

   ```
   aws memorydb create-cluster \
       --cluster-name cluster-01 \
       --description "MemoryDB IAM auth application"
       --node-type db.r6g.large \
       --engine-version 7.0 \
       --acl-name open-access
   ```

1. 아래에서와 같이, 역할에 IAM 신뢰 정책 문서를 생성하여 계정이 새 역할을 수임할 수 있도록 합니다. 정책을 *trust-policy.json* 파일에 저장합니다.

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": {
           "Effect": "Allow",
           "Principal": { "AWS": "arn:aws:iam::123456789012:root" },
           "Action": "sts:AssumeRole"
       }
   }
   ```

------

1. 아래에서와 같이, IAM 정책 문서를 생성합니다. 정책을 *policy.json* 파일에 저장합니다.

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect" : "Allow",
         "Action" : [
           "memorydb:connect"
         ],
         "Resource" : [
           "arn:aws:memorydb:us-east-1:123456789012:cluster/cluster-01",
           "arn:aws:memorydb:us-east-1:123456789012:user/iam-user-01"
         ]
       }
     ]
   }
   ```

------

1. IAM 역할을 생성합니다.

   ```
   aws iam create-role \
     --role-name "memorydb-iam-auth-app" \
     --assume-role-policy-document file://trust-policy.json
   ```

1. IAM 정책을 생성합니다.

   ```
   aws iam create-policy \
     --policy-name "memorydb-allow-all" \
     --policy-document file://policy.json
   ```

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

   ```
   aws iam attach-role-policy \
    --role-name "memorydb-iam-auth-app" \
    --policy-arn "arn:aws:iam::123456789012:policy/memorydb-allow-all"
   ```

1. IAM가 활성화된 사용자를 새로 생성합니다.

   ```
   aws memorydb create-user \
     --user-name iam-user-01 \
     --authentication-mode Type=iam \
     --access-string "on ~* +@all"
   ```

1. ACL을 생성하고 사용자를 연결합니다.

   ```
   aws memorydb create-acl \
     --acl-name iam-acl-01 \
     --user-names iam-user-01
   
   aws memorydb update-cluster \
     --cluster-name cluster-01 \
     --acl-name iam-acl-01
   ```

## Connecting
<a name="auth-iam-Connecting"></a>

**토큰을 암호로 연결**

먼저 [AWS SigV4 사전 서명된 요청](https://docs.aws.amazon.com//general/latest/gr/sigv4-signed-request-examples.html)을 사용하여 단수명 IAM 인증 토큰을 생성해야 합니다. 그런 다음, MemoryDB 클러스터에 연결할 때 아래 예제에서와 같이 IAM 인증 토큰을 암호로 제공합니다.

```
String userName = "insert user name"
String clusterName = "insert cluster name"
String region = "insert region"

// Create a default AWS Credentials provider.
// This will look for AWS credentials defined in environment variables or system properties.
AWSCredentialsProvider awsCredentialsProvider = new DefaultAWSCredentialsProviderChain();

// Create an IAM authentication token request and signed it using the AWS credentials.
// The pre-signed request URL is used as an IAM authentication token for MemoryDB.
IAMAuthTokenRequest iamAuthTokenRequest = new IAMAuthTokenRequest(userName, clusterName, region);
String iamAuthToken = iamAuthTokenRequest.toSignedRequestUri(awsCredentialsProvider.getCredentials());

// Construct URL with IAM Auth credentials provider
RedisURI redisURI = RedisURI.builder()
    .withHost(host)
    .withPort(port)
    .withSsl(ssl)
    .withAuthentication(userName, iamAuthToken)
    .build();

// Create a new Lettuce client
RedisClusterClient client = RedisClusterClient.create(redisURI);
client.connect();
```

아래는 `IAMAuthTokenRequest`의 정의입니다.

```
public class IAMAuthTokenRequest {
    private static final HttpMethodName REQUEST_METHOD = HttpMethodName.GET;
    private static final String REQUEST_PROTOCOL = "http://";
    private static final String PARAM_ACTION = "Action";
    private static final String PARAM_USER = "User";
    private static final String ACTION_NAME = "connect";
    private static final String SERVICE_NAME = "memorydb";
    private static final long TOKEN_EXPIRY_SECONDS = 900;

    private final String userName;
    private final String clusterName;
    private final String region;

    public IAMAuthTokenRequest(String userName, String clusterName, String region) {
        this.userName = userName;
        this.clusterName = clusterName;
        this.region = region;
    }

    public String toSignedRequestUri(AWSCredentials credentials) throws URISyntaxException {
        Request<Void> request = getSignableRequest();
        sign(request, credentials);
        return new URIBuilder(request.getEndpoint())
            .addParameters(toNamedValuePair(request.getParameters()))
            .build()
            .toString()
            .replace(REQUEST_PROTOCOL, "");
    }

    private <T> Request<T> getSignableRequest() {
        Request<T> request  = new DefaultRequest<>(SERVICE_NAME);
        request.setHttpMethod(REQUEST_METHOD);
        request.setEndpoint(getRequestUri());
        request.addParameters(PARAM_ACTION, Collections.singletonList(ACTION_NAME));
        request.addParameters(PARAM_USER, Collections.singletonList(userName));
        return request;
    }

    private URI getRequestUri() {
        return URI.create(String.format("%s%s/", REQUEST_PROTOCOL, clusterName));
    }

    private <T> void sign(SignableRequest<T> request, AWSCredentials credentials) {
        AWS4Signer signer = new AWS4Signer();
        signer.setRegionName(region);
        signer.setServiceName(SERVICE_NAME);

        DateTime dateTime = DateTime.now();
        dateTime = dateTime.plus(Duration.standardSeconds(TOKEN_EXPIRY_SECONDS));

        signer.presignRequest(request, credentials, dateTime.toDate());
    }

    private static List<NameValuePair> toNamedValuePair(Map<String, List<String>> in) {
        return in.entrySet().stream()
            .map(e -> new BasicNameValuePair(e.getKey(), e.getValue().get(0)))
            .collect(Collectors.toList());
    }
}
```

**보안 인증 정보 공급자와 연결**

아래 코드는 IAM 인증 보안 인증 정보 공급자를 사용하여 MemoryDB로 인증하는 방법을 보여줍니다.

```
String userName = "insert user name"
String clusterName = "insert cluster name"
String region = "insert region"

// Create a default AWS Credentials provider.
// This will look for AWS credentials defined in environment variables or system properties.
AWSCredentialsProvider awsCredentialsProvider = new DefaultAWSCredentialsProviderChain();

// Create an IAM authentication token request. Once this request is signed it can be used as an
// IAM authentication token for MemoryDB.
IAMAuthTokenRequest iamAuthTokenRequest = new IAMAuthTokenRequest(userName, clusterName, region);

// Create a credentials provider using IAM credentials.
RedisCredentialsProvider redisCredentialsProvider = new RedisIAMAuthCredentialsProvider(
    userName, iamAuthTokenRequest, awsCredentialsProvider);
    
// Construct URL with IAM Auth credentials provider
RedisURI redisURI = RedisURI.builder()
    .withHost(host)
    .withPort(port)
    .withSsl(ssl)
    .withAuthentication(redisCredentialsProvider)
    .build();

// Create a new Lettuce cluster client
RedisClusterClient client = RedisClusterClient.create(redisURI);
client.connect();
```

다음은 자격 증명 공급자에 IAMAuthTokenRequest를 래핑하여 필요할 때 임시 자격 증명을 자동 생성하는 Lettuce 클러스터 클라이언트의 예입니다.

```
public class RedisIAMAuthCredentialsProvider implements RedisCredentialsProvider {
    private static final long TOKEN_EXPIRY_SECONDS = 900;

    private final AWSCredentialsProvider awsCredentialsProvider;
    private final String userName;
    private final IAMAuthTokenRequest iamAuthTokenRequest;
    private final Supplier<String> iamAuthTokenSupplier;

    public RedisIAMAuthCredentialsProvider(String userName,
        IAMAuthTokenRequest iamAuthTokenRequest,
        AWSCredentialsProvider awsCredentialsProvider) {
        this.userName = userName;
        this.awsCredentialsProvider = awsCredentialsProvider;
        this.iamAuthTokenRequest = iamAuthTokenRequest;      
        this.iamAuthTokenSupplier = Suppliers.memoizeWithExpiration(this::getIamAuthToken, TOKEN_EXPIRY_SECONDS, TimeUnit.SECONDS);
    }

    @Override
    public Mono<RedisCredentials> resolveCredentials() {
        return Mono.just(RedisCredentials.just(userName, iamAuthTokenSupplier.get()));
    }

    private String getIamAuthToken() {
        return iamAuthTokenRequest.toSignedRequestUri(awsCredentialsProvider.getCredentials());
    }
```