Tutorial: Mengkonfigurasi fungsi Lambda untuk mengakses MemoryDB di Amazon VPC - Amazon MemoryDB

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Tutorial: Mengkonfigurasi fungsi Lambda untuk mengakses MemoryDB di Amazon VPC

Dalam tutorial ini Anda dapat mempelajari cara:

  • Buat klaster MemoryDB di Amazon Virtual Private Cloud VPC (Amazon) default Anda di wilayah us-east-1.

  • Buat fungsi Lambda untuk mengakses klaster . Saat Anda membuat fungsi Lambda, Anda menyediakan subnet di Amazon VPC dan grup VPC keamanan untuk memungkinkan fungsi Lambda mengakses sumber daya di IDs Anda. VPC Sebagai ilustrasi dalam tutorial ini, fungsi Lambda menghasilkanUUID, menulisnya ke cluster, dan mengambilnya dari cluster..

  • Memanggil fungsi Lambda secara manual dan memverifikasi bahwa itu mengakses cluster di Anda. VPC

  • Bersihkan fungsi Lambda, cluster, dan IAM peran yang diatur untuk tutorial ini.

Langkah 1: Buat cluster

Untuk membuat cluster, ikuti langkah-langkah ini.

Membuat klaster

Pada langkah ini, Anda membuat klaster di Amazon default VPC di wilayah us-east-1 di akun Anda menggunakan (). AWS Command Line Interface CLI Untuk informasi tentang membuat cluster menggunakan konsol MemoryDB atauAPI, lihat. Langkah 2: Buat klaster

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

Perhatikan bahwa nilai bidang Status diatur ke CREATING. Diperlukan beberapa menit bagi MemoryDB untuk menyelesaikan pembuatan cluster Anda.

Salin titik akhir cluster

Verifikasi bahwa MemoryDB telah selesai membuat cluster dengan perintah. describe-clusters

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

Salin Alamat Titik Akhir Cluster yang ditunjukkan pada output. Anda akan memerlukan alamat ini saat membuat paket deployment untuk fungsi Lambda Anda.

Buat IAM Peran

  1. Buat dokumen kebijakan IAM kepercayaan, seperti yang ditunjukkan di bawah ini, untuk peran Anda yang memungkinkan akun Anda mengambil peran baru. Simpan kebijakan ini ke file bernama trust-policy.json. Pastikan untuk mengganti account_id 123456789012 dalam kebijakan ini dengan account_id Anda.

    { "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. Buat dokumen IAM kebijakan, seperti yang ditunjukkan di bawah ini. Simpan kebijakan ke file bernama policy.json. Pastikan untuk mengganti account_id 123456789012 dalam kebijakan ini dengan account_id Anda.

    { "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. Buat IAM peran.

    aws iam create-role \ --role-name "memorydb-iam-auth-app" \ --assume-role-policy-document file://trust-policy.json
  4. Buat IAM kebijakan.

    aws iam create-policy \ --policy-name "memorydb-allow-all" \ --policy-document file://policy.json
  5. Lampirkan IAM kebijakan ke peran. Pastikan untuk mengganti account_id 123456789012 dalam kebijakan ini dengan account_id Anda.

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

Membuat Daftar Kontrol Akses (ACL)

  1. Buat pengguna baru IAM yang diaktifkan.

    aws memorydb create-user \ --user-name iam-user-01 \ --authentication-mode Type=iam \ --access-string "on ~* +@all"
  2. Buat ACL dan lampirkan ke cluster.

    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

Langkah 2: Buat fungsi Lambda

Untuk membuat fungsi Lambda, lakukan langkah-langkah ini.

Buat paket deployment

Dalam tutorial ini, kami memberikan contoh kode dalam Python untuk fungsi Lambda Anda.

Python

Contoh kode Python berikut membaca dan menulis item ke cluster MemoryDB Anda. Salin kode tersebut dan simpan ke dalam file bernama app.py. Pastikan untuk mengganti cluster_endpoint nilai dalam kode dengan alamat titik akhir yang Anda salin pada langkah sebelumnya.

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"

Kode ini menggunakan redis-py pustaka Python untuk menempatkan item ke dalam cluster Anda dan mengambilnya. Kode ini digunakan cachetools untuk menyimpan token IAM Auth yang dihasilkan selama 15 menit. Untuk membuat paket penyebaran yang berisi redis-py dancachetools, lakukan langkah-langkah berikut.

Di direktori proyek Anda yang berisi file kode app.py sumber, buat paket folder untuk menginstal redis-py dan cachetools pustaka ke dalamnya.

mkdir package

Instal redis-py dan cachetools gunakan pip.

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

Buat file.zip yang berisi redis-py dan cachetools pustaka. Di Linux dan macOS, jalankan perintah berikut. Di Windows, gunakan utilitas zip pilihan Anda untuk membuat file.zip dengan redis-py dan cachetools perpustakaan di root.

cd package zip -r ../my_deployment_package.zip

Tambahkan kode fungsi Anda ke file .zip. Di Linux atau macOS, jalankan perintah CLI berikut. Di Windows, gunakan utilitas zip pilihan Anda untuk menambahkan app.py ke root file.zip Anda.

cd .. zip my_deployment_package.zip app.py

Buat IAM peran (peran eksekusi)

Lampirkan kebijakan AWS terkelola yang diberi nama AWSLambdaVPCAccessExecutionRole ke peran.

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

Unggah paket penerapan (buat fungsi Lambda)

Pada langkah ini, Anda membuat fungsi Lambda (AccessMemoryDB) menggunakan perintah AWS CLI create-function.

Dari direktori proyek yang berisi berkas .zip paket penyebaran Anda, jalankan perintah Lambda berikut. CLI create-function

Untuk opsi peran, gunakan peran eksekusi yang Anda buat di langkah sebelumnya. ARN Untuk vpc-config masukkan daftar yang dipisahkan koma dari subnet default Anda dan VPC ID grup keamanan default Anda. VPC Anda dapat menemukan nilai-nilai ini di VPC konsol Amazon. Untuk menemukan subnet default VPC Anda, pilih Your VPCs, lalu pilih default AWS VPC akun Anda. Untuk menemukan grup keamanan untuk iniVPC, buka Keamanan dan pilih Grup keamanan. Pastikan Anda memilih wilayah 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

Langkah 3: Uji fungsi Lambda

Pada langkah ini, Anda menjalankan fungsi Lambda secara manual menggunakan perintah pemanggilan. Ketika fungsi Lambda dijalankan, ia menghasilkan UUID dan menulisnya ke ElastiCache cache yang Anda tentukan dalam kode Lambda Anda. Fungsi Lambda kemudian mengambil item dari cache.

  1. Memanggil fungsi Lambda AccessMemory (DB) menggunakan perintah AWS Lambda pemanggilan.

    aws lambda invoke \ --function-name AccessMemoryDB \ --region us-east-1 \ output.txt
  2. Verifikasikan bahwa fungsi Lambda berhasil dijalankan sebagai berikut:

    • Tinjau file output.txt.

    • Verifikasi hasil di CloudWatch Log dengan membuka CloudWatch konsol dan memilih grup log untuk fungsi Anda (/aws/lambda/AccessRedis). Log stream akan berisi output seperti yang berikut ini:

      Success: Inserted 826e70c5f4d2478c8c18027125a3e01e. Fetched 826e70c5f4d2478c8c18027125a3e01e from MemoryDB.
    • Tinjau hasilnya di AWS Lambda konsol.

Langkah 4: Bersihkan (Opsional)

Untuk membersihkan, ambil langkah-langkah ini.

Hapus fungsi Lambda

aws lambda delete-function \ --function-name AccessMemoryDB

Hapus klaster MemoryDB

Hapus klaster .

aws memorydb delete-cluster \ --cluster-name cluster-01

Hapus pengguna danACL.

aws memorydb delete-user \ --user-id iam-user-01 aws memorydb delete-acl \ --acl-name iam-acl-01

Hapus IAM Peran dan kebijakan

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"