Terapkan TypeScript kode yang ditranspilasikan di Lambda dengan arsip file.zip - 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 arsip file.zip

Sebelum Anda dapat menerapkan TypeScript kode keAWS Lambda, Anda perlu mentranspilasinya menjadi. JavaScript Halaman ini menjelaskan tiga cara untuk membangun dan menyebarkan TypeScript kode ke Lambda dengan arsip file.zip:

AWS SAMdan AWS CDK menyederhanakan fungsi membangun dan menyebarkan TypeScript . Spesifikasi AWS SAM template menyediakan sintaks sederhana dan bersih untuk menggambarkan fungsi Lambda, API, izin, konfigurasi, dan peristiwa yang membentuk aplikasi tanpa server Anda. Ini AWS CDKmemungkinkan Anda membangun aplikasi yang andal, terukur, dan hemat biaya di cloud dengan kekuatan ekspresif yang cukup besar dari bahasa pemrograman. AWS CDKIni ditujukan untuk AWS pengguna yang cukup hingga sangat berpengalaman. Baik esbuild AWS CDK dan AWS SAM use untuk mentranspile TypeScript kode menjadi. JavaScript

Menggunakan AWS SAM untuk menyebarkan TypeScript kode ke Lambda

Ikuti langkah-langkah di bawah ini untuk mengunduh, membangun, dan menyebarkan contoh aplikasi Hello World menggunakan TypeScript aplikasi Hello World. AWS SAM Aplikasi ini mengimplementasikan backend API dasar. Ini terdiri dari titik akhir Amazon API Gateway dan fungsi Lambda. Ketika Anda mengirim permintaan GET ke titik akhir API Gateway, fungsi Lambda dipanggil. Fungsi mengembalikan hello world pesan.

catatan

AWS SAMmenggunakan esbuild untuk membuat fungsi Lambda Node.js TypeScript dari kode. dukungan esbuild saat ini dalam pratinjau publik. Selama pratinjau publik, dukungan esbuild mungkin mengalami perubahan yang tidak kompatibel ke belakang.

Prasyarat

Untuk menyelesaikan langkah-langkah di bagian ini, Anda harus memiliki hal-hal berikut:

Menyebarkan aplikasi sampel AWS SAM
  1. Inisialisasi aplikasi menggunakan TypeScript template Hello World.

    sam init --app-template hello-world-typescript --name sam-app --package-type Zip --runtime nodejs18.x
  2. (Opsional) Aplikasi sampel mencakup konfigurasi untuk alat yang umum digunakan, seperti ESLLint untuk linting kode dan Jest untuk pengujian unit. Untuk menjalankan perintah lint dan test:

    cd sam-app/hello-world npm install npm run lint npm run test
  3. Bangun aplikasi.

    cd sam-app sam build
  4. Terapkan aplikasi.

    sam deploy --guided
  5. Ikuti petunjuk di layar. Untuk menerima opsi default yang disediakan dalam pengalaman interaktif, respons dengan Enter.

  6. Output menunjukkan titik akhir untuk REST API. Buka titik akhir di browser untuk menguji fungsinya. Anda akan melihat tanggapan ini:

    {"message":"hello world"}
  7. Ini adalah titik akhir API publik yang dapat diakses melalui internet. Kami menyarankan Anda menghapus titik akhir setelah pengujian.

    sam delete

Menggunakan TypeScript kode AWS CDK untuk menyebarkan ke Lambda

Ikuti langkah-langkah di bawah ini untuk membangun dan menerapkan TypeScript aplikasi sampel menggunakan aplikasi. AWS CDK Aplikasi ini mengimplementasikan backend API dasar. Ini terdiri dari titik akhir API Gateway dan fungsi Lambda. Ketika Anda mengirim permintaan GET ke titik akhir API Gateway, fungsi Lambda dipanggil. Fungsi mengembalikan hello world pesan.

Prasyarat

Untuk menyelesaikan langkah-langkah di bagian ini, Anda harus memiliki hal-hal berikut:

Menyebarkan aplikasi sampel AWS CDK
  1. Buat direktori proyek untuk aplikasi baru Anda.

    mkdir hello-world cd hello-world
  2. Inisialisasi aplikasi.

    cdk init app --language typescript
  3. Tambahkan paket @types /aws-lambda sebagai dependensi pengembangan. Paket ini berisi definisi tipe untuk Lambda.

    npm install -D @types/aws-lambda
  4. Buka direktori lib. Anda akan melihat file bernama hello-world-stack.ts. Buat dua file baru di direktori ini: hello-world.function.ts dan hello-world.ts.

  5. Buka hello-world.function.ts dan tambahkan kode berikut ke file. Ini adalah kode untuk fungsi Lambda.

    catatan

    importPernyataan mengimpor definisi tipe dari @types /aws-lambda. Itu tidak mengimpor paket aws-lambda NPM, 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. Buka hello-world.ts dan tambahkan kode berikut ke file. Ini berisi NodejsFunction konstruksi, yang menciptakan fungsi Lambda, dan konstruksi, LambdaRestApi yang membuat REST API.

    import { Construct } from 'constructs'; import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs'; import { LambdaRestApi } from 'aws-cdk-lib/aws-apigateway'; export class HelloWorld extends Construct { constructor(scope: Construct, id: string) { super(scope, id); const helloFunction = new NodejsFunction(this, 'function'); new LambdaRestApi(this, 'apigw', { handler: helloFunction, }); } }

    NodejsFunctionKonstruk mengasumsikan hal berikut secara default:

    • Penangan fungsi Anda dipanggilhandler.

    • File.ts yang berisi kode fungsi (hello-world.function.ts) berada di direktori yang sama dengan file.ts yang berisi konstruksi (hello-world.ts). Konstruk menggunakan ID konstruksi (“hello-world”) dan nama file penangan Lambda (“fungsi”) untuk menemukan kode fungsi. Misalnya, jika kode fungsi Anda ada dalam file bernama hello-world.my-function.ts, file hello-world.ts harus mereferensikan kode fungsi seperti ini:

      const helloFunction = new NodejsFunction(this, 'my-function');

    Anda dapat mengubah perilaku ini dan mengonfigurasi parameter esbuild lainnya. Untuk informasi selengkapnya, lihat Mengonfigurasi esbuild di referensi AWS CDK API.

  7. Buka hello-world-stack.ts. Ini adalah kode yang mendefinisikan AWS CDKtumpukan Anda. Ganti kode dengan yang berikut:

    import { Stack, StackProps } from 'aws-cdk-lib'; import { Construct } from 'constructs'; import { HelloWorld } from './hello-world'; export class HelloWorldStack extends Stack { constructor(scope: Construct, id: string, props?: StackProps) { super(scope, id, props); new HelloWorld(this, 'hello-world'); } }
  8. dari hello-world direktori yang berisi cdk.json file Anda, terapkan aplikasi Anda.

    cdk deploy
  9. AWS CDKMembangun dan mengemas fungsi Lambda menggunakan esbuild, lalu menerapkan fungsi tersebut ke runtime Lambda. Output menunjukkan titik akhir untuk REST API. Buka titik akhir di browser untuk menguji fungsinya. Anda akan melihat tanggapan ini:

    {"message":"hello world"}

    Ini adalah titik akhir API publik yang dapat diakses melalui internet. Kami menyarankan Anda menghapus titik akhir setelah pengujian.

Menggunakan AWS CLI dan esbuild untuk menyebarkan TypeScript kode ke Lambda

Contoh berikut menunjukkan cara mentranspile dan menyebarkan kode TypeScript ke Lambda menggunakan esbuild dan. esbuild menghasilkan satu file dengan semua AWS CLI dependensi. JavaScript Ini adalah satu-satunya file yang perlu Anda tambahkan ke arsip.zip.

Prasyarat

Untuk menyelesaikan langkah-langkah di bagian ini, Anda harus memiliki hal-hal berikut:

Menyebarkan fungsi sampel
  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. Buat file baru bernama index.ts. Tambahkan kode berikut ke file baru. Ini adalah kode untuk fungsi Lambda. Fungsi mengembalikan hello world pesan. Fungsi ini tidak membuat sumber daya API Gateway apa pun.

    catatan

    importPernyataan mengimpor definisi tipe dari @types /aws-lambda. Itu tidak mengimpor paket aws-lambda NPM, 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', }), }; };
  5. Tambahkan skrip build ke file package.json. Ini mengonfigurasi esbuild untuk secara otomatis membuat paket penyebaran.zip. Untuk informasi selengkapnya, lihat Membuat skrip di dokumentasi esbuild.

    Linux and MacOS
    "scripts": { "prebuild": "rm -rf dist", "build": "esbuild index.ts --bundle --minify --sourcemap --platform=node --target=es2020 --outfile=dist/index.js", "postbuild": "cd dist && zip -r index.zip index.js*" },
    Windows

    Dalam contoh ini, "postbuild" perintah menggunakan utilitas 7zip untuk membuat file.zip Anda. Gunakan utilitas zip Windows pilihan Anda sendiri dan modifikasi perintah seperlunya.

    "scripts": { "prebuild": "del /q dist", "build": "esbuild index.ts --bundle --minify --sourcemap --platform=node --target=es2020 --outfile=dist/index.js", "postbuild": "cd dist && 7z a -tzip index.zip index.js*" },
  6. Bangun paketnya.

    npm run build
  7. Buat fungsi Lambda menggunakan paket.zip deployment. Ganti teks yang disorot dengan Amazon Resource Name (ARN) dari peran eksekusi Anda.

    aws lambda create-function --function-name hello-world --runtime "nodejs18.x" --role arn:aws:iam::123456789012:role/lambda-ex --zip-file "fileb://dist/index.zip" --handler index.handler
  8. Jalankan acara uji untuk mengonfirmasi bahwa fungsi mengembalikan respons berikut. Jika Anda ingin menjalankan fungsi ini menggunakan API Gateway, buat dan konfigurasikan REST API.

    { "statusCode": 200, "body": "{\"message\":\"hello world\"}" }