Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Menyebarkan fungsi Java Lambda JAR dengan.zip atau arsip file
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
Bagian-bagian
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:
-
com.amazonaws: aws-lambda-java-core
(required) — Mendefinisikan antarmuka metode handler dan objek konteks yang diteruskan runtime ke handler. Jika Anda menentukan jenis input Anda sendiri, ini adalah satu-satunya pustaka yang Anda butuhkan. -
com.amazonaws: aws-lambda-java-events
— Jenis masukan untuk acara dari layanan yang memanggil fungsi Lambda. -
com.amazonaws: aws-lambda-java-log 4j2
- Pustaka appender untuk Apache Log4j 2 yang dapat Anda gunakan untuk menambahkan ID permintaan untuk pemanggilan saat ini ke log fungsi Anda. -
AWS SDKuntuk Java 2.0
— Resmi AWS SDK untuk bahasa pemrograman Java.
Pustaka ini tersedia melalui repositori pusat Maven
Untuk membuat paket deployment, kompilasi kode fungsi dan dependensi Anda ke dalam satu file.zip atau file Java Archive (). JAR Untuk Gradle, gunakan tipe build Zip. Untuk Apache Maven, gunakan plugin Maven Shade. Untuk mengunggah paket penerapan Anda, gunakan konsol Lambda, LambdaAPI, 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 JAR file dalam urutan abjad Unicode. Jika beberapa JAR file dalam lib
direktori 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
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 JAR file di target
direktori.
catatan
Jika Anda bekerja dengan multi-release JAR (MRJAR)lib
direktori dan zip sebelum mengunggah paket penerapan Anda ke Lambda. Jika tidak, Lambda mungkin tidak membongkar JAR file 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.zip atau JAR file Anda. Untuk memperbarui fungsi yang ada, buka halaman untuk fungsi Anda, lalu ikuti prosedur yang sama untuk menambahkan .zip atau JAR file 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.zip atau JAR file 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)
-
Buka halaman Fungsi
konsol Lambda dan pilih Buat Fungsi. -
Pilih Tulis dari awal.
-
Di bagian Informasi dasar, lakukan hal berikut:
-
Untuk nama Fungsi, masukkan nama untuk fungsi Anda.
-
Untuk Runtime, pilih runtime yang ingin Anda gunakan.
-
(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.
-
-
(Opsional) Di bagian Izin, luaskan Ubah peran eksekusi default. Anda dapat membuat peran Eksekusi baru atau menggunakan yang sudah ada.
-
Pilih Buat fungsi. Lambda menciptakan fungsi dasar 'Hello world' menggunakan runtime yang Anda pilih.
Untuk mengunggah .zip atau JAR arsip dari mesin lokal Anda (konsol)
-
Di halaman Fungsi
konsol Lambda, pilih fungsi yang ingin Anda unggah. Zip atau JAR file. -
Pilih tab Kode.
-
Di panel Sumber kode, pilih Unggah dari.
-
Pilih file.zip atau .jar.
-
Untuk mengunggah .zip atau JAR file, lakukan hal berikut:
-
Pilih Unggah, lalu pilih .zip atau JAR file Anda di pemilih file.
-
Pilih Buka.
-
Pilih Simpan.
-
Untuk mengunggah .zip atau JAR arsip dari bucket Amazon S3 (konsol)
-
Di halaman Fungsi
konsol Lambda, pilih fungsi yang ingin Anda unggah .zip atau JAR file baru. -
Pilih tab Kode.
-
Di panel Sumber kode, pilih Unggah dari.
-
Pilih lokasi Amazon S3.
-
Rekatkan tautan Amazon S3 URL 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 .zip atau JAR file. Gunakan create-function dan update-function-codeperintah untuk menyebarkan .zip atau paket Anda. JAR 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.zip atau JAR paket 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 .zip atau JAR file 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 .zip atau JAR file dengan AWS CLI, Anda harus menentukan yang berikut:
-
Nama fungsi Anda (
--function-name
) -
Runtime ()
--runtime
fungsi Anda -
Amazon Resource Name (ARN) dari peran eksekusi fungsi Anda (
--role
) -
Nama metode handler dalam kode fungsi Anda ()
--handler
Anda juga harus menentukan lokasi .zip atau JAR file Anda. Jika .zip atau JAR file 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=amzn-s3-demo-bucket,S3Key=myFileName.zip,S3ObjectVersion=myObjectVersion
Untuk memperbarui fungsi yang ada menggunakanCLI, Anda menentukan nama fungsi Anda menggunakan --function-name
parameter. 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 amzn-s3-demo-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 penerapan ke Amazon S3, menulis ulang template dengan URI objek, 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 GatewayAPI, Amazon, dan Amazon SQS Kinesis. Fungsi-fungsi ini menggunakan versi terbaru dari aws-lambda-java-eventsperpustakaan (3.0.0 dan yang lebih baru). Contoh-contoh ini tidak memerlukan ketergantungan AWS SDK sebagai. -
s3-java
— Fungsi Java yang memproses peristiwa notifikasi 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 memanggil fungsi.