翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
このチュートリアルの学習内容は次のとおりです。
us-east-1 リージョンのデフォルトの Amazon Virtual Private Cloud (Amazon VPC) に MemoryDB クラスターを作成します。
クラスターにアクセスするための Lambda 関数を作成します。Lambda 関数を作成するときは、Amazon IDsのサブネットVPCとVPCセキュリティグループを指定して、Lambda 関数が のリソースにアクセスできるようにしますVPC。このチュートリアルでは、説明のために、Lambda 関数は を生成しUUID、クラスターに書き込み、クラスターから取得します。
Lambda 関数を手動で呼び出し、 のクラスターにアクセスしたことを確認しますVPC。
このチュートリアル用にセットアップされた Lambda 関数、クラスター、IAMロールをクリーンアップします。
ステップ 1: クラスターを作成する
クラスターを作成するには、次のステップに従います。
クラスターを作成する
このステップでは、 AWS Command Line Interface () を使用して、アカウントの us-east-1 リージョンVPCのデフォルトの Amazon にクラスターを作成します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
値を、ステップ 1 でコピーしたエンドポイントアドレスに必ず置き換えてください。
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
を使用して、生成された Auth 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 ユーティティを使用して、redis-py
および cachetools
ライブラリをルートに置く .zip ファイルを作成します。
cd package
zip -r ../my_deployment_package.zip .
.zip ファイルに関数コードを追加します。Linux および macOS では、次のコマンドを実行します。Windows では、任意の zip ユーティリティを使用して .zip ファイルのルートに app.py を追加します。
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 関数を作成する)
このステップでは、create-function AWS CLI コマンドを使用して Lambda 関数 (AccessMemoryDB) を作成します。
デプロイパッケージ .zip ファイルを含むプロジェクトディレクトリから、次の Lambda CLI create-function
コマンドを実行します。
ロールオプションには、前のステップで作成した実行ロール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 関数をテストする
このステップでは、invoke コマンドを使用して Lambda 関数を手動で呼び出します。Lambda 関数を実行するUUIDと、 が生成され、Lambda コードで指定した ElastiCache キャッシュに書き込まれます。次に、Lambda 関数はキャッシュから項目を取得します。
invoke コマンドを使用して Lambda 関数 (AccessMemoryDB) AWS Lambda を呼び出します。
aws lambda invoke \ --function-name AccessMemoryDB \ --region us-east-1 \ output.txt
Lambda 関数が正常に実行されたことを、次のように確認します。
output.txt ファイルを確認します。
CloudWatch コンソールを開き、関数のロググループ (/) を選択して、 CloudWatch ログの結果を確認しますaws/lambda/AccessRedis。ログストリームには、以下と同様のコマンドの出力が含まれます。
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"