Terapkan TypeScript kode yang ditranspilasikan di Lambda dengan gambar wadah - AWS Lambda

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 wadah

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 image container. 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 atau menginstalnya di mesin lokal 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:

Untuk membuat gambar dari gambar AWS dasar untuk Lambda
  1. Pada mesin lokal Anda, buat direktori proyek untuk fungsi baru Anda.

  2. Buat proyek Node.js baru dengan npm atau manajer paket pilihan Anda.

    npm init
  3. 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
  4. Tambahkan skrip build ke package.json file.

    "scripts": { "build": "esbuild index.ts --bundle --minify --sourcemap --platform=node --target=es2020 --outfile=dist/index.js" }
  5. Buat file baru bernamaindex.ts. Tambahkan kode contoh berikut ke file baru. Ini adalah kode untuk fungsi Lambda. Fungsi mengembalikan hello world pesan.

    catatan

    importPernyataan mengimpor definisi tipe dari @types /aws-lambda. Itu tidak mengimpor aws-lambda NPM paket, yang merupakan alat pihak ketiga yang tidak terkait. Untuk informasi selengkapnya, lihat aws-lambda di 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', }), }; };
  6. Buat Dockerfile baru dengan konfigurasi berikut:

    • Atur FROM properti ke URI gambar dasar.

    • Atur argumen CMD untuk 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 root pengguna ketika tidak ada USER instruksi yang diberikan.

    contoh Dockerfile
    FROM public.ecr.aws/lambda/nodejs:20 as builder WORKDIR /usr/app COPY package.json index.ts ./ RUN npm install RUN npm run build FROM public.ecr.aws/lambda/nodejs:20 WORKDIR ${LAMBDA_TASK_ROOT} COPY --from=builder /usr/app/dist/* ./ CMD ["index.handler"]
  7. Buat image Docker dengan perintah docker build. Contoh berikut menamai gambar docker-image dan memberinya test 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.

  1. Mulai gambar Docker dengan perintah docker run. Dalam contoh ini, docker-image adalah nama gambar dan test 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 dilocalhost:9000/2015-03-31/functions/function/invocations.

    catatan

    Jika Anda membuat image Docker untuk arsitektur set ARM64 instruksi, pastikan untuk menggunakan --platform linux/arm64 opsi alih-alih. --platform linux/amd64

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

    Linux/macOS

    Di Linux dan macOS, jalankan perintah berikut: curl

    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 JSON payload. Contoh:

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

    Dalam 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 JSON payload. Contoh:

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

    docker ps
  4. Gunakan perintah docker kill untuk menghentikan wadah. Dalam perintah ini, ganti 3766c4ab331c dengan ID kontainer dari langkah sebelumnya.

    docker kill 3766c4ab331c
Untuk mengunggah gambar ke Amazon ECR dan membuat fungsi Lambda
  1. Jalankan get-login-passwordperintah 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-stdin 111122223333.dkr.ecr.us-east-1.amazonaws.com
  2. Buat repositori di Amazon ECR menggunakan perintah create-repository.

    aws ecr create-repository --repository-name hello-world --region us-east-1 --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE
    catatan

    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" } } }
  3. Salin repositoryUri dari output pada langkah sebelumnya.

  4. Jalankan perintah tag docker untuk menandai gambar lokal Anda ke ECR repositori Amazon Anda sebagai versi terbaru. Dalam perintah ini:

    • docker-image:testadalah nama dan 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 akhirURI.

    docker tag docker-image:test <ECRrepositoryUri>:latest

    Contoh:

    docker tag docker-image:test 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
  5. 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
  6. Buat peran eksekusi untuk fungsi tersebut, jika Anda belum memilikinya. Anda memerlukan Amazon Resource Name (ARN) peran di langkah berikutnya.

  7. Buat fungsi Lambda. UntukImageUri, 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 \ --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 ECR lintas akun Amazon.

  8. Memanggil fungsi.

    aws lambda invoke --function-name hello-world response.json

    Anda akan melihat tanggapan seperti ini:

    { "ExecutedVersion": "$LATEST", "StatusCode": 200 }
  9. Untuk melihat output 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-codeperintah 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 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-codeperintah, meskipun tag gambar di ECR Amazon 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