Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Deploy fungsi Lambda Node.js dengan gambar kontainer
Ada tiga cara untuk membangun image kontainer untuk fungsi Lambda Node.js:
-
Menggunakan gambar AWS dasar untuk Node.js
Gambar AWS 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 gambar AWS dasar khusus OS
AWS Gambar dasar khusus OS
berisi distribusi Amazon Linux dan emulator antarmuka runtime . Gambar-gambar ini biasanya digunakan untuk membuat gambar kontainer untuk bahasa yang dikompilasi, seperti Go dan Rust, dan untuk versi bahasa atau bahasa yang Lambda tidak menyediakan gambar dasar, seperti Node.js 19. Anda juga dapat menggunakan gambar dasar khusus OS untuk mengimplementasikan runtime kustom. Untuk membuat gambar kompatibel dengan Lambda, Anda harus menyertakan klien antarmuka runtime untuk Node.js dalam gambar. -
Menggunakan gambar AWS non-dasar
Anda dapat menggunakan gambar dasar alternatif dari registri kontainer lain, seperti Alpine Linux atau Debian. Anda juga dapat menggunakan gambar kustom yang dibuat oleh organisasi Anda. Untuk membuat gambar kompatibel dengan Lambda, Anda harus menyertakan klien antarmuka runtime untuk Node.js dalam gambar.
Tip
Untuk mengurangi waktu yang dibutuhkan agar fungsi penampung Lambda menjadi aktif, lihat Menggunakan build multi-tahap
Halaman ini menjelaskan cara membuat, menguji, dan menyebarkan gambar kontainer untuk Lambda.
Topik
AWS gambar dasar untuk Node.js
AWS menyediakan gambar dasar berikut untuk Node.js:
Tanda | Waktu berjalan | Sistem operasi | Dockerfile | penghentian |
---|---|---|---|---|
20 |
Node.js 20 | Amazon Linux 2023 | Dockerfile untuk Node.js 20 di GitHub |
Tidak dijadwalkan |
18 |
Node.js 18 | Amazon Linux 2 | Dockerfile untuk Node.js 18 di GitHub |
Juli 31, 2025 |
ECRRepositori Amazon: gallery.ecr.aws/lambda/nodejs
Gambar dasar Node.js 20 dan yang lebih baru didasarkan pada gambar kontainer minimal Amazon Linux 2023. Gambar dasar sebelumnya menggunakan Amazon Linux 2. AL2023 memberikan beberapa keunggulan dibandingkan Amazon Linux 2, termasuk jejak penyebaran yang lebih kecil dan versi pustaka yang diperbarui seperti. glibc
AL2Gambar berbasis 023 menggunakan microdnf
(symlinked asdnf
) sebagai manajer paket, bukanyum
, yang merupakan pengelola paket default di Amazon Linux 2. microdnf
adalah implementasi mandiri dari. dnf
Untuk daftar paket yang disertakan dalam gambar AL2 berbasis 023, lihat kolom Penampung Minimal di Membandingkan paket yang diinstal pada Gambar Kontainer Amazon Linux 2023. Untuk informasi selengkapnya tentang perbedaan antara AL2 023 dan Amazon Linux 2, lihat Memperkenalkan runtime Amazon Linux 2023 untuk AWS Lambda
catatan
Untuk menjalankan gambar AL2 berbasis 023 secara lokal, termasuk with AWS Serverless Application Model (AWS SAM), Anda harus menggunakan Docker versi 20.10.10 atau yang lebih baru.
Menggunakan gambar AWS dasar untuk Node.js
Untuk menyelesaikan langkah-langkah di bagian ini, Anda harus memiliki hal-hal berikut:
-
Docker
(versi minimum 20.10.10 untuk Node.js 20 dan gambar dasar yang lebih baru) -
Node.js
Untuk membuat gambar kontainer dari gambar AWS dasar untuk Node.js
-
Buat direktori untuk proyek, dan kemudian beralih ke direktori itu.
mkdir example cd example
-
Buat proyek Node.js baru dengan
npm
. Untuk menerima opsi default yang disediakan dalam pengalaman interaktif, tekanEnter
.npm init
-
Buat file baru bernama
index.js
. Anda dapat menambahkan kode fungsi contoh berikut ke file untuk pengujian, atau menggunakan kode Anda sendiri.contoh Penangan CommonJS
exports.handler = async (event) => { const response = { statusCode: 200, body: JSON.stringify('Hello from Lambda!'), }; return response; };
-
Jika fungsi Anda bergantung pada pustaka selain AWS SDK for JavaScript, gunakan npm
untuk menambahkannya ke paket Anda. -
Buat Dockerfile baru dengan konfigurasi berikut:
-
Atur
FROM
properti ke URIgambar dasar. -
Gunakan COPY perintah untuk menyalin kode fungsi dan dependensi runtime ke
{LAMBDA_TASK_ROOT}
, variabel lingkungan yang ditentukan Lambda. -
Atur
CMD
argumen ke penangan fungsi Lambda.
Perhatikan bahwa contoh Dockerfile tidak menyertakan instruksi. USER
Saat Anda menyebarkan gambar 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 adaUSER
instruksi yang diberikan.contoh Dockerfile
FROM
public.ecr.aws/lambda/nodejs:20
# Copy function code COPYindex.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
" ] -
-
Buat image Docker dengan perintah docker
build. Contoh berikut memberi nama gambar docker-image
dan memberinyatest
tag. docker build --platform linux/amd64 -t
docker-image
:test
.catatan
Perintah menentukan
--platform linux/amd64
opsi untuk memastikan bahwa container Anda kompatibel dengan lingkungan eksekusi Lambda terlepas dari arsitektur mesin build Anda. Jika Anda berniat untuk membuat fungsi Lambda menggunakan arsitektur set ARM64 instruksi, pastikan untuk mengubah perintah untuk menggunakan--platform linux/arm64
opsi sebagai gantinya.
-
Mulai gambar Docker dengan perintah docker run. Dalam contoh ini,
docker-image
adalah nama gambar dantest
tag.docker run --platform linux/amd64 -p 9000:8080 --read-only
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 image Docker untuk arsitektur set ARM64 instruksi, pastikan untuk menggunakan
--platform linux/
opsi alih-alih.arm64
--platform linux/
amd64
-
Dari jendela terminal baru, posting acara ke titik akhir lokal.
-
Dapatkan ID kontainer.
docker ps
-
Gunakan perintah docker kill
untuk menghentikan kontainer. Dalam perintah ini, ganti 3766c4ab331c
dengan ID kontainer dari langkah sebelumnya.docker kill
3766c4ab331c
Untuk mengunggah gambar ke Amazon ECR dan membuat fungsi Lambda
-
Jalankan get-login-password
perintah untuk mengautentikasi Docker CLI ke registri Amazon ECR Anda. -
Tetapkan
--region
nilai ke Wilayah AWS tempat Anda ingin membuat ECR repositori Amazon. -
Ganti
111122223333
dengan Akun AWS ID Anda.
aws ecr get-login-password --region
us-east-1
| docker login --username AWS --password-stdin111122223333
.dkr.ecr.us-east-1
.amazonaws.com -
-
Buat repositori di Amazon ECR menggunakan perintah create-repository
. aws ecr create-repository --repository-name
hello-world
--regionus-east-1
--image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLEcatatan
ECRRepositori Amazon harus sama Wilayah AWS 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" } } }
-
Salin
repositoryUri
dari output pada langkah sebelumnya. -
Jalankan perintah tag docker
untuk menandai gambar lokal Anda ke ECR repositori Amazon Anda sebagai versi terbaru. Dalam perintah ini: -
docker-image:test
adalah nama dan taggambar Docker Anda. Ini adalah nama gambar dan tag yang Anda tentukan dalam docker build
perintah. -
Ganti
<ECRrepositoryUri>
denganrepositoryUri
yang Anda salin. Pastikan untuk menyertakan:latest
di akhirURI.
docker tag docker-image:test
<ECRrepositoryUri>
:latestContoh:
docker tag
docker-image
:test
111122223333
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest -
-
Jalankan perintah docker push
untuk menyebarkan gambar lokal Anda ke repositori Amazon. ECR Pastikan untuk menyertakan :latest
di akhir repositoriURI.docker push
111122223333
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest -
Buat peran eksekusi untuk fungsi tersebut, jika Anda belum memilikinya. Anda memerlukan Amazon Resource Name (ARN) peran di langkah berikutnya.
-
Buat fungsi Lambda. Untuk
ImageUri
, tentukan repositori URI dari sebelumnya. Pastikan untuk menyertakan:latest
di akhirURI.aws lambda create-function \ --function-name
hello-world
\ --package-type Image \ --code ImageUri=111122223333
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest \ --rolearn: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 ECR lintas akun Amazon.
-
Memanggil fungsi.
aws lambda invoke --function-name
hello-world
response.jsonAnda akan melihat tanggapan seperti ini:
{ "ExecutedVersion": "$LATEST", "StatusCode": 200 }
-
Untuk melihat output dari fungsi, periksa
response.json
file.
Untuk memperbarui kode fungsi, Anda harus membangun gambar lagi, mengunggah gambar baru ke ECR repositori Amazon, dan kemudian menggunakan update-function-code
Lambda menyelesaikan tag gambar ke intisari gambar tertentu. Ini berarti bahwa jika Anda mengarahkan tag gambar yang digunakan untuk menyebarkan fungsi ke gambar baru di AmazonECR, Lambda tidak secara otomatis memperbarui fungsi untuk menggunakan gambar baru.
Untuk menyebarkan gambar baru ke fungsi Lambda yang sama, Anda harus menggunakan update-function-code--publish
opsi membuat versi baru dari fungsi menggunakan gambar kontainer yang diperbarui.
aws lambda update-function-code \ --function-name
hello-world
\ --image-uri111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
\ --publish
Menggunakan gambar dasar alternatif dengan klien antarmuka runtime
Jika Anda menggunakan gambar dasar khusus OS atau gambar dasar alternatif, Anda harus menyertakan klien antarmuka runtime dalam gambar Anda. Klien antarmuka runtime memperluasMenggunakan runtime Lambda untuk runtime khusus API, yang mengelola interaksi antara Lambda dan kode fungsi Anda.
Instal klien antarmuka runtime Node.js
npm install aws-lambda-ric
Anda juga dapat mengunduh klien antarmuka runtime Node.js
14,x
16,x
18.x
20.x
Contoh berikut menunjukkan bagaimana membangun image container untuk Node.js menggunakan image AWS non-base. Contoh Dockerfile menggunakan gambar buster
dasar. Dockerfile menyertakan klien antarmuka runtime.
Untuk menyelesaikan langkah-langkah di bagian ini, Anda harus memiliki hal-hal berikut:
Untuk membuat gambar kontainer dari gambar AWS non-dasar
-
Buat direktori untuk proyek, dan kemudian beralih ke direktori itu.
mkdir example cd example
-
Buat proyek Node.js baru dengan
npm
. Untuk menerima opsi default yang disediakan dalam pengalaman interaktif, tekanEnter
.npm init
-
Buat file baru bernama
index.js
. Anda dapat menambahkan kode fungsi contoh berikut ke file untuk pengujian, atau menggunakan kode Anda sendiri.contoh Penangan CommonJS
exports.handler = async (event) => { const response = { statusCode: 200, body: JSON.stringify('Hello from Lambda!'), }; return response; };
-
Buat Dockerfile baru. Dockerfile berikut menggunakan gambar
buster
dasar bukan gambar AWS dasar. Dockerfile menyertakan klien antarmuka runtime, yang membuat gambar kompatibel dengan Lambda. Dockerfile menggunakan build multi-tahap . Tahap pertama membuat image build, yang merupakan lingkungan Node.js standar tempat 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 penangan fungsi Lambda.
Perhatikan bahwa contoh Dockerfile tidak menyertakan instruksi. USER
Saat Anda menyebarkan gambar 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 adaUSER
instruksi yang diberikan.contoh Dockerfile
# Define custom function directory ARG FUNCTION_DIR="/function" FROM
node:20-buster
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 FROMnode:20-buster-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
"] -
-
Buat image Docker dengan perintah docker
build. Contoh berikut memberi nama gambar docker-image
dan memberinyatest
tag. docker build --platform linux/amd64 -t
docker-image
:test
.catatan
Perintah menentukan
--platform linux/amd64
opsi untuk memastikan bahwa container Anda kompatibel dengan lingkungan eksekusi Lambda terlepas dari arsitektur mesin build Anda. Jika Anda berniat untuk membuat fungsi Lambda menggunakan arsitektur set ARM64 instruksi, pastikan untuk mengubah perintah untuk menggunakan--platform linux/arm64
opsi sebagai gantinya.
Gunakan emulator antarmuka runtime
Untuk menginstal dan menjalankan emulator antarmuka runtime di mesin lokal Anda
-
Dari direktori proyek Anda, jalankan perintah berikut untuk mengunduh emulator antarmuka runtime (arsitektur x86-64) dari GitHub dan menginstalnya di mesin lokal Anda.
-
Mulai gambar Docker dengan perintah docker run. Perhatikan hal berikut:
-
docker-image
adalah nama gambar dantest
tag. -
/usr/local/bin/npx aws-lambda-ric index.handler
adalahENTRYPOINT
diikuti olehCMD
dari Dockerfile Anda.
Perintah ini menjalankan gambar sebagai wadah dan membuat titik akhir lokal di
localhost:9000/2015-03-31/functions/function/invocations
.catatan
Jika Anda membuat image Docker untuk arsitektur set ARM64 instruksi, pastikan untuk menggunakan
--platform linux/
opsi alih-alih.arm64
--platform linux/
amd64
-
-
Posting acara ke titik akhir lokal.
-
Dapatkan ID kontainer.
docker ps
-
Gunakan perintah docker kill
untuk menghentikan kontainer. Dalam perintah ini, ganti 3766c4ab331c
dengan ID kontainer dari langkah sebelumnya.docker kill
3766c4ab331c
Untuk mengunggah gambar ke Amazon ECR dan membuat fungsi Lambda
-
Jalankan get-login-password
perintah untuk mengautentikasi Docker CLI ke registri Amazon ECR Anda. -
Tetapkan
--region
nilai ke Wilayah AWS tempat Anda ingin membuat ECR repositori Amazon. -
Ganti
111122223333
dengan Akun AWS ID Anda.
aws ecr get-login-password --region
us-east-1
| docker login --username AWS --password-stdin111122223333
.dkr.ecr.us-east-1
.amazonaws.com -
-
Buat repositori di Amazon ECR menggunakan perintah create-repository
. aws ecr create-repository --repository-name
hello-world
--regionus-east-1
--image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLEcatatan
ECRRepositori Amazon harus sama Wilayah AWS 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" } } }
-
Salin
repositoryUri
dari output pada langkah sebelumnya. -
Jalankan perintah tag docker
untuk menandai gambar lokal Anda ke ECR repositori Amazon Anda sebagai versi terbaru. Dalam perintah ini: -
docker-image:test
adalah nama dan taggambar Docker Anda. Ini adalah nama gambar dan tag yang Anda tentukan dalam docker build
perintah. -
Ganti
<ECRrepositoryUri>
denganrepositoryUri
yang Anda salin. Pastikan untuk menyertakan:latest
di akhirURI.
docker tag docker-image:test
<ECRrepositoryUri>
:latestContoh:
docker tag
docker-image
:test
111122223333
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest -
-
Jalankan perintah docker push
untuk menyebarkan gambar lokal Anda ke repositori Amazon. ECR Pastikan untuk menyertakan :latest
di akhir repositoriURI.docker push
111122223333
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest -
Buat peran eksekusi untuk fungsi tersebut, jika Anda belum memilikinya. Anda memerlukan Amazon Resource Name (ARN) peran di langkah berikutnya.
-
Buat fungsi Lambda. Untuk
ImageUri
, tentukan repositori URI dari sebelumnya. Pastikan untuk menyertakan:latest
di akhirURI.aws lambda create-function \ --function-name
hello-world
\ --package-type Image \ --code ImageUri=111122223333
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest \ --rolearn: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 ECR lintas akun Amazon.
-
Memanggil fungsi.
aws lambda invoke --function-name
hello-world
response.jsonAnda akan melihat tanggapan seperti ini:
{ "ExecutedVersion": "$LATEST", "StatusCode": 200 }
-
Untuk melihat output dari fungsi, periksa
response.json
file.
Untuk memperbarui kode fungsi, Anda harus membangun gambar lagi, mengunggah gambar baru ke ECR repositori Amazon, dan kemudian menggunakan update-function-code
Lambda menyelesaikan tag gambar ke intisari gambar tertentu. Ini berarti bahwa jika Anda mengarahkan tag gambar yang digunakan untuk menyebarkan fungsi ke gambar baru di AmazonECR, Lambda tidak secara otomatis memperbarui fungsi untuk menggunakan gambar baru.
Untuk menyebarkan gambar baru ke fungsi Lambda yang sama, Anda harus menggunakan update-function-code--publish
opsi membuat versi baru dari fungsi menggunakan gambar kontainer yang diperbarui.
aws lambda update-function-code \ --function-name
hello-world
\ --image-uri111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
\ --publish