

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

# Terapkan fungsi Node.js Lambda dengan gambar kontainer
<a name="nodejs-image"></a>

Ada tiga cara untuk membangun image wadah untuk fungsi Node.js Lambda:
+ [Menggunakan AWS gambar dasar untuk Node.js](#nodejs-image-instructions)

  Gambar [AWS](images-create.md#runtimes-images-lp) dasar dimuat sebelumnya dengan runtime bahasa, klien antarmuka runtime untuk mengelola interaksi antara Lambda dan kode fungsi Anda, dan emulator antarmuka runtime untuk pengujian lokal.
+ [Menggunakan AWS OS-only gambar dasar](images-create.md#runtimes-images-provided)

  [AWS OS-only gambar dasar ](https://gallery.ecr.aws/lambda/provided) berisi distribusi Amazon Linux dan emulator antarmuka [ runtime](https://github.com/aws/aws-lambda-runtime-interface-emulator/). Gambar-gambar ini biasanya digunakan untuk membuat gambar wadah untuk bahasa yang dikompilasi[, seperti [ Go ](go-image.md#go-image-provided) dan ](lambda-rust.md) Rust, dan untuk versi bahasa atau bahasa yang Lambda tidak menyediakan gambar dasar, seperti Node.js 19. Anda juga dapat menggunakan gambar OS-only dasar untuk mengimplementasikan runtime [ khusus](runtimes-custom.md). Untuk membuat gambar kompatibel dengan Lambda, Anda harus menyertakan klien antarmuka [ runtime untuk Node.js ](#nodejs-image-clients) dalam gambar.
+ [Menggunakan gambar non-AWS dasar](#nodejs-image-clients)

  Anda dapat menggunakan gambar dasar alternatif dari registri kontainer lain, seperti Alpine Linux atau Debian. Anda juga dapat menggunakan gambar khusus yang dibuat oleh organisasi Anda. Untuk membuat gambar kompatibel dengan Lambda, Anda harus menyertakan klien antarmuka [ runtime untuk Node.js ](#nodejs-image-clients) dalam gambar.

**Tip**  
Untuk mengurangi waktu yang dibutuhkan fungsi penampung Lambda untuk menjadi aktif, lihat [ Menggunakan build multi-tahap ](https://docs.docker.com/build/building/multi-stage/) dalam dokumentasi Docker. Untuk membangun image kontainer yang efisien, ikuti Praktik [ terbaik untuk menulis Dockerfiles](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/).

Halaman ini menjelaskan cara membuat, menguji, dan menerapkan gambar kontainer untuk Lambda.

**Topics**
+ [AWS gambar dasar untuk Node.js](#nodejs-image-base)
+ [Menggunakan AWS gambar dasar untuk Node.js](#nodejs-image-instructions)
+ [Menggunakan gambar dasar alternatif dengan klien antarmuka runtime](#nodejs-image-clients)

## AWS gambar dasar untuk Node.js
<a name="nodejs-image-base"></a>

AWS menyediakan gambar dasar berikut untuk Node.js:


| Tag | Waktu berjalan | Sistem operasi | Dockerfile | Penghentian | 
| --- | --- | --- | --- | --- | 
| 24 | Node.js 24 | Amazon Linux 2023 | [Dockerfile untuk 24 aktif Node.js GitHub ](https://github.com/aws/aws-lambda-base-images/blob/nodejs24.x/Dockerfile.nodejs24.x) |  30 April 2028  | 
| 22 | Node.js 22 | Amazon Linux 2023 | [Dockerfile untuk 22 aktif Node.js GitHub ](https://github.com/aws/aws-lambda-base-images/blob/nodejs22.x/Dockerfile.nodejs22.x) |  30 April 2027  | 

Repositori Amazon ECR: [ gallery.cr. aws/lambda/nodeis ](https://gallery.ecr.aws/lambda/nodejs)

Gambar dasar Node.js 20 dan yang lebih baru didasarkan pada gambar kontainer minimal [ Amazon Linux 2023](https://docs.aws.amazon.com/linux/al2023/ug/minimal-container.html). Gambar dasar sebelumnya menggunakan Amazon Linux 2. AL2023 memberikan beberapa keunggulan dibandingkan Amazon Linux 2, termasuk jejak penerapan yang lebih kecil dan versi perpustakaan yang diperbarui seperti`glibc`.

AL2023-based gambar menggunakan `microdnf` (disambungkan sebagai`dnf`) sebagai manajer paket alih-alih`yum`, yang merupakan manajer paket default di Amazon Linux 2. `microdnf`adalah implementasi mandiri dari`dnf`. Untuk daftar paket yang disertakan dalam AL2023-based gambar, lihat ** kolom ** Minimal Container di [ Membandingkan paket yang diinstal pada Amazon Linux 2023 Container Images](https://docs.aws.amazon.com/linux/al2023/ug/al2023-container-image-types.html). Untuk informasi selengkapnya tentang perbedaan antara AL2023 dan Amazon Linux 2, lihat [ Memperkenalkan runtime Amazon Linux 2023 untuk AWS Lambda](https://aws.amazon.com/blogs/compute/introducing-the-amazon-linux-2023-runtime-for-aws-lambda/) di AWS Compute Blog.

**catatan**  
Untuk menjalankan AL2023-based gambar secara lokal, termasuk dengan AWS Serverless Application Model (AWS SAM), Anda harus menggunakan Docker versi 20.10.10 atau yang lebih baru.

## Menggunakan AWS gambar dasar untuk Node.js
<a name="nodejs-image-instructions"></a>

### Prasyarat
<a name="nodejs-image-prerequisites"></a>

Untuk menyelesaikan langkah-langkah di bagian ini, Anda harus memiliki hal-hal berikut:
+ [AWS CLI versi 2 ](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)
+ [Docker ](https://docs.docker.com/get-docker) (versi minimum 25.0.0)
+ Plugin Docker [ buildx. ](https://github.com/docker/buildx/blob/master/README.md)
+ Node.js

### Membuat gambar dari gambar dasar
<a name="nodejs-image-create"></a>

**Untuk membuat gambar kontainer dari AWS gambar dasar untuk Node.js**

1. Buat direktori untuk proyek, dan kemudian beralih ke direktori itu.

   ```
   mkdir example
   cd example
   ```

1. Buat Node.js proyek baru dengan`npm`. Untuk menerima opsi default yang disediakan dalam pengalaman interaktif, tekan`Enter`.

   ```
   npm init
   ```

1. Buat file baru yang disebut`index.js`. Anda dapat menambahkan contoh kode fungsi berikut ke file untuk pengujian, atau menggunakan milik Anda sendiri.  
**Example Pengendali CommonJS**  

   ```
   exports.handler = async (event) => {
       const response = {
           statusCode: 200,
           body: JSON.stringify('Hello from Lambda!'),
       };
       return response;
   };
   ```

1. Jika fungsi Anda bergantung pada pustaka selain AWS SDK untuk JavaScript, gunakan [ npm ](https://www.npmjs.com/) untuk menambahkannya ke paket Anda.

1. Buat Dockerfile baru dengan konfigurasi berikut:
   + A `FROM` tur properti ke [ URI gambar dasar](https://gallery.ecr.aws/lambda/nodejs).
   + Gunakan perintah COPY untuk menyalin kode fungsi dan dependensi runtime ke`{LAMBDA_TASK_ROOT}`, variabel [ Lambda-defined ](configuration-envvars.md#configuration-envvars-runtime) lingkungan.
   + Atur `CMD` argumen ke pengendali fungsi Lambda.

   Perhatikan bahwa contoh Dockerfile tidak menyertakan instruksi [ USER. ](https://docs.docker.com/reference/dockerfile/#user) Saat Anda menerapkan image kontainer ke Lambda, Lambda secara otomatis mendefinisikan pengguna Linux default dengan izin yang paling tidak memiliki hak istimewa. Ini berbeda dari perilaku Docker standar yang default ke `root` pengguna ketika tidak ada `USER` instruksi yang diberikan.  
**Example Dockerfile**  

   ```
   FROM {{public.ecr.aws/lambda/nodejs:22}}
   
   # Copy function code
   COPY {{index.js}} ${LAMBDA_TASK_ROOT}
     
   # Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile)
   CMD [ "{{index.handler}}" ]
   ```

1. Bangun image Docker dengan perintah [ docker build](https://docs.docker.com/engine/reference/commandline/build/). Contoh berikut memberi nama gambar `docker-image` dan memberinya `test` [ tag](https://docs.docker.com/engine/reference/commandline/build/#tag). Untuk membuat gambar Anda kompatibel dengan Lambda, Anda harus menggunakan `--provenance=false` opsi.

   ```
   docker buildx build --platform linux/amd64 --provenance=false -t {{docker-image}}:{{test}} .
   ```
**catatan**  
Perintah menentukan `--platform linux/amd64` opsi untuk memastikan bahwa wadah Anda kompatibel dengan lingkungan eksekusi Lambda terlepas dari arsitektur mesin build Anda. Jika Anda ingin membuat fungsi Lambda menggunakan arsitektur set instruksi ARM64, pastikan untuk mengubah perintah untuk menggunakan `--platform linux/arm64` opsi sebagai gantinya.

### (Opsional) Uji gambar secara lokal
<a name="nodejs-image-test"></a>

1. Mulai gambar Docker dengan perintah **docker run**. Dalam contoh ini, `docker-image` adalah nama gambar dan `test` merupakan tag.

   ```
   docker run --platform linux/amd64 -p 9000:8080 {{docker-image}}:{{test}}
   ```

   Perintah ini menjalankan gambar sebagai wadah dan membuat titik akhir lokal di`localhost:9000/2015-03-31/functions/function/invocations`.
**catatan**  
Jika Anda membuat gambar Docker untuk arsitektur set instruksi ARM64, pastikan untuk menggunakan `--platform linux/{{arm64}}` opsi alih-alih. `--platform linux/{{amd64}}`

1. Dari jendela terminal baru, posting acara ke titik akhir lokal.

------
#### [ Linux/macOS ]

   Di Linux dan macOS, jalankan `curl` perintah berikut:

   ```
   curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'
   ```

   Perintah ini memanggil fungsi dengan peristiwa kosong dan mengembalikan respons. Jika Anda menggunakan kode fungsi Anda sendiri daripada kode fungsi sampel, Anda mungkin ingin memanggil fungsi dengan muatan JSON. Contoh:

   ```
   curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{{{"payload":"hello world!"}}}'
   ```

------
#### [ PowerShell ]

   Di PowerShell, jalankan `Invoke-WebRequest` perintah berikut:

   ```
   Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{}' -ContentType "application/json"
   ```

   Perintah ini memanggil fungsi dengan peristiwa kosong dan mengembalikan respons. Jika Anda menggunakan kode fungsi Anda sendiri daripada kode fungsi sampel, Anda mungkin ingin memanggil fungsi dengan muatan JSON. Contoh:

   ```
   Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{{{"payload":"hello world!"}}}' -ContentType "application/json"
   ```

------

1. Dapatkan ID kontainer.

   ```
   docker ps
   ```

1. Gunakan [ perintah ](https://docs.docker.com/engine/reference/commandline/kill/) docker kill untuk menghentikan wadah. Dalam perintah ini, ganti `3766c4ab331c` dengan ID kontainer dari langkah sebelumnya.

   ```
   docker kill {{3766c4ab331c}}
   ```

### Menyebarkan gambar
<a name="nodejs-image-deploy"></a>

**Untuk mengunggah gambar ke Amazon ECR dan membuat fungsi Lambda**

1. Jalankan [ perintah ](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ecr/get-login-password.html) get-login-password untuk mengotentikasi Docker CLI ke registri Amazon ECR Anda.
   + Tetapkan `--region` nilai ke Wilayah AWS tempat Anda ingin membuat repositori Amazon ECR.
   + Ganti `111122223333` dengan Akun AWS ID Anda.

   ```
   aws ecr get-login-password --region {{us-east-1}} | docker login --username AWS --password-stdin {{111122223333}}.dkr.ecr.{{us-east-1}}.amazonaws.com
   ```

1. Buat repositori di Amazon ECR menggunakan perintah [ create-repository](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ecr/create-repository.html).

   ```
   aws ecr create-repository --repository-name {{hello-world}} --region {{us-east-1}} --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE
   ```
**catatan**  
Repositori Amazon ECR harus Wilayah AWS sama dengan fungsi Lambda.

   Jika berhasil, Anda melihat respons seperti ini:

   ```
   {
       "repository": {
           "repositoryArn": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world",
           "registryId": "111122223333",
           "repositoryName": "hello-world",
           "repositoryUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world",
           "createdAt": "2023-03-09T10:39:01+00:00",
           "imageTagMutability": "MUTABLE",
           "imageScanningConfiguration": {
               "scanOnPush": true
           },
           "encryptionConfiguration": {
               "encryptionType": "AES256"
           }
       }
   }
   ```

1. Salin `repositoryUri` dari output pada langkah sebelumnya.

1. Jalankan [ perintah tag ](https://docs.docker.com/engine/reference/commandline/tag/) docker untuk menandai gambar lokal Anda ke repositori Amazon ECR Anda sebagai versi terbaru. Dalam perintah ini:
   + `docker-image:test`adalah nama dan [ tag ](https://docs.docker.com/engine/reference/commandline/build/#tag) gambar Docker Anda. Ini adalah nama gambar dan tag yang Anda tentukan dalam `docker build` perintah.
   + Ganti `<ECRrepositoryUri>` dengan `repositoryUri` yang Anda salin. Pastikan untuk menyertakan `:latest` di akhir URI.

   ```
   docker tag docker-image:test {{<ECRrepositoryUri>}}:latest
   ```

   Contoh:

   ```
   docker tag {{docker-image}}:{{test}} {{111122223333}}.dkr.ecr.{{us-east-1}}.amazonaws.com/{{hello-world}}:latest
   ```

1. Jalankan [ perintah ](https://docs.docker.com/engine/reference/commandline/push/) docker push untuk menyebarkan gambar lokal Anda ke repositori Amazon ECR. Pastikan untuk menyertakan `:latest` di akhir URI repositori.

   ```
   docker push {{111122223333}}.dkr.ecr.{{us-east-1}}.amazonaws.com/{{hello-world}}:latest
   ```

1. [Buat peran eksekusi ](lambda-intro-execution-role.md#permissions-executionrole-api) untuk fungsi, jika Anda belum memilikinya. Anda memerlukan Nama Sumber Daya Amazon (ARN) dari peran di langkah berikutnya.

1. Buat fungsi Lambda. Untuk`ImageUri`, tentukan URI repositori dari sebelumnya. Pastikan untuk menyertakan `:latest` di akhir URI.

   ```
   aws lambda create-function \
     --function-name {{hello-world}} \
     --package-type Image \
     --code ImageUri={{111122223333}}.dkr.ecr.{{us-east-1}}.amazonaws.com/{{hello-world}}:latest \
     --role {{arn:aws:iam::111122223333:role/lambda-ex}}
   ```
**catatan**  
Anda dapat membuat fungsi menggunakan gambar di AWS akun yang berbeda, selama gambar berada di Wilayah yang sama dengan fungsi Lambda. Untuk informasi selengkapnya, lihat [Izin lintas akun Amazon ECR](images-create.md#configuration-images-xaccount-permissions).

1. Memanggil fungsi.

   ```
   aws lambda invoke --function-name {{hello-world}} response.json
   ```

   Anda akan melihat respons seperti ini:

   ```
   {
     "ExecutedVersion": "$LATEST", 
     "StatusCode": 200
   }
   ```

1. Untuk melihat output fungsi, periksa `response.json` file.

Untuk memperbarui kode fungsi, Anda harus membuat gambar lagi, mengunggah gambar baru ke repositori Amazon ECR, dan kemudian menggunakan [ perintah ](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html) update-function-code untuk menyebarkan gambar ke fungsi Lambda.

Lambda menyelesaikan tag gambar ke intisari gambar tertentu. Ini berarti bahwa jika Anda mengarahkan tag gambar yang digunakan untuk menerapkan fungsi ke gambar baru di Amazon ECR, Lambda tidak secara otomatis memperbarui fungsi untuk menggunakan gambar baru.

Untuk menerapkan gambar baru ke fungsi Lambda yang sama, Anda harus menggunakan [ perintah ](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html) update-function-code, bahkan jika tag gambar di Amazon ECR tetap sama. Dalam contoh berikut, `--publish` opsi membuat versi baru dari fungsi menggunakan gambar kontainer yang diperbarui.

```
aws lambda update-function-code \
  --function-name {{hello-world}} \
  --image-uri {{111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest}} \
  --publish
```

## Menggunakan gambar dasar alternatif dengan klien antarmuka runtime
<a name="nodejs-image-clients"></a>

Jika Anda menggunakan gambar [ OS-only dasar ](images-create.md#runtimes-images-provided) atau gambar dasar alternatif, Anda harus menyertakan klien antarmuka runtime dalam gambar Anda. Klien antarmuka runtime memperluas[API runtime](runtimes-api.md), yang mengelola interaksi antara Lambda dan kode fungsi Anda.

Instal klien antarmuka [ Node.js runtime ](https://www.npmjs.com/package/aws-lambda-ric) menggunakan manajer paket npm:

```
npm install aws-lambda-ric
```

Anda juga dapat mengunduh klien antarmuka [ Node.js runtime ](https://github.com/aws/aws-lambda-nodejs-runtime-interface-client) dari GitHub.

Contoh berikut menunjukkan bagaimana membangun image kontainer untuk Node.js menggunakan gambar non-AWS dasar. Contoh Dockerfile menggunakan gambar `bookworm` dasar. Dockerfile menyertakan klien antarmuka runtime.

### Prasyarat
<a name="nodejs-alt-prerequisites"></a>

Untuk menyelesaikan langkah-langkah di bagian ini, Anda harus memiliki hal-hal berikut:
+ [AWS CLI versi 2 ](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)
+ [Docker ](https://docs.docker.com/get-docker) (versi minimum 25.0.0)
+ Plugin Docker [ buildx. ](https://github.com/docker/buildx/blob/master/README.md)
+ Node.js

### Membuat gambar dari gambar dasar alternatif
<a name="nodejs-alt-create"></a>

**Untuk membuat gambar kontainer dari non-AWS gambar dasar**

1. Buat direktori untuk proyek, dan kemudian beralih ke direktori itu.

   ```
   mkdir example
   cd example
   ```

1. Buat Node.js proyek baru dengan`npm`. Untuk menerima opsi default yang disediakan dalam pengalaman interaktif, tekan`Enter`.

   ```
   npm init
   ```

1. Buat file baru yang disebut`index.js`. Anda dapat menambahkan contoh kode fungsi berikut ke file untuk pengujian, atau menggunakan milik Anda sendiri.  
**Example Pengendali CommonJS**  

   ```
   exports.handler = async (event) => {
       const response = {
           statusCode: 200,
           body: JSON.stringify('Hello from Lambda!'),
       };
       return response;
   };
   ```

1. Buat Dockerfile baru. Dockerfile berikut menggunakan gambar `bookworm` dasar alih-alih gambar [AWS dasar. ](images-create.md#runtimes-images-lp) Dockerfile menyertakan klien antarmuka [ runtime](https://www.npmjs.com/package/aws-lambda-ric), yang membuat gambar kompatibel dengan Lambda. Dockerfile menggunakan build [ multi-tahap. ](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#use-multi-stage-builds)

   Tahap pertama menciptakan image build, yang merupakan Node.js lingkungan standar di mana dependensi fungsi diinstal. Tahap kedua menciptakan gambar yang lebih ramping yang mencakup kode fungsi dan dependensinya. Ini mengurangi ukuran gambar akhir.
   + Atur `FROM` properti ke pengenal gambar dasar.
   + Gunakan `COPY` perintah untuk menyalin kode fungsi dan dependensi runtime.
   + Atur `ENTRYPOINT` ke modul yang Anda inginkan untuk menjalankan wadah Docker saat dimulai. Dalam hal ini, modul adalah klien antarmuka runtime.
   + Atur `CMD` argumen ke pengendali fungsi Lambda.

   Perhatikan bahwa contoh Dockerfile tidak menyertakan instruksi [ USER. ](https://docs.docker.com/reference/dockerfile/#user) Saat Anda menerapkan image kontainer ke Lambda, Lambda secara otomatis mendefinisikan pengguna Linux default dengan izin yang paling tidak memiliki hak istimewa. Ini berbeda dari perilaku Docker standar yang default ke `root` pengguna ketika tidak ada `USER` instruksi yang diberikan.  
**Example Dockerfile**  

   ```
   # Define custom function directory
   ARG FUNCTION_DIR="/function"
   
   FROM {{node:20-bookworm}} as build-image
   
   # Include global arg in this stage of the build
   ARG FUNCTION_DIR
   
   # Install build dependencies
   RUN apt-get update && \
       apt-get install -y \
       g++ \
       make \
       cmake \
       unzip \
       libcurl4-openssl-dev
   
   # Copy function code
   RUN mkdir -p ${FUNCTION_DIR}
   COPY . ${FUNCTION_DIR}
   
   WORKDIR ${FUNCTION_DIR}
   
   # Install Node.js dependencies
   RUN npm install
   
   # Install the runtime interface client
   RUN npm install aws-lambda-ric
   
   # Grab a fresh slim copy of the image to reduce the final size
   FROM {{node:20-bookworm-slim}}
   
   # Required for Node runtimes which use npm@8.6.0+ because
   # by default npm writes logs under /home/.npm and Lambda fs is read-only
   ENV NPM_CONFIG_CACHE=/tmp/.npm
   
   # Include global arg in this stage of the build
   ARG FUNCTION_DIR
   
   # Set working directory to function root directory
   WORKDIR ${FUNCTION_DIR}
   
   # Copy in the built dependencies
   COPY --from=build-image ${FUNCTION_DIR} ${FUNCTION_DIR}
   
   # Set runtime interface client as default command for the container runtime
   ENTRYPOINT ["{{/usr/local/bin/npx", "aws-lambda-ric"}}]
   # Pass the name of the function handler as an argument to the runtime
   CMD ["{{index.handler}}"]
   ```

1. Bangun image Docker dengan perintah [ docker build](https://docs.docker.com/engine/reference/commandline/build/). Contoh berikut memberi nama gambar `docker-image` dan memberinya `test` [ tag](https://docs.docker.com/engine/reference/commandline/build/#tag). Untuk membuat gambar Anda kompatibel dengan Lambda, Anda harus menggunakan `--provenance=false` opsi.

   ```
   docker buildx build --platform linux/amd64 --provenance=false -t {{docker-image}}:{{test}} .
   ```
**catatan**  
Perintah menentukan `--platform linux/amd64` opsi untuk memastikan bahwa wadah Anda kompatibel dengan lingkungan eksekusi Lambda terlepas dari arsitektur mesin build Anda. Jika Anda ingin membuat fungsi Lambda menggunakan arsitektur set instruksi ARM64, pastikan untuk mengubah perintah untuk menggunakan `--platform linux/arm64` opsi sebagai gantinya.

### (Opsional) Uji gambar secara lokal
<a name="nodejs-alt-test"></a>

Gunakan emulator antarmuka [ runtime ](https://github.com/aws/aws-lambda-runtime-interface-emulator/) untuk menguji gambar secara lokal. Anda dapat [ membangun emulator ke dalam gambar Anda ](https://github.com/aws/aws-lambda-runtime-interface-emulator/?tab=readme-ov-file#build-rie-into-your-base-image) atau menggunakan prosedur berikut untuk menginstalnya di mesin lokal Anda.

**Untuk menginstal dan menjalankan emulator antarmuka runtime di mesin lokal Anda**

1. Dari direktori proyek Anda, jalankan perintah berikut untuk mengunduh emulator antarmuka runtime (arsitektur x86-64) dari GitHub dan menginstalnya di mesin lokal Anda.

------
#### [ Linux/macOS ]

   ```
   mkdir -p ~/.aws-lambda-rie && \
       curl -Lo ~/.aws-lambda-rie/aws-lambda-rie https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie && \
       chmod +x ~/.aws-lambda-rie/aws-lambda-rie
   ```

   Untuk menginstal emulator arm64, ganti URL GitHub repositori di perintah sebelumnya dengan yang berikut:

   ```
   https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie-arm64
   ```

------
#### [ PowerShell ]

   ```
   $dirPath = "$HOME\.aws-lambda-rie"
   if (-not (Test-Path $dirPath)) {
       New-Item -Path $dirPath -ItemType Directory
   }
         
   $downloadLink = "https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie"
   $destinationPath = "$HOME\.aws-lambda-rie\aws-lambda-rie"
   Invoke-WebRequest -Uri $downloadLink -OutFile $destinationPath
   ```

   Untuk menginstal emulator arm64, ganti `$downloadLink` dengan yang berikut ini:

   ```
   https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie-arm64
   ```

------

1. Mulai gambar Docker dengan perintah **docker run**. Perhatikan hal-hal berikut:
   + `docker-image`adalah nama gambar dan `test` merupakan tag.
   + `/usr/local/bin/npx aws-lambda-ric index.handler`adalah yang `ENTRYPOINT` diikuti oleh `CMD` dari Dockerfile Anda.

------
#### [ Linux/macOS ]

   ```
   docker run --platform linux/amd64 -d -v ~/.aws-lambda-rie:/aws-lambda -p 9000:8080 \
       --entrypoint /aws-lambda/aws-lambda-rie \
       {{docker-image:test}} \
           {{/usr/local/bin/npx aws-lambda-ric index.handler}}
   ```

------
#### [ PowerShell ]

   ```
   docker run --platform linux/amd64 -d -v "$HOME\.aws-lambda-rie:/aws-lambda" -p 9000:8080 `
   --entrypoint /aws-lambda/aws-lambda-rie `
   {{docker-image:test}} `
       {{/usr/local/bin/npx aws-lambda-ric index.handler}}
   ```

------

   Perintah ini menjalankan gambar sebagai wadah dan membuat titik akhir lokal di`localhost:9000/2015-03-31/functions/function/invocations`.
**catatan**  
Jika Anda membuat gambar Docker untuk arsitektur set instruksi ARM64, pastikan untuk menggunakan `--platform linux/{{arm64}}` opsi alih-alih. `--platform linux/{{amd64}}`

1. Posting acara ke titik akhir lokal.

------
#### [ Linux/macOS ]

   Di Linux dan macOS, jalankan `curl` perintah berikut:

   ```
   curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'
   ```

   Perintah ini memanggil fungsi dengan peristiwa kosong dan mengembalikan respons. Jika Anda menggunakan kode fungsi Anda sendiri daripada kode fungsi sampel, Anda mungkin ingin memanggil fungsi dengan muatan JSON. Contoh:

   ```
   curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{{{"payload":"hello world!"}}}'
   ```

------
#### [ PowerShell ]

   Di PowerShell, jalankan `Invoke-WebRequest` perintah berikut:

   ```
   Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{}' -ContentType "application/json"
   ```

   Perintah ini memanggil fungsi dengan peristiwa kosong dan mengembalikan respons. Jika Anda menggunakan kode fungsi Anda sendiri daripada kode fungsi sampel, Anda mungkin ingin memanggil fungsi dengan muatan JSON. Contoh:

   ```
   Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{{{"payload":"hello world!"}}}' -ContentType "application/json"
   ```

------

1. Dapatkan ID kontainer.

   ```
   docker ps
   ```

1. Gunakan [ perintah ](https://docs.docker.com/engine/reference/commandline/kill/) docker kill untuk menghentikan wadah. Dalam perintah ini, ganti `3766c4ab331c` dengan ID kontainer dari langkah sebelumnya.

   ```
   docker kill {{3766c4ab331c}}
   ```

### Menyebarkan gambar
<a name="nodejs-alt-deploy"></a>

**Untuk mengunggah gambar ke Amazon ECR dan membuat fungsi Lambda**

1. Jalankan [ perintah ](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ecr/get-login-password.html) get-login-password untuk mengotentikasi Docker CLI ke registri Amazon ECR Anda.
   + Tetapkan `--region` nilai ke Wilayah AWS tempat Anda ingin membuat repositori Amazon ECR.
   + Ganti `111122223333` dengan Akun AWS ID Anda.

   ```
   aws ecr get-login-password --region {{us-east-1}} | docker login --username AWS --password-stdin {{111122223333}}.dkr.ecr.{{us-east-1}}.amazonaws.com
   ```

1. Buat repositori di Amazon ECR menggunakan perintah [ create-repository](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ecr/create-repository.html).

   ```
   aws ecr create-repository --repository-name {{hello-world}} --region {{us-east-1}} --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE
   ```
**catatan**  
Repositori Amazon ECR harus Wilayah AWS sama dengan fungsi Lambda.

   Jika berhasil, Anda melihat respons seperti ini:

   ```
   {
       "repository": {
           "repositoryArn": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world",
           "registryId": "111122223333",
           "repositoryName": "hello-world",
           "repositoryUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world",
           "createdAt": "2023-03-09T10:39:01+00:00",
           "imageTagMutability": "MUTABLE",
           "imageScanningConfiguration": {
               "scanOnPush": true
           },
           "encryptionConfiguration": {
               "encryptionType": "AES256"
           }
       }
   }
   ```

1. Salin `repositoryUri` dari output pada langkah sebelumnya.

1. Jalankan [ perintah tag ](https://docs.docker.com/engine/reference/commandline/tag/) docker untuk menandai gambar lokal Anda ke repositori Amazon ECR Anda sebagai versi terbaru. Dalam perintah ini:
   + `docker-image:test`adalah nama dan [ tag ](https://docs.docker.com/engine/reference/commandline/build/#tag) gambar Docker Anda. Ini adalah nama gambar dan tag yang Anda tentukan dalam `docker build` perintah.
   + Ganti `<ECRrepositoryUri>` dengan `repositoryUri` yang Anda salin. Pastikan untuk menyertakan `:latest` di akhir URI.

   ```
   docker tag docker-image:test {{<ECRrepositoryUri>}}:latest
   ```

   Contoh:

   ```
   docker tag {{docker-image}}:{{test}} {{111122223333}}.dkr.ecr.{{us-east-1}}.amazonaws.com/{{hello-world}}:latest
   ```

1. Jalankan [ perintah ](https://docs.docker.com/engine/reference/commandline/push/) docker push untuk menyebarkan gambar lokal Anda ke repositori Amazon ECR. Pastikan untuk menyertakan `:latest` di akhir URI repositori.

   ```
   docker push {{111122223333}}.dkr.ecr.{{us-east-1}}.amazonaws.com/{{hello-world}}:latest
   ```

1. [Buat peran eksekusi ](lambda-intro-execution-role.md#permissions-executionrole-api) untuk fungsi, jika Anda belum memilikinya. Anda memerlukan Nama Sumber Daya Amazon (ARN) dari peran di langkah berikutnya.

1. Buat fungsi Lambda. Untuk`ImageUri`, tentukan URI repositori dari sebelumnya. Pastikan untuk menyertakan `:latest` di akhir URI.

   ```
   aws lambda create-function \
     --function-name {{hello-world}} \
     --package-type Image \
     --code ImageUri={{111122223333}}.dkr.ecr.{{us-east-1}}.amazonaws.com/{{hello-world}}:latest \
     --role {{arn:aws:iam::111122223333:role/lambda-ex}}
   ```
**catatan**  
Anda dapat membuat fungsi menggunakan gambar di AWS akun yang berbeda, selama gambar berada di Wilayah yang sama dengan fungsi Lambda. Untuk informasi selengkapnya, lihat [Izin lintas akun Amazon ECR](images-create.md#configuration-images-xaccount-permissions).

1. Memanggil fungsi.

   ```
   aws lambda invoke --function-name {{hello-world}} response.json
   ```

   Anda akan melihat respons seperti ini:

   ```
   {
     "ExecutedVersion": "$LATEST", 
     "StatusCode": 200
   }
   ```

1. Untuk melihat output fungsi, periksa `response.json` file.

Untuk memperbarui kode fungsi, Anda harus membuat gambar lagi, mengunggah gambar baru ke repositori Amazon ECR, dan kemudian menggunakan [ perintah ](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html) update-function-code untuk menyebarkan gambar ke fungsi Lambda.

Lambda menyelesaikan tag gambar ke intisari gambar tertentu. Ini berarti bahwa jika Anda mengarahkan tag gambar yang digunakan untuk menerapkan fungsi ke gambar baru di Amazon ECR, Lambda tidak secara otomatis memperbarui fungsi untuk menggunakan gambar baru.

Untuk menerapkan gambar baru ke fungsi Lambda yang sama, Anda harus menggunakan [ perintah ](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html) update-function-code, bahkan jika tag gambar di Amazon ECR tetap sama. Dalam contoh berikut, `--publish` opsi membuat versi baru dari fungsi menggunakan gambar kontainer yang diperbarui.

```
aws lambda update-function-code \
  --function-name {{hello-world}} \
  --image-uri {{111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest}} \
  --publish
```