View a markdown version of this page

使用公共端点连接到缓存 - Amazon ElastiCache
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)。

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

使用公共端点连接到缓存

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

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

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

  3. 手动 Sigv4 签名:使用 SDK 自行生成令牌。 Amazon

用于连接的 IAM 策略

在您连接之前,您的 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 客户端

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

Python

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

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

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

安装

pip install developer-toolkit-elasticache

Python 和 valkey-py

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

要连接 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存储库的开发者工具包 GitHub。

选项 3:手动 sigV4 签名

使用 Amazon 软件开发工具包手动生成 IAM 身份验证令牌。有关签名代码的示例,请参阅使用令牌作为密码进行连接。

令牌和会话到期

  • 令牌过期:IAM 身份验证令牌的有效期为 15 分钟。GLIDE 会自动刷新令牌。如果您使用开发者工具包或手动签名,请为每个新连接生成一个新令牌。令牌过期不会影响已建立的连接。如果您使用临时证书签署令牌,则令牌将在这些证书过期时过期(如果该时间早于 15 分钟)。

  • 会话过期:连接将在 12 小时后过期并自动重新连接。撤销 IAM 委托人的elasticache:Connect权限不会立即断开活动会话的连接。要立即断开用户的连接,请将该用户从缓存的用户组中移除。

问题排查

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

错误 原因 解决方案
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 hboard 中是否存在 ElastiCache 服务问题。
连接超时 网络连接问题、端点不正确或未启用 TLS 验证终端节点地址是否正确,在您的客户端配置中启用了 TLS,并且您的网络允许到端口 6379 的出站连接。
TLS handshake failure 客户端不支持 TLS 1.3。带有公共端点的缓存需要 TLS 1.3。 将您的客户端或运行时更新到支持 TLS 1.3 的版本。