Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Terapkan TypeScript kode yang ditranspilasikan di Lambda dengan gambar kontainer
Anda dapat menerapkan TypeScript kode Anda ke AWS Lambda fungsi sebagai gambar kontainer Node.js. AWS menyediakan gambar dasar untuk Node.js untuk membantu Anda membangun gambar kontainer. Gambar dasar ini dimuat sebelumnya dengan runtime bahasa dan komponen lain yang diperlukan untuk menjalankan gambar di Lambda. AWS menyediakan Dockerfile untuk setiap gambar dasar untuk membantu membangun gambar kontainer Anda.
Jika Anda menggunakan image basis komunitas atau perusahaan pribadi, Anda harus menambahkan Node.js runtime interface client (RIC) ke image dasar agar kompatibel dengan Lambda.
Lambda menyediakan emulator antarmuka runtime untuk pengujian lokal. Gambar AWS dasar untuk Node.js menyertakan emulator antarmuka runtime. Jika Anda menggunakan gambar dasar alternatif, seperti gambar Alpine Linux atau Debian, Anda dapat membangun emulator ke dalam gambar Anda
Menggunakan image dasar Node.js untuk membangun dan mengemas kode TypeScript fungsi
Untuk menyelesaikan langkah-langkah di bagian ini, Anda harus memiliki hal-hal berikut:
-
Docker
(versi minimum 25.0.0) -
Plugin buildx Docker
. -
Node.js 22.x
Untuk membuat gambar dari gambar AWS dasar untuk Lambda
-
Pada mesin lokal Anda, buat direktori proyek untuk fungsi baru Anda.
-
Buat proyek Node.js baru dengan
npmatau manajer paket pilihan Anda.npm init -
Tambahkan paket @types /aws-lambda
dan esbuild sebagai dependensi pengembangan. @types/aws-lambdaPaket berisi definisi tipe untuk Lambda.npm install -D @types/aws-lambda esbuild -
Tambahkan skrip build
ke package.jsonfile."scripts": { "build": "esbuild index.ts --bundle --minify --sourcemap --platform=node --target=es2020 --outfile=dist/index.js" } -
Buat file baru bernama
index.ts. Tambahkan kode contoh berikut ke file baru. Ini adalah kode untuk fungsi Lambda. Fungsi mengembalikanhello worldpesan.catatan
importPernyataan mengimpor definisi tipe dari @types /aws-lambda. Itu tidak mengimpor paket aws-lambdaNPM, yang merupakan alat pihak ketiga yang tidak terkait. Untuk informasi selengkapnya, lihat aws-lambdadi repositori. DefinitelyTyped GitHub import { Context, APIGatewayProxyResult, APIGatewayEvent } from 'aws-lambda'; export const handler = async (event: APIGatewayEvent, context: Context): Promise<APIGatewayProxyResult> => { console.log(`Event: ${JSON.stringify(event, null, 2)}`); console.log(`Context: ${JSON.stringify(context, null, 2)}`); return { statusCode: 200, body: JSON.stringify({ message: 'hello world', }), }; }; -
Buat Dockerfile baru dengan konfigurasi berikut:
-
Atur properti
FROMuntuk URI dari gambar dasar. -
Atur argumen
CMDuntuk menentukan handler fungsi Lambda.
Contoh berikut Dockerfile menggunakan build multi-tahap. Langkah pertama mentransformasikan TypeScript kode ke dalam JavaScript. Langkah kedua menghasilkan gambar kontainer yang hanya berisi JavaScript file dan dependensi produksi.
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 rootpengguna ketika tidak adaUSERinstruksi yang diberikan.contoh Dockerfile
FROM public.ecr.aws/lambda/nodejs:22 as builder WORKDIR /usr/app COPY package.json index.ts ./ RUN npm install RUN npm run build FROM public.ecr.aws/lambda/nodejs:22 WORKDIR ${LAMBDA_TASK_ROOT} COPY --from=builder /usr/app/dist/* ./ CMD ["index.handler"] -
-
Buat image Docker dengan perintah docker
build. Contoh berikut menamai gambar docker-imagedan memberinyatesttag. Untuk membuat gambar Anda kompatibel dengan Lambda, Anda harus menggunakan opsi. --provenance=falsedocker buildx build --platform linux/amd64 --provenance=false -tdocker-image:test.catatan
Perintah menentukan
--platform linux/amd64opsi 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/arm64opsi sebagai gantinya.
-
Mulai gambar Docker dengan perintah docker run. Dalam contoh ini,
docker-imageadalah nama gambar dantesttag.docker run --platform linux/amd64 -p 9000:8080docker-image:testPerintah 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 wadah. Dalam perintah ini, ganti 3766c4ab331cdengan ID kontainer dari langkah sebelumnya.docker kill3766c4ab331c
Untuk mengunggah gambar ke Amazon ECR dan membuat fungsi Lambda
-
Jalankan get-login-password
perintah untuk mengautentikasi CLI Docker ke registri Amazon ECR Anda. -
Tetapkan
--regionnilai ke Wilayah AWS tempat Anda ingin membuat repositori Amazon ECR. -
Ganti
111122223333dengan Akun AWS ID Anda.
aws ecr get-login-password --regionus-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-namehello-world--regionus-east-1--image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLEcatatan
Repositori Amazon ECR 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
repositoryUridari output pada langkah sebelumnya. -
Jalankan perintah tag docker
untuk menandai gambar lokal Anda ke repositori Amazon ECR Anda sebagai versi terbaru. Dalam perintah ini: -
docker-image:testadalah nama dan taggambar Docker Anda. Ini adalah nama gambar dan tag yang Anda tentukan dalam docker buildperintah. -
Ganti
<ECRrepositoryUri>denganrepositoryUriyang Anda salin. Pastikan untuk menyertakan:latestdi akhir URI.
docker tag docker-image:test<ECRrepositoryUri>:latestContoh:
docker tagdocker-image:test111122223333.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 :latestdi akhir URI repositori.docker push111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest -
Buat peran eksekusi untuk fungsi tersebut, jika Anda belum memilikinya. Anda memerlukan Nama Sumber Daya Amazon (ARN) dari peran tersebut di langkah berikutnya.
-
Buat fungsi Lambda. Untuk
ImageUri, tentukan URI repositori dari sebelumnya. Pastikan untuk menyertakan:latestdi akhir URI.aws lambda create-function \ --function-namehello-world\ --package-type Image \ --code ImageUri=111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \ --rolearn:aws:iam::111122223333:role/lambda-excatatan
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.
-
Memanggil fungsi.
aws lambda invoke --function-namehello-worldresponse.jsonAnda akan melihat tanggapan seperti ini:
{ "ExecutedVersion": "$LATEST", "StatusCode": 200 } -
Untuk melihat output dari fungsi, periksa
response.jsonfile.
Untuk memperbarui kode fungsi, Anda harus membangun gambar lagi, mengunggah gambar baru ke repositori Amazon ECR, 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 Amazon ECR, 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-namehello-world\ --image-uri111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest\ --publish