教程:配置 Lambda 函数以访问亚马逊中的 MemoryDB VPC - Amazon MemoryDB

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

教程:配置 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 可能需要几分钟才能完成集群的创建。

复制集群终端节点

使用命令验证 MemoryDB 是否已完成集群的 describe-clusters创建。

aws memorydb describe-clusters \ --cluster-name cluster-01

复制输出中显示的集群终端节点地址。在为 Lambda 函数创建部署包时,您将需要此地址。

创建IAM角色

  1. 为您的角色创建IAM信任政策文档,如下所示,允许您的账户担任新角色。将策略保存到名为 trust-policy.json 的文件中。请务必将本政策中的账号_id 123456789012 替换为你的账户 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" }] }
  2. 创建IAM策略文档,如下所示。将策略保存到名为 policy.json 的文件中。请务必将本政策中的账号_id 123456789012 替换为你的账户 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" ] } ] }
  3. 创建IAM角色。

    aws iam create-role \ --role-name "memorydb-iam-auth-app" \ --assume-role-policy-document file://trust-policy.json
  4. 创建IAM策略。

    aws iam create-policy \ --policy-name "memorydb-allow-all" \ --policy-document file://policy.json
  5. 将IAM策略附加到该角色。请务必将本政策中的账户 ID 123456789012 替换为你的账户 ID。

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

创建访问控制列表 (ACL)

  1. 创建新的IAM启用用户。

    aws memorydb create-user \ --user-name iam-user-01 \ --authentication-mode Type=iam \ --access-string "on ~* +@all"
  2. 创建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-pycachetools库的文件夹包。

mkdir package

安装redis-pycachetools使用 pip。

pip install --target ./package redis pip install --target ./package cachetools

创建包含redis-pycachetools库的.zip 文件。在 Linux 和 macOS 中,运行以下命令。在 Windows 中,使用你首选的 zip 实用程序创建一个.zip 文件,根目录为redis-pycachetools库。

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。您可以在 Amazon 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 函数将从缓存中检索项目。

  1. 使用调用命令 AWS Lambda 调用 Lambda 函数 (AccessMemoryDB)。

    aws lambda invoke \ --function-name AccessMemoryDB \ --region us-east-1 \ output.txt
  2. 按以下过程验证 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"