本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
教程:配置 Lambda 函数,以便在 Amazon VPC 中访问 MemoryDB
在本教程中,您可以学习如何:
在 us-east-1 区域中的默认 Amazon Virtual Private Cloud(Amazon VPC)中创建 MemoryDB 集群。
创建 Lambda 函数以访问集群。创建 Lambda 函数时,您需要在您的 Amazon VPC IDs 中提供子网和一个 VPC 安全组,以允许 Lambda 函数访问您的 VPC 中的资源。在本教程的图示中,Lambda 函数生成 UUID,将其写入到集群,然后从集群中检索。
手动调用 Lambda 函数,并确认它访问了您的 VPC 中的集群。
清理为本教程设置的 Lambda 函数、集群和 IAM 角色。
步骤 1:创建集群
要创建集群,请执行以下步骤。
创建集群
在此步骤中,您将使用 (CLI) 在账户的 us-east-1 区域的默认 Amazon VPC 中创建一个集群。 Amazon Command Line Interface 有关使用 MemoryDB 控制台或 API 创建集群的信息,请参阅步骤 2:创建集群。
aws memorydb create-cluster --cluster-name cluster-01 --engine-version 7.0 --acl-name open-access \ --description "MemoryDB IAM auth application" \ --node-type db.r6g.large
请注意,“状态”字段的值设置为 CREATING
。MemoryDB 需要几分钟时间来完成集群的创建。
复制集群端点
使用 describe-clusters
命令确认 MemoryDB 已完成集群的创建。
aws memorydb describe-clusters \ --cluster-name cluster-01
复制输出中显示的集群端点地址。在为 Lambda 函数创建部署包时,您将需要此地址。
创建 IAM 角色
为您的角色创建 IAM 信任政策文档,如下所示,允许您的账户承担新角色。将策略保存到名为 trust-policy.json 的文件中。请务必将本策略中的 account_id 123456789012 替换为您的 account_id。
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:root" }, "Action": "sts:AssumeRole" }, { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" }] }
创建 IAM 策略文档,如下所示。将策略保存到名为 policy.json 的文件中。请务必将本策略中的 account_id 123456789012 替换为您的 account_id。
{ "Version": "2012-10-17", "Statement": [ { "Effect" : "Allow", "Action" : [ "memorydb:Connect" ], "Resource" : [ "arn:aws:memorydb:us-east-1:123456789012:cluster/cluster-01", "arn:aws:memorydb:us-east-1:123456789012:user/iam-user-01" ] } ] }
创建一个 IAM 角色。
aws iam create-role \ --role-name "memorydb-iam-auth-app" \ --assume-role-policy-document file://trust-policy.json
创建 IAM 策略。
aws iam create-policy \ --policy-name "memorydb-allow-all" \ --policy-document file://policy.json
向角色附加 IAM 策略。请务必将这个 policy-arn 中的 account_id 123456789012 替换为您的 account_id。
aws iam attach-role-policy \ --role-name "memorydb-iam-auth-app" \ --policy-arn "arn:aws:iam::123456789012:policy/memorydb-allow-all"
创建访问控制列表(ACL)
创建启用 IAM 的新用户。
aws memorydb create-user \ --user-name iam-user-01 \ --authentication-mode Type=iam \ --access-string "on ~* +@all"
创建 ACL 并将其附加到集群中。
aws memorydb create-acl \ --acl-name iam-acl-01 \ --user-names iam-user-01 aws memorydb update-cluster \ --cluster-name cluster-01 \ --acl-name iam-acl-01
第 2 步:创建 Lambda 函数
要创建 Lambda 函数,请执行以下步骤。
创建部署程序包
在本教程中,我们为您的 Lambda 函数提供了 Python 中的示例代码。
Python
以下示例 Python 代码在 MemoryDB 集群中读取和写入项目。复制代码,并将其保存到名为 app.py
的文件中。请确保将代码中的 cluster_endpoint
值替换为您在之前的步骤中复制的端点地址。
from typing import Tuple, Union from urllib.parse import ParseResult, urlencode, urlunparse import botocore.session import redis from botocore.model import ServiceId from botocore.signers import RequestSigner from cachetools import TTLCache, cached import uuid class MemoryDBIAMProvider(redis.CredentialProvider): def __init__(self, user, cluster_name, region="us-east-1"): self.user = user self.cluster_name = cluster_name self.region = region session = botocore.session.get_session() self.request_signer = RequestSigner( ServiceId("memorydb"), self.region, "memorydb", "v4", session.get_credentials(), session.get_component("event_emitter"), ) # Generated IAM tokens are valid for 15 minutes @cached(cache=TTLCache(maxsize=128, ttl=900)) def get_credentials(self) -> Union[Tuple[str], Tuple[str, str]]: query_params = {"Action": "connect", "User": self.user} url = urlunparse( ParseResult( scheme="https", netloc=self.cluster_name, path="/", query=urlencode(query_params), params="", fragment="", ) ) signed_url = self.request_signer.generate_presigned_url( {"method": "GET", "url": url, "body": {}, "headers": {}, "context": {}}, operation_name="connect", expires_in=900, region_name=self.region, ) # RequestSigner only seems to work if the URL has a protocol, but # MemoryDB only accepts the URL without a protocol # So strip it off the signed URL before returning return (self.user, signed_url.removeprefix("https://")) def lambda_handler(event, context): username = "iam-user-01" # replace with your user id cluster_name = "cluster-01" # replace with your cache name cluster_endpoint = "clustercfg.cluster-01.xxxxxx.memorydb.us-east-1.amazonaws.com" # replace with your cluster endpoint creds_provider = MemoryDBIAMProvider(user=username, cluster_name=cluster_name) redis_client = redis.Redis(host=cluster_endpoint, port=6379, credential_provider=creds_provider, ssl=True, ssl_cert_reqs="none") key='uuid' # create a random UUID - this will be the sample element we add to the cluster uuid_in = uuid.uuid4().hex redis_client.set(key, uuid_in) result = redis_client.get(key) decoded_result = result.decode("utf-8") # check the retrieved item matches the item added to the cluster and print # the results if decoded_result == uuid_in: print(f"Success: Inserted {uuid_in}. Fetched {decoded_result} from MemoryDB.") else: raise Exception(f"Bad value retrieved. Expected {uuid_in}, got {decoded_result}") return "Fetched value from MemoryDB"
此代码使用 Python redis-py
库将项目放入集群并检索它们。此代码使用 cachetools
将生成的 IAM 身份验证令牌缓存 15 分钟。要创建包含 redis-py
和 cachetools
的部署包,请执行以下步骤。
在包含 app.py
源代码文件的项目目录中,创建一个文件夹包,用于在其中安装 redis-py
和 cachetools
库。
mkdir package
使用 pip 安装 redis-py
和 cachetools
。
pip install --target ./package redis pip install --target ./package cachetools
创建包含 redis-py
和 cachetools
库的 .zip 文件。在 Linux 和 MacOS 中,运行以下命令。在 Windows 中,使用首选 zip 实用工具创建一个 .zip 文件,并将 redis-py
和 cachetools
库置于根目录下。
cd package zip -r ../my_deployment_package.zip .
将您的函数代码添加到 .zip 文件。在 Linux 和 macOS 中,运行以下命令:在 Windows 中,使用首选 zip 实用工具将 app.py 添加到 .zip 文件的根目录下。
cd .. zip my_deployment_package.zip app.py
创建 IAM 角色(执行角色)
将名为的 Amazon 托管策略附加AWSLambdaVPCAccessExecutionRole
到角色。
aws iam attach-role-policy \ --role-name "memorydb-iam-auth-app" \ --policy-arn "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
上传部署包(创建 Lambda 函数)
在此步骤中,您将使用创建函数命令创建 Lambda 函数 (AccessMemoryDB)。 Amazon CLI
在包含您的部署包 .zip 文件的项目目录中,运行以下 Lambda CLI create-function
命令。
对于角色选项,请使用您在上一步中创建的执行角色的 ARN。对于 vpc-config,请输入默认 VPC 子网的列表和默认 VPC 安全组 ID 的列表,以逗号分隔。您还可以在 Amazon VPC 控制台中找到这些值。要查找您的默认 VPC 子网,请选择您的 VPCs,然后选择您 Amazon 账户的默认 VPC。要查找此 VPC 的安全组,请转到安全,然后选择安全组。请确保您选择了 us-east-1 区域。
aws lambda create-function \ --function-name AccessMemoryDB \ --region us-east-1 \ --zip-file fileb://my_deployment_package.zip \ --role arn:aws:iam::123456789012:role/memorydb-iam-auth-app \ --handler app.lambda_handler \ --runtime python3.12 \ --timeout 30 \ --vpc-config SubnetIds=comma-separated-vpc-subnet-ids,SecurityGroupIds=default-security-group-id
步骤 3:测试 Lambda 函数
在此步骤中,您将使用调用命令手动调用 Lambda 函数。当 Lambda 函数执行时,它会生成一个 UUID 并将其写入您在 Lambda 代码中指定的 ElastiCache 缓存中。然后,Lambda 函数将从缓存中检索项目。
使用调用命令 Amazon Lambda 调用 Lambda 函数 (AccessMemoryDB)。
aws lambda invoke \ --function-name AccessMemoryDB \ --region us-east-1 \ output.txt
按以下过程验证 Lambda 函数是否已成功执行:
查看 output.txt 文件。
打开 CloudWatch 控制台并选择函数的日志组 (/aws/lambda/AccessRedis),验证日志中的 CloudWatch 结果。日志流应包含类似于以下内容的输出:
Success: Inserted 826e70c5f4d2478c8c18027125a3e01e. Fetched 826e70c5f4d2478c8c18027125a3e01e from MemoryDB.
在 Amazon Lambda 控制台中查看结果。
步骤 4:清除(可选)
要进行清理,请执行以下步骤。
删除 Lambda 函数
aws lambda delete-function \ --function-name AccessMemoryDB
删除 MemoryDB 集群
请删除集群。
aws memorydb delete-cluster \ --cluster-name cluster-01
移除用户和 ACL
aws memorydb delete-user \ --user-id iam-user-01 aws memorydb delete-acl \ --acl-name iam-acl-01
移除 IAM 角色和策略
aws iam detach-role-policy \ --role-name "memorydb-iam-auth-app" \ --policy-arn "arn:aws:iam::123456789012:policy/memorydb-allow-all" aws iam detach-role-policy \ --role-name "memorydb-iam-auth-app" \ --policy-arn "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole" aws iam delete-role \ --role-name "memorydb-iam-auth-app" aws iam delete-policy \ --policy-arn "arn:aws:iam::123456789012:policy/memorydb-allow-all"