기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
자습서: Amazon VPC에서 MemoryDB에 액세스하도록 Lambda 함수 구성
이 자습서에서는 다음을 수행하는 방법을 알아봅니다.
us-east-1 리전 내 기본 Amazon Virtual Private Cloud(Amazon VPC)에서 MemoryDB 클러스터를 생성합니다.
이 클러스터에 액세스하기 위해 Lambda 함수를 생성합니다. Lambda 함수를 생성할 때 Amazon VPC 및 VPC 보안 그룹에 서브넷 ID를 제공하여 Lambda 함수가 VPC의 리소스에 액세스할 수 있도록 합니다. 이 자습서의 설명에서는 Lambda 함수가 UUID를 생성하여 이를 클러스터에 기록한 다음, 클러스터에서 이를 검색합니다.
Lambda 함수를 수동으로 간접적으로 호출하고 VPC의 클러스터에 액세스했는지 확인합니다.
이 자습서를 위해 설정된 Lambda 함수, 클러스터 및 IAM 역할을 정리합니다.
1단계: 클러스터 생성
클러스터를 생성하려면 아래 단계를 따르세요.
클러스터 생성
이 단계에서는 AWS Command Line Interface (CLI)를 사용하여 계정의 us-east-1 리전에 있는 기본 Amazon VPC에 클러스터를 생성합니다. 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 역할 생성
아래에서와 같이, 역할에 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 유틸리티를 사용하여 루트에 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 함수는 캐시에서 해당 항목을 검색합니다.
호출 명령을 사용하여 Lambda 함수(AccessMemoryDB) AWS Lambda 를 호출합니다.
aws lambda invoke \ --function-name AccessMemoryDB \ --region us-east-1 \ output.txt
다음과 같이 Lambda 함수가 성공적으로 실행되었는지 확인합니다.
output.txt 파일을 검토합니다.
CloudWatch 콘솔을 열고 함수(/aws/lambda/AccessRedis)의 로그 그룹을 선택하여 CloudWatch Logs에서 결과를 확인합니다. 로그 스트림의 출력은 다음과 유사해야 합니다.
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"