

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
<a name="using-sam-cli-local-invoke"></a>

Gunakan AWS Serverless Application Model `sam local invoke` subperintah Command Line Interface (AWS SAMCLI) untuk memulai pemanggilan satu kali fungsi secara lokal. AWS Lambda 
+ Untuk pengantar AWS SAMCLI, lihat [Apa itu AWS SAMCLI?](what-is-sam-overview.md#what-is-sam-cli)
+ Untuk daftar opsi `sam local invoke` perintah, lihat[sam local invoke](sam-cli-command-reference-sam-local-invoke.md).
+ Untuk contoh penggunaan `sam local invoke` selama alur kerja pengembangan tipikal, lihat[Langkah 7: (Opsional) Uji aplikasi Anda secara lokal](serverless-getting-started-hello-world.md#serverless-getting-started-hello-world-test).

**catatan**  
Tidak disarankan untuk menggunakan kemampuan pemanggilan lokal SAM CLI dalam kode yang tidak tepercaya. Untuk memiliki isolasi lengkap dari lingkungan lokal Anda, jalankan kode di layanan Lambda secara langsung.

**catatan**  
`sam local invoke`mendukung fungsi tahan lama dengan kemampuan checkpointing dan replay otomatis. Saat menjalankan fungsi tahan lama secara lokal, status eksekusi dikelola secara otomatis.

## Prasyarat
<a name="using-sam-cli-local-invoke-prerequisites"></a>

Untuk menggunakan`sam local invoke`, instal AWS SAMCLI dengan menyelesaikan yang berikut ini:
+ [AWS SAM prasyarat](prerequisites.md).
+ [Instal AWS SAMCLI](install-sam-cli.md).

Sebelum menggunakan`sam local invoke`, kami merekomendasikan pemahaman dasar tentang hal-hal berikut:
+ [Mengkonfigurasi AWS SAMCLI](using-sam-cli-configure.md).
+ [Buat aplikasi Anda di AWS SAM](using-sam-cli-init.md).
+ [Pengantar bangunan dengan AWS SAM](using-sam-cli-build.md).
+ [Pengantar penerapan dengan AWS SAM](using-sam-cli-deploy.md).

## Memanggil fungsi Lambda secara lokal
<a name="using-sam-cli-local-invoke-use"></a>

Ketika Anda menjalankan`sam local invoke`, AWS SAMCLI mengasumsikan bahwa direktori kerja Anda saat ini adalah direktori root proyek Anda. Yang pertama AWS SAMCLI akan mencari `template.[yaml|yml]` file dalam `.aws-sam` subfolder. Jika tidak ditemukan, AWS SAMCLI 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>
   ```

1. Jika aplikasi Anda berisi lebih dari satu fungsi, berikan ID logis fungsi tersebut. Berikut ini adalah contohnya:

   ```
   $ sam local invoke HelloWorldFunction
   ```

1.  AWS SAMCLIMembangun fungsi Anda dalam wadah lokal menggunakanDocker. Kemudian memanggil fungsi Anda dan mengeluarkan respons fungsi Anda.

   Berikut ini 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
<a name="using-sam-cli-local-invoke-logs"></a>

Saat menggunakan`sam local invoke`, output runtime fungsi Lambda (misalnya, log) adalah output ke`stderr`, 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 ini 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
<a name="using-sam-cli-local-invoke-options"></a>

### Lulus acara khusus untuk menjalankan fungsi Lambda
<a name="using-sam-cli-local-invoke-options-events"></a>

Untuk meneruskan acara ke fungsi Lambda, gunakan opsi. `--event` Berikut ini 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](using-sam-cli-local-generate-event.md).

### Lulus variabel lingkungan saat menjalankan fungsi Lambda Anda
<a name="using-sam-cli-local-invoke-options-env"></a>

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 ini adalah contohnya:

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

### Tentukan templat atau fungsi
<a name="using-sam-cli-local-invoke-options-specify"></a>

Untuk menentukan template untuk referensi AWS SAMCLI ke, gunakan `--template` opsi. AWS SAMCLIAkan memuat hanya AWS SAM template itu dan sumber daya yang ditunjukkannya.

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

```
$ sam local invoke StackLogicalId/FunctionLogicalId
```

### Uji fungsi Lambda dari proyek Anda Terraform
<a name="using-sam-cli-local-invoke-options-terraform"></a>

Gunakan `--hook-name` opsi untuk menguji fungsi Lambda secara lokal dari Terraform proyek Anda. Untuk mempelajari selengkapnya, lihat [Menggunakan AWS SAMCLI with Terraform untuk debugging dan pengujian lokal](using-samcli-terraform.md).

Berikut ini adalah contohnya:

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

## Praktik terbaik
<a name="using-sam-cli-local-invoke-best"></a>

Jika aplikasi Anda memiliki `.aws-sam` direktori dari berjalan`sam 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`](using-sam-cli-sync.md) untuk mempercepat alur kerja pengujian cloud Anda.

## Contoh
<a name="using-sam-cli-local-invoke-examples"></a>

### Buat contoh peristiwa Amazon API Gateway dan gunakan untuk menjalankan fungsi Lambda secara lokal
<a name="using-sam-cli-local-invoke-examples-api"></a>

Pertama, kami menghasilkan payload peristiwa API Gateway API API API 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
<a name="using-sam-cli-local-invoke-examples-env"></a>

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

```
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 sebagai`locals.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
<a name="using-sam-cli-local-invoke-learn"></a>

Untuk daftar semua `sam local invoke` opsi, lihat[sam local invoke](sam-cli-command-reference-sam-local-invoke.md).

Untuk demo penggunaan`sam local`, lihat [AWS SAM untuk pengembangan lokal. Menguji AWS Cloud sumber daya dari lingkungan pengembangan lokal](https://www.youtube.com/watch?v=NzPqMrdgD1s&list=PLJo-rJlep0ED198FJnTzhIB5Aut_1vDAd&index=24) di *Sesi Tanah Tanpa Server dengan seri SAM aktif*. YouTube