자습서: 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 라이브러리를 사용하여 항목을 캐시에 넣고 검색합니다. 이 코드는 캐시 도구를 사용하여 생성된 IAM 인증 토큰을 15분 동안 캐시합니다. redis-py 및 캐시 도구가 포함된 배포 패키지를 생성하려면 다음 단계를 수행합니다.

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

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된 목록과 기본 보안 그룹 IDVPC를 입력합니다. Amazon VPC 콘솔에서 이러한 값을 찾을 수 있습니다. 기본 VPC의 서브넷을 찾으려면 VPCs를 선택한 다음 AWS 계정의 기본 를 선택합니다VPC. 이 에 대한 보안 그룹을 찾으려면 보안으로 VPC이동하여 보안 그룹 을 선택합니다. 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. 호출 명령을 사용하여 Lambda 함수(AccessValkey) AWS Lambda 를 호출합니다.

    aws lambda invoke \ --function-name AccessValkey \ --region us-east-1 \ output.txt
  2. 다음과 같이 Lambda 함수가 성공적으로 실행되었는지 확인합니다.

    • output.txt 파일을 검토합니다.

    • CloudWatch 콘솔을 열고 함수(/aws/lambda/)의 로그 그룹을 선택하여 CloudWatch 로그에서 결과를 확인합니다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"