Pengantar pengujian dengan sam local invoke - AWS Serverless Application Model

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

Pengantar pengujian dengan sam local invoke

Gunakan AWS Serverless Application Model Antarmuka Baris Perintah (AWS SAM CLI) sam local invoke subperintah untuk memulai pemanggilan satu kali AWS Lambda berfungsi secara lokal.

Untuk menggunakansam local invoke, instal AWS SAM CLI dengan menyelesaikan hal-hal berikut:

Sebelum menggunakansam local invoke, kami merekomendasikan pemahaman dasar tentang hal-hal berikut:

Memanggil fungsi Lambda secara lokal

Ketika Anda berlarisam local invoke, AWS SAM CLI mengasumsikan bahwa direktori kerja Anda saat ini adalah direktori root proyek Anda. Bagian AWS SAM CLI pertama-tama akan mencari template.[yaml|yml] file dalam .aws-sam subfolder. Jika tidak ditemukan, AWS SAM CLI akan mencari template.[yaml|yml] file dalam direktori kerja Anda saat ini.

Untuk menjalankan fungsi Lambda secara lokal
  1. Dari direktori root proyek Anda, jalankan yang berikut ini:

    $ sam local invoke <options>
  2. Jika aplikasi Anda berisi lebih dari satu fungsi, berikan ID logis fungsi tersebut. Berikut adalah contohnya:

    $ sam local invoke HelloWorldFunction
  3. Bagian AWS SAM CLI membangun fungsi Anda dalam wadah lokal menggunakan Docker. Kemudian memanggil fungsi Anda dan mengeluarkan respons fungsi Anda.

    Berikut adalah contohnya:

    $ sam local invoke Invoking app.lambda_handler (python3.9) Local image is out of date and will be updated to the latest runtime. To skip this, pass in the parameter --skip-pull-image Building image.................................................................................................................... Using local image: public.ecr.aws/lambda/python:3.9-rapid-x86_64. Mounting /Users/.../sam-app/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated, inside runtime container START RequestId: 64bf7e54-5509-4762-a97c-3d740498d3df Version: $LATEST END RequestId: 64bf7e54-5509-4762-a97c-3d740498d3df REPORT RequestId: 64bf7e54-5509-4762-a97c-3d740498d3df Init Duration: 1.09 ms Duration: 608.42 ms Billed Duration: 609 ms Memory Size: 128 MB Max Memory Used: 128 MB {"statusCode": 200, "body": "{\"message\": \"hello world\"}"}%

Mengelola log

Saat menggunakansam local invoke, output runtime fungsi Lambda (misalnya, log) adalah output kestderr, dan hasil fungsi Lambda adalah output ke. stdout

Berikut ini adalah contoh fungsi Lambda dasar:

def handler(event, context): print("some log") # this goes to stderr return "hello world" # this goes to stdout

Anda dapat menyimpan output standar ini. Berikut adalah contohnya:

$ sam local invoke 1> stdout.log ... $ cat stdout.log "hello world" $ sam local invoke 2> stderr.log ... $ cat stderr.log Invoking app.lambda_handler (python3.9) Local image is up-to-date Using local image: public.ecr.aws/lambda/python:3.9-rapid-x86_64. Mounting /Users/.../sam-app/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated, inside runtime container START RequestId: 0b46e646-3bdf-4b58-8beb-242d00912c46 Version: $LATEST some log END RequestId: 0b46e646-3bdf-4b58-8beb-242d00912c46 REPORT RequestId: 0b46e646-3bdf-4b58-8beb-242d00912c46 Init Duration: 0.91 ms Duration: 589.19 ms Billed Duration: 590 ms Memory Size: 128 MB Max Memory Used: 128 MB

Anda dapat menggunakan output standar ini untuk lebih mengotomatiskan proses pengembangan lokal Anda.

Opsi

Lulus acara khusus untuk menjalankan fungsi Lambda

Untuk meneruskan acara ke fungsi Lambda, gunakan opsi. --event Berikut adalah contohnya:

$ sam local invoke --event events/s3.json S3JsonLoggerFunction

Anda dapat membuat acara dengan sam local generate-event subperintah. Untuk mempelajari selengkapnya, lihat Pengantar pengujian dengan sam local generate-event.

Lulus variabel lingkungan saat menjalankan fungsi Lambda Anda

Jika fungsi Lambda Anda menggunakan variabel lingkungan, Anda dapat meneruskannya selama pengujian lokal dengan opsi. --env-vars Ini adalah cara yang bagus untuk menguji fungsi Lambda secara lokal dengan layanan di aplikasi Anda yang sudah digunakan di cloud. Berikut adalah contohnya:

$ sam local invoke --env-vars locals.json

Tentukan templat atau fungsi

Untuk menentukan template untuk AWS SAM CLI untuk referensi, gunakan --template opsi. Bagian AWS SAM CLI akan memuat hanya itu AWS SAM template dan sumber daya yang ditunjukkannya.

Untuk memanggil fungsi aplikasi atau tumpukan bersarang, berikan aplikasi atau tumpukan ID logis bersama dengan ID logika fungsi. Berikut adalah contohnya:

$ sam local invoke StackLogicalId/FunctionLogicalId

Uji fungsi Lambda dari Anda Terraform proyek

Gunakan --hook-name opsi untuk menguji fungsi Lambda secara lokal dari Terraform proyek. Untuk mempelajari selengkapnya, lihat Menggunakan AWS SAM CLI dengan Terraform untuk debugging dan pengujian lokal.

Berikut adalah contohnya:

$ sam local invoke --hook-name terraform --beta-features

Praktik terbaik

Jika aplikasi Anda memiliki .aws-sam direktori dari berjalansam build, pastikan untuk menjalankan sam build setiap kali Anda memperbarui kode fungsi Anda. Kemudian, jalankan sam local invoke untuk menguji kode fungsi Anda yang diperbarui secara lokal.

Pengujian lokal adalah solusi hebat untuk pengembangan dan pengujian cepat sebelum menerapkan ke cloud. Namun, pengujian lokal tidak memvalidasi semuanya, seperti izin antar sumber daya Anda di cloud. Sebisa mungkin, uji aplikasi Anda di cloud. Sebaiknya gunakan sam sync untuk mempercepat alur kerja pengujian cloud Anda.

Contoh

Buat contoh peristiwa Amazon API Gateway dan gunakan untuk menjalankan fungsi Lambda secara lokal

Pertama, kami menghasilkan payload HTTP API acara API Gateway dan menyimpannya ke events folder kami.

$ sam local generate-event apigateway http-api-proxy > events/apigateway_event.json

Selanjutnya, kami memodifikasi fungsi Lambda kami untuk mengembalikan nilai parameter dari acara tersebut.

def lambda_handler(event, context): print("HelloWorldFunction invoked") return { "statusCode": 200, "body": json.dumps({ "message": event['queryStringParameters']['parameter2'], }), }

Selanjutnya, kami secara lokal memanggil fungsi Lambda kami dan menyediakan acara khusus kami.

$ sam local invoke --event events/apigateway_event.json Invoking app.lambda_handler (python3.9) Local image is up-to-date Using local image: public.ecr.aws/lambda/python:3.9-rapid-x86_64. Mounting /Users/...sam-app/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated, inside runtime container START RequestId: 59535d0d-3d9e-493d-8c98-6264e8e961b8 Version: $LATEST some log END RequestId: 59535d0d-3d9e-493d-8c98-6264e8e961b8 REPORT RequestId: 59535d0d-3d9e-493d-8c98-6264e8e961b8 Init Duration: 1.63 ms Duration: 564.07 ms Billed Duration: 565 ms Memory Size: 128 MB Max Memory Used: 128 MB {"statusCode": 200, "body": "{\"message\": \"value\"}"}%

Lulus variabel lingkungan saat menjalankan fungsi Lambda secara lokal

Aplikasi ini memiliki fungsi Lambda yang menggunakan variabel lingkungan untuk nama tabel Amazon DynamoDB. Berikut ini adalah contoh dari fungsi yang didefinisikan dalam AWS SAM templat:

AWSTemplateFormatVersion: 2010-09-09 Transform: AWS::Serverless-2016-10-31 ... Resources: getAllItemsFunction: Type: AWS::Serverless::Function Properties: Handler: src/get-all-items.getAllItemsHandler Description: get all items Policies: - DynamoDBReadPolicy: TableName: !Ref SampleTable Environment: Variables: SAMPLE_TABLE: !Ref SampleTable ...

Kami ingin menguji fungsi Lambda kami secara lokal sambil berinteraksi dengan tabel DynamoDB kami di cloud. Untuk melakukan ini, kami membuat file variabel lingkungan kami dan menyimpannya di direktori root proyek kami sebagailocals.json. Nilai yang disediakan di sini untuk SAMPLE_TABLE referensi tabel DynamoDB kami di cloud.

{ "getAllItemsFunction": { "SAMPLE_TABLE": "dev-demo-SampleTable-1U991234LD5UM98" } }

Selanjutnya, kita menjalankan sam local invoke dan meneruskan variabel lingkungan kita dengan --env-vars opsi.

$ sam local invoke getAllItemsFunction --env-vars locals.json Mounting /Users/...sam-app/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated, inside runtime container START RequestId: 59535d0d-3d9e-493d-8c98-6264e8e961b8 Version: $LATEST some log END RequestId: 59535d0d-3d9e-493d-8c98-6264e8e961b8 REPORT RequestId: 59535d0d-3d9e-493d-8c98-6264e8e961b8 Init Duration: 1.63 ms Duration: 564.07 ms Billed Duration: 565 ms Memory Size: 128 MB Max Memory Used: 128 MB {"statusCode":200,"body":"{}"}

Pelajari selengkapnya

Untuk daftar semua sam local invoke opsi, lihatsam local invoke.

Untuk demo penggunaansam local, lihat AWS SAM untuk pembangunan lokal. Pengujian AWS Cloud sumber daya dari lingkungan pengembangan lokal di Sesi Tanah Tanpa Server dengan seri SAM YouTube.