本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
教程:配置 Lambda 函数以访问亚马逊中的 MemoryDB VPC
在本教程中,您可以学习如何:
在 us-east-1 区域的默认亚马逊虚拟私有云(亚马逊VPC)中创建 MemoryDB 集群。
创建 Lambda 函数以访问集群。创建 Lambda 函数时,您需要在您的 Amazon IDs 中提供子网VPC和一个VPC安全组,以允许 Lambda 函数访问您的中的资源。VPC为了便于在本教程中进行说明,Lambda 函数生成一个UUID,将其写入集群,然后从集群中检索它。
手动调用 Lambda 函数并验证它是否访问了您的集群。VPC
清理为本教程设置的 Lambda 函数、集群和IAM角色。
步骤 1:创建集群
要创建集群,请执行以下步骤。
创建集群
在此步骤中,您将使用 () 在账户的 us-east-1 区域的默认 Amazon VPC 中创建一个集群。 AWS Command Line Interface CLI有关使用 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角色(执行角色)
将名为的 AWS 托管策略附加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)。 AWS CLI
在包含您的部署包.zip 文件的项目目录中,运行以下 CLI create-function
Lambda 命令。
对于角色选项,请使用您在上一步中创建的执行角色的。ARN在 vpc-config 中,输入以逗号分隔的默认VPC子网列表和默认VPC的安全组 ID。您可以在亚马逊VPC控制台中找到这些值。要查找您的默认VPC子网,请选择您的VPCs,然后选择您 AWS 账户的默认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 函数将从缓存中检索项目。
使用调用命令 AWS 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.
在 AWS 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"