Deploy fungsi Java Lambda dengan arsip file .zip atau JAR - AWS Lambda

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

Deploy fungsi Java Lambda dengan arsip file .zip atau JAR

Kode AWS Lambda fungsi Anda terdiri dari skrip atau program yang dikompilasi dan dependensinya. Gunakan paket deployment untuk men-deploy fungsi kode Anda ke Lambda. Lambda mendukung dua tipe paket deployment: gambar kontainer dan arsip file .zip.

Halaman ini menjelaskan cara membuat paket deployment Anda sebagai file.zip atau file Jar, dan kemudian menggunakan paket deployment untuk menyebarkan kode fungsi Anda untuk AWS Lambda menggunakan (). AWS Command Line Interface AWS CLI

Prasyarat

AWS CLI Ini adalah alat sumber terbuka yang memungkinkan Anda berinteraksi dengan AWS layanan menggunakan perintah di shell baris perintah Anda. Untuk menyelesaikan langkah-langkah di bagian ini, Anda harus memiliki hal-hal berikut:

Alat dan pustaka

Lambda menyediakan pustaka berikut untuk fungsi Java:

Pustaka ini tersedia melalui repositori pusat Maven. Tambahkan mereka ke definisi pembuatan Anda sebagai berikut:

Gradle
dependencies { implementation 'com.amazonaws:aws-lambda-java-core:1.2.2' implementation 'com.amazonaws:aws-lambda-java-events:3.11.1' runtimeOnly 'com.amazonaws:aws-lambda-java-log4j2:1.5.1' }
Maven
<dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-core</artifactId> <version>1.2.2</version> </dependency> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-events</artifactId> <version>3.11.1</version> </dependency> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-log4j2</artifactId> <version>1.5.1</version> </dependency> </dependencies>

Untuk membuat paket deployment, kompilasikan kode fungsi dan dependensi Anda menjadi file .zip atau Java Archive (JAR). Untuk Gradle, gunakan tipe build Zip. Untuk Apache Maven, gunakan plugin Maven Shade. Untuk mengunggah paket penerapan Anda, gunakan konsol Lambda, API Lambda, atau (). AWS Serverless Application Model AWS SAM

catatan

Agar ukuran paket deployment Anda tetap kecil, kemas dependensi fungsi Anda dalam lapisan. Lapisan memungkinkan Anda mengelola dependensi secara mandiri, dapat digunakan oleh beberapa fungsi, dan dapat dibagikan ke akun lain. Untuk informasi selengkapnya, lihat Mengelola dependensi Lambda dengan lapisan.

Membangun paket deployment dengan Gradle

Untuk membuat paket penerapan dengan kode dan dependensi fungsi Anda di Gradle, gunakan tipe build. Zip Berikut adalah contoh dari contoh file build.gradle lengkap:

contoh build.gradle – Membangun tugas
task buildZip(type: Zip) { into('lib') { from(jar) from(configurations.runtimeClasspath) } }

Konfigurasi bangunan ini menghasilkan paket deployment di direktori build/distributions. Dalam into('lib') pernyataan itu, jar tugas merakit arsip jar yang berisi kelas utama Anda ke dalam folder bernamalib. Selain itu, configurations.runtimeClassPath tugas menyalin pustaka dependensi dari classpath build ke folder yang sama. lib

contoh build.gradle – Dependensi
dependencies { ... implementation 'com.amazonaws:aws-lambda-java-core:1.2.2' implementation 'com.amazonaws:aws-lambda-java-events:3.11.1' implementation 'org.apache.logging.log4j:log4j-api:2.17.1' implementation 'org.apache.logging.log4j:log4j-core:2.17.1' runtimeOnly 'org.apache.logging.log4j:log4j-slf4j18-impl:2.17.1' runtimeOnly 'com.amazonaws:aws-lambda-java-log4j2:1.5.1' ... }

Lambda memuat file JAR dalam urutan alfabet Unicode. Jika beberapa file JAR ada di direktori lib berisi kelas yang sama, yang pertama digunakan. Anda dapat menggunakan skrip shell berikut untuk mengidentifikasi kelas duplikat:

contoh test-zip.sh
mkdir -p expanded unzip path/to/my/function.zip -d expanded find ./expanded/lib -name '*.jar' | xargs -n1 zipinfo -1 | grep '.*.class' | sort | uniq -c | sort

Membuat layer Java untuk dependensi Anda

catatan

Menggunakan lapisan dengan fungsi dalam bahasa yang dikompilasi seperti Java mungkin tidak memberikan jumlah manfaat yang sama seperti dengan bahasa yang ditafsirkan seperti Python. Karena Java adalah bahasa yang dikompilasi, fungsi Anda masih harus memuat rakitan bersama secara manual ke dalam memori selama fase init, yang dapat meningkatkan waktu mulai dingin. Sebagai gantinya, kami sarankan untuk menyertakan kode bersama apa pun pada waktu kompilasi untuk memanfaatkan pengoptimalan kompiler bawaan apa pun.

Instruksi di bagian ini menunjukkan kepada Anda bagaimana memasukkan dependensi Anda dalam lapisan. Untuk petunjuk tentang cara menyertakan dependensi Anda dalam paket penerapan Anda, lihat atau. Membangun paket deployment dengan Gradle Membangun paket deployment dengan Maven

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 (CLASSPATH)

Misalnya, struktur file layer.zip Anda mungkin terlihat seperti berikut:

jackson.zip └ java/lib/jackson-core-2.2.3.jar

Selain itu, Lambda secara otomatis mendeteksi pustaka apa pun di /opt/lib direktori, dan binari apa pun di direktori. /opt/bin Untuk memastikan bahwa Lambda menemukan konten layer Anda dengan benar, Anda juga dapat membuat layer dengan struktur berikut:

custom-layer.zip └ lib | lib_1 | lib_2 └ bin | bin_1 | bin_2

Setelah Anda mengemas layer Anda, lihat Membuat dan menghapus layer di Lambda dan Menambahkan lapisan ke fungsi untuk menyelesaikan setup layer Anda.

Membangun paket deployment dengan Maven

Untuk membangun paket deployment dengan Maven, gunakan Plugin Maven Shade. Plugin membuat file JAR yang berisi kode fungsi terkompilasi dan semua dependensinya.

contoh pom.xml – Konfigurasi plugin
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.2</version> <configuration> <createDependencyReducedPom>false</createDependencyReducedPom> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> </execution> </executions> </plugin>

Untuk membuat paket deployment, gunakan perintah mvn package.

[INFO] Scanning for projects... [INFO] -----------------------< com.example:java-maven >----------------------- [INFO] Building java-maven-function 1.0-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- ... [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ java-maven --- [INFO] Building jar: target/java-maven-1.0-SNAPSHOT.jar [INFO] [INFO] --- maven-shade-plugin:3.2.2:shade (default) @ java-maven --- [INFO] Including com.amazonaws:aws-lambda-java-core:jar:1.2.2 in the shaded jar. [INFO] Including com.amazonaws:aws-lambda-java-events:jar:3.11.1 in the shaded jar. [INFO] Including joda-time:joda-time:jar:2.6 in the shaded jar. [INFO] Including com.google.code.gson:gson:jar:2.8.6 in the shaded jar. [INFO] Replacing original artifact with shaded artifact. [INFO] Replacing target/java-maven-1.0-SNAPSHOT.jar with target/java-maven-1.0-SNAPSHOT-shaded.jar [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 8.321 s [INFO] Finished at: 2020-03-03T09:07:19Z [INFO] ------------------------------------------------------------------------

Perintah ini menghasilkan file JAR dalam direktori target.

catatan

Jika Anda bekerja dengan JAR multi-rilis (MRJAR), Anda harus menyertakan MRJAR (yaitu JAR berbayang yang dihasilkan oleh plugin Maven Shade) di lib direktori dan zip sebelum mengunggah paket penerapan Anda ke Lambda. Jika tidak, Lambda mungkin tidak membongkar file JAR Anda dengan benar, menyebabkan MANIFEST.MF file Anda diabaikan.

Jika Anda menggunakan pustaka appender (aws-lambda-java-log4j2), Anda juga harus mengonfigurasi trafo untuk plugin Maven Shade. Pustaka trafo menggabungkan versi file cache yang muncul di pustaka appender dan Log4j.

contoh pom.xml – Konfigurasi plugin dengan appender Log4j 2
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.2</version> <configuration> <createDependencyReducedPom>false</createDependencyReducedPom> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="com.github.edwgiz.maven_shade_plugin.log4j2_cache_transformer.PluginsCacheFileTransformer"> </transformer> </transformers> </configuration> </execution> </executions> <dependencies> <dependency> <groupId>com.github.edwgiz</groupId> <artifactId>maven-shade-plugin.log4j2-cachefile-transformer</artifactId> <version>2.13.0</version> </dependency> </dependencies> </plugin>

Mengunggah paket penerapan dengan konsol Lambda

Untuk membuat fungsi baru, Anda harus terlebih dahulu membuat fungsi di konsol, lalu mengunggah file.zip atau JAR Anda. Untuk memperbarui fungsi yang ada, buka halaman untuk fungsi Anda, lalu ikuti prosedur yang sama untuk menambahkan file.zip atau JAR Anda yang diperbarui.

Jika file paket penyebaran Anda kurang dari 50MB, Anda dapat membuat atau memperbarui fungsi dengan mengunggah file langsung dari mesin lokal Anda. Untuk file.zip atau JAR yang lebih besar dari 50MB, Anda harus mengunggah paket Anda ke bucket Amazon S3 terlebih dahulu. Untuk petunjuk tentang cara mengunggah file ke bucket Amazon S3 menggunakan AWS Management Console, lihat Memulai Amazon S3. Untuk mengunggah file menggunakan AWS CLI, lihat Memindahkan objek di Panduan AWS CLI Pengguna.

catatan

Anda tidak dapat mengubah jenis paket penerapan (.zip atau image kontainer) untuk fungsi yang ada. Misalnya, Anda tidak dapat mengonversi fungsi gambar kontainer untuk menggunakan arsip file.zip. Anda harus membuat fungsi baru.

Untuk membuat fungsi baru (konsol)
  1. Buka halaman Functions dari konsol Lambda dan pilih Create Function.

  2. Pilih Tulis dari awal.

  3. Di bagian Informasi dasar, lakukan hal berikut:

    1. Untuk nama Fungsi, masukkan nama untuk fungsi Anda.

    2. Untuk Runtime, pilih runtime yang ingin Anda gunakan.

    3. (Opsional) Untuk Arsitektur, pilih arsitektur set instruksi untuk fungsi Anda. Arsitektur defaultnya adalah x86_64. Pastikan bahwa paket deployment .zip untuk fungsi Anda kompatibel dengan arsitektur set instruksi yang Anda pilih.

  4. (Opsional) Di bagian Izin, luaskan Ubah peran eksekusi default. Anda dapat membuat peran Eksekusi baru atau menggunakan yang sudah ada.

  5. Pilih Buat fungsi. Lambda menciptakan fungsi dasar 'Hello world' menggunakan runtime yang Anda pilih.

Untuk mengunggah arsip.zip atau JAR dari mesin lokal Anda (konsol)
  1. Di halaman Fungsi konsol Lambda, pilih fungsi yang ingin Anda unggah file.zip atau JAR.

  2. Pilih tab Kode.

  3. Di panel Sumber kode, pilih Unggah dari.

  4. Pilih file.zip atau .jar.

  5. Untuk mengunggah file.zip atau JAR, lakukan hal berikut:

    1. Pilih Unggah, lalu pilih file.zip atau JAR Anda di pemilih file.

    2. Pilih Buka.

    3. Pilih Simpan.

Untuk mengunggah arsip.zip atau JAR dari bucket Amazon S3 (konsol)
  1. Di halaman Fungsi konsol Lambda, pilih fungsi yang ingin Anda unggah file.zip atau JAR baru.

  2. Pilih tab Kode.

  3. Di panel Sumber kode, pilih Unggah dari.

  4. Pilih lokasi Amazon S3.

  5. Rekatkan URL tautan Amazon S3 dari file.zip Anda dan pilih Simpan.

Mengunggah paket penerapan dengan AWS CLI

Anda dapat menggunakan AWS CLIuntuk membuat fungsi baru atau memperbarui yang sudah ada menggunakan file.zip atau JAR. Gunakan create-function dan update-function-codeperintah untuk menyebarkan paket.zip atau JAR Anda. Jika file Anda lebih kecil dari 50MB, Anda dapat mengunggah paket dari lokasi file di mesin build lokal Anda. Untuk file yang lebih besar, Anda harus mengunggah paket.zip atau JAR dari bucket Amazon S3. Untuk petunjuk tentang cara mengunggah file ke bucket Amazon S3 menggunakan AWS CLI, lihat Memindahkan objek di AWS CLI Panduan Pengguna.

catatan

Jika Anda mengunggah file.zip atau JAR dari bucket Amazon S3 menggunakan AWS CLI bucket, bucket harus berada di lokasi Wilayah AWS yang sama dengan fungsi Anda.

Untuk membuat fungsi baru menggunakan file.zip atau JAR dengan AWS CLI, Anda harus menentukan yang berikut:

  • Nama fungsi Anda (--function-name)

  • Runtime () --runtime fungsi Anda

  • Nama Sumber Daya Amazon (ARN) dari peran eksekusi fungsi Anda () --role

  • Nama metode handler dalam kode fungsi Anda () --handler

Anda juga harus menentukan lokasi file.zip atau JAR Anda. Jika file.zip atau JAR Anda terletak di folder di mesin build lokal Anda, gunakan --zip-file opsi untuk menentukan jalur file, seperti yang ditunjukkan pada perintah contoh berikut.

aws lambda create-function --function-name myFunction \ --runtime java21 --handler example.handler \ --role arn:aws:iam::123456789012:role/service-role/my-lambda-role \ --zip-file fileb://myFunction.zip

Untuk menentukan lokasi file.zip di bucket Amazon S3, gunakan opsi seperti --code yang ditunjukkan pada perintah contoh berikut. Anda hanya perlu menggunakan S3ObjectVersion parameter untuk objek berversi.

aws lambda create-function --function-name myFunction \ --runtime java21 --handler example.handler \ --role arn:aws:iam::123456789012:role/service-role/my-lambda-role \ --code S3Bucket=DOC-EXAMPLE-BUCKET,S3Key=myFileName.zip,S3ObjectVersion=myObjectVersion

Untuk memperbarui fungsi yang ada menggunakan CLI, Anda menentukan nama fungsi Anda menggunakan parameter. --function-name Anda juga harus menentukan lokasi file.zip yang ingin Anda gunakan untuk memperbarui kode fungsi Anda. Jika file.zip Anda terletak di folder di mesin build lokal Anda, gunakan --zip-file opsi untuk menentukan jalur file, seperti yang ditunjukkan pada perintah contoh berikut.

aws lambda update-function-code --function-name myFunction \ --zip-file fileb://myFunction.zip

Untuk menentukan lokasi file.zip di bucket Amazon S3, gunakan opsi --s3-key dan seperti --s3-bucket yang ditunjukkan pada perintah contoh berikut. Anda hanya perlu menggunakan --s3-object-version parameter untuk objek berversi.

aws lambda update-function-code --function-name myFunction \ --s3-bucket DOC-EXAMPLE-BUCKET --s3-key myFileName.zip --s3-object-version myObject Version

Mengunggah paket penerapan dengan AWS SAM

Anda dapat menggunakan AWS SAM untuk mengotomatiskan penerapan kode fungsi, konfigurasi, dan dependensi Anda. AWS SAM adalah ekstensi yang menyediakan sintaks yang disederhanakan untuk mendefinisikan aplikasi tanpa server. AWS CloudFormation Templat contoh berikut mendefinisikan fungsi dengan paket deployment dalam direktori build/distributions yang digunakan Gradle:

contoh template.yml
AWSTemplateFormatVersion: '2010-09-09' Transform: 'AWS::Serverless-2016-10-31' Description: An AWS Lambda application that calls the Lambda API. Resources: function: Type: AWS::Serverless::Function Properties: CodeUri: build/distributions/java-basic.zip Handler: example.Handler Runtime: java21 Description: Java function MemorySize: 512 Timeout: 10 # Function's execution role Policies: - AWSLambdaBasicExecutionRole - AWSLambda_ReadOnlyAccess - AWSXrayWriteOnlyAccess - AWSLambdaVPCAccessExecutionRole Tracing: Active

Untuk membuat fungsi, gunakan perintah package dan deploy. Perintah ini adalah kustomisasi ke AWS CLI. Mereka membungkus perintah lain untuk mengunggah paket deployment ke Amazon S3, menulis ulang templat dengan objek URI, dan memperbarui kode fungsi.

Skrip contoh berikut menjalankan pembuatan Gradle dan mengunggah paket deployment yang dibuatnya. Ini menciptakan AWS CloudFormation tumpukan saat pertama kali Anda menjalankannya. Jika tumpukan sudah ada, skrip akan memperbaruinya.

contoh deploy.sh
#!/bin/bash set -eo pipefail aws cloudformation package --template-file template.yml --s3-bucket MY_BUCKET --output-template-file out.yml aws cloudformation deploy --template-file out.yml --stack-name java-basic --capabilities CAPABILITY_NAMED_IAM

Untuk contoh kerja lengkap, lihat aplikasi sampel berikut:

Sampel aplikasi Lambda di Java
  • java17-examples - Fungsi Java yang menunjukkan bagaimana menggunakan catatan Java untuk mewakili objek data peristiwa masukan.

  • java-basic - Kumpulan fungsi Java minimal dengan pengujian unit dan konfigurasi logging variabel.

  • java-events - Kumpulan fungsi Java yang berisi kode kerangka untuk cara menangani peristiwa dari berbagai layanan seperti Amazon API Gateway, Amazon SQS, dan Amazon Kinesis. Fungsi-fungsi ini menggunakan versi terbaru dari aws-lambda-java-eventsperpustakaan (3.0.0 dan yang lebih baru). Contoh-contoh ini tidak memerlukan AWS SDK sebagai dependensi.

  • s3-java – Fungsi Java yang memproses kejadian pemberitahuan dari Amazon S3 dan menggunakan Java Class Library (JCL) untuk membuat thumbnail dari file gambar yang diunggah.

  • Gunakan API Gateway untuk menjalankan fungsi Lambda — Fungsi Java yang memindai tabel Amazon DynamoDB yang berisi informasi karyawan. Kemudian menggunakan Amazon Simple Notification Service untuk mengirim pesan teks kepada karyawan yang merayakan ulang tahun kerja mereka. Contoh ini menggunakan API Gateway untuk menjalankan fungsi.