Bekerja dengan lapisan untuk fungsi Java Lambda - AWS Lambda

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

Bekerja dengan lapisan untuk fungsi Java Lambda

Lapisan Lambda adalah arsip file.zip yang berisi kode atau data tambahan. Lapisan biasanya berisi dependensi pustaka, runtime kustom, atau file konfigurasi. Membuat layer melibatkan tiga langkah umum:

  1. Package konten layer Anda. Ini berarti membuat arsip file.zip yang berisi dependensi yang ingin Anda gunakan dalam fungsi Anda.

  2. Buat layer di Lambda.

  3. Tambahkan layer ke fungsi Anda.

Topik ini berisi langkah-langkah dan panduan tentang cara mengemas dan membuat lapisan Java Lambda dengan dependensi pustaka eksternal dengan benar.

Prasyarat

Untuk mengikuti langkah-langkah di bagian ini, Anda harus memiliki yang berikut:

catatan

Pastikan bahwa versi Java yang dirujuk Maven sama dengan versi Java dari fungsi yang ingin Anda gunakan. Misalnya, untuk fungsi Java 21, mvn -v perintah harus mencantumkan Java versi 21 dalam output:

Apache Maven 3.8.6 ... Java version: 21.0.2, vendor: Oracle Corporation, runtime: /Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home ...

Sepanjang topik ini, kami mereferensikan layer-javacontoh aplikasi pada repositori awsdocs GitHub . Aplikasi ini berisi skrip yang mengunduh dependensi dan menghasilkan lapisan. Aplikasi ini juga berisi fungsi yang sesuai yang menggunakan dependensi dari lapisan. Setelah membuat layer, Anda dapat menerapkan dan memanggil fungsi yang sesuai untuk memverifikasi bahwa semuanya berfungsi dengan baik. Karena Anda menggunakan runtime Java 21 untuk fungsi, lapisan juga harus kompatibel dengan Java 21.

Aplikasi layer-java sampel berisi satu contoh dalam dua sub-direktori. layerDirektori berisi pom.xml file yang mendefinisikan dependensi lapisan, serta skrip untuk menghasilkan lapisan. functionDirektori berisi fungsi sampel untuk membantu menguji bahwa lapisan berfungsi. Tutorial ini berjalan melalui cara membuat dan mengemas layer ini.

Kompatibilitas lapisan Java dengan Amazon Linux

Langkah pertama untuk membuat layer adalah untuk menggabungkan semua konten layer Anda ke dalam arsip file.zip. Karena fungsi Lambda berjalan di Amazon Linux, konten layer Anda harus dapat dikompilasi dan dibangun di lingkungan Linux.

Kode Java dirancang untuk menjadi platform-independen, sehingga Anda dapat mengemas lapisan Anda pada mesin lokal Anda bahkan jika itu tidak menggunakan lingkungan Linux. Setelah Anda mengunggah lapisan Java ke Lambda, itu akan tetap kompatibel dengan Amazon Linux.

Jalur lapisan untuk runtime Java

Saat Anda menambahkan lapisan ke fungsi, Lambda memuat konten lapisan ke dalam /opt direktori lingkungan eksekusi itu. Untuk setiap runtime Lambda, PATH variabel sudah menyertakan jalur folder tertentu dalam direktori. /opt Untuk memastikan bahwa PATH variabel mengambil konten lapisan Anda, file layer.zip Anda harus memiliki dependensi di jalur folder berikut:

  • java/lib

Misalnya, file layer zip yang dihasilkan yang Anda buat dalam tutorial ini memiliki struktur direktori berikut:

layer_content.zip └ java └ lib └ layer-java-layer-1.0-SNAPSHOT.jar

File layer-java-layer-1.0-SNAPSHOT.jar JAR (sebuah uber-jar yang berisi semua dependensi yang diperlukan) terletak dengan benar di direktori. java/lib Ini memastikan bahwa Lambda dapat menemukan pustaka selama pemanggilan fungsi.

Mengemas konten lapisan

Dalam contoh ini, Anda mengemas dua pustaka Java berikut ke dalam satu file JAR:

  • aws-lambda-java-core— Satu set minimal definisi antarmuka untuk bekerja dengan Java di AWS Lambda

  • Jackson — Rangkaian alat pemrosesan data yang populer, terutama untuk bekerja dengan JSON.

Selesaikan langkah-langkah berikut untuk menginstal dan mengemas konten lapisan.

Untuk menginstal dan mengemas konten lapisan Anda
  1. Kloning aws-lambda-developer-guide GitHub repo, yang berisi kode sampel yang Anda butuhkan di direktori. sample-apps/layer-java

    git clone https://github.com/awsdocs/aws-lambda-developer-guide.git
  2. Arahkan ke layer direktori aplikasi layer-java sampel. Direktori ini berisi skrip yang Anda gunakan untuk membuat dan mengemas lapisan dengan benar.

    cd aws-lambda-developer-guide/sample-apps/layer-java/layer
  3. Periksa pom.xmlfile. Di <dependencies> bagian ini, Anda menentukan dependensi yang ingin Anda sertakan di lapisan, yaitu aws-lambda-java-core dan jackson-databind pustaka. Anda dapat memperbarui file ini untuk menyertakan dependensi apa pun yang ingin Anda sertakan dalam lapisan Anda sendiri.

    contoh pom.xml
    <dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-core</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.17.0</version> </dependency> </dependencies>
    catatan

    <build>Bagian dari pom.xml file ini berisi dua plugin. maven-compiler-pluginMengkompilasi kode sumber. maven-shade-pluginPaket artefak Anda ke dalam satu uber-jar.

  4. Pastikan Anda memiliki izin untuk menjalankan kedua skrip.

    chmod 744 1-install.sh && chmod 744 2-package.sh
  5. Jalankan 1-install.shskrip menggunakan perintah berikut:

    ./1-install.sh

    Skrip ini berjalan mvn clean install di direktori saat ini. Ini membuat uber-jar dengan semua dependensi yang diperlukan dalam direktori. target/

    contoh 1-install.sh
    mvn clean install
  6. Jalankan 2-package.shskrip menggunakan perintah berikut:

    ./2-package.sh

    Skrip ini menciptakan struktur java/lib direktori yang Anda butuhkan untuk mengemas konten lapisan Anda dengan benar. Kemudian menyalin uber-jar dari /target direktori ke direktori yang baru dibuatjava/lib. Akhirnya, skrip zip isi java direktori ke dalam file bernamalayer_content.zip. Ini adalah file.zip untuk layer Anda. Anda dapat membuka zip file dan memverifikasi bahwa itu berisi struktur file yang benar, seperti yang ditunjukkan pada Jalur lapisan untuk runtime Java bagian.

    contoh 2-package.sh
    mkdir java mkdir java/lib cp -r target/layer-java-layer-1.0-SNAPSHOT.jar java/lib/ zip -r layer_content.zip java

Membuat layer

Di bagian ini, Anda mengambil layer_content.zip file yang Anda buat di bagian sebelumnya dan mengunggahnya sebagai lapisan Lambda. Anda dapat mengunggah layer menggunakan AWS Management Console atau Lambda API melalui AWS Command Line Interface ()AWS CLI. Saat Anda mengunggah file layer .zip Anda, dalam PublishLayerVersion AWS CLI perintah berikut, tentukan java21 sebagai runtime yang kompatibel dan arm64 sebagai arsitektur yang kompatibel.

aws lambda publish-layer-version --layer-name java-jackson-layer \ --zip-file fileb://layer_content.zip \ --compatible-runtimes java21 \ --compatible-architectures "arm64"

Dari tanggapan, perhatikanLayerVersionArn, yang terlihat sepertiarn:aws:lambda:us-east-1:123456789012:layer:java-jackson-layer:1. Anda akan memerlukan Amazon Resource Name (ARN) ini di langkah berikutnya dari tutorial ini, ketika Anda menambahkan layer ke fungsi Anda.

Menambahkan layer ke fungsi Anda

Di bagian ini, Anda menyebarkan contoh fungsi Lambda yang menggunakan pustaka Jackson dalam kode fungsinya, lalu Anda melampirkan layer. Untuk menyebarkan fungsi, Anda memerlukan file. Mendefinisikan izin fungsi Lambda dengan peran eksekusi Jika Anda tidak memiliki peran eksekusi yang ada, ikuti langkah-langkah di bagian yang dapat dilipat. Jika tidak, lewati ke bagian berikutnya untuk menyebarkan fungsi.

Untuk membuat peran eksekusi
  1. Buka halaman peran di konsol IAM.

  2. Pilih Buat peran.

  3. Buat peran dengan properti berikut.

    • Entitas tepercayaLambda.

    • IzinAWSLambdaBasicExecutionRole.

    • Nama peranlambda-role.

    AWSLambdaBasicExecutionRoleKebijakan ini memiliki izin yang diperlukan fungsi untuk menulis log ke CloudWatch Log.

Untuk menyebarkan fungsi Lambda
  1. Buka direktori function/ tersebut. Jika saat ini Anda berada di layer/ direktori, maka jalankan perintah berikut:

    cd ../function
  2. Tinjau kode fungsi. Fungsi mengambil Map<String, String> sebagai input, dan menggunakan Jackson untuk menulis input sebagai JSON String sebelum mengubahnya menjadi objek Java F1Car yang telah ditentukan sebelumnya. Akhirnya, fungsi menggunakan bidang dari objek F1Car untuk membangun String yang fungsi kembali.

    package example; import com.amazonaws.services.lambda.runtime.Context; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.util.Map; public class Handler { public String handleRequest(Map<String, String> input, Context context) throws IOException { // Parse the input JSON ObjectMapper objectMapper = new ObjectMapper(); F1Car f1Car = objectMapper.readValue(objectMapper.writeValueAsString(input), F1Car.class); StringBuilder finalString = new StringBuilder(); finalString.append(f1Car.getDriver()); finalString.append(" is a driver for team "); finalString.append(f1Car.getTeam()); return finalString.toString(); } }
  3. Bangun proyek menggunakan perintah Maven berikut:

    mvn package

    Perintah ini menghasilkan file JAR dalam target/ direktori bernamalayer-java-function-1.0-SNAPSHOT.jar.

  4. Menyebarkan fungsi. Dalam AWS CLI perintah berikut, ganti --role parameter dengan peran eksekusi ARN Anda:

    aws lambda create-function --function-name java_function_with_layer \ --runtime java21 \ --architectures "arm64" \ --handler example.Handler::handleRequest \ --timeout 30 \ --role arn:aws:iam::123456789012:role/lambda-role \ --zip-file fileb://target/layer-java-function-1.0-SNAPSHOT.jar

Pada titik ini, Anda dapat secara opsional mencoba memanggil fungsi Anda sebelum melampirkan layer. Jika Anda mencoba ini, maka Anda harus mendapatkan ClassNotFoundException karena fungsi Anda tidak dapat mereferensikan requests paket. Untuk menjalankan fungsi Anda, gunakan AWS CLI perintah berikut:

aws lambda invoke --function-name java_function_with_layer \ --cli-binary-format raw-in-base64-out \ --payload '{ "driver": "Max Verstappen", "team": "Red Bull" }' response.json

Anda akan melihat output seperti ini:

{ "StatusCode": 200, "FunctionError": "Unhandled", "ExecutedVersion": "$LATEST" }

Untuk melihat kesalahan tertentu, buka response.json file output. Anda akan melihat ClassNotFoundException dengan pesan kesalahan berikut:

"errorMessage":"com.fasterxml.jackson.databind.ObjectMapper","errorType":"java.lang.ClassNotFoundException"

Selanjutnya, pasang layer ke fungsi Anda. Dalam AWS CLI perintah berikut, ganti --layers parameter dengan versi lapisan ARN yang Anda catat sebelumnya:

aws lambda update-function-configuration --function-name java_function_with_layer \ --cli-binary-format raw-in-base64-out \ --layers "arn:aws:lambda:us-east-1:123456789012:layer:java-jackson-layer:1"

Terakhir, coba panggil fungsi Anda menggunakan AWS CLI perintah berikut:

aws lambda invoke --function-name java_function_with_layer \ --cli-binary-format raw-in-base64-out \ --payload '{ "driver": "Max Verstappen", "team": "Red Bull" }' response.json

Anda akan melihat output seperti ini:

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

Ini menunjukkan bahwa fungsi tersebut dapat menggunakan ketergantungan Jackson untuk menjalankan fungsi dengan benar. Anda dapat memeriksa apakah response.json file output berisi String yang dikembalikan dengan benar:

"Max Verstappen is a driver for team Red Bull"

Sekarang Anda dapat menghapus sumber daya yang Anda buat untuk tutorial ini, kecuali Anda ingin mempertahankannya. Dengan menghapus AWS sumber daya yang tidak lagi Anda gunakan, Anda mencegah tagihan yang tidak perlu ke Anda Akun AWS.

Untuk menghapus layer Lambda
  1. Buka halaman Fungsi di konsol Lambda.

  2. Pilih layer yang Anda buat.

  3. Pilih Hapus, lalu pilih Hapus lagi.

Untuk menghapus fungsi Lambda
  1. Buka halaman Fungsi di konsol Lambda.

  2. Pilih fungsi yang Anda buat.

  3. Pilih Tindakan, Hapus.

  4. Ketik delete kolom input teks dan pilih Hapus.