Memproses permintaan Application Load Balancer dengan Lambda - AWS Lambda

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

Memproses permintaan Application Load Balancer dengan Lambda

Anda dapat menggunakan fungsi Lambda untuk memproses permintaan dari Application Load Balancer. Elastic Load Balancing mendukung fungsi Lambda sebagai target untuk Application Load Balancer. Gunakan aturan load balancer untuk merutekan permintaan HTTP ke fungsi, berdasarkan nilai jalur atau header. Lakukan proses permintaan dan kembalikan respons HTTP dari fungsi Lambda Anda.

Elastic Load Balancing akan memanggil fungsi Lambda Anda secara sinkron dengan kejadian yang berisi badan dan metadata permintaan.

contoh Kejadian permintaan Application Load Balancer
{ "requestContext": { "elb": { "targetGroupArn": "arn:aws:elasticloadbalancing:us-east-1:123456789012:targetgroup/lambda-279XGJDqGZ5rsrHC2Fjr/49e9d65c45c6791a" } }, "httpMethod": "GET", "path": "/lambda", "queryStringParameters": { "query": "1234ABCD" }, "headers": { "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", "accept-encoding": "gzip", "accept-language": "en-US,en;q=0.9", "connection": "keep-alive", "host": "lambda-alb-123578498.us-east-1.elb.amazonaws.com", "upgrade-insecure-requests": "1", "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36", "x-amzn-trace-id": "Root=1-5c536348-3d683b8b04734faae651f476", "x-forwarded-for": "72.12.164.125", "x-forwarded-port": "80", "x-forwarded-proto": "http", "x-imforwards": "20" }, "body": "", "isBase64Encoded": False }

Fungsi Anda memproses kejadian dan mengembalikan dokumen respons ke load balancer dalam JSON. Elastic Load Balancing mengonversi dokumen menjadi respons keberhasilan atau kesalahan HTTP dan mengembalikannya ke pengguna.

contoh format dokumen respons
{ "statusCode": 200, "statusDescription": "200 OK", "isBase64Encoded": False, "headers": { "Content-Type": "text/html" }, "body": "<h1>Hello from Lambda!</h1>" }

Untuk mengonfigurasi Application Load Balancer sebagai pemicu fungsi, berikan izin kepada Elastic Load Balancing untuk menjalankan fungsi, buat grup target yang merutekan permintaan ke fungsi, dan tambahkan aturan ke load balancer yang mengirim permintaan ke grup target.

Gunakan perintah add-permission untuk menambahkan pernyataan izin ke kebijakan berbasis sumber daya milik fungsi Anda.

aws lambda add-permission --function-name alb-function \ --statement-id load-balancer --action "lambda:InvokeFunction" \ --principal elasticloadbalancing.amazonaws.com

Anda akan melihat output berikut:

{ "Statement": "{\"Sid\":\"load-balancer\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"elasticloadbalancing.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:us-west-2:123456789012:function:alb-function\"}" }

Untuk petunjuk konfigurasi Application Load Balancer dan grup target, lihat Fungsi Lambda sebagai target dalam Panduan Pengguna untuk Application Load Balancer.

Event Handler dari Powertools untuk Lambda AWS

Event handler dari Powertools for AWS Lambda toolkit menyediakan routing, middleware, konfigurasi CORS, pembuatan spesifikasi OpenAPI, validasi permintaan, penanganan kesalahan, dan fitur berguna lainnya saat menulis fungsi Lambda yang dipanggil oleh Application Load Balancer. Utilitas Event Handler tersedia untuk Python. Untuk informasi selengkapnya, lihat Event Handler REST API di dokumentasi Powertools for AWS Lambda (Python).

Python

import requests from requests import Response from aws_lambda_powertools import Logger, Tracer from aws_lambda_powertools.event_handler import ALBResolver from aws_lambda_powertools.logging import correlation_paths from aws_lambda_powertools.utilities.typing import LambdaContext tracer = Tracer() logger = Logger() app = ALBResolver() @app.get("/todos") @tracer.capture_method def get_todos(): todos: Response = requests.get("https://jsonplaceholder.typicode.com/todos") todos.raise_for_status() # for brevity, we'll limit to the first 10 only return {"todos": todos.json()[:10]} # You can continue to use other utilities just as before @logger.inject_lambda_context(correlation_id_path=correlation_paths.APPLICATION_LOAD_BALANCER) @tracer.capture_lambda_handler def lambda_handler(event: dict, context: LambdaContext) -> dict: return app.resolve(event, context)