

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

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

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

Amazon ElastiCache for Memcached는 Memcached 버전 1.6.12 이상을 실행하는 캐시에서 데이터 암호화를 제공하는 기능을 갖추고 있습니다.

Valkey 및 Redis OSS를 사용하는 Amazon ElastiCache는 Valkey 7.2 이상 및 Redis OSS 버전 3.2.6(EOL 예정, [Redis OSS 버전 수명 종료 일정 참조](engine-versions.md#deprecated-engine-versions)) 4.0.10 이상을 실행하는 캐시의 데이터에 대한 암호화 기능을 제공합니다. 또한, Amazon ElastiCache는 IAM 또는 Valkey 및 Redis OSS AUTH를 통한 사용자 인증과 역할 기반 액세스 제어(RBAC)를 사용하여 사용자 작업 권한 부여를 지원합니다.
+ 전송 중 암호화는 클러스터 내 노드 사이 또는 캐시와 애플리케이션 사이와 같이 한 위치에서 다른 위치로 데이터가 이동 중인 경우 항상 데이터를 암호화합니다.
+ 미사용 데이터 암호화는 동기화 및 백업 작업 중 디스크 내 데이터를 암호화합니다.

ElastiCache는 IAM 및 Valkey 및 Redis OSS 인증 명령을 사용한 사용자 인증을 지원하고 역할 기반 액세스 제어(RBAC)를 사용한 사용자 작업을 승인하는 기능을 지원합니다.

![\[이미지: ElastiCache for Valkey 및 Redis OSS 보안 다이어그램\]](http://docs.aws.amazon.com/ko_kr/AmazonElastiCache/latest/dg/images/ElastiCache-Redis-Secure-Compliant.png)


*ElastiCache for Valkey 및 Redis OSS 보안 다이어그램*

**Topics**
+ [ElastiCache 전송 중 데이터 암호화(TLS)](in-transit-encryption.md)
+ [ElastiCache에서 저장 시 암호화](at-rest-encryption.md)
+ [인증 및 권한 부여](auth-redis.md)

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

데이터를 안전하게 유지하기 위해 Amazon ElastiCache 및 Amazon EC2는 서버의 데이터에 대한 무단 액세스를 방지하는 메커니즘을 제공합니다. ElastiCache에서는 전송 중 데이터 암호화 기능을 제공해 한 위치에서 다른 위치로 데이터 이동 시 데이터를 보호할 수 있는 수단을 제공합니다.

모든 Valkey 또는 Redis OSS 서버리스 캐시에는 전송 중 데이터 암호화가 활성화되어 있습니다. 노드 기반 클러스터의 경우 복제 그룹을 생성할 때 `TransitEncryptionEnabled` 파라미터를 `true`(CLI: `--transit-encryption-enabled`)로 설정해 복제 그룹에서 전송 중 암호화를 활성화합니다.AWS Management ConsoleAWS CLI, 또는 ElastiCache API를 사용하여 복제 그룹을 생성하든 관계없이이 작업을 수행할 수 있습니다.

모든 서버리스 캐시에는 전송 중 암호화가 활성화되어 있습니다. 노드 기반 클러스터의 경우 `CreateCacheCluster`(CLI: `create-cache-cluster`) 작업을 사용하여 클러스터를 생성할 때 `TransitEncryptionEnabled` 파라미터를 `true`(CLI: `--transit-encryption-enabled`)로 설정하여 클러스터에서 전송 중 암호화를 활성화할 수 있습니다.

**Topics**
+ [전송 중 데이터 암호화 개요](#in-transit-encryption-overview)
+ [전송 중 암호화 조건(Valkey 및 Redis OSS)](#in-transit-encryption-constraints)
+ [전송 중 데이터 암호화 조건(Memcached)](#in-transit-encryption-constraints)
+ [전송 중 데이터 암호화 모범 사례](#in-transit-encryption-best-practices)
+ [추가 Valkey 및 Redis OSS 옵션](#in-transit-encryption-see-also)
+ [Memcached에 대한 전송 중 데이터 암호화 활성화](#in-transit-encryption-enable-existing-mc)
+ [전송 중 데이터 암호화 사용 설정](in-transit-encryption-enable.md)
+ [valkey-cli를 사용하여 전송 중 암호화를 통해 ElastiCache(Valkey) 또는 Amazon ElastiCache for Redis OSS에 연결](connect-tls.md)
+ [Python을 사용하여 노드 기반 Redis OSS 클러스터에서 전송 중 데이터 암호화 활성화](in-transit-encryption-enable-python.md)
+ [전송 중 암호화 활성화 시 모범 사례](enable-python-best-practices.md)
+ [Openssl을 사용하여 전송 중 데이터 암호화가 사용 설정된 노드에 연결(Memcached)](#in-transit-encryption-connect-mc)
+ [Java를 사용하여 TLS Memcached 클라이언트 생성](#in-transit-encryption-connect-java)
+ [PHP를 사용하여 TLS Memcached 클라이언트 생성](#in-transit-encryption-connect-php-mc)

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

Amazon ElastiCache의 전송 중 암호화는 가장 취약한 지점 즉, 한 위치에서 다른 위치로 데이터를 전송할 때 데이터의 보안을 강화하는 기능입니다. 엔드포인트에서 데이터를 암호화 및 해독하기 위해 몇 가지 처리가 필요하기 때문에 전송 중 데이터 암호화를 활성화하면 성능에 어느 정도 영향이 있을 수 있습니다. 사용 사례에 대한 성능 영향을 파악하기 위해서는 전송 중 데이터 암호화를 사용한 상태와 사용하지 않은 상태에서 데이터를 벤치마크해야 합니다.

ElastiCache의 전송 중 데이터 암호화는 다음 기능을 구현합니다.
+ **암호화된 클라이언트 연결** - 캐시 노드에 대한 클라이언트 연결은 TLS로 암호화됩니다.
+ **암호화된 서버 연결 -** 클러스터의 노드 간에 이동하는 데이터는 암호화됩니다.
+ **서버 인증** - 클라이언트가 자신이 올바른 서버에 연결 중임을 인증할 수 있습니다.
+ **클라이언트 인증** - Valkey 또는 Redis OSS AUTH 기능을 사용하여 서버가 클라이언트를 인증할 수 있습니다.

## 전송 중 암호화 조건(Valkey 및 Redis OSS)
<a name="in-transit-encryption-constraints"></a>

노드 기반 클러스터를 구현하려는 경우 Amazon ElastiCache의 전송 중 암호화에 관한 다음 제한 사항을 고려해야 합니다.
+ 전송 중 데이터 암호화는 Valkey 7.2 이상 및 Redis OSS 3.2.6, 4.0.10 및 이후 버전을 실행 중인 복제 그룹에서만 지원됩니다.
+ 기존 클러스터의 전송 중 데이터 암호화 설정 수정은 Valkey 7.2 이상 및 Redis OSS 버전 7 이상을 실행하는 복제 그룹에서 지원됩니다.
+ 전송 중 데이터 암호화는 Amazon VPC에서 실행 중인 복제 그룹에 대해서만 지원됩니다.
+ 전송 중 데이터 암호화는 M1, M2 노드 유형을 실행하는 복제 그룹에 대해 지원되지 않습니다.

  자세한 내용은 [지원되는 노드 유형](CacheNodes.SupportedTypes.md) 단원을 참조하십시오.
+ 전송 중 데이터 암호화는 `TransitEncryptionEnabled` 파라미터를 명시적으로 `true`로 설정해 활성화합니다.
+ 캐시 클라이언트가 TLS 연결을 지원하고 클라이언트 구성에서 TLS 연결을 활성화합니다.
+ 2026년 1월 26일부터AWS는 Valkey용 ElastiCache 버전 7.2 이상 및 Redis용 ElastiCache OSS 버전 6 이상에서 지원되는 최소 TLS 버전을 1.2로 업데이트합니다. 고객은 해당 날짜 이전에 클라이언트 소프트웨어를 업데이트해야 합니다. 이 업데이트는 보안, 규정 준수 및 규제 요구 사항을 충족하는 데 도움이 됩니다.

## 전송 중 데이터 암호화 조건(Memcached)
<a name="in-transit-encryption-constraints"></a>

노드 기반 클러스터를 구현하려는 경우 Amazon ElastiCache의 전송 중 암호화에 관한 다음 제한 사항을 고려해야 합니다.
+ 전송 중 데이터 암호화는 Memcached 버전 1.6.12 이상 버전을 실행 중인 클러스터에서 지원됩니다.
+ 전송 중 암호화는 전송 계층 보안(TLS) 버전 1.2 및 1.3을 지원합니다.
+ 전송 중 데이터 암호화는 Amazon VPC에서 실행 중인 클러스터에 대해서만 지원됩니다.
+ 전송 중 데이터 암호화는 M1, M2, M3, R3, T2 노드 유형을 실행하는 복제 그룹에 대해 지원되지 않습니다.

  자세한 내용은 [지원되는 노드 유형](CacheNodes.SupportedTypes.md) 단원을 참조하십시오.
+ 전송 중 데이터 암호화는 `TransitEncryptionEnabled` 파라미터를 명시적으로 `true`로 설정해 활성화합니다.
+ 클러스터를 생성하는 경우에만 클러스터에서 전송 중 데이터 암호화를 사용 설정할 수 있습니다. 클러스터를 수정하여 전송 중 데이터 암호화 켜기 및 끄기를 전환할 수 없습니다.
+ 캐시 클라이언트가 TLS 연결을 지원하고 클라이언트 구성에서 TLS 연결을 활성화합니다.

## 전송 중 데이터 암호화 모범 사례
<a name="in-transit-encryption-best-practices"></a>
+ 엔드포인트에서 데이터를 암호화 및 해독하기 위해 처리가 필요하기 때문에 전송 중 데이터 암호화를 구현하면 성능이 저하될 수 있습니다. 이러한 암호화가 구현 성능에 미치는 영향을 확인하려면 전송 중 데이터 암호화와 데이터를 암호화하지 않은 경우를 비교해 벤치마크하세요.
+ 새로운 연결을 생성하면 비용이 높아질 수 있기 때문에 TLS 연결을 지속해 전송 중 데이터 암호화가 성능에 미치는 영향을 줄일 수 있습니다.

## 추가 Valkey 및 Redis OSS 옵션
<a name="in-transit-encryption-see-also"></a>

Valkey 및 Redis OSS에 사용할 수 있는 옵션에 대한 자세한 내용은 다음 링크를 참조하세요.
+ [ElastiCache에서 저장 시 암호화](at-rest-encryption.md)
+ [Valkey 및 Redis OSS AUTH 명령으로 인증](auth.md)
+ [역할 기반 액세스 제어(RBAC)](Clusters.RBAC.md)
+ [Amazon VPC 및 ElastiCache 보안](VPCs.md)
+ [Amazon ElastiCache의 Identity and Access Management](IAM.md)

## Memcached에 대한 전송 중 데이터 암호화 활성화
<a name="in-transit-encryption-enable-existing-mc"></a>

AWS관리 콘솔을 사용하여 Memcached 클러스터를 생성하는 경우 전송 중 데이터 암호화를 사용 설정하려면 다음을 선택합니다.
+ 엔진으로 Memcached를 선택합니다.
+ 엔진 버전 1.6.12 이상을 선택합니다.
+ **Encryption in transit**(전송 중 데이터 암호화)에서 **Enable**(사용 설정)을 선택합니다.

 단계별 절차는 [Valkey 또는 Redis OSS용 클러스터 생성](Clusters.Create.md) 섹션을 참조하세요.

# 전송 중 데이터 암호화 사용 설정
<a name="in-transit-encryption-enable"></a>

모든 서버리스 캐시에는 전송 중 암호화가 활성화되어 있습니다. 노드 기반 클러스터에서는AWS Management Console,AWS CLI 또는 ElastiCache API를 사용하여 전송 중 데이터 암호화를 활성화할 수 있습니다.

## 를 사용하여 전송 중 데이터 암호화 활성화AWS Management Console
<a name="in-transit-encryption-enable-console"></a>

### 를 사용하여 새 노드 기반 클러스터에 대한 전송 중 데이터 암호화 활성화AWS Management Console
<a name="in-transit-encryption-enable-con"></a>

자체 클러스터를 설계할 때 '간편한 생성' 메서드를 사용하는 '개발 및 테스트' 및 '프로덕션' 구성에서는 전송 중 암호화가 활성화됩니다. 구성을 직접 선택할 때 다음과 같이 진행합니다.
+ 다음 엔진 버전을 선택합니다. 3.2.6, 4.0.10 또는 이후 버전.
+ **전송 중 암호화**의 **활성화** 옵션 옆에서 확인란을 클릭합니다.

단계별 프로세스의 경우 다음을 참조하세요.
+ [Valkey(클러스터 모드 비활성화됨) 클러스터 생성(콘솔)](SubnetGroups.designing-cluster-pre.valkey.md#Clusters.Create.CON.valkey-gs)
+ [Valkey 또는 Redis OSS(클러스터 모드 활성화됨) 클러스터 생성(콘솔)](Clusters.Create.md#Clusters.Create.CON.RedisCluster)

### 를 사용하여 기존 노드 기반 클러스터에 대한 전송 중 암호화 활성화AWS Management Console
<a name="in-transit-encryption-enable-existing"></a>

전송 중 암호화 활성화는 두 단계 프로세스이므로, 먼저 전송 암호화 모드를 `preferred`(으)로 설정해야 합니다. 이 모드는 Valkey 또는 Redis OSS 클라이언트가 암호화된 연결과 암호화되지 않은 연결을 모두 사용하여 연결할 수 있도록 합니다. 암호화된 연결을 사용하도록 모든 Valkey 또는 Redis OSS 클라이언트를 마이그레이션한 후, 클러스터 구성을 수정하여 전송 암호화 모드를 `required`(으)로 설정할 수 있습니다. 전송 암호화 모드를 `required`(으)로 설정하면 암호화되지 않은 모든 연결이 끊어지고 암호화된 연결만 허용됩니다.

****전송 암호화 모드**를 **선호**로 설정**

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

1. 왼쪽에 표시되는 탐색 창에 나열된 ElastiCache **리소스**에서 **Valkey 캐시** 또는 **Redis OSS 캐시**를 선택합니다.

1. 업데이트할 캐시를 선택합니다.

1. **작업** 드롭다운을 선택한 다음, **수정**을 선택합니다.

1. **보안** 섹션, **전송 중 암호화**에서 **활성화**를 선택합니다.

1. **전송 암호화 모드**로 **선호**를 선택합니다.

1. **변경 사항 미리 보기**를 선택하여 변경 사항을 저장합니다.

암호화된 연결을 사용하도록 모든 Valkey 또는 Redis OSS 클라이언트를 마이그레이션한 후:

****전송 암호화 모드**를 **필수**로 설정**

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

1. 왼쪽에 표시되는 탐색 창에 나열된 ElastiCache **리소스**에서 **Valkey 캐시** 또는 **Redis OSS 캐시**를 선택합니다.

1. 업데이트할 캐시를 선택합니다.

1. **작업** 드롭다운을 선택한 다음, **수정**을 선택합니다.

1. **보안** 섹션에서 **전송 암호화 모드**로 **필수**를 선택합니다.

1. **변경 사항 미리 보기**를 선택하여 변경 사항을 저장합니다.

## 를 사용하여 전송 중 데이터 암호화 활성화AWS CLI
<a name="in-transit-encryption-enable-cli"></a>

AWS CLI를 사용하여 Valkey 또는 Redis OSS 복제 그룹을 생성할 때 전송 중 데이터 암호화를 활성화하려면 파라미터 `transit-encryption-enabled`를 설정합니다.

### Valkey 또는 Redis OSS용 새 노드 기반 클러스터에서 전송 중 암호화 활성화(클러스터 모드 비활성화)(CLI)
<a name="in-transit-encryption-enable-cli-redis-classic-rg"></a>

AWS CLI작업`create-replication-group`과 다음 파라미터를 사용하여 전송 중 데이터 암호화가 활성화된 복제본이 있는 Valkey 또는 Redis OSS 복제 그룹을 생성합니다.

**키 파라미터:**
+ **--engine** - `valkey` 또는 `redis`이어야 합니다.
+ **--engine-version** - 엔진이 Redis OSS인 경우 3.2.6, 4.0.10 또는 그 이상이어야 합니다.
+ **--transit-encryption-enabled** - 필수입니다. 전송 중 데이터 암호화를 활성화하면 `--cache-subnet-group` 파라미터의 값도 제공해야 합니다.
+ **--num-cache-clusters** - 1 이상이어야 합니다. 이 파라미터의 최대값은 6입니다.

자세한 내용은 다음을 참조하세요.
+ [Valkey 또는 Redis OSS(클러스터 모드 비활성화됨) 복제 그룹을 처음부터 새로 생성(AWS CLI)](Replication.CreatingReplGroup.NoExistingCluster.Classic.md#Replication.CreatingReplGroup.NoExistingCluster.Classic.CLI)
+ [create-replication-group](https://docs.aws.amazon.com/cli/latest/reference/elasticache/create-replication-group.html)

### Valkey 또는 Redis OSS용 새 노드 기반 클러스터에서 전송 중 암호화 활성화(클러스터 모드 활성화)(CLI)
<a name="in-transit-encryption-enable-cli-redis-cluster"></a>

AWS CLI작업`create-replication-group`과 다음 파라미터를 사용하여 전송 중 데이터 암호화가 활성화된 Valkey 또는 Redis OSS(클러스터 모드 활성화됨) 복제 그룹을 생성합니다.

**키 파라미터:**
+ **--engine** - `valkey` 또는 `redis`이어야 합니다.
+ **--engine-version** - 엔진이 Redis OSS인 경우 3.2.6, 4.0.10 또는 그 이상이어야 합니다.
+ **--transit-encryption-enabled** - 필수입니다. 전송 중 데이터 암호화를 활성화하면 `--cache-subnet-group` 파라미터의 값도 제공해야 합니다.
+ 다음 파라미터 세트 중 하나를 사용해 복제 그룹의 노드 그룹 구성을 지정합니다.
  + **--num-node-groups** - 이 복제 그룹의 샤드(노드 그룹) 수를 지정합니다. 이 파라미터의 최대값은 500입니다.

    **--replicas-per-node-group** - 각 노드 그룹의 복제 노드 수를 지정합니다. 여기서 지정된 값은 복제 그룹의 모든 샤드에 적용됩니다. 이 파라미터의 최대값은 5입니다.
  + **--node-group-configuration** - 각 샤드의 구성을 독립적으로 지정합니다.

자세한 내용은 다음을 참조하세요.
+ [처음부터 Valkey 또는 Redis OSS(클러스터 모드 활성화됨) 복제 그룹 만들기(AWS CLI)](Replication.CreatingReplGroup.NoExistingCluster.Cluster.md#Replication.CreatingReplGroup.NoExistingCluster.Cluster.CLI)
+ [create-replication-group](https://docs.aws.amazon.com/cli/latest/reference/elasticache/create-replication-group.html)

### AWS CLI을(를) 사용하여 기존 클러스터에 전송 중 암호화 활성화
<a name="in-transit-encryption-enable-cli-redis-cluster-existing-cli"></a>

전송 중 암호화 활성화는 두 단계 프로세스이므로, 먼저 전송 암호화 모드를 `preferred`(으)로 설정해야 합니다. 이 모드는 Valkey 또는 Redis OSS 클라이언트가 암호화된 연결과 암호화되지 않은 연결을 모두 사용하여 연결할 수 있도록 합니다. 암호화된 연결을 사용하도록 모든 Valkey 또는 Redis OSS 클라이언트를 마이그레이션한 후, 클러스터 구성을 수정하여 전송 암호화 모드를 `required`(으)로 설정할 수 있습니다. 전송 암호화 모드를 `required`(으)로 설정하면 암호화되지 않은 모든 연결이 끊어지고 암호화된 연결만 허용됩니다.

AWS CLI작업`modify-replication-group`과 다음 파라미터를 사용하여 전송 중 데이터 암호화가 비활성화된 Valkey 또는 Redis OSS(클러스터 모드 활성화됨) 복제 그룹을 업데이트합니다.

**전송 중 암호화를 활성화하려면**

1. 다음 파라미터를 사용하여 전송 암호화 모드를 `preferred`(으)로 설정
   + **--transit-encryption-enabled** - 필수입니다.
   + **--transit-encryption-mode** - `preferred`(으)로 설정해야 합니다.

1. 다음 파라미터를 사용하여 전송 암호화 모드를 `required`(으)로 설정합니다.
   + **--transit-encryption-enabled** - 필수입니다.
   + **--transit-encryption-mode** - `required`(으)로 설정해야 합니다.

# valkey-cli를 사용하여 전송 중 암호화를 통해 ElastiCache(Valkey) 또는 Amazon ElastiCache for Redis OSS에 연결
<a name="connect-tls"></a>

전송 중 암호화가 활성화된 ElastiCache for Redis OSS 캐시에서 데이터에 액세스하려면 Secure Sockets Layer(SSL)로 작업하는 클라이언트를 사용해야 합니다. 또한 Amazon Linux 및 Amazon Linux 2에서 TLS/SSL과 함께 valkey-cli를 사용할 수 있습니다. 클라이언트가 TLS를 지원하지 않는 경우 클라이언트 호스트에서 `stunnel` 명령을 사용하여 Redis OSS 노드에 SSL 터널을 생성할 수 있습니다.

## Linux를 사용한 암호화된 연결
<a name="connect-tls.linux"></a>

valkey-cli를 사용하여 Amazon Linux 2 또는 Amazon Linux에서 전송 중 암호화가 활성화된 Valkey 또는 Redis OSS 클러스터에 연결하려면 다음 단계를 따르세요.

1. valkey-cli 유틸리티를 다운로드하고 컴파일합니다. 이 유틸리티는 Valkey 소프트웨어 배포에 포함되어 있습니다.

1. EC2 인스턴스의 명령 프롬프트에 사용 중인 Linux 버전에 적합한 명령을 입력합니다.

   ** Amazon Linux 2**

   Amazon Linux 2를 사용하는 경우 다음을 입력합니다.

   ```
   sudo yum -y install openssl-devel gcc
   wget https://github.com/valkey-io/valkey/archive/refs/tags/7.2.6.tar.gz
   tar xvzf valkey-7.2.6.tar.gz
   cd valkey-7.2.6
   make distclean
   make valkey-cli BUILD_TLS=yes
   sudo install -m 755 src/valkey-cli /usr/local/bin/
   ```

   **Amazon Linux** – 

   Amazon Linux를 사용하는 경우 다음을 입력합니다.

   ```
   sudo yum install gcc jemalloc-devel openssl-devel tcl tcl-devel clang wget
   wget https://github.com/valkey-io/valkey/archive/refs/tags/8.0.0.tar.gz
   tar xvzf valkey-8.0.0.tar.gz
   cd valkey-8.0.0
   make valkey-cli CC=clang BUILD_TLS=yes
   sudo install -m 755 src/valkey-cli /usr/local/bin/
   ```

   Amazon Linux에서 다음 추가 단계를 실행해야 할 수도 있습니다.

   ```
   sudo yum install clang
   CC=clang make
   sudo make install
   ```

1. valkey-cli 유틸리티를 다운로드하고 설치한 후에는 선택적 `make-test` 명령을 실행하는 것이 좋습니다.

1. 암호화 및 인증이 활성화된 클러스터에 연결하려면 다음 명령을 입력합니다.

   ```
   valkey-cli -h Primary or Configuration Endpoint --tls -a 'your-password' -p 6379
   ```
**참고**  
Amazon Linux 2023에 redis6을 설치하는 경우 이제 `valkey-cli` 대신 `redis6-cli` 명령을 사용할 수 있습니다.  

   ```
   redis6-cli -h Primary or Configuration Endpoint --tls -p 6379
   ```

## stunnel을 사용한 암호화된 연결
<a name="connect-tls.stunnel"></a>

valkey-cli를 사용하여 stunnel을 통한 전송 중 데이터 암호화가 활성화된 Redis OSS 클러스터에 연결하려면 다음 단계를 따르세요.

1. SSH를 사용하여 클라이언트에 연결하고 `stunnel`을 설치합니다.

   ```
   sudo yum install stunnel
   ```

1. `'/etc/stunnel/valkey-cli.conf'` 파일을 생성하는 동시에 편집하기 위한 다음 명령을 실행하여 ElastiCache for Redis OSS 클러스터 엔드포인트를 아래 제공된 출력을 템플릿으로 사용하여 1개 이상의 연결 파라미터에 추가하세요.

   ```
   vi /etc/stunnel/valkey-cli.conf
   
   				
   fips = no
   setuid = root
   setgid = root
   pid = /var/run/stunnel.pid
   debug = 7 
   delay = yes
   options = NO_SSLv2
   options = NO_SSLv3
   [valkey-cli]
      client = yes
      accept = 127.0.0.1:6379
      connect = primary.ssltest.wif01h.use1.cache.amazonaws.com:6379
   [valkey-cli-replica]
      client = yes
      accept = 127.0.0.1:6380
      connect = ssltest-02.ssltest.wif01h.use1.cache.amazonaws.com:6379
   ```

   이 예에서는 구성 파일에 두 가지 연결, 즉 `valkey-cli`와 `valkey-cli-replica`가 있습니다. 파라미터는 다음과 같이 설정되어 있습니다.
   + **client**는 이 stunnel 인스턴스를 클라이언트로 지정하기 위해 yes로 설정되어 있습니다.
   + **accept**는 클라이언트 IP로 설정되어 있습니다. 이 예에서는 프라이머리 노드가 Redis OSS 기본인 포트 6379의 127.0.0.1로 설정되어 있습니다. 복제본은 다른 포트를 호출해야 하며 6380으로 설정되어야 합니다. 휘발성 포트 1024\$165535를 사용할 수 있습니다. 자세한 내용은 *Amazon VPC 사용 설명서*의 [휘발성 포트](https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_ACLs.html#VPC_ACLs_Ephemeral_Ports) 섹션을 참조하세요.
   + **연결**은 Redis 서버 엔드포인트로 설정되어 있습니다. 자세한 내용은 [ElastiCache에서 연결 엔드포인트 찾기](Endpoints.md) 섹션을 참조하세요.

1. Start `stunnel`.

   ```
   sudo stunnel /etc/stunnel/valkey-cli.conf
   ```

   `netstat` 명령을 사용하여 터널이 시작되었는지 확인합니다.

   ```
   sudo netstat -tulnp | grep -i stunnel
   				
   tcp        0      0 127.0.0.1:6379              0.0.0.0:*                   LISTEN      3189/stunnel        
   tcp        0      0 127.0.0.1:6380              0.0.0.0:*                   LISTEN      3189/stunnel
   ```

1. 터널의 로컬 엔드포인트를 사용하여 암호화된 Redis OSS 노드에 연결합니다.
   + ElastiCache for Redis OSS 클러스터 생성 중 AUTH 암호를 사용하지 않은 경우, 이 예에서는 Amazon Linux에서 valkey-cli에 대한 완전한 경로로 ElastiCache for Redis OSS 서버에 연결하기 위해 valkey-cli를 사용합니다.

     ```
     /home/ec2-user/redis-7.2.5/src/valkey-cli -h localhost -p 6379
     ```

     Redis OSS 클러스터 생성 중 AUTH 암호가 사용된 경우 이 예에서는 Amazon Linux에서 valkey-cli에 대한 완전한 경로로 Redis OSS 서버에 연결하기 위해 valkey-cli를 사용합니다.

     ```
      /home/ec2-user/redis-7.2.5/src/valkey-cli -h localhost -p 6379 -a my-secret-password
     ```

   OR
   + redis-7.2.5로 디렉토리를 변경하고 다음을 수행합니다.

     ElastiCache for Redis OSS 클러스터 생성 중 AUTH 암호를 사용하지 않은 경우, 이 예에서는 Amazon Linux에서 valkey-cli에 대한 완전한 경로로 ElastiCache for Redis OSS 서버에 연결하기 위해 valkey-cli를 사용합니다.

     ```
     src/valkey-cli -h localhost -p 6379
     ```

     Redis OSS 클러스터 생성 중 AUTH 암호가 사용된 경우 이 예에서는 Amazon Linux에서 valkey-cli에 대한 완전한 경로로 Valkey 또는 Redis OSS 서버에 연결하기 위해 valkey-cli를 사용합니다.

     ```
     src/valkey-cli -h localhost -p 6379 -a my-secret-password	
     ```

   이 예에서는 Telnet을 사용하여 Valkey Redis OSS 서버에 연결합니다.

   ```
   telnet localhost 6379
   			
   Trying 127.0.0.1...
   Connected to localhost.
   Escape character is '^]'.
   auth MySecretPassword
   +OK
   get foo
   $3
   bar
   ```

1. SSL 터널을 중단하고 닫으려면 stunnel 프로세스를 `pkill`합니다.

   ```
   sudo pkill stunnel
   ```

# Python을 사용하여 노드 기반 Redis OSS 클러스터에서 전송 중 데이터 암호화 활성화
<a name="in-transit-encryption-enable-python"></a>

다음 가이드에서는 원래 전송 중 데이터 암호화가 비활성화된 상태로 생성된 Redis OSS 7.0 클러스터에서 전송 중 데이터 암호화를 활성화하는 방법을 보여줍니다. TCP 및 TLS 클라이언트는 이 프로세스 동안 가동 중지 시간 없이 클러스터와 계속 통신합니다.

Boto3는 환경 변수에서 필요한 보안 인증 정보(`aws_access_key_id`, `aws_secret_access_key` 및 `aws_session_token`)를 가져옵니다. 이러한 보안 인증 정보는 이 가이드에 표시된 Python 코드를 처리하기 위해 `python3`를 실행할 동일한 bash 터미널에 미리 붙여넣어집니다. 아래 예제의 코드는 ElastiCache Redis OSS 클러스터를 생성하는 데 사용될 동일한 VPC에서 시작된 EC2 인스턴스에서 처리된 코드입니다.

**참고**  
다음 예에서는 boto3 SDK for ElastiCache 관리 작업(클러스터 또는 사용자 생성)과 데이터 처리를 위한 redis-py/redis-py-cluster를 사용합니다.
클러스터 수정 API와 함께 온라인 TLS 마이그레이션을 사용하려면 최소한 boto3 버전 (=\$1) 1.26.39를 사용해야 합니다.
ElastiCache는 Valkey 버전 7.2 이상 또는 Redis OSS 버전 7.0 이상의 클러스터에 대해서만 온라인 TLS 마이그레이션을 지원합니다. 따라서 7.0 이전의 Redis OSS 버전을 실행하는 클러스터가 있는 경우 클러스터의 Redis OSS 버전을 업그레이드해야 합니다. 버전 차이에 대한 자세한 내용은 [메이저 엔진 버전 동작 및 Redis OSS와의 호환성 차이](VersionManagementConsiderations.md) 섹션을 참조하세요.

**Topics**
+ [ElastiCache Valkey 또는 Redis OSS 클러스터를 시작할 문자열 상수를 정의합니다.](#enable-python-define-constants)
+ [클러스터 구성을 위한 클래스를 정의합니다.](#enable-python-define-classes)
+ [클러스터 자체를 나타내는 클래스를 정의합니다.](#enable-python-define-classes-cluster)
+ [(선택 사항) Valkey 또는 Redis OSS 클러스터에 대한 클라이언트 연결을 시연하는 래퍼 클래스 생성](#enable-python-create-wrapper)
+ [전송 중 데이터 암호화 구성 변경 프로세스를 시연하는 기본 함수 생성](#enable-python-main-function)

## ElastiCache Valkey 또는 Redis OSS 클러스터를 시작할 문자열 상수를 정의합니다.
<a name="enable-python-define-constants"></a>

먼저 , `security-group` `Cache Subnet group`및와 같이 ElastiCache 클러스터를 생성하는 데 필요한AWS엔터티의 이름을 포함하는 몇 가지 간단한 Python 문자열 상수를 정의해 보겠습니다`default parameter group`. 이러한 모든AWS엔터티는 사용하려는 리전의AWS계정에 미리 생성해야 합니다.

```
#Constants definitions 
SECURITY_GROUP = "sg-0492aa0a29c558427"
CLUSTER_DESCRIPTION = "This cluster has been launched as part of the online TLS migration user guide"
EC_SUBNET_GROUP = "client-testing"
DEFAULT_PARAMETER_GROUP_REDIS_7_CLUSTER_MODE_ENABLED = "default.redis7.cluster.on"
```

## 클러스터 구성을 위한 클래스를 정의합니다.
<a name="enable-python-define-classes"></a>

이제 클러스터의 구성을 나타내는 몇 가지 간단한 Python 클래스를 정의해 보겠습니다. 이 클래스에는 Valkey 또는 Redis OSS 버전, 인스턴스 유형, 전송 중 데이터 암호화(TLS) 활성화 또는 비활성화 여부와 같은 클러스터에 대한 메타데이터가 보관됩니다.

```
#Class definitions

class Config:
    def __init__(
        self,
        instance_type: str = "cache.t4g.small",
        version: str = "7.0",
        multi_az: bool = True,
        TLS: bool = True,
        name: str = None,
    ):
        self.instance_type = instance_type
        self.version = version
        self.multi_az = multi_az
        self.TLS = TLS
        self.name = name or f"tls-test"

    def create_base_launch_request(self):
        return {
            "ReplicationGroupId": self.name,
            "TransitEncryptionEnabled": self.TLS,
            "MultiAZEnabled": self.multi_az,
            "CacheNodeType": self.instance_type,
            "Engine": "redis",
            "EngineVersion": self.version,
            "CacheSubnetGroupName": EC_SUBNET_GROUP ,
            "CacheParameterGroupName": DEFAULT_PARAMETER_GROUP_REDIS_7_CLUSTER_MODE_ENABLED ,
            "ReplicationGroupDescription": CLUSTER_DESCRIPTION,
            "SecurityGroupIds": [SECURITY_GROUP],
        }
        
class ConfigCME(Config):
    def __init__(
        self,
        instance_type: str = "cache.t4g.small",
        version: str = "7.0",
        multi_az: bool = True,
        TLS: bool = True,
        name: str = None,
        num_shards: int = 2,
        num_replicas_per_shard: int = 1,
    ):
        super().__init__(instance_type, version, multi_az, TLS, name)
        self.num_shards = num_shards
        self.num_replicas_per_shard = num_replicas_per_shard

    def create_launch_request(self) -> dict:
        launch_request = self.create_base_launch_request()
        launch_request["NumNodeGroups"] = self.num_shards
        launch_request["ReplicasPerNodeGroup"] = self.num_replicas_per_shard
        return launch_request
```

## 클러스터 자체를 나타내는 클래스를 정의합니다.
<a name="enable-python-define-classes-cluster"></a>

이제 ElastiCache Valkey 또는 Redis OSS 클러스터 자체를 나타내는 몇 가지 간단한 Python 클래스를 정의해 보겠습니다. 이 클래스에는 클러스터 생성 및 ElastiCache API 쿼리와 같은 ElastiCache 관리 작업을 위한 boto3 클라이언트가 보관된 클라이언트 필드가 있습니다.

```
import botocore.config
import boto3

# Create boto3 client
def init_client(region: str = "us-east-1"):
    config = botocore.config.Config(retries={"max_attempts": 10, "mode": "standard"})
    init_request = dict()
    init_request["config"] = config
    init_request["service_name"] = "elasticache"
    init_request["region_name"] = region
    return boto3.client(**init_request) 
 
 
class ElastiCacheClusterBase:
    def __init__(self, name: str):
        self.name = name
        self.elasticache_client = init_client()

    def get_first_replication_group(self):
        return self.elasticache_client.describe_replication_groups(
        ReplicationGroupId=self.name
        )["ReplicationGroups"][0]
 
    def get_status(self) -> str:
        return self.get_first_replication_group()["Status"]
 
    def get_transit_encryption_enabled(self) -> bool:
        return self.get_first_replication_group()["TransitEncryptionEnabled"]
 
    def is_available(self) -> bool:
        return self.get_status() == "available"
        
    def is_modifying(self) -> bool:
        return self.get_status() == "modifying"
        
    def wait_for_available(self):
        while True:
            if self.is_available():
                break
            else:
                time.sleep(5)

    def wait_for_modifying(self):
        while True:
            if self.is_modifying():
                break
            else:
                time.sleep(5)
                
    def delete_cluster(self) -> bool:
        self.elasticache_client.delete_replication_group(
            ReplicationGroupId=self.name, RetainPrimaryCluster=False
        )
        
    def modify_transit_encryption_mode(self, new_transit_encryption_mode: str):
        # generate api call to migrate the cluster to TLS preffered or to TLS required
            self.elasticache_client.modify_replication_group(
                ReplicationGroupId=self.name,
                TransitEncryptionMode=new_transit_encryption_mode,
                TransitEncryptionEnabled=True,
                ApplyImmediately=True,
            )  
        self.wait_for_modifying()
              
 class ElastiCacheClusterCME(ElastiCacheClusterBase):
    def __init__(self, name: str):
        super().__init__(name)

    @classmethod
    def launch(cls, config: ConfigCME = None) -> ElastiCacheClusterCME:
        config = config or ConfigCME()
        print(config)
        new_cluster = ElastiCacheClusterCME(config.name)
        launch_request = config.create_launch_request()
        new_cluster.elasticache_client.create_replication_group(**launch_request)
        new_cluster.wait_for_available()
        return new_cluster

    def get_configuration_endpoint(self) -> str:
        return self.get_first_replication_group()["ConfigurationEndpoint"]["Address"]
     
#Since the code can throw exceptions, we define this class to make the code more readable and 
#so we won't forget to delete the cluster    
class ElastiCacheCMEManager:
    def __init__(self, config: ConfigCME = None):
        self.config = config or ConfigCME()

    def __enter__(self) -> ElastiCacheClusterCME:
        self.cluster = ElastiCacheClusterCME.launch(self.config)
        return self.cluster 
          
    def __exit__(self, exc_type, exc_val, exc_tb):
        self.cluster.delete_cluster()
```

## (선택 사항) Valkey 또는 Redis OSS 클러스터에 대한 클라이언트 연결을 시연하는 래퍼 클래스 생성
<a name="enable-python-create-wrapper"></a>

이제 `redis-py-cluster` 클라이언트를 위한 래퍼 클래스를 생성해 보겠습니다. 이 래퍼 클래스는 클러스터를 일부 키로 미리 채운 다음 무작위로 반복되는 `get` 명령을 수행하는 것을 지원합니다.

**참고**  
이 단계는 선택 사항이지만 이후 단계에 나오는 기본 함수의 코드를 단순화합니다.

```
import redis
improt random
from time import perf_counter_ns, time


class DowntimeTestClient:
    def __init__(self, client):
        self.client = client

        # num of keys prefilled
        self.prefilled = 0
        # percent of get above prefilled
        self.percent_get_above_prefilled = 10 # nil result expected when get hit above prefilled
        # total downtime in nano seconds 
        self.downtime_ns = 0
        # num of success and fail operations
        self.success_ops = 0
        self.fail_ops = 0
        self.connection_errors = 0
        self.timeout_errors = 0
        

    def replace_client(self, client):
        self.client = client

    def prefill_data(self, timelimit_sec=60):
        end_time = time() + timelimit_sec
        while time() < end_time:
            self.client.set(self.prefilled, self.prefilled)
            self.prefilled += 1

    # unsuccesful operations throw exceptions
    def _exec(self, func):
        try:
            start_ns = perf_counter_ns()
            func()
            self.success_ops += 1
            elapsed_ms = (perf_counter_ns() - start_ns) // 10 ** 6
            # upon succesful execution of func
            # reset random_key to None so that the next command
            # will use a new random key
            self.random_key = None

        except Exception as e:
            elapsed_ns = perf_counter_ns() - start_ns
            self.downtime_ns += elapsed_ns
            # in case of failure- increment the relevant counters so that we will keep track 
            # of how many connection issues we had while trying to communicate with
            # the cluster.
            self.fail_ops += 1
            if e.__class__ is redis.exceptions.ConnectionError:
                self.connection_errors += 1
            if e.__class__ is redis.exceptions.TimeoutError:
                self.timeout_errors += 1

    def _repeat_exec(self, func, seconds):
        end_time = time() + seconds
        while time() < end_time:
            self._exec(func)

    def _new_random_key_if_needed(self, percent_above_prefilled):
        if self.random_key is None:
            max = int((self.prefilled * (100 + percent_above_prefilled)) / 100)
            return random.randint(0, max)
        return self.random_key

    def _random_get(self):
        key = self._new_random_key_if_needed(self.percent_get_above_prefilled)
        result = self.client.get(key)
        # we know the key was set for sure only in the case key < self.prefilled
        if key < self.prefilled:
            assert result.decode("UTF-8") == str(key)


    def repeat_get(self, seconds=60):
        self._repeat_exec(self._random_get, seconds)

    def get_downtime_ms(self) -> int:
        return self.downtime_ns // 10 ** 6


    def do_get_until(self, cond_check):
        while not cond_check():
            self.repeat_get()
        # do one more get cycle once condition is met
        self.repeat_get()
```

## 전송 중 데이터 암호화 구성 변경 프로세스를 시연하는 기본 함수 생성
<a name="enable-python-main-function"></a>

이제 다음을 수행하는 기본 함수를 정의해 보겠습니다.

1. boto3 ElastiCache 클라이언트를 사용하여 클러스터를 생성합니다.

1. TLS 없이 명확한 TCP 연결로 클러스터에 연결할 `redis-py-cluster` 클라이언트를 초기화합니다.

1. `redis-py-cluster` 클라이언트는 클러스터를 일부 데이터로 미리 채웁니다.

1. boto3 클라이언트는 비 TLS에서 TLS 선호로의 TLS 마이그레이션을 트리거합니다.

1. 클러스터를 `Preferred` TLS로 마이그레이션하는 동안 `redis-py-cluster` TCP 클라이언트는 마이그레이션이 완료될 때까지 클러스터에 반복 `get` 작업을 전송합니다.

1. TLS `Preferred`로의 마이그레이션이 완료되면 클러스터가 전송 중 데이터 암호화를 지원하는지 확인합니다. 그런 다음 TLS를 사용하여 클러스터에 연결할 `redis-py-cluster` 클라이언트를 생성합니다.

1. 새 TLS 클라이언트와 이전 TCP 클라이언트를 사용하여 몇 가지 `get` 명령을 보내겠습니다.

1. boto3 클라이언트는 TLS `Preferred`에서 TLS 필수로의 TLS 마이그레이션을 트리거합니다.

1. 클러스터를 TLS로 마이그레이션하는 동안 redis-py-cluster TCP 클라이언트는 마이그레이션이 완료될 때까지 클러스터에 반복 `get` 작업을 전송합니다.

```
import redis

def init_cluster_client(
    cluster: ElastiCacheClusterCME, prefill_data: bool, TLS: bool = True) -> DowntimeTestClient:
    # we must use for the host name the cluster configuration endpoint. 
    redis_client = redis.RedisCluster(
        host=cluster.get_configuration_endpoint(), ssl=TLS, socket_timeout=0.25, socket_connect_timeout=0.1
    )
    test_client = DowntimeTestClient(redis_client)
    if prefill_data:
        test_client.prefill_data()
    return test_client

if __name__ == '__main__':
    config = ConfigCME(TLS=False, instance_type="cache.m5.large")

    with ElastiCacheCMEManager(config) as cluster:
        # create a client that will connect to the cluster with clear tcp connection
        test_client_tcp = init_cluster_client(cluster, prefill_data=True, TLS=False)
        
       # migrate the cluster to TLS Preferred
        cluster.modify_transit_encryption_mode(new_transit_encryption_mode="preferred")
        
        # do repeated get commands until the cluster finishes the migration to TLS Preferred
        test_client_tcp.do_get_until(cluster.is_available)
        
       # verify that in transit encryption is enabled so that clients will be able to connect to the cluster with TLS
        assert cluster.get_transit_encryption_enabled() == True
        
       # create a client that will connect to the cluster with TLS connection. 
        # we must first make sure that the cluster indeed supports TLS
        test_client_tls = init_cluster_client(cluster, prefill_data=True, TLS=True)
        
        # by doing get commands with the tcp client for 60 more seconds
       # we can verify that the existing tcp connection to the cluster still works 
        test_client_tcp.repeat_get(seconds=60)
        
        # do get commands with the new TLS client for 60 more seconds
        test_client_tcp.repeat_get(seconds=60)
        
       # migrate the cluster to TLS required
        cluster.modify_transit_encryption_mode(new_transit_encryption_mode="required")
        
       # from this point the tcp clients will be disconnected and we must not use them anymore.
       # do get commands with the TLS client until the cluster finishes migartion to TLS required mode.
        test_client_tls.do_get_until(cluster.is_available)
```

# 전송 중 암호화 활성화 시 모범 사례
<a name="enable-python-best-practices"></a>

## 전송 중 데이터 암호화를 활성화하기 전: DNS 레코드를 올바르게 처리했는지 확인하세요.
<a name="enable-python-best-practices-before"></a>

**참고**  
이 프로세스에서 기존 엔드포인트를 변경 및 삭제합니다. 엔드포인트를 잘못 사용하면 Valkey 또는 Redis OSS 클라이언트가 이전 엔드포인트 및 삭제된 엔드포인트를 사용하여 클러스터에 연결하지 못하게 될 수 있습니다.

클러스터가 TLS가 지원되지 않는 상태에서 TLS 선호로 마이그레이션되는 동안 이전 클러스터 구성 엔드포인트 DNS 레코드가 유지되고 새 클러스터 구성 엔드포인트 DNS 레코드가 다른 형식으로 생성됩니다. TLS 지원 클러스터는 TLS가 지원되지 않는 클러스터와 다른 형식의 DNS 레코드를 사용합니다. ElastiCache는 클러스터가 암호화 모드: `encryption mode: Preferred`로 구성될 때 애플리케이션 및 다른 Valkey 또는 Redis OSS 클라이언트가 둘 사이를 전환할 수 있도록 두 DNS 레코드를 모두 보관합니다. DNS 레코드의 다음 변경 사항은 TLS 마이그레이션 프로세스 중에 발생합니다.

### 전송 중 데이터 암호화를 활성화할 때 발생하는 DNS 레코드의 변경 사항에 대한 설명
<a name="enable-python-best-practices-before-desc"></a>

**CME 클러스터의 경우**

클러스터가 '전송 암호화 모드: 선호'로 설정된 경우:
+ TLS가 지원되지 않는 클러스터의 원래 클러스터 구성 엔드포인트는 활성 상태로 유지됩니다. 클러스터를 TLS 암호화 모드 '없음'에서 '선호'로 재구성해도 가동 중지가 발생하지 않습니다.
+ 클러스터를 TLS 선호 모드로 설정하면 새 TLS Valkey 또는 Redis OSS 엔드포인트가 생성됩니다. 이러한 새 엔드포인트는 이전 엔드포인트와 동일한 IP(비 TLS)로 변환됩니다.
+ 새로운 TLS Valkey 또는 Redis OSS 구성 엔드포인트는 ElastiCache 콘솔에서 및 `describe-replication-group` API에 대한 응답으로 노출됩니다.

클러스터가 '전송 암호화 모드: 필수'로 설정된 경우:
+ TLS가 지원되지 않는 이전 엔드포인트는 삭제됩니다. TLS 클러스터 엔드포인트의 가동 중지는 없습니다.
+ ElastiCache 콘솔 또는 `describe-replication-group` API에서 새 `cluster-configuration-endpoint`를 검색할 수 있습니다.

**자동 장애 조치가 활성화되었거나 자동 장애 조치가 비활성화된 CMD 클러스터의 경우**

복제 그룹이 '전송 암호화 모드: 선호'로 설정된 경우:
+ TLS가 지원되지 않는 클러스터의 원래 프라이머리 엔드포인트 및 리더 엔드포인트는 활성 상태로 유지됩니다.
+ 클러스터를 TLS `Preferred` 모드로 설정하면 새 TLS 프라이머리 및 리더 엔드포인트가 생성됩니다. 이 새 엔드포인트는 이전 엔드포인트와 동일한 IP(TLS 없음)로 변환됩니다.
+ 새로운 프라이머리 엔드포인트 및 리더 엔드포인트는 ElastiCache 콘솔에서 및 `describe-replication-group` API에 대한 응답으로 노출됩니다.

복제 그룹이 '전송 암호화 모드: 필수'로 설정된 경우:
+ 기존의 비 TLS 프라이머리 엔드포인트와 리더 엔드포인트는 삭제됩니다. TLS 클러스터 엔드포인트의 가동 중지는 없습니다.
+ ElastiCache 콘솔 또는 `describe-replication-group` API에서 새 프라이머리 엔드포인트 및 리더 엔드포인트를 검색할 수 있습니다.

### DNS 레코드의 권장 사용
<a name="enable-python-best-practices-before-usage"></a>

**CME 클러스터의 경우 **
+ 애플리케이션 코드에서 노드별 DNS 레코드 대신 클러스터 구성 엔드포인트를 사용하세요. 노드별 DNS 이름을 직접 사용하는 것은 권장되지 않습니다. 마이그레이션 중에 DNS 이름이 변경되고 애플리케이션 코드가 클러스터에 대한 연결을 끊기 때문입니다.
+ 클러스터 구성 엔드포인트는 이 프로세스 중에 변경되므로 애플리케이션에서 클러스터 구성 엔드포인트를 하드코딩하지 마세요.
+ 클러스터 구성 엔드포인트는 이 프로세스 중에 변경될 수 있으므로 애플리케이션에서 클러스터 구성 엔드포인트를 하드코딩하는 것은 좋지 않습니다. 전송 중 데이터 암호화가 완료된 후 `describe-replication-group` API로 클러스터 구성 엔드포인트를 쿼리하고(위에 굵게 표시) 이 시점부터 응답으로 받은 DNS를 사용하세요.

**자동 장애 조치가 활성화된 CMD 클러스터의 경우 **
+ 비 TLS에서 TLS 선호로 클러스터를 마이그레이션할 때 이전 노드별 DNS 이름이 삭제되고 새 이름이 생성되므로 애플리케이션 코드에서 노드별 DNS 이름 대신 프라이머리 엔드포인트와 리더 엔드포인트를 사용하세요. 향후 클러스터에 복제본을 추가할 수 있으므로 노드별 DNS 이름을 직접 사용하는 것은 권장되지 않습니다. 또한 자동 장애 조치가 활성화되면 프라이머리 클러스터 및 복제본의 역할이 ElastiCache 서비스에 의해 자동으로 변경됩니다. 이러한 변경 사항을 추적하는 데 도움이 되도록 프라이머리 엔드포인트와 리더 엔드포인트를 사용하는 것이 좋습니다. 마지막으로 리더 엔드포인트를 사용하면 복제본의 읽기를 클러스터의 복제본 간에 균등하게 분산하는 데 도움이 됩니다.
+ TLS 마이그레이션 프로세스 중에 변경될 수 있으므로 애플리케이션에서 프라이머리 엔드포인트와 리더 엔드포인트를 하드코딩하는 것은 좋지 않습니다. TLS 선호로의 마이그레이션 변경이 완료되면 describe-replication-group API를 사용하여 프라이머리 엔드포인트 및 리더 엔드포인트를 쿼리하고 이 시점부터 응답으로 받은 DNS를 사용하세요. 이렇게 하면 엔드포인트의 변경 사항을 동적으로 추적할 수 있습니다.

**자동 장애 조치가 비활성화된 CMD 클러스터의 경우 **
+ 애플리케이션 코드에서 노드별 DNS 이름 대신 프라이머리 엔드포인트와 리더 엔드포인트를 사용하세요. 자동 장애 조치가 비활성화되면 자동 장애 조치가 활성화되었을 때 ElastiCache 서비스에서 자동으로 관리되는 크기 조정, 패치, 장애 조치 및 기타 절차를 사용자가 대신 수행합니다. 이렇게 하면 여러 엔드포인트를 쉽게 수동으로 추적할 수 있습니다. 비 TLS에서 TLS 선호로 클러스터를 마이그레이션할 때 이전 노드별 DNS 이름이 삭제되고 새 이름이 생성되므로 노드별 DNS 이름을 직접 사용하지 마세요. 이는 TLS 마이그레이션 중에 클라이언트가 클러스터에 연결할 수 있도록 하기 위한 필수 사항입니다. 또한 리더 엔드포인트를 사용할 때 복제본 간에 읽기를 균등하게 분산하고 클러스터에서 복제본을 추가하거나 삭제할 때 DNS 레코드를 추적할 수 있다는 이점이 있습니다.
+ 클러스터 구성 엔드포인트는 TLS 마이그레이션 프로세스 중에 변경될 수 있으므로 애플리케이션에서 클러스터 구성 엔드포인트를 하드코딩하는 것은 좋지 않습니다.

## 전송 중 데이터 암호화 중: 마이그레이션 프로세스가 언제 완료되는지에 주의 기울이기
<a name="enable-python-best-practices-during"></a>

전송 중 데이터 암호화 모드 변경은 즉시 이루어지지 않으며 시간이 좀 걸릴 수 있습니다. 대규모 클러스터의 경우 특히 그렇습니다. 클러스터가 TLS 선호로 마이그레이션을 완료한 후에만 TCP 연결과 TLS 연결을 모두 수락하고 제공할 수 있습니다. 따라서 전송 중 데이터 암호화가 완료될 때까지 클러스터에 TLS 연결을 설정하려고 시도하는 클라이언트를 생성해서는 안 됩니다.

전송 중 데이터 암호화가 성공적으로 완료되거나 실패했을 때 알림을 받는 방법에는 다음과 같은 여러 가지가 있습니다(위 코드 예에는 표시되지 않음).
+ SNS 서비스를 사용하여 암호화 완료 시 알림 받기
+ 암호화가 완료될 때 이벤트를 발생시키는 `describe-events` API 사용
+ ElastiCache 콘솔에서 암호화가 완료되었다는 메시지 확인

또한 애플리케이션에 로직을 구현하여 암호화가 완료되었는지 확인할 수 있습니다. 위의 예에서는 클러스터가 마이그레이션을 완료하도록 하는 몇 가지 방법을 살펴보았습니다.
+ 마이그레이션 프로세스가 시작될 때까지 대기(클러스터 상태가 ‘수정 중’으로 변경됨) 및 수정이 완료될 때까지 대기(클러스터 상태가 다시 ‘사용 가능’으로 변경됨)
+ `describe-replication-group` API를 쿼리하여 클러스터의 `transit_encryption_enabled`가 True로 설정되었는지 확인.

### 전송 중 데이터 암호화를 활성화한 후: 사용하는 클라이언트가 올바르게 구성되었는지 확인
<a name="enable-python-best-practices-after"></a>

클러스터가 TLS 선호 모드에 있는 동안 애플리케이션은 클러스터에 대한 TLS 연결을 열고 해당 연결만 사용해야 합니다. 이렇게 하면 전송 중 데이터 암호화를 활성화할 때 애플리케이션이 가동 중지를 겪지 않습니다. SSL 섹션 아래의 info 명령을 사용하여 Valkey 또는 Redis OSS 엔진에 대한 보다 명확한 TCP 연결이 없는지 확인할 수 있습니다.

```
# SSL
ssl_enabled:yes
ssl_current_certificate_not_before_date:Mar 20 23:27:07 2017 GMT
ssl_current_certificate_not_after_date:Feb 24 23:27:07 2117 GMT
ssl_current_certificate_serial:D8C7DEA91E684163
tls_mode_connected_tcp_clients:0   (should be zero)
tls_mode_connected_tls_clients:100
```

## Openssl을 사용하여 전송 중 데이터 암호화가 사용 설정된 노드에 연결(Memcached)
<a name="in-transit-encryption-connect-mc"></a>

전송 중 데이터 암호화가 사용 설정된 ElastiCache for Memcached 노드에서 데이터에 액세스하려면 Secure Sockets Layer(SSL)에서 작업하는 클라이언트를 사용해야 합니다. 또한 Amazon Linux 및 Amazon Linux 2에서 Openssl s\$1client를 사용할 수 있습니다.

Openssl s\$1client를 사용하여 Amazon Linux 2 또는 Amazon Linux에서 전송 중 데이터 암호화가 사용 설정된 Memcached 클러스터에 연결하려면 다음을 수행합니다.

```
/usr/bin/openssl s_client -connect memcached-node-endpoint:memcached-port
```

## Java를 사용하여 TLS Memcached 클라이언트 생성
<a name="in-transit-encryption-connect-java"></a>

TLS 모드로 클라이언트를 생성하려면 다음을 수행하여 적절한 SSLContext를 통해 클라이언트를 초기화합니다.

```
import java.security.KeyStore;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManagerFactory;
import net.spy.memcached.AddrUtil;
import net.spy.memcached.ConnectionFactoryBuilder;
import net.spy.memcached.MemcachedClient;
public class TLSDemo {
    public static void main(String[] args) throws Exception {
        ConnectionFactoryBuilder connectionFactoryBuilder = new ConnectionFactoryBuilder();
        // Build SSLContext
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        tmf.init((KeyStore) null);
        SSLContext sslContext = SSLContext.getInstance("TLS");
        sslContext.init(null, tmf.getTrustManagers(), null);
        // Create the client in TLS mode
        connectionFactoryBuilder.setSSLContext(sslContext);
        MemcachedClient client = new MemcachedClient(connectionFactoryBuilder.build(), AddrUtil.getAddresses("mycluster.fnjyzo.cfg.use1.cache.amazonaws.com:11211"));

        // Store a data item for an hour.
        client.set("theKey", 3600, "This is the data value");
    }
}
```

## PHP를 사용하여 TLS Memcached 클라이언트 생성
<a name="in-transit-encryption-connect-php-mc"></a>

TLS 모드로 클라이언트를 생성하려면 다음을 수행하여 적절한 SSLContext를 통해 클라이언트를 초기화합니다.

```
<?php

/**
 * Sample PHP code to show how to create a TLS Memcached client. In this example we
 * will use the Amazon ElastiCache Auto Descovery feature, but TLS can also be
 * used with a Static mode client. 
 * See Using the ElastiCache Cluster Client for PHP (https://docs.aws.amazon.com/AmazonElastiCache/latest/dg/AutoDiscovery.Using.ModifyApp.PHP.html) for more information 
 * about Auto Discovery and persistent-id.
 */

/* Configuration endpoint to use to initialize memcached client.
 * this is only an example */
$server_endpoint = "mycluster.fnjyzo.cfg.use1.cache.amazonaws.com";

/* Port for connecting to the cluster. 
 * This is only an example     */
$server_port = 11211;

/* Initialize a persistent Memcached client and configure it with the Dynamic client mode  */
$tls_client =  new Memcached('persistent-id');
$tls_client->setOption(Memcached::OPT_CLIENT_MODE, Memcached::DYNAMIC_CLIENT_MODE);

/* Add the memcached's cluster server/s */
$tls_client->addServer($server_endpoint, $server_port);

/* Configure the client to use TLS */
if(!$tls_client->setOption(Memcached::OPT_USE_TLS, 1)) {
    echo $tls_client->getLastErrorMessage(), "\n";
    exit(1);
}

/* Set your TLS context configurations values.
 * See MemcachedTLSContextConfig in memcached-api.php for all configurations */
$tls_config = new MemcachedTLSContextConfig();
$tls_config->hostname = '*.mycluster.fnjyzo.use1.cache.amazonaws.com';
$tls_config->skip_cert_verify = false;
$tls_config->skip_hostname_verify = false;

/* Use the created TLS context configuration object to create OpenSSL's SSL_CTX and set it to your client.
 * Note:  These TLS context configurations will be applied to all the servers connected to this client. */
$tls_client->createAndSetTLSContext((array)$tls_config);

/* test the TLS connection with set-get scenario: */

 /* store the data for 60 seconds in the cluster.
 * The client will decide which cache host will store this item.
 */
if($tls_client->set('key', 'value', 60)) {
    print "Successfully stored key\n";
} else {
    echo "Failed to set key: ", $tls_client->getLastErrorMessage(), "\n";
    exit(1);
}

/* retrieve the key */
if ($tls_client->get('key') === 'value') {
    print "Successfully retrieved key\n";
} else {
    echo "Failed to get key: ", $tls_client->getLastErrorMessage(), "\n";
    exit(1);
}
```

PHP 클라이언트 사용 방법에 관한 자세한 정보는 [PHP용 ElastiCache 클러스터 클라이언트 설치](Appendix.PHPAutoDiscoverySetup.md) 섹션을 참조하세요.

# ElastiCache에서 저장 시 암호화
<a name="at-rest-encryption"></a>

데이터를 안전하게 보관하기 위해 Amazon ElastiCache 및 Amazon S3에서는 캐시의 데이터에 대한 액세스를 제한하는 다른 방식을 제공합니다. 자세한 내용은 [Amazon VPC 및 ElastiCache 보안](VPCs.md) 및 [Amazon ElastiCache의 Identity and Access Management](IAM.md) 섹션을 참조하세요.

ElastiCache의 저장 시 암호화는 디스크의 데이터를 암호화해 데이터 보안을 강화하는 기능입니다. 이 기능은 서버리스 캐시에서 항상 활성화되어 있습니다. 이 기능이 활성화되어 있으면 다음과 같은 항목이 암호화됩니다.
+ 동기화, 백업 및 스왑 작업 중 디스크
+ Amazon S3에 저장된 백업 

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

 ElastiCache는 기본(서비스 관리형) 저장 데이터 암호화와 [AWS Key Management Service(KMS)](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html)에서 자체 대칭 고객 관리형AWS KMS 키를 사용할 수 있는 기능을 제공합니다. 캐시가 백업되면 암호화 옵션에서 기본 암호화 키를 사용할지 또는 고객 관리 키를 사용할지 선택합니다. 자세한 내용은 [저장 데이터 암호화 활성화](#at-rest-encryption-enable) 단원을 참조하십시오.

**중요**  
기존 노드 기반 Valkey 또는 Redis OSS 클러스터에서 저장 시 암호화를 활성화하려면 복제 그룹에서 백업 및 복원을 실행한 **후** 기존 복제 그룹을 삭제해야 합니다.

저장 시 암호화는 캐시를 생성할 때만 캐시에 대해 활성화할 수 있습니다. 데이터를 암호화 및 해독하기 위해 몇 가지 처리가 필요하기 때문에 미사용 데이터 암호화를 활성화하면 이러한 작업 중 성능에 영향이 있을 수 있습니다. 사용 사례에 대한 성능 영향을 파악하기 위해서는 미사용 데이터 암호화를 사용한 상태와 사용하지 않은 상태에서 데이터를 벤치마크해야 합니다.

**Topics**
+ [미사용 데이터 암호화 조건](#at-rest-encryption-constraints)
+ [AWS KMS에서 고객 관리형 키 사용](#using-customer-managed-keys-for-elasticache-security)
+ [저장 데이터 암호화 활성화](#at-rest-encryption-enable)
+ [참고](#at-rest-encryption-see-also)

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

ElastiCache의 미사용 데이터 암호화를 구현하기 위해 계획하는 경우에는 ElastiCache의 미사용 데이터 암호화에 대한 다음 제약을 염두에 둬야 합니다.
+ 저장 중 암호화는 Valkey 7.2 이후 버전 및 Redis OSS 버전(3.2.6, EOL 예정, [Redis OSS 버전 수명 종료 일정](engine-versions.md#deprecated-engine-versions) 참조) 4.0.10 이후에서 실행 중인 복제 그룹에서 지원됩니다.
+ 미사용 데이터 암호화는 Amazon VPC에서 실행 중인 복제 그룹에 대해서만 지원됩니다.
+ 유휴 데이터 암호화는 다음 노드 유형을 실행하는 복제 그룹에 대해서만 지원됩니다.
  + R7g, R6gd, R6g, R5, R4, R3
  + M7g, M6g, M5, M4, M3
  + T4g, T3, T2
  + C7gn

  자세한 내용은 [지원되는 노드 유형](CacheNodes.SupportedTypes.md) 섹션을 참조하세요.
+ 미사용 데이터 암호화는 `AtRestEncryptionEnabled` 파라미터를 명시적으로 `true`로 설정해 활성화합니다.
+ 복제 그룹을 생성하는 경우에만 복제 그룹에 대해 미사용 데이터 암호화를 활성화할 수 있습니다. 복제 그룹을 수정하는 방법으로는 미사용 데이터 암호화 켜기 또는 끄기로 전환할 수 없습니다. 기존 복제 그룹에 대해 미사용 데이터 암호화를 구현하는 방법에 대한 자세한 내용은 [저장 데이터 암호화 활성화](#at-rest-encryption-enable) 섹션을 참조하세요.
+ 클러스터가 r6gd 패밀리의 노드 유형을 사용하는 경우 미사용 데이터 암호화가 활성화되었는지 여부에 관계없이 SSD에 저장된 데이터가 암호화됩니다.
+ 유휴 시 암호화에 고객 관리형 키를 사용하는 옵션은AWS GovCloud(us-gov-east-1 및 us-gov-west-1) 리전에서 사용할 수 없습니다.
+ 클러스터가 r6gd 패밀리의 노드 유형을 사용하는 경우 SSD에 저장된 데이터는 선택한 고객 관리형AWS KMS 키(또는AWS GovCloud 리전의 서비스 관리형 암호화)로 암호화됩니다.
+ Memcached에서 저장 시 암호화는 서버리스 캐시에서만 지원됩니다.
+ Memcached를 사용할 경우,AWS GovCloud(us-gov-east-1 및 us-gov-west-1) 리전에서는 저장된 데이터 암호화를 위한 고객 관리형 키를 사용할 수 없습니다.

미사용 데이터 암호화를 구현하면 백업 및 노드 동기화 작업 중 성능이 저하될 수 있습니다. 이러한 암호화가 구현 성능에 미치는 영향을 확인하려면 미사용 데이터 암호화와 데이터를 암호화하지 않은 경우를 비교해 벤치마크하세요.

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

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

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

ElastiCache를 사용하면AWS KMS와 통합할 수 있습니다. 자세한 내용은 *AWS Key Management Service 개발자 안내서*의 [권한 부여 사용](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html)을 참조하세요. Amazon ElastiCache와AWS KMS 통합을 활성화하는 데는 고객 작업이 필요하지 않습니다.

`kms:ViaService` 조건 키는AWS KMS 키(KMS 키) 사용을 지정된AWS서비스의 요청으로 제한합니다. ElastiCache에서 `kms:ViaService`를 사용하려면 조건 키 `elasticache.AWS_region.amazonaws.com` 및 `dax.AWS_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)을 사용하여 Amazon ElastiCache가 사용자 대신AWS Key Management Service에 전송하는 요청을 추적할 수 있습니다. 고객 관리형 키와AWS Key Management Service관련된에 대한 모든 API 호출에는 해당 CloudTrail 로그가 있습니다. [ListGlants](https://docs.aws.amazon.com/kms/latest/APIReference/API_ListGrants.html) KMS API 호출을 통해 ElastiCache가 생성하는 그랜트를 볼 수도 있습니다.

고객 관리형 키를 사용하여 복제 그룹을 암호화하면 복제 그룹에 대한 모든 백업이 다음과 같이 암호화됩니다.
+ 자동 일일 백업은 클러스터와 연결된 고객 관리형 키를 사용하여 암호화됩니다.
+ 복제 그룹을 삭제할 때 생성된 최종 백업은 복제 그룹에 연결된 고객 관리형 키를 사용하여 암호화됩니다.
+ 수동으로 생성한 백업은 복제 그룹에 연결된 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 루트 키의 속성을 보존하므로 ElastiCache 데이터에 액세스하는 기능에 영향을 주지 않습니다. 암호화된 Amazon ElastiCache 캐시는 새로운 루트 키 생성 및 기존 키에 대한 모든 참조를 업데이트하는 수동 키 교체를 지원하지 않습니다. 자세한 내용은 *AWS Key Management Service 개발자 안내서*의 [AWS KMS 키 교체](https://docs.aws.amazon.com/kms/latest/developerguide/rotate-keys.html)를 참조하세요.
+ KMS 키를 사용하여 ElastiCache 캐시를 암호화하려면 캐시당 1개의 권한이 필요합니다. 이 권한은 캐시의 수명 기간 동안 사용됩니다. 또한 백업 생성 중에는 백업당 하나의 권한이 사용됩니다. 이 권한은 백업이 생성되면 폐기됩니다.
+ AWS KMS 권한 부여 및 제한에 대한 자세한 내용은 *AWS Key Management Service 개발자 안내서*의 [제한을 참조하세요](https://docs.aws.amazon.com/kms/latest/developerguide/limits.html).

## 저장 데이터 암호화 활성화
<a name="at-rest-encryption-enable"></a>

모든 서버리스 캐시에는 저장 시 암호화가 활성화되어 있습니다.

노드 기반 클러스터를 생성할 때 `AtRestEncryptionEnabled` 파라미터를 `true`로 설정하여 저장 시 암호화를 활성화할 수 있습니다. 기존 복제 그룹에 대해서는 미사용 데이터 암호화를 설정할 수 없습니다.

 ElastiCache 캐시를 생성할 때 저장 시 암호화를 활성화할 수 있습니다.AWS CLI, 또는 ElastiCache API AWS Management Console를 사용하여이 작업을 수행할 수 있습니다.

캐시를 생성할 때 다음 옵션 중 하나를 선택할 수 있습니다.
+ **기본값** – 이 옵션은 저장된 서비스 관리 암호화를 사용합니다.
+ **고객 관리형 키 ** -이 옵션을 사용하면 저장 시 암호화를 위해AWS KMS의 키 ID/ARN을 제공할 수 있습니다.

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

**Contents**
+ [를 사용하여 미사용 데이터 암호화 활성화AWS Management Console](#at-rest-encryption-enable-con)
+ [를 사용하여 미사용 데이터 암호화 활성화AWS CLI](#at-rest-encryption-enable-cli)

### 기존 노드 기반 Valkey 또는 Redis OSS 클러스터에 대해 저장 시 암호화 활성화
<a name="at-reset-encryption-enable-existing-cluster"></a>

Valkey 또는 Redis OSS 복제 그룹을 생성할 때에만 미사용 데이터 암호화를 활성화할 수 있습니다. 미사용 데이터 암호화를 활성화하려는 기존 복제 그룹이 있으면 다음 작업을 수행하세요.

**기존 복제 그룹에 대해 미사용 데이터 암호화를 활성화하려면**

1. 기존 복제 그룹의 백업을 수동으로 생성합니다. 자세한 내용은 [수동 백업 지원](backups-manual.md)을 참조하세요.

1. 백업에서 복원하여 새 복제 그룹을 생성합니다. 새 복제 그룹에 대해 미사용 데이터 암호화를 활성화합니다. 자세한 내용은 [백업에서 새 캐시로 복원](backups-restoring.md)을 참조하세요.

1. 새 복제 그룹을 가리키도록 애플리케이션에서 엔드포인트를 업데이트합니다.

1. 이전 복제 그룹을 삭제합니다. 자세한 내용은 [ElastiCache에서 클러스터 삭제](Clusters.Delete.md) 또는 [복제 그룹 삭제](Replication.DeletingRepGroup.md)을 참조하세요.

### 를 사용하여 미사용 데이터 암호화 활성화AWS Management Console
<a name="at-rest-encryption-enable-con"></a>

#### 서버리스 캐시에서 저장 시 암호화 활성화(콘솔)
<a name="at-rest-encryption-enable-con-serverless"></a>

모든 서버리스 캐시에는 저장 시 암호화가 활성화되어 있습니다. 기본적으로AWS소유 KMS 키는 데이터를 암호화하는 데 사용됩니다. 자체AWS KMS키를 선택하려면 다음을 선택합니다.
+ **기본 설정** 섹션을 펼칩합니다.
+ **기본 설정** 섹션에서 **기본 설정 사용자 지정**을 선택합니다.
+ **보안** 섹션에서 **보안 설정 사용자 지정**을 선택합니다.
+ **암호화 키** 설정에서 **고객 관리형 CMK**를 선택합니다.
+ **AWS KMS키** 설정에서 키를 선택합니다.

#### 노드 기반 클러스터에 대해 저장 시 암호화 활성화(콘솔)
<a name="at-rest-encryption-enable-con-self-designed"></a>

자체 캐시를 설계할 때 '간편한 생성' 메서드를 사용하는 '개발 및 테스트' 및 '프로덕션' 구성에서는 **기본** 키를 사용하여 저장 시 암호화가 활성화됩니다. 구성을 직접 선택할 때 다음과 같이 진행합니다.
+ 엔진 버전으로 버전 3.2.6, 4.0.10 또는 이후 버전을 선택합니다.
+ **저장 시 암호화**의 **활성화** 옵션 옆에서 확인란을 클릭합니다.
+ **기본 키** 또는 **고객 관리형 CMK**를 선택합니다.

단계별 절차의 경우 다음을 참조하세요.
+ [Valkey(클러스터 모드 비활성화됨) 클러스터 생성(콘솔)](SubnetGroups.designing-cluster-pre.valkey.md#Clusters.Create.CON.valkey-gs)
+ [Valkey 또는 Redis OSS(클러스터 모드 활성화됨) 클러스터 생성(콘솔)](Clusters.Create.md#Clusters.Create.CON.RedisCluster)

### 를 사용하여 미사용 데이터 암호화 활성화AWS CLI
<a name="at-rest-encryption-enable-cli"></a>

를 사용하여 Valkey 또는 Redis OSS 클러스터를 생성할 때 미사용 데이터 암호화를 활성화하려면 복제 그룹을 생성할 때 *--at-rest-encryption-enabled* 파라미터를AWS CLI사용합니다.

#### Valkey 또는 Redis OSS(클러스터 모드 비활성화됨) 클러스터에 대해 미사용 데이터 암호화 활성화(CLI)
<a name="at-rest-encryption-enable-cli-redis-classic-rg"></a>

다음 작업은 세 개의 노드(*--num-cache-clusters*) 즉, 기본 한 개와 읽기 전용 복제본 두 개가 있는 Valkey 또는 Redis OSS(클러스터 모드 비활성화됨) 복제 그룹 `my-classic-rg`를 생성합니다. 미사용 데이터 암호화가 이 복제 그룹에 대해 활성화되어 있습니다(*--at-rest-encryption-enabled*).

다음 파라미터와 해당 값은 복제 그룹에 대한 암호화를 활성화하는 데 필요합니다.

**키 파라미터**
+ **--engine** - `valkey` 또는 `redis`이어야 합니다.
+ **--engine-version** - 엔진이 Redis OSS인 경우 3.2.6, 4.0.10 또는 그 이상이어야 합니다.
+ **--at-rest-encryption-enabled** - 미사용 데이터 암호화를 활성화하기 위해 필요합니다.

**Example 1: 복제본이 있는 Valkey 또는 Redis OSS(클러스터 모드 비활성화됨) 클러스터**  
Linux, macOS, Unix의 경우:  

```
aws elasticache create-replication-group \
    --replication-group-id my-classic-rg \
    --replication-group-description "3 node replication group" \
    --cache-node-type cache.m4.large \
    --engine redis \    
    --at-rest-encryption-enabled \  
    --num-cache-clusters 3
```
Windows의 경우:  

```
aws elasticache create-replication-group ^
    --replication-group-id my-classic-rg ^
    --replication-group-description "3 node replication group" ^
    --cache-node-type cache.m4.large ^
    --engine redis ^    
    --at-rest-encryption-enabled ^  
    --num-cache-clusters 3 ^
```

추가 정보는 다음을 참조하세요.
+ [Valkey 또는 Redis OSS(클러스터 모드 비활성화됨) 복제 그룹을 처음부터 새로 생성(AWS CLI)](Replication.CreatingReplGroup.NoExistingCluster.Classic.md#Replication.CreatingReplGroup.NoExistingCluster.Classic.CLI)
+ [create-replication-group](https://docs.aws.amazon.com/cli/latest/reference/elasticache/create-replication-group.html)

 

#### Valkey 또는 Redis OSS(클러스터 모드 활성화됨)에 대한 클러스터에서 미사용 데이터 암호화 활성화(CLI)
<a name="at-rest-encryption-enable-cli-clustered-redis"></a>

다음 작업은 3개의 노드 그룹 또는 샤드(*--num-node-groups*)가 있는 Valkey 또는 Redis OSS(클러스터 모드 활성화됨) 복제 그룹 `my-clustered-rg`를 생성합니다. 각 복제 그룹에는 기본 복제본 한 개와 읽기 전용 복제본 두 개, 이렇게 세 개의 노드가 있습니다(*--replicas-per-node-group*). 미사용 데이터 암호화가 이 복제 그룹에 대해 활성화되어 있습니다(*--at-rest-encryption-enabled*).

다음 파라미터와 해당 값은 복제 그룹에 대한 암호화를 활성화하는 데 필요합니다.

**키 파라미터**
+ **--engine** - `valkey` 또는 `redis`이어야 합니다.
+ **--engine-version** - 엔진이 Redis OSS인 경우 4.0.10 또는 그 이상이어야 합니다.
+ **--at-rest-encryption-enabled** - 미사용 데이터 암호화를 활성화하기 위해 필요합니다.
+ **--cache-parameter-group** - 이 클러스터 모드가 활성화된 복제 그룹을 만들려면 `default-redis4.0.cluster.on` 또는 이 클러스터에서 파생된 클러스터여야 합니다.

**Example 2: Valkey 또는 Redis OSS(클러스터 모드 활성화됨) 클러스터**  
Linux, macOS, Unix의 경우:  

```
aws elasticache create-replication-group \
   --replication-group-id my-clustered-rg \
   --replication-group-description "redis clustered cluster" \
   --cache-node-type cache.m3.large \
   --num-node-groups 3 \
   --replicas-per-node-group 2 \
   --engine redis \
   --engine-version 6.2 \
   --at-rest-encryption-enabled \
   --cache-parameter-group default.redis6.x.cluster.on
```
Windows의 경우:  

```
aws elasticache create-replication-group ^
   --replication-group-id my-clustered-rg ^
   --replication-group-description "redis clustered cluster" ^
   --cache-node-type cache.m3.large ^
   --num-node-groups 3 ^
   --replicas-per-node-group 2 ^
   --engine redis ^
   --engine-version 6.2 ^
   --at-rest-encryption-enabled ^
   --cache-parameter-group default.redis6.x.cluster.on
```

추가 정보는 다음을 참조하세요.
+ [처음부터 Valkey 또는 Redis OSS(클러스터 모드 활성화됨) 복제 그룹 만들기(AWS CLI)](Replication.CreatingReplGroup.NoExistingCluster.Cluster.md#Replication.CreatingReplGroup.NoExistingCluster.Cluster.CLI)
+ [create-replication-group](https://docs.aws.amazon.com/cli/latest/reference/elasticache/create-replication-group.html)

## 참고
<a name="at-rest-encryption-see-also"></a>
+ [Amazon VPC 및 ElastiCache 보안](VPCs.md)
+ [Amazon ElastiCache의 Identity and Access Management](IAM.md)

# 인증 및 권한 부여
<a name="auth-redis"></a>

AWS Identity and Access Management(IAM)는 AWS 리소스에 대한 사용자의 액세스를 안전하게 제어할 수 있게 지원하는 웹 서비스입니다. ElastiCache는 IAM 및 Valkey 및 Redis OSS 인증 명령을 사용한 사용자 인증을 지원하고 역할 기반 액세스 제어(RBAC)를 사용한 사용자 작업을 승인하는 기능을 지원합니다.

**Topics**
+ [역할 기반 액세스 제어(RBAC)](Clusters.RBAC.md)
+ [Valkey 및 Redis OSS AUTH 명령으로 인증](auth.md)
+ [ElastiCache Valkey 또는 Redis OSS 캐시에서 액세스 제어 비활성화](in-transit-encryption-disable.md)

# 역할 기반 액세스 제어(RBAC)
<a name="Clusters.RBAC"></a>

[Valkey 및 Redis OSS AUTH 명령으로 인증](auth.md)에 설명된 대로 Valkey 및 Redis OSS AUTH 명령을 사용하여 역할 기반 액세스 제어(RBAC)를 사용할 수 있습니다. 또한 서버리스 캐시에 대한 액세스를 제어하는 유일한 방법은 RBAC입니다. Valkey 7.2 이상 및 Redis OSS 6.0\$17.2에서 사용할 수 있습니다.

RBAC는 다음과 같은 작업이 가능합니다.
+ 사용자 그룹을 통해 캐시 액세스를 제어합니다. 이러한 사용자 그룹은 캐시에 대한 액세스를 구성하는 방법으로 설계되었습니다.
+ *authN*을 사용하면 클러스터 인증 토큰과 달리 사용자당 암호가 있습니다.
+ *authZ*를 사용하면 사용자 권한이 세분화됩니다.
+ 클러스터 액세스는 ACL에 기반합니다.

클라이언트의 토큰이 인증된 경우 인증된 모든 클라이언트가 전체 캐시에 대한 액세스 권한을 갖는 Valkey 및 Redis OSS AUTH와 달리, RBAC를 사용하면 사용자가 원하는 역할에 의존하여 사용자를 세트에 설정할 수 있습니다. 이러한 세트는 캐시에 대한 액세스를 구성하는 방법으로 설계되었습니다.

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

RBAC는 Redis OSS 6의 [ACL](https://valkey.io/topics/acl/) 도입을 지원하도록 설계되었습니다. RBAC를 ElastiCache Valkey 또는 Redis OSS 캐시와 함께 사용하는 경우 다음과 같은 몇 가지 제한 사항이 있습니다.
+ ‘VALKEY’ 엔진에 대해 구성된 사용자 그룹에는 인증 메커니즘(암호 또는 IAM)을 사용하는 사용자만 포함될 수 있습니다. 즉, ‘VALKEY’ 엔진이 있는 모든 사용자와 암호 또는 IAM으로 인증하도록 구성된 ‘Redis’ 엔진이 있는 다른 모든 사용자는 이 사용자 그룹에 속할 수 있습니다.
+ Valkey 클러스터에서 RBAC를 사용하는 경우 엔진이 ‘VALKEY’인 사용자 그룹과 엔진이 ‘REDIS’인 사용자 그룹을 모두 사용할 수 있습니다.
+ Redis OSS 클러스터에서 RBAC를 사용하는 경우 엔진이 ‘REDIS’인 사용자 그룹만 사용할 수 있습니다.
+ 액세스 문자열에는 암호를 지정할 수 없습니다. [CreateUser](https://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_CreateUser.html) 또는 [ModifyUser](https://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_ModifyUser.html) 호출을 사용하여 암호를 설정합니다.
+ 사용자 권한의 경우 액세스 문자열의 일부로 `on` 및 `off`를 사용하여 사용자를 활성화하거나 비활성화합니다. 액세스 문자열에 둘 다 지정되지 않은 경우, 사용자에게 `off`가 할당되며 캐시에 대한 액세스 권한은 없습니다.
+ 금지되거나 재명명된 명령을 액세스 문자열의 일부로 사용할 수 없습니다. 금지되거나 이름이 바뀐 명령을 지정하면 예외가 발생합니다. 이름이 바뀐 명령에 액세스 제어 목록(ACL)을 사용하려면 명령의 원래 이름, 즉 이름이 바뀌기 전의 명령 이름을 지정합니다.
+ `reset` 명령을 액세스 문자열의 일부로 사용할 수 없습니다. API 파라미터에 암호를 지정하고 ElastiCache for Valkey and Redis OSS가 암호를 관리합니다. 따라서 사용자의 모든 암호를 제거할 수 있는 `reset`을 사용할 수 없습니다.
+ Redis OSS 6에 [ACL LIST](https://valkey.io/commands/acl-list) 명령이 도입되었습니다. 이 명령은 각 사용자에게 적용된 ACL 규칙과 함께 사용자 목록을 반환합니다. ElastiCache는 `ACL LIST` 명령을 지원하지만 Redis OSS와 마찬가지로 암호 해시에 대한 지원은 포함하지 않습니다. ElastiCache에서는 [DescribeUsers](https://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_DescribeUsers.html) 작업을 사용하여 액세스 문자열에 포함된 규칙을 비롯한 유사한 정보를 얻을 수 있습니다. 그러나 [DescribeUsers](https://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_DescribeUsers.html)는 사용자 암호를 검색하지 않습니다.
+ ElastiCache for Valkey 및 Redis OSS에서 지원하는 다른 읽기 전용 명령에는 [ACL WHOAMI](https://valkey.io/commands/acl-whoami), [ACL USERS](https://valkey.io/commands/acl-users) 및 [ACL CAT](https://valkey.io/commands/acl-cat)가 포함됩니다. ElastiCache for Valkey 및 Redis OSS는 다른 쓰기 기반 ACL 명령을 지원하지 않습니다.
+ 다음과 같은 제한이 적용됩니다.    
<a name="quotas-table"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AmazonElastiCache/latest/dg/Clusters.RBAC.html)

**Valkey에서 RBAC 사용**

Valkey에서 역할 기반 액세스 제어를 사용하는 경우 사용자 및 사용자 그룹은 ‘VALKEY’ 엔진 유형으로 만들어집니다. 기본적으로 RBAC를 사용하는 Valkey는 Redis OSS에 비해 향상된 보안을 제공하므로 이 방법을 사용하는 것이 좋습니다. 프로비저닝된 Valkey 클러스터와 서버리스 Valkey 클러스터는 모두 VALKEY 사용자 및 사용자 그룹 연결을 지원합니다.

Valkey 액세스 제어의 주요 기능은 다음과 같습니다.
+ Valkey 사용자는 Valkey 사용자 그룹 연결로만 제한됩니다.
+ Valkey 사용자 그룹에는 Valkey 사용자와 암호로 보호되거나 IAM 인증이 활성화된 Redis OSS 사용자가 포함될 수 있습니다.
+ Valkey 사용자는 암호 보호 또는 IAM 인증을 사용해야 합니다.
+ VALKEY 사용자 그룹은 VALKEY 클러스터에만 연결할 수 있습니다.
+ 기본 사용자 요구 사항은 없습니다. Valkey 사용자 그룹이 클러스터에 연결되면 기본 사용자 요구 사항이 자동으로 비활성화됩니다. 고객은 ACL LIST 명령을 사용할 때 기본 사용자가 꺼져 있음을 알 수 있습니다.

ElastiCache for Valkey 및 ElastiCache for Redis OSS와 함께 RBAC를 사용하는 방법에 대한 자세한 내용은 다음과 같습니다.

**Topics**
+ [액세스 문자열을 사용하여 권한 지정](#Access-string)
+ [ElastiCache for Valkey 또는 Redis OSS에 대한 캐시에 RBAC 적용](#rbac-using)
+ [AUTH에서 RBAC로 마이그레이션](#Migrate-From-RBAC-to-Auth)
+ [RBAC에서 AUTH로 마이그레이션](#Migrate-From-RBAC-to-AUTH-1)
+ [사용자 암호 자동 교체](User-Secrets-Manager.md)
+ [IAM을 통한 인증](auth-iam.md)

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

ElastiCache Valkey 또는 Redis OSS 캐시에 대한 권한을 지정하려면 액세스 문자열을 생성하고AWS CLI또는를 통해 사용자에게 할당합니다AWS Management Console.

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

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

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

 `on ~* +@all`

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

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

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

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

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

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

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

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

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

Redis OSS 버전 6.2 이상에서는 다음 액세스 문자열 구문도 지원됩니다.
+ `&*` - 사용 가능한 모든 채널에 대한 액세스 권한을 부여합니다.

Redis OSS 버전 7.0 이상에서는 다음 액세스 문자열 구문도 지원됩니다.
+ `|` - 하위 명령(예: “-config\$1set”)을 차단하는 데 사용 가능합니다.
+ `%R~<pattern>` - 지정된 읽기 키 패턴을 추가합니다. 이는 일반 키 패턴과 유사하게 동작하지만 주어진 패턴과 일치하는 키에서 읽을 수 있는 권한만 부여합니다. 자세한 내용은 [키 권한](https://valkey.io/topics/acl/)을 참조하세요.
+ `%W~<pattern>` - 지정된 쓰기 키 패턴을 추가합니다. 이는 일반 키 패턴과 유사하게 동작하지만 주어진 패턴과 일치하는 키로 쓸 수 있는 권한만 부여합니다. 자세한 내용은 [ACL 키 권한](https://valkey.io/topics/acl/)을 참조하세요.
+ `%RW~<pattern>` - `~<pattern>`의 다른 형태입니다.
+ `(<rule list>)` - 규칙을 일치시킬 새 선택기를 생성합니다. 선택기는 사용자 권한 이후, 정의된 순서에 따라 평가됩니다. 명령이 사용자 권한과 일치하거나, 일치하는 선택기가 있으면 허용됩니다. 자세한 내용은 [ACL 선택기](https://valkey.io/topics/acl/)를 참조하세요.
+ `clearselectors` - 사용자에게 연결된 모든 선택기를 삭제합니다.

## ElastiCache for Valkey 또는 Redis OSS에 대한 캐시에 RBAC 적용
<a name="rbac-using"></a>

ElastiCache for Valkey 또는 Redis OSS RBAC를 사용하려면 다음 단계를 수행하세요.

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

1. 사용자 그룹을 생성하고 사용자를 그룹에 추가합니다.

1. 전송 중 암호화가 활성화된 캐시에 사용자 그룹을 할당합니다.

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

**Topics**
+ [콘솔 및 CLI를 사용하여 사용자 및 사용자 그룹 생성](#Users-management)
+ [콘솔 및 CLI를 사용하여 사용자 그룹 관리](#User-Groups)
+ [서버리스 캐시에 사용자 그룹 할당](#Users-groups-to-serverless-caches)
+ [복제 그룹에 사용자 그룹 할당](#Users-groups-to-RGs)

### 콘솔 및 CLI를 사용하여 사용자 및 사용자 그룹 생성
<a name="Users-management"></a>

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

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

ElastiCache는 사용자 ID와 사용자 이름 `"default"`를 사용하여 기본 사용자를 자동으로 구성하고 모든 사용자 그룹에 추가합니다. 이 사용자는 수정하거나 삭제할 수 없습니다. 이 사용자는 이전 Redis OSS 버전의 기본 동작과의 호환성을 위해 만들어졌으며 모든 명령을 호출하고 모든 키에 액세스할 수 있는 액세스 문자열을 가지고 있습니다.

캐시에 적절한 액세스 제어를 추가하려면 이 기본 사용자를 활성화되지 않거나 강력한 암호를 사용하는 새 사용자로 바꿉니다. 기본 사용자를 변경하려면 사용자 이름이 `default`로 설정된 새 사용자를 생성합니다. 그런 다음 원래 기본 사용자를 새 사용자로 바꿉니다.

다음 절차에서는 원래 `default` 사용자를 수정된 액세스 문자열을 가진 다른 `default` 사용자로 바꾸는 방법을 보여 줍니다.

**콘솔에서 기본 사용자 수정**

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

1. 왼쪽 탐색 창에서 **사용자 그룹 관리**를 선택합니다.

1. **사용자 그룹 ID**에서 수정하려는 ID를 선택합니다. 확인란이 아니라 링크를 선택해야 합니다.

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

1. **수정** 창에서 **관리**를 선택합니다. ‘원하는 사용자 선택’에서 **사용자 이름**이 기본값인 사용자를 선택합니다.

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

1. **수정**을 선택합니다. 이렇게 하면 원래 기본 사용자가 가진 캐시에 대한 모든 기존 연결이 종료됩니다.

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

1. 다음 명령을 사용하여 사용자 이름이 `default`인 새 사용자를 생성합니다.

   Linux, macOS, Unix의 경우:

   ```
   aws elasticache create-user \
    --user-id "new-default-user" \
    --user-name "default" \
    --engine "VALKEY" \
    --passwords "a-str0ng-pa))word" \
    --access-string "off +get ~keys*"
   ```

   Windows의 경우:

   ```
   aws elasticache create-user ^
    --user-id "new-default-user" ^
    --user-name "default" ^
    --engine "VALKEY" ^
    --passwords "a-str0ng-pa))word" ^
    --access-string "off +get ~keys*"
   ```

1. 사용자 그룹을 생성하고 이전에 생성한 사용자를 추가합니다.

   Linux, macOS, Unix의 경우:

   ```
   aws elasticache create-user-group \
     --user-group-id "new-group-2" \
     --engine "VALKEY" \
     --user-ids "new-default-user"
   ```

   Windows의 경우:

   ```
   aws elasticache create-user-group ^
     --user-group-id "new-group-2" ^
     --engine "VALKEY" ^
     --user-ids "new-default-user"
   ```

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

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

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

다음 절차에 따라 콘솔에서 사용자를 관리합니다.

**콘솔에서 사용자를 관리하려면**

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

1. Amazon ElastiCache 대시보드에서 **사용자 관리**를 선택합니다. 다음 옵션을 사용할 수 있습니다.
   + **사용자 생성** - 사용자를 생성할 때 사용자 ID, 사용자 이름, 인증 모드, 액세스 문자열을 입력합니다. 액세스 문자열은 사용자에게 허용할 키와 명령에 대한 권한 수준을 설정합니다.

     사용자를 생성할 때 최대 두 개의 암호를 설정할 수 있습니다. 암호를 수정해도 캐시에 대한 모든 기존 연결은 유지됩니다.
   + **사용자 수정** - 사용자의 인증 설정을 업데이트하거나 액세스 문자열을 변경할 수 있습니다.
   + **사용자 삭제** - 계정이 속한 모든 사용자 관리 그룹에서 제거됩니다.

다음 절차에 따라AWS CLI를 사용하여 사용자를 관리합니다.

**CLI를 사용하여 사용자를 수정하려면**
+  `modify-user` 명령을 사용하여 사용자의 암호를 업데이트하거나 사용자의 액세스 권한을 변경합니다.

  사용자를 수정하면 해당 사용자와 연결된 사용자 그룹이 업데이트되고, 해당 사용자 그룹과 연결된 캐시도 업데이트됩니다. 기존 연결은 모두 유지됩니다. 예를 들면 다음과 같습니다.

  Linux, macOS, Unix의 경우:

  ```
  aws elasticache modify-user \
    --user-id user-id-1 \
    --access-string "~objects:* ~items:* ~public:*" \
    --authentication-mode Type=iam
  ```

  Windows의 경우:

  ```
  aws elasticache modify-user ^
    --user-id user-id-1 ^
    --access-string "~objects:* ~items:* ~public:*" ^
    --authentication-mode Type=iam
  ```

**참고**  
`nopass` 옵션을 사용하지 않는 것이 좋습니다. 사용해야 한다면 사용자 권한을 제한된 키 집합에 액세스할 수 있는 읽기 전용으로 설정하는 것이 좋습니다.

**CLI를 사용하여 사용자를 삭제하려면**
+ `delete-user` 명령을 사용하여 사용자를 삭제합니다. 계정이 삭제되고 해당 계정이 속한 모든 사용자 그룹에서 제거됩니다. 다음은 예입니다.

  Linux, macOS, Unix의 경우:

  ```
  aws elasticache delete-user \
    --user-id user-id-2
  ```

  Windows의 경우:

  ```
  aws elasticache delete-user ^
    --user-id user-id-2
  ```

사용자 목록을 보려면 [describe-users](https://docs.aws.amazon.com/cli/latest/reference/elasticache/describe-users.html) 작업을 호출합니다.

```
aws elasticache describe-users
```

### 콘솔 및 CLI를 사용하여 사용자 그룹 관리
<a name="User-Groups"></a>

다음과 같이 사용자 그룹을 생성하여 하나 이상의 캐시에 대한 사용자 액세스를 구성하고 제어할 수 있습니다.

다음 절차에 따라 콘솔을 사용하여 사용자 그룹을 관리합니다.

**콘솔을 사용하여 사용자 그룹을 관리하려면**

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

1. Amazon ElastiCache 대시보드에서 **사용자 그룹 관리**를 선택합니다.

   다음 작업을 사용하여 새 사용자 그룹을 생성할 수 있습니다.
   + **생성** - 사용자 그룹을 생성할 때 사용자를 추가한 다음 캐시에 사용자 그룹을 할당합니다. 예를 들어 캐시에서 관리 역할을 가진 사용자의 `Admin` 사용자 그룹을 생성할 수 있습니다.
**중요**  
Valkey 또는 Redis OSS 사용자 그룹을 사용하지 않는 경우 사용자 그룹을 생성할 때 기본 사용자를 포함해야 합니다.
   + **사용자 추가** - 사용자를 사용자 그룹에 추가합니다.
   + **사용자 제거** - 사용자 그룹에서 사용자를 제거합니다. 사용자 그룹에서 사용자를 제거하면 사용자가 가진 캐시에 대한 모든 기존 연결이 종료됩니다.
   + **삭제** - 사용자 그룹을 삭제하는 데 사용합니다. 그룹에 속한 사용자가 아닌 사용자 그룹 자체가 삭제된다는 것에 주의하세요.

   기존 사용자 그룹의 경우 다음 작업을 수행할 수 있습니다.
   + **사용자 추가** - 기존 사용자를 사용자 그룹에 추가합니다.
   + **사용자 삭제** - 사용자 그룹에서 기존 사용자를 제거합니다.
**참고**  
사용자가 사용자 그룹에서 제거되지만 시스템에서 삭제되지는 않습니다.

다음 절차에 따라 CLI를 사용하여 사용자 그룹을 관리합니다.

**CLI를 사용하여 새 사용자 그룹을 생성하고 사용자를 추가하려면**
+ 다음과 같이 `create-user-group` 명령을 사용합니다.

  Linux, macOS, Unix의 경우:

  ```
  aws elasticache create-user-group \
    --user-group-id "new-group-1" \
    --engine "VALKEY" \
    --user-ids user-id-1, user-id-2
  ```

  Windows의 경우:

  ```
  aws elasticache create-user-group ^
    --user-group-id "new-group-1" ^
    --engine "VALKEY" ^
    --user-ids user-id-1, user-id-2
  ```

**CLI를 사용하여 새 사용자를 추가하거나 현재 멤버를 제거하여 사용자 그룹을 수정하려면**
+ 다음과 같이 `modify-user-group` 명령을 사용합니다.

  Linux, macOS, Unix의 경우:

  ```
  aws elasticache modify-user-group --user-group-id new-group-1 \
  --user-ids-to-add user-id-3 \
  --user-ids-to-remove user-id-2
  ```

  Windows의 경우:

  ```
  aws elasticache modify-user-group --user-group-id new-group-1 ^
  --user-ids-to-add user-id-3 ^
  --user-ids-to-removere user-id-2
  ```

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

**CLI를 사용하여 사용자 그룹을 삭제하려면**
+ 다음과 같이 `delete-user-group` 명령을 사용합니다. 그룹에 속한 사용자가 아닌 사용자 그룹 자체가 삭제됩니다.

  Linux, macOS, Unix의 경우:

  ```
  aws elasticache delete-user-group /
     --user-group-id
  ```

  Windows의 경우:

  ```
  aws elasticache delete-user-group ^
     --user-group-id
  ```

사용자 그룹의 목록을 보려면 [describe-user-groups](https://docs.aws.amazon.com/cli/latest/reference/elasticache/describe-user-groups.html) 작업을 호출합니다.

```
aws elasticache describe-user-groups \
  --user-group-id test-group
```

### 서버리스 캐시에 사용자 그룹 할당
<a name="Users-groups-to-serverless-caches"></a>

사용자 그룹을 생성하고 사용자를 추가한 후 RBAC를 구현하는 마지막 단계는 사용자 그룹을 서버리스 캐시에 할당하는 것입니다.

#### 콘솔을 사용해 서버리스 캐시에 사용자 그룹 할당
<a name="Users-groups-to-SCs-CON"></a>

를 사용하여 서버리스 캐시에 사용자 그룹을 추가하려면 다음을AWS Management Console수행합니다.
+ 클러스터 모드가 비활성화된 경우 [Valkey(클러스터 모드 비활성화됨) 클러스터 생성(콘솔)](SubnetGroups.designing-cluster-pre.valkey.md#Clusters.Create.CON.valkey-gs) 섹션을 참조하세요.
+ 클러스터 모드가 활성화된 경우 [Valkey 또는 Redis OSS(클러스터 모드 활성화됨) 클러스터 생성(콘솔)](Clusters.Create.md#Clusters.Create.CON.RedisCluster) 섹션을 참조하세요.

#### 를 사용하여 서버리스 캐시에 사용자 그룹 할당AWS CLI
<a name="Users-groups-to-SCs-CLI"></a>

 다음AWS CLI작업은 값이 인 **user-group-id** 파라미터를 사용하여 서버리스 캐시를 생성합니다`my-user-group-id`. 서브넷 그룹 `sng-test`는 존재하는 서브넷 그룹으로 대체합니다.

**키 파라미터**
+ **--engine** – `VALKEY` 또는 `REDIS`이어야 합니다.
+ **--user-group-id** - 이 값으로 사용자 그룹의 ID를 확인할 수 있으며, 이 그룹은 캐시에 대해 특정 액세스 권한을 보유한 사용자로 구성되어 있습니다.

Linux, macOS, Unix의 경우:

```
aws elasticache create-serverless-cache \
    --serverless-cache-name "new-serverless-cache" \
    --description "new-serverless-cache" \
    --engine "VALKEY" \
    --user-group-id "new-group-1"
```

Windows의 경우:

```
aws elasticache create-serverless-cache ^
    --serverless-cache-name "new-serverless-cache" ^
    --description "new-serverless-cache" ^
    --engine "VALKEY" ^
    --user-group-id "new-group-1"
```

다음AWS CLI작업은 값이 인 **user-group-id** 파라미터로 서버리스 캐시를 수정합니다`my-user-group-id`.

Linux, macOS, Unix의 경우:

```
aws elasticache modify-serverless-cache \
    --serverless-cache-name serverless-cache-1 \
    --user-group-id "new-group-2"
```

Windows의 경우:

```
aws elasticache modify-serverless-cache ^
    --serverless-cache-name serverless-cache-1 ^
    --user-group-id "new-group-2"
```

캐시에 적용된 모든 수정 사항은 비동기식으로 업데이트됩니다. 이벤트를 보면서 진행 상태를 모니터링할 수 있습니다. 자세한 내용은 [ElastiCache 이벤트 보기](ECEvents.Viewing.md) 단원을 참조하십시오.

### 복제 그룹에 사용자 그룹 할당
<a name="Users-groups-to-RGs"></a>

사용자 그룹을 생성하고 사용자를 추가한 후 RBAC를 구현하는 마지막 단계는 사용자 그룹을 복제 그룹에 할당하는 것입니다.

#### 콘솔을 사용하여 복제 그룹에 사용자 그룹 할당
<a name="Users-groups-to-RGs-CON"></a>

를 사용하여 복제에 사용자 그룹을 추가하려면 다음을AWS Management Console수행합니다.
+ 클러스터 모드가 비활성화된 경우 [Valkey(클러스터 모드 비활성화됨) 클러스터 생성(콘솔)](SubnetGroups.designing-cluster-pre.valkey.md#Clusters.Create.CON.valkey-gs) 섹션을 참조하세요.
+ 클러스터 모드가 활성화된 경우 [Valkey 또는 Redis OSS(클러스터 모드 활성화됨) 클러스터 생성(콘솔)](Clusters.Create.md#Clusters.Create.CON.RedisCluster) 섹션을 참조하세요.

#### 를 사용하여 복제 그룹에 사용자 그룹 할당AWS CLI
<a name="Users-groups-to-RGs-CLI"></a>

 다음AWS CLI작업은 전송 중 암호화(TLS)가 활성화된 복제 그룹과 값이 인 **user-group-ids** 파라미터를 생성합니다`my-user-group-id`. 서브넷 그룹 `sng-test`는 존재하는 서브넷 그룹으로 대체합니다.

**키 파라미터**
+ **--engine** – `valkey` 또는 `redis`이어야 합니다.
+ **--engine-version** - 6.0 이상이어야 합니다.
+ **--transit-encryption-enabled** - 인증 및 사용자 그룹 연결에 필요합니다.
+ **--user-group-ids** - 이 값으로 사용자 그룹의 ID를 확인할 수 있으며, 이 그룹은 캐시에 대해 특정 액세스 권한을 보유한 사용자로 구성되어 있습니다.
+ **--cache-subnet-group** - 사용자 그룹 연결에 필요합니다.

Linux, macOS, Unix의 경우:

```
aws elasticache create-replication-group \
    --replication-group-id "new-replication-group" \
    --replication-group-description "new-replication-group" \
    --engine "VALKEY" \
    --cache-node-type cache.m5.large \
    --transit-encryption-enabled \
    --user-group-ids "new-group-1" \
    --cache-subnet-group "cache-subnet-group"
```

Windows의 경우:

```
aws elasticache create-replication-group ^
    --replication-group-id "new-replication-group" ^
    --replication-group-description "new-replication-group" ^
    --engine "VALKEY" ^
    --cache-node-type cache.m5.large ^
    --transit-encryption-enabled ^
    --user-group-ids "new-group-1" ^
    --cache-subnet-group "cache-subnet-group"
```

다음AWS CLI작업은 전송 중 암호화(TLS)가 활성화된 복제 그룹과 값이 인 **user-group-ids** 파라미터를 수정합니다`my-user-group-id`.

Linux, macOS, Unix의 경우:

```
aws elasticache modify-replication-group \
    --replication-group-id replication-group-1 \
    --user-group-ids-to-remove "new-group-1" \
    --user-group-ids-to-add "new-group-2"
```

Windows의 경우:

```
aws elasticache modify-replication-group ^
    --replication-group-id replication-group-1 ^
    --user-group-ids-to-remove "new-group-1" ^
    --user-group-ids-to-add "new-group-2"
```

응답의 `PendingChanges`에 주의하세요. 캐시에 적용된 모든 수정 사항은 비동기식으로 업데이트됩니다. 이벤트를 보면서 진행 상태를 모니터링할 수 있습니다. 자세한 내용은 [ElastiCache 이벤트 보기](ECEvents.Viewing.md) 단원을 참조하십시오.

## AUTH에서 RBAC로 마이그레이션
<a name="Migrate-From-RBAC-to-Auth"></a>

[Valkey 및 Redis OSS AUTH 명령으로 인증](auth.md)에 설명된 대로 AUTH를 사용하고 있으며 RBAC 사용으로 마이그레이션하려는 경우 다음 절차를 따르십시오.

콘솔을 사용하여 AUTH에서 RBAC로 마이그레이션하려면 다음 절차를 따르십시오.

**콘솔을 사용하여 Valkey 또는 Redis OSS AUTH에서 RBAC로 마이그레이션하려면**

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

1. 오른쪽 상단의 목록에서 수정하려는 캐시가 있는AWS리전을 선택합니다.

1. 탐색 창에서, 수정하려는 캐시에서 실행하는 엔진을 선택합니다.

   선택한 엔진의 캐시 목록이 나타납니다.

1. 캐시 목록에서 수정할 캐시의 이름을 선택합니다.

1. **작업**에서 **수정**을 선택합니다.

   **수정** 창이 나타납니다.

1. **액세스 제어**에서 **사용자 그룹 액세스 제어 목록**을 선택합니다.

1.  **사용자 그룹 액세스 제어 목록**에서 사용자 그룹을 선택합니다.

1. **변경 사항 미리보기**를 선택하면 나오는 다음 화면에서 **수정**을 선택합니다.

CLI를 사용하여 Valkey 또는 Redis OSS AUTH에서 RBAC로 마이그레이션하려면 다음 절차를 따르십시오.

**CLI를 사용하여 AUTH에서 RBAC로 마이그레이션하려면**
+  다음과 같이 `modify-replication-group` 명령을 사용합니다.

  Linux, macOS, Unix의 경우:

  ```
  aws elasticache modify-replication-group --replication-group-id test \
      --auth-token-update-strategy DELETE \
      --user-group-ids-to-add user-group-1
  ```

  Windows의 경우:

  ```
  aws elasticache modify-replication-group --replication-group-id test ^
      --auth-token-update-strategy DELETE ^
      --user-group-ids-to-add user-group-1
  ```

## RBAC에서 AUTH로 마이그레이션
<a name="Migrate-From-RBAC-to-AUTH-1"></a>

RBAC를 사용하고 있고 Redis OSS AUTH로 마이그레이션하려는 경우 [RBAC에서 AUTH로 마이그레이션](auth.md#Migrate-From-RBAC-to-AUTH) 섹션을 참조하세요.

**참고**  
ElastiCache 캐시에서 액세스 제어를 비활성화해야 하는 경우AWS CLI를 통해 비활성화해야 합니다. 자세한 내용은 [ElastiCache Valkey 또는 Redis OSS 캐시에서 액세스 제어 비활성화](in-transit-encryption-disable.md) 단원을 참조하십시오.

# 사용자 암호 자동 교체
<a name="User-Secrets-Manager"></a>

를 사용하면 코드의 하드코딩된 자격 증명(암호 포함)을 Secrets Manager에 대한 API 호출로 대체하여 프로그래밍 방식으로 보안 암호를 검색할AWS Secrets Manager수 있습니다. 이렇게 하면 보안 암호가 해당 위치에 있지 않기 때문에 여러분의 코드를 검사하는 누군가에 의해 보안 암호가 손상되지 않도록 방지할 수 있습니다. 또한 사용자가 지정한 일정에 따라 Secrets Manager가 자동으로 보안 암호를 교체하도록 구성할 수 있습니다. 따라서 단기 보안 암호로 장기 보안 암호를 교체할 수 있어 손상 위험이 크게 줄어듭니다.

Secrets Manager를 사용하면 Secrets Manager가 제공하는AWS Lambda함수를 사용하여 ElastiCache for Redis OSS 암호(즉, 암호)를 자동으로 교체할 수 있습니다.

에 대한 자세한 내용은 [란 무엇입니까AWS Secrets Manager?](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html)를AWS Secrets Manager참조하십시오.

## ElastiCache가 보안 암호를 사용하는 방식
<a name="how-elasticache-uses-secrets"></a>

Valkey 7.2 이상에는 Redis OSS 7.0과 동일한 기능이 설정되어 있습니다. Redis OSS 6에서 ElastiCache는 Valkey 또는 Redis OSS 클러스터를 보호하기 위해 [역할 기반 액세스 제어(RBAC)](Clusters.RBAC.md)를 도입했습니다. 이 기능을 사용하면 실행 가능한 명령 및 액세스 가능한 키 측면에서 특정 연결을 제한할 수 있습니다. RBAC를 이용하면 고객이 사용자와 암호를 생성할 때 암호 값을 일반 텍스트로 수동 입력해야 하는데, 이는 운영자가 볼 수 있습니다.

Secrets Manager를 이용하면 애플리케이션이 Secrets Manager에서 암호를 가져와 애플리케이션 구성에 저장하므로 수동으로 입력할 필요가 없습니다. 이렇게 하는 방법에 대한 정보는 [ElastiCache 사용자가 보안 암호와 연결되는 방식](#How-User-Secrets-Manager-Associate) 단원을 참조하십시오.

보안 암호 사용 시 비용이 발생합니다. 요금 정보는 [AWS Secrets Manager 요금](https://aws.amazon.com/secrets-manager/pricing/)을 참조하세요.

## ElastiCache 사용자가 보안 암호와 연결되는 방식
<a name="How-User-Secrets-Manager-Associate"></a>

Secrets Manager는 보안 암호의 `SecretString` 필드에 연결된 사용자에 대한 참조를 보관합니다. ElastiCache 측에는 이 보안 암호에 대한 참조가 없습니다.

```
{
    "password": "strongpassword",
    "username": "user1",
    "user_arn": "arn:aws:elasticache:us-east-1:xxxxxxxxxx918:user:user1" //this is the bond between the secret and the user
}
```

## Lambda 교체 함수
<a name="lambda-rotation-function"></a>

Secrets Manager에서 자동 암호 교체를 활성화하려면 [modify-user](https://docs.aws.amazon.com/cli/latest/reference/elasticache/modify-user.html) API와 상호 작용하여 사용자의 암호를 업데이트하는 Lambda 함수를 생성해야 합니다.

작동 방식에 대한 자세한 내용은 [교체 작동 방식](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotating-secrets.html#rotate-secrets_how)을 참조하세요.

**참고**  
일부AWS서비스의 경우 혼동된 대리자 시나리오를 방지하려면 `aws:SourceArn` 및 `aws:SourceAccount` 전역 조건 키를 모두 사용하는 것이AWS좋습니다. 그러나 교체 함수 정책에 `aws:SourceArn` 조건을 포함하는 경우 교체 함수는 해당 ARN에서 지정한 보안 암호를 교체하는 데만 사용할 수 있습니다. 여러 보안 암호에 대해 교체 기능을 사용할 수 있도록 컨텍스트 키 `aws:SourceAccount`만 포함하는 것이 좋습니다.

발생할 수 있는 문제는 [AWS Secrets Manager 교체 문제 해결을](https://docs.aws.amazon.com/secretsmanager/latest/userguide/troubleshoot_rotation.html) 참조하세요.

## ElastiCache 사용자를 생성하고 Secrets Manager와 연결하는 방법
<a name="User-Secrets-Manager-Associate"></a>

다음 단계에서는 사용자를 생성하고 Secrets Manager와 연결하는 방법을 보여줍니다.

1. **비활성 사용자 생성**

   Linux, macOS, Unix의 경우:

   ```
   aws elasticache create-user \
    --user-id user1 \
    --user-name user1 \
    --engine "REDIS" \
    --no-password \ // no authentication is required
    --access-string "*off* +get ~keys*" // this disables the user
   ```

   Windows의 경우:

   ```
   aws elasticache create-user ^
    --user-id user1 ^
    --user-name user1 ^
    --engine "REDIS" ^
    --no-password ^ // no authentication is required
    --access-string "*off* +get ~keys*" // this disables the user
   ```

   다음과 비슷한 응답이 나타납니다.

   ```
   {
       "UserId": "user1",
       "UserName": "user1",
       "Status": "active",
       "Engine": "redis",
       "AccessString": "off ~keys* -@all +get",
       "UserGroupIds": [],
       "Authentication": {
           "Type": "no_password"
       },
       "ARN": "arn:aws:elasticache:us-east-1:xxxxxxxxxx918:user:user1"
   }
   ```

1. **보안 암호 생성**

   Linux, macOS, Unix의 경우:

   ```
   aws secretsmanager create-secret \
   --name production/ec/user1 \
   --secret-string \
   '{
      "user_arn": "arn:aws:elasticache:us-east-1:123456xxxx:user:user1", 
       "username":"user1"
    }'
   ```

   Windows의 경우:

   ```
   aws secretsmanager create-secret ^
   --name production/ec/user1 ^
   --secret-string ^
   '{
      "user_arn": "arn:aws:elasticache:us-east-1:123456xxxx:user:user1", 
       "username":"user1"
    }'
   ```

   다음과 비슷한 응답이 나타납니다.

   ```
   {
    "ARN": "arn:aws:secretsmanager:us-east-1:123456xxxx:secret:production/ec/user1-eaFois",
    "Name": "production/ec/user1",
    "VersionId": "aae5b963-1e6b-4250-91c6-ebd6c47d0d95"
   }
   ```

1. **암호를 교체하도록 Lambda 함수 구성**

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

   1. 탐색 창에서 **함수**를 선택한 후, 생성해 둔 함수를 선택합니다. 왼쪽에 있는 확인란이 아닌, 함수 이름을 선택합니다.

   1. **구성** 탭을 선택합니다.

   1. **일반 구성**에서 **편집**을 선택한 다음, **제한 시간**을 최소 12분으로 설정합니다.

   1. **저장**을 선택합니다.

   1. **환경 변수**를 선택한 후, 다음을 설정합니다.

      1. SECRETS\$1MANAGER\$1ENDPOINT – https://secretsmanager.**REGION**.amazonaws.com

      1. SECRET\$1ARN – 2단계에서 생성한 보안 암호의 Amazon 리소스 이름(ARN).

      1. USER\$1NAME – ElastiCache 사용자의 사용자 이름.

      1. **저장**을 선택합니다.

   1. **권한**을 선택합니다.

   1. **실행 역할** 아래에서, IAM 콘솔에서 볼 Lambda 함수 역할의 이름을 선택합니다.

   1. Lambda 함수에 다음 권한이 있어야 사용자를 수정하고 암호를 설정할 수 있습니다.

      ElastiCache

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

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "elasticache:DescribeUsers",
                      "elasticache:ModifyUser"
                  ],
                  "Resource": "arn:aws:elasticache:us-east-1:123456789012:user:user1"
              }
          ]
      }
      ```

------

      Secrets Manager 

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

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "secretsmanager:GetSecretValue",
                      "secretsmanager:DescribeSecret",
                      "secretsmanager:PutSecretValue",
                      "secretsmanager:UpdateSecretVersionStage"
                  ],
                  "Resource": "arn:aws:secretsmanager:us-east-1:123456789012:secret:XXXX"
              },
              {
                  "Effect": "Allow",
                  "Action": "secretsmanager:GetRandomPassword",
                  "Resource": "*"
              }
          ]
      }
      ```

------

1. Secrets Manager 보안 암호 교체 설정

   1. **를 사용하여 콘솔을 사용하여 Secrets Manager 보안 암호의 자동 교체 설정을AWS Management Console참조하세요. [AWS](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotate-secrets_turn-on-for-other.html)** 

      교체 일정 설정에 대한 자세한 내용은 [Secrets Manager 교체 일정 표현식](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotate-secrets_schedule.html)을 참조하세요.

   1. **를 사용하여AWS CLI를 [AWS Secrets Manager사용하기 위한 자동 교체 설정을 참조하세요.AWS Command Line Interface](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotate-secrets-cli.html)**

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

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

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

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

IAM 데이터베이스 인증을 사용할 때 다음 제한이 적용됩니다.
+ IAM 인증은 ElastiCache for Valkey 7.2 이상 또는 Redis OSS 버전 7.0 이상에 사용할 수 있습니다.
+ IAM가 활성화된 ElastiCache 사용자는 사용자 이름과 사용자 ID 속성이 동일해야 합니다.
+ IAM 인증 토큰은 15분간 유효합니다. 장수명 연결의 경우, 자격 증명 공급자 인터페이스를 지원하는 Valkey 또는 Redis OSS 클라이언트를 사용하는 것이 좋습니다.
+ ElastiCache for Valkey 또는 Redis OSS로의 IAM 인증 연결은 12시간 후에 자동으로 연결이 해제됩니다. `AUTH` 또는 `HELLO` 명령과 새 IAM 인증 토큰을 전송하여 연결을 12시간 연장할 수 있습니다.
+ IAM 인증은 `MULTI EXEC` 명령에서 지원되지 않습니다.
+ 현재 IAM 인증은 다음의 전역 조건 컨텍스트 키를 지원합니다.
  + 서버리스 캐시와 함께 IAM 인증을 사용하는 경우 `aws:VpcSourceIp`, `aws:SourceVpc`, `aws:SourceVpce`, `aws:CurrentTime`, `aws:EpochTime` 및 `aws:ResourceTag/%s`(관련 서버리스 캐시 및 사용자 기준)가 지원됩니다.
  + 복제 그룹과 함께 IAM 인증을 사용하는 경우 `aws:SourceIp`, `aws:ResourceTag/%s`(관련 복제 그룹 및 사용자 기준)가 지원됩니다.

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

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

IAM 인증을 설정하려면:

1. 캐시 생성

   ```
   aws elasticache create-serverless-cache \
     --serverless-cache-name cache-01  \
     --description "ElastiCache IAM auth application" \
     --engine redis
   ```

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" : [
           "elasticache:Connect"
         ],
         "Resource" : [
           "arn:aws:elasticache:us-east-1:123456789012:serverlesscache:cache-01",
           "arn:aws:elasticache:us-east-1:123456789012:user:iam-user-01"
         ]
       }
     ]
   }
   ```

------

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

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

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

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

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

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

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

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

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

   ```
   aws elasticache create-user-group \
     --user-group-id iam-user-group-01 \
     --engine redis \
     --user-ids default iam-user-01
   
   aws elasticache modify-serverless-cache \
     --serverless-cache-name cache-01  \
     --user-group-id iam-user-group-01
   ```

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

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

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

```
String userId = "insert user id";
String cacheName = "insert cache name";
boolean isServerless = true;
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 ElastiCache with Redis OSS.
IAMAuthTokenRequest iamAuthTokenRequest = new IAMAuthTokenRequest(userId, cacheName, region, isServerless);
String iamAuthToken = iamAuthTokenRequest.toSignedRequestUri(awsCredentialsProvider.getCredentials());

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

// Create a new Lettuce Redis OSS client
RedisClient client = RedisClient.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 PARAM_RESOURCE_TYPE = "ResourceType";
    private static final String RESOURCE_TYPE_SERVERLESS_CACHE = "ServerlessCache";
    private static final String ACTION_NAME = "connect";
    private static final String SERVICE_NAME = "elasticache";
    private static final long TOKEN_EXPIRY_SECONDS = 900;

    private final String userId;
    private final String cacheName;
    private final String region;
    private final boolean isServerless;

    public IAMAuthTokenRequest(String userId, String cacheName, String region, boolean isServerless) {
        this.userId = userId;
        this.cacheName = cacheName;
        this.region = region;
        this.isServerless = isServerless;
    }

    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(userId));
        if (isServerless) {
            request.addParameters(PARAM_RESOURCE_TYPE, Collections.singletonList(RESOURCE_TYPE_SERVERLESS_CACHE));
        }
        return request;
    }

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

    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 인증 자격 증명 공급자를 사용하여 ElastiCache로 인증하는 방법을 보여줍니다.

```
String userId = "insert user id";
String cacheName = "insert cache name";
boolean isServerless = true;
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 ElastiCache with Redis OSS.
IAMAuthTokenRequest iamAuthTokenRequest = new IAMAuthTokenRequest(userId, cacheName, region, isServerless);

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

// Create a new Lettuce Redis OSS client
RedisClient client = RedisClient.create(redisURI);
client.connect();
```

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

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

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

    public RedisIAMAuthCredentialsProvider(String userId,
        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(userId, iamAuthTokenSupplier.get()));
    }

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

# Valkey 및 Redis OSS AUTH 명령으로 인증
<a name="auth"></a>

**참고**  
**AUTH**가 [역할 기반 액세스 제어(RBAC)](Clusters.RBAC.md)로 대체되었습니다. 모든 서버리스 캐시는 RBAC를 사용해 인증되어야 합니다.

Valkey 및 Redis OSS 인증 토큰 또는 암호는 Valkey 및 Redis OSS가 클라이언트의 명령 실행을 허용하기 전에 암호를 요구할 수 있게 함으로써 데이터 보안을 개선합니다. **AUTH**는 노드 기반 클러스터에만 사용할 수 있습니다.

**Topics**
+ [ElastiCache for Valkey 및 Redis OSS의 AUTH 개요](#auth-overview)
+ [ElastiCache for Valkey 및 Redis OSS 클러스터에 인증 적용](#auth-using)
+ [기존 클러스터에서 AUTH 토큰 수정](#auth-modifyng-token)
+ [RBAC에서 AUTH로 마이그레이션](#Migrate-From-RBAC-to-AUTH)

## ElastiCache for Valkey 및 Redis OSS의 AUTH 개요
<a name="auth-overview"></a>

ElastiCache for Valkey 및 Redis OSS 클러스터에서 **AUTH**를 사용할 때 몇 가지 제약 사항이 있습니다.

특히 AUTH를 사용할 경우 다음과 같은 AUTH 토큰 또는 암호 제약 조건을 알고 있어야 합니다.
+ 토큰 또는 암호는 16\$1128자 길이의 인쇄 가능한 문자여야 합니다.
+ 영숫자 외의 특수 문자는 (\$1, &, \$1, \$1, ^, <, >, -)로 제한됩니다.
+ AUTH는 전송 중 데이터 암호화가 활성화된 Valkey 또는 Redis OSS 클러스터에서만 사용할 수 있습니다.

강력한 토큰을 설정하려면 다음 사항을 요구하는 등 엄격한 암호 정책을 따르는 것이 좋습니다.
+ 토큰 또는 암호에는 다음 문자 유형 중 3개 이상이 포함되어야 합니다.
  + 대문자
  + 소문자
  + Digits 
  + 영숫자 이외의 문자(`!`, `&`, `#`, `$`, `^`, `<`, `>`, `-`)
+ 토큰 또는 암호에는 사전에 나오는 단어나 약간 수정한 형태의 사전 단어가 포함되어서는 안 됩니다.
+ 최근에 사용한 것과 같거나 비슷한 토큰 또는 암호도 안 됩니다.

## ElastiCache for Valkey 및 Redis OSS 클러스터에 인증 적용
<a name="auth-using"></a>

토큰 보호 Valkey 또는 Redis OSS 서버에서 토큰(암호)을 입력하도록 사용자에게 요구할 수 있습니다. 이렇게 하려면 복제 그룹 또는 클러스터를 생성할 때 올바른 토큰을 가진 파라미터 `--auth-token`(API: `AuthToken`)을 포함시킵니다. 또한 복제 그룹 또는 클러스터에 대한 모든 후속 명령에 이를 포함시킵니다.

다음AWS CLI작업은 전송 중 암호화(TLS)가 활성화되고 **AUTH** 토큰이 인 복제 그룹을 생성합니다`This-is-a-sample-token`. 서브넷 그룹 `sng-test`는 존재하는 서브넷 그룹으로 대체합니다.

**키 파라미터**
+ **--engine** – `valkey` 또는 `redis`이어야 합니다.
+ **--engine-version** – 엔진이 Redis OSS인 경우 3.2.6, 4.0.10 또는 그 이상이어야 합니다.
+ **--transit-encryption-enabled** - 인증 및 HIPAA 자격 획득에 필요합니다.
+ **--auth-token** - HIPAA 자격 획득에 필요합니다. 이 값은 이러한 토큰 보호 Valkey 또는 Redis OSS 서버를 위한 올바른 토큰이어야 합니다.
+ **--cache-subnet-group** - HIPAA 자격 획득에 필요합니다.

Linux, macOS, Unix의 경우:

```
aws elasticache create-replication-group \
    --replication-group-id authtestgroup \
    --replication-group-description authtest \
    --engine redis \ 
    --cache-node-type cache.m4.large \
    --num-node-groups 1 \
    --replicas-per-node-group 2 \    
    --transit-encryption-enabled \
    --auth-token This-is-a-sample-token \
    --cache-subnet-group sng-test
```

Windows의 경우:

```
aws elasticache create-replication-group ^
    --replication-group-id authtestgroup ^
    --replication-group-description authtest ^
    --engine redis ^ 
    --cache-node-type cache.m4.large ^
    --num-node-groups 1 ^
    --replicas-per-node-group 2 ^    
    --transit-encryption-enabled ^
    --auth-token This-is-a-sample-token ^
    --cache-subnet-group sng-test
```

## 기존 클러스터에서 AUTH 토큰 수정
<a name="auth-modifyng-token"></a>

보다 손쉬운 인증 업데이트를 위해 클러스터에서 사용되는 **AUTH** 토큰을 수정할 수 있습니다. 엔진 버전이 Valkey 7.2 이상 또는 Redis 5.0.6 이상인 경우 이 수정을 수행할 수 있습니다. ElastiCache에는 전송 중 데이터 암호화도 활성화되어 있어야 합니다.

auth 토큰 수정은 ROTATE와 SET 등 두 가지 전략을 지원합니다. ROTATE 전략은 이전 토큰을 유지하면서 서버에 새 AUTH 토큰을 추가합니다. SET 전략은 단일 AUTH 토큰만 지원하도록 서버를 업데이트합니다. `--apply-immediately` 파라미터를 통해 이러한 수정 호출을 수행하면 변경 사항이 즉시 적용됩니다.

### AUTH 토큰 교체
<a name="auth-modifyng-rotate"></a>

새 **AUTH 토큰**을 사용하여 Valkey 또는 Redis OSS 서버를 업데이트하려면 `--auth-token` 파라미터를 새 **AUTH** 토큰으로 사용하여 `ModifyReplicationGroup` API를 호출하고 ROTATE 값으로 `--auth-token-update-strategy`를 호출합니다. ROTATE 수정이 완료되면 클러스터는 `auth-token` 파라미터에 지정된 것 외에 이전의 AUTH 토큰을 지원하게 됩니다. AUTH 토큰 교체 전에 복제 그룹에 AUTH 토큰이 구성되지 않은 경우 클러스터는 인증 없이 연결을 지원하는 것 외에도 `--auth-token` 파라미터에 지정된 AUTH 토큰을 지원합니다. 업데이트 전략 SET를 사용하여 AUTH 토큰을 필수로 업데이트하려면 [AUTH 토큰 설정](#auth-modifying-set) 섹션을 참조하세요.

**참고**  
이전에 AUTH 토큰을 구성하지 않은 경우 수정이 완료되면 클러스터는 auth-token 파라미터에 지정된 토큰 외에 AUTH 토큰을 지원하지 않습니다.

두 가지 AUTH 토큰을 이미 지원하는 서버에서 이러한 수정을 수행하면 수정 작업이 수행되는 동안 가장 오래된 AUTH 토큰도 제거됩니다. 이를 통해 서버는 해당 시점에서 가장 최근의 AUTH 토큰을 최대 두 개까지 지원할 수 있습니다.

이 시점에서 가장 최근의 AUTH 토큰을 사용하도록 클라이언트를 업데이트하면 작업을 계속 진행할 수 있습니다. 클라이언트가 업데이트되면 **AUTH** 토큰 교체를 위한 SET 전략(다음 섹션에 설명)을 이용해 새 토큰의 사용을 단독으로 시작할 수 있습니다.

다음AWS CLI작업은 **AUTH** 토큰을 교체하도록 복제 그룹을 수정합니다`This-is-the-rotated-token`.

Linux, macOS, Unix의 경우: 

```
aws elasticache modify-replication-group \
--replication-group-id authtestgroup \
--auth-token This-is-the-rotated-token \
--auth-token-update-strategy ROTATE \
--apply-immediately
```

Windows의 경우:

```
aws elasticache modify-replication-group ^
--replication-group-id authtestgroup ^
--auth-token This-is-the-rotated-token ^
--auth-token-update-strategy ROTATE ^
--apply-immediately
```

### AUTH 토큰 설정
<a name="auth-modifying-set"></a>

단일 필수 **AUTH** 토큰을 지원하도록 Valkey 또는 Redis OSS 서버를 업데이트하려면 마지막 AUTH 토큰과 값이 동일한 `--auth-token` 파라미터와 값이 `SET`인 `--auth-token-update-strategy` 파라미터로 `ModifyReplicationGroup` API 작업을 호출합니다. SET 전략은 이전에 ROTATE 전략을 사용한 AUTH 토큰 2개 또는 옵션 AUTH 토큰 1개가 있는 클러스터에서만 사용할 수 있습니다. 수정이 완료되고 나면 서버는 인증 토큰 파라미터에 지정된 AUTH 토큰만 지원합니다.

다음AWS CLI작업은 복제 그룹을 수정하여 AUTH 토큰을 로 설정합니다`This-is-the-set-token`.

Linux, macOS, Unix의 경우: 

```
aws elasticache modify-replication-group \
--replication-group-id authtestgroup \
--auth-token This-is-the-set-token \
--auth-token-update-strategy SET \
--apply-immediately
```

Windows의 경우:

```
aws elasticache modify-replication-group ^
--replication-group-id authtestgroup ^
--auth-token This-is-the-set-token ^
--auth-token-update-strategy SET ^
--apply-immediately
```

### 기존 클러스터에서 인증 활성화
<a name="auth-enabling"></a>

기존 Valkey 또는 Redis OSS 서버에서 인증을 활성화하려면 `ModifyReplicationGroup` API 작업을 호출합니다. 새 토큰 역할을 하는 `--auth-token` 파라미터와 값이 ROTATE인 `--auth-token-update-strategy` 파라미터로 `ModifyReplicationGroup`을 호출합니다.

ROTATE 수정이 완료되고 나면 클러스터는 인증 없는 연결을 지원하는 것 외에도 `--auth-token` 파라미터에 지정된 **AUTH** 토큰을 지원합니다. AUTH 토큰을 사용하여 Valkey 또는 Redis OSS에 인증하도록 모든 클라이언트 애플리케이션이 업데이트되면 필요에 따라 SET 전략을 사용하여 AUTH 토큰을 표시합니다. 인증 활성화는 전송 중 데이터 암호화(TLS)가 활성화된 Valkey 및 Redis OSS 서버에서만 지원됩니다.

## RBAC에서 AUTH로 마이그레이션
<a name="Migrate-From-RBAC-to-AUTH"></a>

[역할 기반 액세스 제어(RBAC)](Clusters.RBAC.md)에 설명된 대로 Valkey 또는 Redis OSS RBAC(역할 기반 액세스 제어)를 사용하여 사용자를 인증하고 AUTH로 마이그레이션하려는 경우 다음 절차를 사용합니다. 콘솔이나 CLI를 사용하여 마이그레이션할 수 있습니다.

**콘솔을 사용하여 RBAC에서 AUTH로 마이그레이션하려면**

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

1. 오른쪽 상단의 목록에서 수정하려는 클러스터가 위치한AWS리전을 선택합니다.

1. 탐색 창에서 수정하려는 클러스터에서 실행 중인 엔진을 선택합니다.

   선택한 엔진의 클러스터 목록이 나타납니다.

1. 클러스터 목록에서 수정할 클러스터의 해당 이름을 선택합니다.

1. **작업**에서 **수정**을 선택합니다.

   **수정** 창이 나타납니다.

1. **액세스 제어**에서 **Valkey AUTH 기본 사용자 액세스** 또는 **Redis OSS AUTH 기본 사용자 액세스**를 선택합니다.

1. **Valkey AUTH 토큰** 또는 **Redis OSS AUTH 토큰**에서 새 토큰을 설정합니다.

1. **변경 사항 미리보기**를 선택하면 나오는 다음 화면에서 **수정**을 선택합니다.

**를 사용하여 RBAC에서 AUTH로 마이그레이션하려면AWS CLI**

다음 명령 중 하나를 사용하여 Valkey 또는 Redis OSS 복제 그룹에 대한 새 옵션 **AUTH** 토큰을 구성합니다. 옵션 인증 토큰은 다음 단계의 업데이트 전략 `SET`를 사용하여 인증 토큰이 필요한 것으로 표시될 때까지 복제 그룹에 대한 인증되지 않은 액세스를 허용합니다.

Linux, macOS, Unix의 경우:

```
aws elasticache modify-replication-group \
    --replication-group-id test \
    --remove-user-groups \
    --auth-token This-is-a-sample-token \
    --auth-token-update-strategy ROTATE \ 
    --apply-immediately
```

Windows의 경우:

```
aws elasticache modify-replication-group ^
    --replication-group-id test ^
    --remove-user-groups ^
    --auth-token This-is-a-sample-token ^
    --auth-token-update-strategy ROTATE ^ 
    --apply-immediately
```

위 명령을 실행한 후 새로 구성된 옵션 AUTH 토큰을 사용하여 ElastiCache 복제 그룹에 인증하도록 Valkey 또는 Redis OSS 애플리케이션을 업데이트할 수 있습니다. 인증 토큰 교체를 완료하려면 아래 후속 명령의 업데이트 전략 `SET`를 사용하세요. 이렇게 하면 옵션 AUTH 토큰이 필수로 표시됩니다. 인증 토큰 업데이트가 완료되면 복제 그룹 상태가 `ACTIVE`로 표시되고 이 복제 그룹에 대한 모든 연결에는 인증이 필요합니다.

Linux, macOS, Unix의 경우:

```
aws elasticache modify-replication-group \
			--replication-group-id test \
			--auth-token This-is-a-sample-token \
			--auth-token-update-strategy SET \ 
			--apply-immediately
```

Windows의 경우:

```
aws elasticache modify-replication-group ^
			--replication-group-id test ^
			--remove-user-groups ^
			--auth-token This-is-a-sample-token ^
			--auth-token-update-strategy SET ^ 
			--apply-immediately
```

자세한 내용은 [Valkey 및 Redis OSS AUTH 명령으로 인증](#auth) 단원을 참조하십시오.

**참고**  
ElastiCache 클러스터에서 액세스 제어를 비활성화해야 하는 경우 [ElastiCache Valkey 또는 Redis OSS 캐시에서 액세스 제어 비활성화](in-transit-encryption-disable.md) 섹션을 참조하세요.

# ElastiCache Valkey 또는 Redis OSS 캐시에서 액세스 제어 비활성화
<a name="in-transit-encryption-disable"></a>

Valkey 또는 Redis OSS TLS 지원 캐시에서 액세스 제어를 비활성화하려면 아래 지침을 따르세요. 캐시에는 AUTH 인증 기본 사용자 액세스 또는 사용자 그룹 액세스 제어 목록(RBAC)이라는 2가지 구성 유형 중 하나가 있습니다. 인증 구성을 선택하여 캐시를 만든 경우, 사용자 그룹을 제거하여 캐시를 비활성화하려면 먼저 RBAC 구성으로 변경해야 합니다. RBAC 구성으로 캐시를 만든 경우, 캐시를 바로 비활성화할 수 있습니다.

**RBAC로 구성된 Valkey 또는 Redis OSS 서버리스 캐시를 비활성화하려면 다음과 같이 하세요.**

1. 액세스 제어를 비활성화하려면 사용자 그룹을 제거합니다.

   ```
   aws elasticache modify-serverless-cache --serverless-cache-name <serverless-cache> --remove-user-group
   ```

1. (선택 사항) 서버리스 캐시에 연결된 사용자 그룹이 없는지 확인합니다.

   ```
   aws elasticache describe-serverless-caches --serverless-cache-name <serverless-cache>    
   {
       "..."
       "UserGroupId": ""
       "..."
   }
   ```

**AUTH 토큰으로 구성된 Valkey 또는 Redis OSS 캐시를 비활성화하려면 다음과 같이 하세요.**

1. AUTH 토큰을 RBAC로 변경하고 추가할 사용자 그룹을 지정합니다.

   ```
   aws elasticache modify-replication-group --replication-group-id <replication-group-id-value> --auth-token-update-strategy DELETE --user-group-ids-to-add <user-group-value>
   ```

1. AUTH 토큰이 비활성화되었고 사용자 그룹이 추가되었는지 확인합니다.

   ```
   aws elasticache describe-replication-groups --replication-group-id <replication-group-id-value>
   {
       "..."
       "AuthTokenEnabled": false,
       "UserGroupIds": [
           "<user-group-value>"
       ]
       "..."
   }
   ```

1. 액세스 제어를 비활성화하려면 사용자 그룹을 제거합니다.

   ```
   aws elasticache modify-replication-group --replication-group-id <replication-group-value> --user-group-ids-to-remove <user-group-value>
   {
       "..."
       "PendingModifiedValues": {
       "UserGroups": {
         "UserGroupIdsToAdd": [],
         "UserGroupIdsToRemove": [
           "<user-group-value>"
         ]
       }
       "..."
   }
   ```

1. (선택 사항) 클러스터에 연결된 사용자 그룹이 없는지 확인합니다. `AuthTokenEnabled` 필드도 거짓으로 표시되어야 합니다.

   ```
   aws elasticache describe-replication-groups --replication-group-id <replication-group-value>    
   "AuthTokenEnabled": false
   ```

**RBAC로 구성된 Valkey 또는 Redis OSS 클러스터를 비활성화하는 방법**

1. 액세스 제어를 비활성화하려면 사용자 그룹을 제거합니다.

   ```
   aws elasticache modify-replication-group --replication-group-id <replication-group-value> --user-group-ids-to-remove <user-group-value>
   {
       "..."
       "PendingModifiedValues": {
       "UserGroups": {
         "UserGroupIdsToAdd": [],
         "UserGroupIdsToRemove": [
           "<user-group-value>"
         ]
       }
       "..."
   }
   ```

1. (선택 사항) 클러스터에 연결된 사용자 그룹이 없는지 확인합니다. `AuthTokenEnabled` 필드도 거짓으로 표시되어야 합니다.

   ```
   aws elasticache describe-replication-groups --replication-group-id <replication-group-value>    
   "AuthTokenEnabled": false
   ```