チュートリアル: ElastiCache で にアクセスするように Lambda を設定する VPC - Amazon ElastiCache

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

チュートリアル: ElastiCache で にアクセスするように Lambda を設定する VPC

このチュートリアルでは、 ElastiCache サーバーレスキャッシュの作成、Lambda 関数の作成、Lambda 関数のテスト、オプションでクリーンアップを行う方法について説明します。

ステップ 1: ElastiCache サーバーレスキャッシュを作成する。

サーバーレスキャッシュを作成するには、次の手順に従います。

ステップ 1.1: サーバーレスキャッシュを作成する

このステップでは、 AWS Command Line Interface () を使用して、アカウントの us-east-1 リージョンVPCのデフォルトの Amazon にサーバーレスキャッシュを作成しますCLI。 ElastiCache コンソールまたは を使用してサーバーレスキャッシュを作成する方法についてはAPI、「」を参照してくださいValkey サーバーレスキャッシュを作成する

aws elasticache create-serverless-cache \ --serverless-cache-name cache-01 \ --description "ElastiCache IAM auth application" \ --engine valkey

[ステータス] フィールドの値が CREATING に設定されていることに注意してください。キャッシュの作成 ElastiCache が完了するまでに 1 分かかる場合があります。

ステップ 1.2: サーバーレスキャッシュエンドポイントをコピーする

ElastiCache (Redis OSS) が describe-serverless-caches コマンドを使用してキャッシュの作成を完了したことを確認します。

aws elasticache describe-serverless-caches \ --serverless-cache-name cache-01

出力に表示されたエンドポイントアドレスをコピーします。Lambda 関数のデプロイパッケージを作成するときに、このアドレスが必要になります。

ステップ 1.3: IAMロールを作成する

  1. 以下に示すように、アカウントが新しいロールを引き受けることができるIAM信頼ポリシードキュメントを作成します。ポリシーを trust-policy.json というファイルに保存します。

    { "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 というファイルに保存します。

    { "Version": "2012-10-17", "Statement": [ { "Effect" : "Allow", "Action" : [ "elasticache:Connect" ], "Resource" : [ "arn:aws:elasticache:us-east-1:123456789012:serverlesscache:cache-01", "arn:aws:elasticache:us-east-1:123456789012:user:iam-user-01" ] } ] }
  3. IAM ロールを作成します。

    aws iam create-role \ --role-name "elasticache-iam-auth-app" \ --assume-role-policy-document file://trust-policy.json
  4. IAM ポリシーを作成します。

    aws iam create-policy \ --policy-name "elasticache-allow-all" \ --policy-document file://policy.json
  5. IAM ポリシーをロールにアタッチします。

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

ステップ 1.4: サーバーレスキャッシュを作成する

  1. 新しいデフォルトユーザーを作成します。

    aws elasticache create-user \ --user-name default \ --user-id default-user-disabled \ --engine redis \ --authentication-mode Type=no-password-required \ --access-string "off +get ~keys*"
  2. IAM新しい 対応ユーザーを作成します。

    aws elasticache create-user \ --user-name iam-user-01 \ --user-id iam-user-01 \ --authentication-mode Type=iam \ --engine redis \ --access-string "on ~* +@all"
  3. ユーザーグループを作成し、ユーザーをアタッチします。

    aws elasticache create-user-group \ --user-group-id iam-user-group-01 \ --engine redis \ --user-ids default-user-disabled iam-user-01 aws elasticache modify-serverless-cache \ --serverless-cache-name cache-01 \ --user-group-id iam-user-group-01

ステップ 2: の Lambda 関数を作成する ElastiCache

ElastiCache キャッシュにアクセスするための Lambda 関数を作成するには、以下の手順を実行します。

ステップ 2.1: Lambda 関数を作成する

このチュートリアルでは、Lambda 関数のコード例を Python で提供します。

Python

次の Python コードの例では、 ElastiCache キャッシュに項目を読み書きします。コードを app.py という名前のファイルに保存します。コードのelasticache_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 ElastiCacheIAMProvider(redis.CredentialProvider): def __init__(self, user, cache_name, is_serverless=False, region="us-east-1"): self.user = user self.cache_name = cache_name self.is_serverless = is_serverless self.region = region session = botocore.session.get_session() self.request_signer = RequestSigner( ServiceId("elasticache"), self.region, "elasticache", "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} if self.is_serverless: query_params["ResourceType"] = "ServerlessCache" url = urlunparse( ParseResult( scheme="https", netloc=self.cache_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 # Elasticache 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 cache_name = "cache-01" # replace with your cache name elasticache_endpoint = "cache-01-xxxxx.serverless.use1.cache.amazonaws.com" # replace with your cache endpoint creds_provider = ElastiCacheIAMProvider(user=username, cache_name=cache_name, is_serverless=True) redis_client = redis.Redis(host=elasticache_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 cache 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 cache and print # the results if decoded_result == uuid_in: print(f"Success: Inserted {uuid_in}. Fetched {decoded_result} from Valkey.") else: raise Exception(f"Bad value retrieved. Expected {uuid_in}, got {decoded_result}") return "Fetched value from Valkey"

このコードは Python redis-py ライブラリを使用して項目をキャッシュに入れ、取得します。このコードは cachetools を使用して、生成された Auth IAM トークンを 15 分間キャッシュします。redis-py と cachetools を含むデプロイパッケージを作成するには、次の手順を実行します。

app.py ソースコードファイルを含むプロジェクトディレクトリで、フォルダパッケージを作成して redis-py ライブラリと cachetools ライブラリをインストールします。

mkdir package

pip を使用して redis-py キャッシュツールをインストールします。

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

redis-py ライブラリと cachetools ライブラリを含む .zip ファイルを作成します。Linux および macOS では、次のコマンドを実行します。Windows では、任意の zip ユーティリティを使用して、ルートに redis-py ライブラリと cachetools ライブラリを含む .zip ファイルを作成します。

cd package zip -r ../my_deployment_package.zip .

.zip ファイルに関数コードを追加します。Linux および macOS では、次のコマンドを実行します。Windows では、任意の zip ユーティリティを使用して、app.py を .zip ファイルのルートに追加します。

cd .. zip my_deployment_package.zip app.py

ステップ 2.2: IAMロールを作成する (実行ロール)

という名前の AWS マネージドポリシーをロールAWSLambdaVPCAccessExecutionRoleにアタッチします。

aws iam attach-role-policy \ --role-name "elasticache-iam-auth-app" \ --policy-arn "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"

ステップ 2.3: デプロイパッケージをアップロードする (Lambda 関数を作成する)

このステップでは、create-function AWS CLI コマンドを使用して Lambda 関数 (AccessValkey) を作成します。

デプロイパッケージ .zip ファイルを含むプロジェクトディレクトリから、次の Lambda CLI create-function コマンドを実行します。

ロールオプションには、前のステップで作成した実行ロールARNの を使用します。vpc-config には、デフォルトの VPCのサブネットとデフォルトの VPCのセキュリティグループ ID のカンマ区切りリストを入力します。これらの値は Amazon VPCコンソールで確認できます。デフォルトの VPCのサブネットを検索するには、 VPCsを選択し、 AWS アカウントのデフォルトの を選択しますVPC。この のセキュリティグループを検索するにはVPC、Security に移動し、Security groups を選択します。us-east-1 リージョンが選択されていることを確認します。

aws lambda create-function \ --function-name AccessValkey \ --region us-east-1 \ --zip-file fileb://my_deployment_package.zip \ --role arn:aws:iam::123456789012:role/elasticache-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 関数をテストする ElastiCache

このステップでは、呼び出しコマンドを使用して Lambda 関数を手動で呼び出します。Lambda 関数を実行するUUIDと、 が生成され、Lambda コードで指定した ElastiCache キャッシュに書き込まれます。次に、Lambda 関数はキャッシュから項目を取得します。

  1. invoke コマンドを使用して Lambda 関数 (AccessValkey) AWS Lambda を呼び出します。

    aws lambda invoke \ --function-name AccessValkey \ --region us-east-1 \ output.txt
  2. Lambda 関数が正常に実行されたことを、次のように確認します。

    • output.txt ファイルを確認します。

    • CloudWatch コンソールを開き、関数のロググループ (/aws/lambda/) を選択して、 CloudWatch Logs で結果を確認しますAccessValkey。ログストリームには、以下と同様のコマンドの出力が含まれます。

      Success: Inserted 826e70c5f4d2478c8c18027125a3e01e. Fetched 826e70c5f4d2478c8c18027125a3e01e from Valkey.
    • AWS Lambda コンソールで結果を確認します。

ステップ 4: クリーンアップ (オプション)

クリーンアップするには、以下の手順を実行します。

ステップ 4.1: Lambda 関数を削除する

aws lambda delete-function \ --function-name AccessValkey

ステップ 4.2: サーバーレスキャッシュを削除する

キャッシュを削除します。

aws elasticache delete-serverless-cache \ --serverless-cache-name cache-01

ユーザーとユーザーグループを削除します。

aws elasticache delete-user \ --user-id default-user-disabled aws elasticache delete-user \ --user-id iam-user-01 aws elasticache delete-user-group \ --user-group-id iam-user-group-01

ステップ 4.3: IAMロールとポリシーを削除する

aws iam detach-role-policy \ --role-name "elasticache-iam-auth-app" \ --policy-arn "arn:aws:iam::123456789012:policy/elasticache-allow-all" aws iam detach-role-policy \ --role-name "elasticache-iam-auth-app" \ --policy-arn "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole" aws iam delete-role \ --role-name "elasticache-iam-auth-app" aws iam delete-policy \ --policy-arn "arn:aws:iam::123456789012:policy/elasticache-allow-all"