

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用公共端点连接到缓存
<a name="connecting-public-endpoint"></a>

所有公共终端节点连接都需要 IAM 身份验证和 TLS 1.3。生成 IAM 身份验证令牌的方法有三种：

1. **GLIDE 客户端：**自动处理令牌生成和刷新。无需验证码。

1. **开发者工具包 ElastiCache：为您**生成令牌。将其与任何 Valkey 或 Redis OSS 客户端库一起使用。

1. **手动 Sigv4 签名：**使用 SDK 自行生成令牌。 Amazon 

**Topics**
+ [用于连接的 IAM 策略](#connecting-public-endpoint-iam-policy)
+ [选项 1：内置 IAM 的 GLIDE 客户端](#connecting-public-endpoint-glide)
+ [选项 2：开发者工具包 ElastiCache](#connecting-public-endpoint-toolkit)
+ [选项 3：手动 sigV4 签名](#connecting-public-endpoint-sigv4)
+ [令牌和会话到期](#connecting-public-endpoint-behavior)
+ [问题排查](#connecting-public-endpoint-troubleshooting)

## 用于连接的 IAM 策略
<a name="connecting-public-endpoint-iam-policy"></a>

在您连接之前，您的 IAM 用户或角色需要获得调用权限`elasticache:Connect`。 Amazon 托管策略`AdministratorAccess`包括所有资源的此权限。

创建允许对 ElastiCache 缓存和 ElastiCache 用户执行`elasticache:Connect`操作的 IAM 策略：

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "elasticache:Connect",
            "Resource": [
                "arn:aws:elasticache:us-east-1:123456789012:serverlesscache:my-public-cache",
                "arn:aws:elasticache:us-east-1:123456789012:user:default.iam-user"
            ]
        }
    ]
}
```

## 选项 1：内置 IAM 的 GLIDE 客户端
<a name="connecting-public-endpoint-glide"></a>

GLIDE 2.2 及更高版本包含内置的 IAM 身份验证支持。您可以配置 Amazon 凭据，GLIDE 会自动处理令牌生成、缓存和刷新。有关安装说明，请参阅 [GLIDE 网站上的 GLIDE 文档](https://glide.valkey.io)。

### Python
<a name="connecting-public-endpoint-glide-python"></a>

```
from glide import (
    GlideClusterClient, GlideClusterClientConfiguration, NodeAddress,
    ServerCredentials, IamAuthConfig, ServiceType,
)

config = GlideClusterClientConfiguration(
    addresses=[NodeAddress("my-public-cache-x2e9hv.public.serverless.use1.cache.amazonaws.com", 6379)],
    credentials=ServerCredentials(
        username="default.iam-user",
        iam_config=IamAuthConfig(
            cluster_name="my-public-cache",
            service=ServiceType.ELASTICACHE,
            region="us-east-1",
        ),
    ),
    use_tls=True,
)

client = await GlideClusterClient.create(config)
await client.set("key", "value")
result = await client.get("key")
print(result)  # b"value"
```

### Java
<a name="connecting-public-endpoint-glide-java"></a>

```
import glide.api.GlideClusterClient;
import glide.api.models.configuration.IamAuthConfig;
import glide.api.models.configuration.ServiceType;
import glide.api.models.configuration.ServerCredentials;
import glide.api.models.configuration.GlideClusterClientConfiguration;
import glide.api.models.configuration.NodeAddress;

import java.util.List;
import java.util.Collections;

List<NodeAddress> nodes = Collections.singletonList(
    NodeAddress.builder()
        .host("my-public-cache-x2e9hv.public.serverless.use1.cache.amazonaws.com")
        .port(6379)
        .build()
);

IamAuthConfig iamConfig = IamAuthConfig.builder()
    .clusterName("my-public-cache")
    .service(ServiceType.ELASTICACHE)
    .region("us-east-1")
    .build();

GlideClusterClientConfiguration config = GlideClusterClientConfiguration.builder()
    .addresses(nodes)
    .credentials(ServerCredentials.builder()
        .username("default.iam-user")
        .iamConfig(iamConfig)
        .build())
    .useTLS(true)
    .build();

GlideClusterClient client = GlideClusterClient.createClient(config).get();
client.set("key", "value").get();
String result = client.get("key").get();
System.out.println(result);  // "value"
```

## 选项 2：开发者工具包 ElastiCache
<a name="connecting-public-endpoint-toolkit"></a>

 ElastiCache (`developer-toolkit-elasticache`) 的开发者工具包是一个独立的 Python 库和 CLI，用于生成 IAM 身份验证令牌。将其与 Python Valkey 或 Redis OSS 客户端库一起使用，比如 valkey-py。

### 安装
<a name="connecting-public-endpoint-toolkit-install"></a>

```
pip install developer-toolkit-elasticache
```

### Python 和 valkey-py
<a name="connecting-public-endpoint-toolkit-python"></a>

```
import valkey
from valkey.credentials import CredentialProvider

from developer_toolkit_elasticache import ElastiCacheIAMAuthTokenProvider

class ElastiCacheCredentialProvider(CredentialProvider):
    def __init__(self, auth):
        self._auth = auth

    def get_credentials(self):
        return self._auth.user_id, self._auth.get_token()

auth = ElastiCacheIAMAuthTokenProvider(
    serverless_cache_name="my-public-cache",
    user_id="default.iam-user",
    region="us-east-1",
)

client = valkey.ValkeyCluster(
    host="my-public-cache-x2e9hv.public.serverless.use1.cache.amazonaws.com",
    port=6379,
    ssl=True,
    credential_provider=ElastiCacheCredentialProvider(auth),
)

client.set("key", "value")
result = client.get("key")
print(result)  # b"value"
```

开发者工具包不会自动刷新令牌。IAM 身份验证令牌的有效期为 15 分钟，因此您的应用程序必须在当前令牌到期之前生成新令牌。前面示例中的凭证提供者会调`get_token()`用每个新连接。

### 带有开发者工具包的 CLI
<a name="connecting-public-endpoint-toolkit-cli"></a>

要连接 valkey-cli 或 redis-cli，请使用开发者工具包 CLI 生成令牌：

```
export VALKEYCLI_AUTH=$(developer-toolkit-elasticache generate_iam_auth_token \
    --serverless-cache-name my-public-cache \
    --user-id default.iam-user \
    --region us-east-1)

valkey-cli -c -h my-public-cache-x2e9hv.public.serverless.use1.cache.amazonaws.com \
    -p 6379 \
    --tls \
    --user default.iam-user
```

`VALKEYCLI_AUTH`需要 valkey-cli 9.0 或更高版本。对于 redis-cli，请使用代替`REDISCLI_AUTH`。`VALKEYCLI_AUTH`

有关源代码和其他示例，请参阅上 ElastiCache存储库[的开发者工具包](https://github.com/aws/developer-toolkit-elasticache) GitHub。

## 选项 3：手动 sigV4 签名
<a name="connecting-public-endpoint-sigv4"></a>

使用 Amazon 软件开发工具包手动生成 IAM 身份验证令牌。有关签名代码的示例，请参阅[使用令牌作为密码进行连接](auth-iam.md#auth-iam-manual-sigv4)。

## 令牌和会话到期
<a name="connecting-public-endpoint-behavior"></a>
+ **令牌过期：**IAM 身份验证令牌的有效期为 15 分钟。GLIDE 会自动刷新令牌。如果您使用开发者工具包或手动签名，请为每个新连接生成一个新令牌。令牌过期不会影响已建立的连接。如果您使用临时证书签署令牌，则令牌将在这些证书过期时过期（如果该时间早于 15 分钟）。
+ **会话过期：**连接将在 12 小时后过期并自动重新连接。撤销 IAM 委托人的`elasticache:Connect`权限不会立即断开活动会话的连接。要立即断开用户的连接，请将该用户从缓存的用户组中移除。

## 问题排查
<a name="connecting-public-endpoint-troubleshooting"></a>

下表列出了常见的连接错误、其原因以及解决方法。


| 错误 | 原因 | 解决方案 | 
| --- | --- | --- | 
| WRONGPASS或身份验证失败 | IAM 令牌已过期、用户名不正确、IAM 权限缺失、缓存名称不为小写或临时证书已过期 | 验证令牌是新的（少于 15 分钟），用户名是否与缓存用户组中的用户相匹配，IAM 委托人对缓存 ARN 和用户 ARN 都具有elasticache:Connect权限，令牌签名代码中的缓存名称是否为小写，并且，如果您使用临时证书签署令牌，则这些证书尚未过期。 | 
| NOAUTH Authentication required | 客户端在进行身份验证之前发送了一条命令。公共端点连接必须使用AUTH或HELLO … AUTH作为其第一个命令进行身份验证。在应用凭据之前，某些客户端库会发送诸如 PING “CLIENT SETINFO或” 之类的命令。重复执行未经身份验证的命令后，连接将关闭。 | 配置您的客户端，使身份验证作为连接设置的一部分进行——将令牌作为连接密码传递或通过凭据提供者传递，而不是AUTH在连接后调用。GLIDE 会自动执行此操作。 | 
| ERR service is not available | 对于在身份验证完成之前失败的任何新连接，都会返回此错误。为避免向未经身份验证的调用者透露引擎内部状态，请 ElastiCache 报告同样的通用消息，原因有几个不同的根本原因：IAM 身份验证暂时不可用，由于 IAM 身份验证限制您受到速率限制，或者引擎暂时超载（、或达到的最大客户端数）。BUSY CLUSTERDOWN在重新运行的已通过身份验证的连接上HELLO，将 ElastiCache 返回特定的错误，例如AUTH或。ERR IAM Authentication service is not available ERR Exceeded limit of IAM Authentication requests | 如果您最近打开的新连接或重新身份验证的比率很高，请降低该比率，然后使用指数级退避重试。如果您的连接率和重新身份验证率正常，请查看 Healt [Amazon h Das](https://health.aws.amazon.com/) hboard 中是否存在 ElastiCache 服务问题。 | 
| 连接超时 | 网络连接问题、端点不正确或未启用 TLS | 验证终端节点地址是否正确，在您的客户端配置中启用了 TLS，并且您的网络允许到端口 6379 的出站连接。 | 
| TLS handshake failure | 客户端不支持 TLS 1.3。带有公共端点的缓存需要 TLS 1.3。 | 将您的客户端或运行时更新到支持 TLS 1.3 的版本。 | 