Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
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 AWS CLI versi 2.
Alat dan pustaka
AWS menyediakan pustaka berikut untuk fungsi Java. Pustaka ini tersedia melalui repositori pusat Maven
-
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 SDK for Java
2.0 — SDK AWS resmi untuk bahasa pemrograman Java.
Tambahkan library ini ke definisi build Anda sebagai berikut:
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'
}
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 Lambda mengambil konten layer Anda, file layer.zip Anda harus memiliki dependensinya 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 file JAR dalam direktori target
.
catatan
Jika Anda bekerja dengan JAR multi-rilis (MRJAR)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)
-
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 arsip.zip atau JAR dari mesin lokal Anda (konsol)
-
Di halaman Fungsi
konsol Lambda, pilih fungsi yang ingin Anda unggah file.zip atau JAR. -
Pilih tab Kode.
-
Di panel Sumber kode, pilih Unggah dari.
-
Pilih file.zip atau .jar.
-
Untuk mengunggah file.zip atau JAR, lakukan hal berikut:
-
Pilih Unggah, lalu pilih file.zip atau JAR Anda di pemilih file.
-
Pilih Buka.
-
Pilih Simpan.
-
Untuk mengunggah arsip.zip atau JAR dari bucket Amazon S3 (konsol)
-
Di halaman Fungsi
konsol Lambda, pilih fungsi yang ingin Anda unggah file.zip atau JAR baru. -
Pilih tab Kode.
-
Di panel Sumber kode, pilih Unggah dari.
-
Pilih lokasi Amazon S3.
-
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=amzn-s3-demo-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 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 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
-
example-java
— Fungsi Java yang menunjukkan bagaimana Anda dapat menggunakan Lambda untuk memproses pesanan. Fungsi ini menggambarkan cara mendefinisikan dan deserialisasi objek peristiwa masukan kustom, menggunakan AWS SDK, dan logging keluaran. -
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. -
layer-java
— Fungsi Java yang menggambarkan cara menggunakan lapisan Lambda untuk mengemas dependensi yang terpisah dari kode fungsi inti Anda.