Bahagian Belakang Tanpa Pelayan dengan AWS Lambda dan API Gateway · Pelajaran

Pencetus Lambda dengan SQS/SNS

Konfigurasikan fungsi Lambda supaya dicetuskan oleh baris gilir SQS dan topik SNS, sekali gus membolehkan aliran kerja dipacu peristiwa yang berkuasa.

Pelajaran 3 daripada 412 langkah

Pencetus Lambda dengan SQS/SNS ialah pelajaran Bahagian Belakang Tanpa Pelayan dengan AWS Lambda dan API Gateway percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Bahagian Belakang Tanpa Pelayan dengan AWS Lambda dan API Gateway, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Bahagian Belakang Tanpa Pelayan dengan AWS Lambda dan API Gateway merangkumi sejumlah 4 pelajaran.

Pencetus Lambda Dipacu Peristiwa

Fungsi Lambda menjadi teras pengkomputeran tanpa pelayan, tetapi bagaimanakah fungsi ini mengetahui masa untuk dijalankan? Fungsi ini bertindak balas terhadap peristiwa!

Peristiwa ialah apa-apa sahaja yang berlaku dalam persekitaran AWS anda, seperti muat naik fail ke S3, item baharu dalam DynamoDB atau, dalam pelajaran ini, mesej yang tiba dalam SQS atau SNS.

Penggunaan SQS dan SNS untuk mencetuskan Lambda membolehkan seni bina dipacu peristiwa yang berkuasa. Ini bermaksud perkhidmatan berkomunikasi melalui peristiwa, menjadikan sistem lebih fleksibel dan boleh diskalakan.

Pencetus SQS untuk Lambda

Amazon SQS (Simple Queue Service) ialah perkhidmatan baris gilir mesej yang diurus. Apabila anda mengkonfigurasikan baris gilir SQS sebagai pencetus Lambda, Lambda mengundi baris gilir tersebut untuk mendapatkan mesej.

Begini caranya:

  • Lambda menyemak baris gilir SQS secara berterusan.
  • Apabila mesej tersedia, Lambda mendapatkan kelompok mesej tersebut.
  • Lambda kemudiannya memanggil fungsi anda untuk setiap kelompok atau mesej secara individu, bergantung pada konfigurasi.
  • Selepas pemprosesan berjaya, Lambda memadamkan mesej daripada baris gilir.

Menyediakan Pencetus SQS

Untuk menyambungkan baris gilir SQS kepada fungsi Lambda, anda biasanya melakukannya melalui AWS Management Console, AWS CLI atau Infrastruktur sebagai Kod (seperti AWS SAM atau CloudFormation).

Konfigurasi utama termasuk:

  • Saiz kelompok: Bilangan mesej yang diambil oleh Lambda pada satu-satu masa (contohnya, 1 hingga 10).
  • Tetingkap kelompok: Tempoh Lambda menunggu untuk mengumpulkan satu kelompok (sehingga 5 minit).
  • Kekerapan pengundian: Lambda menguruskannya secara automatik.

Penyediaan ini membolehkan fungsi anda memproses mesej secara tak segerak, sekali gus menyahgandingkan pengeluar mesej daripada pengguna.

Memproses Mesej SQS

Fungsi Lambda anda menerima mesej SQS dalam objek event. Objek ini mengandungi tatasusunan Records, yang setiap itemnya ialah mesej SQS.

Mari lihat contoh Python ringkas yang memproses mesej daripada baris gilir SQS. Bayangkan mesej-mesej ini mengandungi ID pengguna untuk diproses.

import json

def lambda_handler(event, context):
    print("Received SQS event:")
    for record in event['Records']:
        message_body = record['body']
        print(f"Processing message: {message_body}")
        
        # Example: parse JSON body if expected
        try:
            data = json.loads(message_body)
            user_id = data.get('userId')
            print(f"Extracted userId: {user_id}")
            # Add your business logic here
        except json.JSONDecodeError:
            print(f"Message body is not valid JSON: {message_body}")
        
    return {
        'statusCode': 200,
        'body': json.dumps('Messages processed successfully!')
    }

# --- For local testing (simulated event) ---
if __name__ == '__main__':
    # Simulate an SQS event
    simulated_sqs_event = {
        "Records": [
            {
                "messageId": "19dd0b57-b21e-4ac1-bd88-01bbb068cb78",
                "receiptHandle": "AQEBwJnKyrgtLvC5...",
                "body": '{"userId": "user123", "action": "signup"}',
                "attributes": {
                    "ApproximateReceiveCount": "1",
                    "SentTimestamp": "1523232000000",
                    "SenderId": "AIDAIY234234234234234",
                    "ApproximateFirstReceiveTimestamp": "1523232000001"
                },
                "messageAttributes": {},
                "md5OfBody": "098f6bcd4621d373cade4e832627b4f6",
                "eventSource": "aws:sqs",
                "eventSourceARN": "arn:aws:sqs:us-east-1:123456789012:my-queue",
                "awsRegion": "us-east-1"
            },
            {
                "messageId": "19dd0b57-b21e-4ac1-bd88-01bbb068cb79",
                "receiptHandle": "AQEBwJnKyrgtLvC5...",
                "body": '{"userId": "user456", "action": "login"}',
                "attributes": {
                    "ApproximateReceiveCount": "1",
                    "SentTimestamp": "1523232000000",
                    "SenderId": "AIDAIY234234234234234",
                    "ApproximateFirstReceiveTimestamp": "1523232000001"
                },
                "messageAttributes": {},
                "md5OfBody": "098f6bcd4621d373cade4e832627b4f6",
                "eventSource": "aws:sqs",
                "eventSourceARN": "arn:aws:sqs:us-east-1:123456789012:my-queue",
                "awsRegion": "us-east-1"
            }
        ]
    }
    lambda_handler(simulated_sqs_event, None)

Butiran Peristiwa SQS

Mari kita huraikan bahagian utama peristiwa SQS yang dihantar kepada fungsi Lambda anda:

  • event['Records']: Senarai mesej SQS. Fungsi anda akan mengulangi setiap mesej dalam senarai ini.
  • record['body']: Kandungan mesej sebenar, biasanya rentetan JSON yang perlu dihuraikan.
  • record['messageId']: ID unik untuk mesej tersebut. Berguna untuk pengelogan dan idempotensi.
  • record['attributes']: Mengandungi metadata seperti SentTimestamp.
  • record['eventSource']: Sentiasa "aws:sqs" untuk pencetus SQS.

Sentiasa anggap body sebagai rentetan dan huraikannya jika anda menjangkakan JSON.

Pencetus SNS untuk Lambda

Amazon SNS (Simple Notification Service) ialah perkhidmatan pemesejan pub/sub yang diurus sepenuhnya. Tidak seperti SQS, SNS menggunakan model tolak untuk menghantar pemberitahuan.

Apabila topik SNS menerima mesej, topik tersebut terus menolak mesej itu kepada semua titik akhir yang melanggan, termasuk fungsi Lambda.

Model ini sesuai untuk:

  • Keadaan penyebaran (satu mesej mencetuskan berbilang tindakan).
  • Menyebarkan makluman atau pemberitahuan.
  • Menyahgandingkan penerbit daripada berbilang pelanggan.

Menyediakan Pencetus SNS

Menyambungkan topik SNS kepada fungsi Lambda adalah mudah. Anda melanggan fungsi Lambda anda kepada topik SNS.

Langkah-langkah:

  1. Cipta topik SNS.
  2. Cipta fungsi Lambda anda.
  3. Tambahkan pencetus SNS kepada fungsi Lambda anda dan pilih topik tersebut.
  4. Pastikan peranan pelaksanaan Lambda anda mempunyai kebenaran untuk dipanggil oleh SNS.

Setelah dikonfigurasikan, sebarang mesej yang diterbitkan kepada topik SNS akan memanggil fungsi Lambda anda secara automatik.

Memproses Pemberitahuan SNS

Apabila dicetuskan oleh SNS, fungsi Lambda anda menerima objek event yang mengandungi butiran tentang pemberitahuan tersebut. Bahagian yang paling penting ialah medan Message dalam objek Sns.

Berikut ialah contoh Python yang merekodkan pemberitahuan SNS.

import json

def lambda_handler(event, context):
    print("Received SNS event:")
    for record in event['Records']:
        sns_message = record['Sns']
        message_id = sns_message['MessageId']
        topic_arn = sns_message['TopicArn']
        subject = sns_message.get('Subject', 'No Subject')
        message_body = sns_message['Message']
        timestamp = sns_message['Timestamp']
        
        print(f"Message ID: {message_id}")
        print(f"Topic ARN: {topic_arn}")
        print(f"Subject: {subject}")
        print(f"Message: {message_body}")
        print(f"Timestamp: {timestamp}")
        
        # Add your business logic here, e.g., send an email, update a database
        
    return {
        'statusCode': 200,
        'body': json.dumps('SNS notification processed!')
    }

# --- For local testing (simulated event) ---
if __name__ == '__main__':
    # Simulate an SNS event
    simulated_sns_event = {
        "Records": [
            {
                "EventSource": "aws:sns",
                "EventVersion": "1.0",
                "EventSubscriptionArn": "arn:aws:sns:us-east-1:123456789012:my-topic:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
                "Sns": {
                    "Type": "Notification",
                    "MessageId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
                    "TopicArn": "arn:aws:sns:us-east-1:123456789012:my-topic",
                    "Subject": "New Order Confirmation",
                    "Message": "{\"orderId\": \"ORD-789\", \"customer\": \"Jane Doe\"}",
                    "Timestamp": "2023-10-27T10:00:00.000Z",
                    "SignatureVersion": "1",
                    "Signature": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
                    "SigningCertUrl": "https://sns.us-east-1.amazonaws.com/SimpleNotificationService-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.pem",
                    "UnsubscribeUrl": "https://sns.us-east-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-1:123456789012:my-topic:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
                    "MessageAttributes": {
                        "EventType": {"Type": "String", "Value": "OrderCreated"}
                    }
                }
            }
        ]
    }
    lambda_handler(simulated_sns_event, None)

Butiran Peristiwa SNS

Sama seperti SQS, peristiwa SNS turut disertakan dengan tatasusunan Records, tetapi struktur di dalamnya berbeza:

  • event['Records']: Senarai yang biasanya mengandungi satu pemberitahuan SNS bagi setiap pemanggilan.
  • record['Sns']: Objek ini menyimpan butiran teras pemberitahuan.
  • record['Sns']['MessageId']: ID unik bagi mesej SNS.
  • record['Sns']['TopicArn']: ARN topik SNS yang menerbitkan mesej tersebut.
  • record['Sns']['Subject']: Subjek pemberitahuan (pilihan).
  • record['Sns']['Message']: Kandungan sebenar pemberitahuan, biasanya dalam bentuk rentetan JSON.

Ingat untuk menghuraikan Message jika anda menjangkakan data berstruktur.

Amalan Terbaik Pencetus

Apabila menggunakan SQS dan SNS untuk mencetuskan Lambda, ingat amalan terbaik berikut:

  • Idempoten: Reka bentuk Lambda anda supaya dapat mengendalikan mesej pendua tanpa kesan sampingan yang tidak diingini, kerana mesej kadangkala boleh dihantar lebih daripada sekali.
  • Pengendalian Ralat: Konfigurasikan Baris Gilir Surat Mati (DLQ) untuk Lambda yang dicetuskan oleh SQS. Mesej yang gagal akan dihantar ke sana untuk diperiksa kemudian.
  • Pemprosesan Kelompok: Bagi SQS, proses mesej dalam kelompok dengan cekap. Jika satu mesej dalam kelompok gagal, keseluruhan kelompok mungkin dicuba semula.
  • Kebenaran: Pastikan peranan pelaksanaan Lambda mempunyai kebenaran untuk mengakses SQS/SNS dan perkhidmatan lain yang berinteraksi dengannya.

Kuiz Pencetusan Lambda

Uji pengetahuan anda tentang pencetus SQS dan SNS untuk Lambda!

Imbas Kembali dan Langkah Seterusnya

Tahniah! Anda telah mempelajari cara memanfaatkan kuasa dipacu peristiwa dengan menyepadukan Lambda dengan SQS dan SNS.

  • Pencetus SQS: Membolehkan pemprosesan mesej tak segerak dan terpisah dengan Lambda melakukan pengundian terhadap baris gilir.
  • Pencetus SNS: Memudahkan pemberitahuan masa nyata secara fan-out dengan menolak mesej kepada Lambda.
  • Anda juga telah melihat pelbagai struktur peristiwa dan amalan terbaik utama untuk membina aplikasi tanpa pelayan dipacu peristiwa yang berdaya tahan.

Menguasai penyepaduan ini amat penting untuk membina bahagian belakang tanpa pelayan yang boleh diskalakan dan teguh!

Percuma untuk bermula

Pelajari Bahagian Belakang Tanpa Pelayan dengan AWS Lambda dan API Gateway dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
12
Pelajaran
48

Soalan Lazim

Adakah pelajaran “Pencetus Lambda dengan SQS/SNS” percuma?

Ya — teks penuh “Pencetus Lambda dengan SQS/SNS” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Bahagian Belakang Tanpa Pelayan dengan AWS Lambda dan API Gateway, tingkat taraf kepada CoddyKit PRO. Kursus Bahagian Belakang Tanpa Pelayan dengan AWS Lambda dan API Gateway merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Pencetus Lambda dengan SQS/SNS”?

Konfigurasikan fungsi Lambda supaya dicetuskan oleh baris gilir SQS dan topik SNS, sekali gus membolehkan aliran kerja dipacu peristiwa yang berkuasa. Anda berlatih Bahagian Belakang Tanpa Pelayan dengan AWS Lambda dan API Gateway menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Bahagian Belakang Tanpa Pelayan dengan AWS Lambda dan API Gateway?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Bahagian Belakang Tanpa Pelayan dengan AWS Lambda dan API Gateway di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.

Berapa lamakah pelajaran “Pencetus Lambda dengan SQS/SNS” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Bahagian Belakang Tanpa Pelayan dengan AWS Lambda dan API Gateway ini?

Ya. Setiap pelajaran Bahagian Belakang Tanpa Pelayan dengan AWS Lambda dan API Gateway menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. SQS untuk Menyahgandingkan Perkhidmatan
  2. SNS untuk Pemesejan Pub/Sub
  3. Pencetus Lambda dengan SQS/SNS
  4. Baris Gilir Surat Mati dan Pengendalian Kegagalan
← Kembali ke Bahagian Belakang Tanpa Pelayan dengan AWS Lambda dan API Gateway