Deploy fungsi Java Lambda dengan gambar kontainer - 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 gambar kontainer

Ada tiga cara untuk membangun image container untuk fungsi Java Lambda:

Tip

Untuk mengurangi waktu yang dibutuhkan agar fungsi penampung Lambda menjadi aktif, lihat Menggunakan build multi-tahap dalam dokumentasi Docker. Untuk membuat gambar kontainer yang efisien, ikuti Praktik terbaik untuk menulis Dockerfiles.

Halaman ini menjelaskan cara membuat, menguji, dan menyebarkan gambar kontainer untuk Lambda.

AWS gambar dasar untuk Java

AWS menyediakan gambar dasar berikut untuk Java:

Tanda Waktu berjalan Sistem operasi Dockerfile penghentian

21

Jawa 21 Amazon Linux 2023 Dockerfile untuk Java 21 di GitHub

17

Jawa 17 Amazon Linux 2 Dockerfile untuk Java 17 di GitHub

11

Java 11 Amazon Linux 2 Dockerfile untuk Java 11 di GitHub

8.al2

Java 8 Amazon Linux 2 Dockerfile untuk Java 8 di GitHub

ECRRepositori Amazon: gallery.ecr.aws/lambda/java

Gambar dasar Java 21 dan yang lebih baru didasarkan pada gambar kontainer minimal Amazon Linux 2023. Gambar dasar sebelumnya menggunakan Amazon Linux 2. AL2023 memberikan beberapa keunggulan dibandingkan Amazon Linux 2, termasuk jejak penyebaran yang lebih kecil dan versi pustaka yang diperbarui seperti. glibc

AL2Gambar berbasis 023 menggunakan microdnf (symlinked asdnf) sebagai manajer paket, bukanyum, yang merupakan pengelola paket default di Amazon Linux 2. microdnfadalah implementasi mandiri dari. dnf Untuk daftar paket yang disertakan dalam gambar AL2 berbasis 023, lihat kolom Penampung Minimal di Membandingkan paket yang diinstal pada Gambar Kontainer Amazon Linux 2023. Untuk informasi selengkapnya tentang perbedaan antara AL2 023 dan Amazon Linux 2, lihat Memperkenalkan runtime Amazon Linux 2023 untuk AWS Lambda di Blog Komputasi AWS .

catatan

Untuk menjalankan gambar AL2 berbasis 023 secara lokal, termasuk with AWS Serverless Application Model (AWS SAM), Anda harus menggunakan Docker versi 20.10.10 atau yang lebih baru.

Menggunakan gambar AWS dasar untuk Java

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

Maven
  1. Jalankan perintah berikut untuk membuat proyek Maven menggunakan pola dasar untuk Lambda. Parameter-parameter berikut diperlukan:

    • Layanan — layanan AWS Klien untuk digunakan dalam fungsi Lambda. Untuk daftar sumber yang tersedia, lihat aws-sdk-java-v2/layanan di GitHub.

    • wilayah — Wilayah AWS Tempat Anda ingin membuat fungsi Lambda.

    • groupId— Namespace paket lengkap aplikasi Anda.

    • artifactId— Nama proyek Anda. Ini menjadi nama direktori untuk proyek Anda.

    Di Linux dan macOS, jalankan perintah ini:

    mvn -B archetype:generate \ -DarchetypeGroupId=software.amazon.awssdk \ -DarchetypeArtifactId=archetype-lambda -Dservice=s3 -Dregion=US_WEST_2 \ -DgroupId=com.example.myapp \ -DartifactId=myapp

    Di PowerShell, jalankan perintah ini:

    mvn -B archetype:generate ` "-DarchetypeGroupId=software.amazon.awssdk" ` "-DarchetypeArtifactId=archetype-lambda" "-Dservice=s3" "-Dregion=US_WEST_2" ` "-DgroupId=com.example.myapp" ` "-DartifactId=myapp"

    Pola dasar Maven untuk Lambda telah dikonfigurasi sebelumnya untuk dikompilasi dengan Java SE 8 dan menyertakan ketergantungan pada file. AWS SDK for JavaJika Anda membuat proyek Anda dengan pola dasar yang berbeda atau dengan menggunakan metode lain, Anda harus mengkonfigurasi compiler Java untuk Maven dan mendeklarasikan sebagai dependensi. SDK

  2. Buka myapp/src/main/java/com/example/myapp direktori, dan temukan App.java filenya. Ini adalah kode untuk fungsi Lambda. Anda dapat menggunakan kode sampel yang disediakan untuk pengujian, atau menggantinya dengan kode Anda sendiri.

  3. Arahkan kembali ke direktori root proyek, lalu buat Dockerfile baru dengan konfigurasi berikut:

    • Atur FROM properti ke URIgambar dasar.

    • Atur CMD argumen ke penangan fungsi Lambda.

    Perhatikan bahwa contoh Dockerfile tidak menyertakan instruksi. USER Saat Anda menyebarkan gambar kontainer ke Lambda, Lambda secara otomatis mendefinisikan pengguna Linux default dengan izin yang paling tidak memiliki hak istimewa. Ini berbeda dari perilaku Docker standar yang default ke root pengguna ketika tidak ada USER instruksi yang diberikan.

    contoh Dockerfile
    FROM public.ecr.aws/lambda/java:21 # Copy function code and runtime dependencies from Maven layout COPY target/classes ${LAMBDA_TASK_ROOT} COPY target/dependency/* ${LAMBDA_TASK_ROOT}/lib/ # Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile) CMD [ "com.example.myapp.App::handleRequest" ]
  4. Kompilasi proyek dan kumpulkan dependensi runtime.

    mvn compile dependency:copy-dependencies -DincludeScope=runtime
  5. Buat image Docker dengan perintah docker build. Contoh berikut menamai gambar docker-image dan memberinya test tag.

    docker build --platform linux/amd64 -t docker-image:test .
    catatan

    Perintah menentukan --platform linux/amd64 opsi untuk memastikan bahwa container Anda kompatibel dengan lingkungan eksekusi Lambda terlepas dari arsitektur mesin build Anda. Jika Anda berniat untuk membuat fungsi Lambda menggunakan arsitektur set ARM64 instruksi, pastikan untuk mengubah perintah untuk menggunakan --platform linux/arm64 opsi sebagai gantinya.

Gradle
  1. Buat direktori untuk proyek, dan kemudian beralih ke direktori itu.

    mkdir example cd example
  2. Jalankan perintah berikut agar Gradle membuat proyek aplikasi Java baru di direktori example di lingkungan Anda. Untuk Pilih skrip build DSL, pilih 2: Groovy.

    gradle init --type java-application
  3. Buka /example/app/src/main/java/example direktori, dan temukan App.java filenya. Ini adalah kode untuk fungsi Lambda. Anda dapat menggunakan kode contoh berikut untuk pengujian, atau menggantinya dengan kode Anda sendiri.

    contoh App.java
    package com.example; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; public class App implements RequestHandler<Object, String> { public String handleRequest(Object input, Context context) { return "Hello world!"; } }
  4. Buka file build.gradle. Jika Anda menggunakan kode fungsi sampel dari langkah sebelumnya, ganti isinya build.gradle dengan yang berikut ini. Jika Anda menggunakan kode fungsi Anda sendiri, ubah build.gradle file Anda sesuai kebutuhan.

    contoh build.gradle (Groovy) DSL
    plugins { id 'java' } group 'com.example' version '1.0-SNAPSHOT' sourceCompatibility = 1.8 repositories { mavenCentral() } dependencies { implementation 'com.amazonaws:aws-lambda-java-core:1.2.1' } jar { manifest { attributes 'Main-Class': 'com.example.App' } }
  5. gradle initPerintah dari langkah 2 juga menghasilkan kasus uji dummy di app/test direktori. Untuk keperluan tutorial ini, lewati tes yang sedang berjalan dengan menghapus /test direktori.

  6. Bangun proyek.

    gradle build
  7. Di direktori root proyek (/example), buat Dockerfile dengan konfigurasi berikut:

    • Atur FROM properti ke URIgambar dasar.

    • Gunakan COPY perintah untuk menyalin kode fungsi dan dependensi runtime ke{LAMBDA_TASK_ROOT}, variabel lingkungan yang ditentukan Lambda.

    • Atur CMD argumen ke penangan fungsi Lambda.

    Perhatikan bahwa contoh Dockerfile tidak menyertakan instruksi. USER Saat Anda menyebarkan gambar kontainer ke Lambda, Lambda secara otomatis mendefinisikan pengguna Linux default dengan izin yang paling tidak memiliki hak istimewa. Ini berbeda dari perilaku Docker standar yang default ke root pengguna ketika tidak ada USER instruksi yang diberikan.

    contoh Dockerfile
    FROM public.ecr.aws/lambda/java:21 # Copy function code and runtime dependencies from Gradle layout COPY app/build/classes/java/main ${LAMBDA_TASK_ROOT} # Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile) CMD [ "com.example.App::handleRequest" ]
  8. Buat image Docker dengan perintah docker build. Contoh berikut menamai gambar docker-image dan memberinya test tag.

    docker build --platform linux/amd64 -t docker-image:test .
    catatan

    Perintah menentukan --platform linux/amd64 opsi untuk memastikan bahwa container Anda kompatibel dengan lingkungan eksekusi Lambda terlepas dari arsitektur mesin build Anda. Jika Anda berniat untuk membuat fungsi Lambda menggunakan arsitektur set ARM64 instruksi, pastikan untuk mengubah perintah untuk menggunakan --platform linux/arm64 opsi sebagai gantinya.

  1. Mulai gambar Docker dengan perintah docker run. Dalam contoh ini, docker-image adalah nama gambar dan test tag.

    docker run --platform linux/amd64 -p 9000:8080 docker-image:test

    Perintah ini menjalankan gambar sebagai wadah dan membuat titik akhir lokal dilocalhost:9000/2015-03-31/functions/function/invocations.

    catatan

    Jika Anda membuat image Docker untuk arsitektur set ARM64 instruksi, pastikan untuk menggunakan --platform linux/arm64 opsi alih-alih. --platform linux/amd64

  2. Dari jendela terminal baru, posting acara ke titik akhir lokal.

    Linux/macOS

    Di Linux dan macOS, jalankan perintah berikut: curl

    curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'

    Perintah ini memanggil fungsi dengan peristiwa kosong dan mengembalikan respons. Jika Anda menggunakan kode fungsi Anda sendiri daripada kode fungsi sampel, Anda mungkin ingin memanggil fungsi dengan JSON payload. Contoh:

    curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"payload":"hello world!"}'
    PowerShell

    Dalam PowerShell, jalankan Invoke-WebRequest perintah berikut:

    Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{}' -ContentType "application/json"

    Perintah ini memanggil fungsi dengan peristiwa kosong dan mengembalikan respons. Jika Anda menggunakan kode fungsi Anda sendiri daripada kode fungsi sampel, Anda mungkin ingin memanggil fungsi dengan JSON payload. Contoh:

    Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{"payload":"hello world!"}' -ContentType "application/json"
  3. Dapatkan ID kontainer.

    docker ps
  4. Gunakan perintah docker kill untuk menghentikan wadah. Dalam perintah ini, ganti 3766c4ab331c dengan ID kontainer dari langkah sebelumnya.

    docker kill 3766c4ab331c
Untuk mengunggah gambar ke Amazon ECR dan membuat fungsi Lambda
  1. Jalankan get-login-passwordperintah untuk mengautentikasi Docker CLI ke registri Amazon ECR Anda.

    • Tetapkan --region nilai ke Wilayah AWS tempat Anda ingin membuat ECR repositori Amazon.

    • Ganti 111122223333 dengan Akun AWS ID Anda.

    aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 111122223333.dkr.ecr.us-east-1.amazonaws.com
  2. Buat repositori di Amazon ECR menggunakan perintah create-repository.

    aws ecr create-repository --repository-name hello-world --region us-east-1 --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE
    catatan

    ECRRepositori Amazon harus sama Wilayah AWS dengan fungsi Lambda.

    Jika berhasil, Anda melihat respons seperti ini:

    { "repository": { "repositoryArn": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world", "registryId": "111122223333", "repositoryName": "hello-world", "repositoryUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world", "createdAt": "2023-03-09T10:39:01+00:00", "imageTagMutability": "MUTABLE", "imageScanningConfiguration": { "scanOnPush": true }, "encryptionConfiguration": { "encryptionType": "AES256" } } }
  3. Salin repositoryUri dari output pada langkah sebelumnya.

  4. Jalankan perintah tag docker untuk menandai gambar lokal Anda ke ECR repositori Amazon Anda sebagai versi terbaru. Dalam perintah ini:

    • docker-image:testadalah nama dan tag gambar Docker Anda. Ini adalah nama gambar dan tag yang Anda tentukan dalam docker build perintah.

    • Ganti <ECRrepositoryUri> dengan repositoryUri yang Anda salin. Pastikan untuk menyertakan :latest di akhirURI.

    docker tag docker-image:test <ECRrepositoryUri>:latest

    Contoh:

    docker tag docker-image:test 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
  5. Jalankan perintah docker push untuk menyebarkan gambar lokal Anda ke repositori Amazon. ECR Pastikan untuk menyertakan :latest di akhir repositoriURI.

    docker push 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
  6. Buat peran eksekusi untuk fungsi tersebut, jika Anda belum memilikinya. Anda memerlukan Amazon Resource Name (ARN) peran di langkah berikutnya.

  7. Buat fungsi Lambda. UntukImageUri, tentukan repositori URI dari sebelumnya. Pastikan untuk menyertakan :latest di akhirURI.

    aws lambda create-function \ --function-name hello-world \ --package-type Image \ --code ImageUri=111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \ --role arn:aws:iam::111122223333:role/lambda-ex
    catatan

    Anda dapat membuat fungsi menggunakan gambar di AWS akun yang berbeda, selama gambar berada di Wilayah yang sama dengan fungsi Lambda. Untuk informasi selengkapnya, lihat Izin ECR lintas akun Amazon.

  8. Memanggil fungsi.

    aws lambda invoke --function-name hello-world response.json

    Anda akan melihat tanggapan seperti ini:

    { "ExecutedVersion": "$LATEST", "StatusCode": 200 }
  9. Untuk melihat output fungsi, periksa response.json file.

Untuk memperbarui kode fungsi, Anda harus membangun gambar lagi, mengunggah gambar baru ke ECR repositori Amazon, dan kemudian menggunakan update-function-codeperintah untuk menyebarkan gambar ke fungsi Lambda.

Lambda menyelesaikan tag gambar ke intisari gambar tertentu. Ini berarti bahwa jika Anda mengarahkan tag gambar yang digunakan untuk menyebarkan fungsi ke gambar baru di AmazonECR, Lambda tidak secara otomatis memperbarui fungsi untuk menggunakan gambar baru.

Untuk menyebarkan gambar baru ke fungsi Lambda yang sama, Anda harus menggunakan update-function-codeperintah, meskipun tag gambar di ECR Amazon tetap sama. Dalam contoh berikut, --publish opsi membuat versi baru dari fungsi menggunakan gambar kontainer yang diperbarui.

aws lambda update-function-code \ --function-name hello-world \ --image-uri 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \ --publish

Menggunakan gambar dasar alternatif dengan klien antarmuka runtime

Jika Anda menggunakan gambar dasar khusus OS atau gambar dasar alternatif, Anda harus menyertakan klien antarmuka runtime dalam gambar Anda. Klien antarmuka runtime memperluasMenggunakan runtime Lambda untuk runtime khusus API, yang mengelola interaksi antara Lambda dan kode fungsi Anda.

Instal klien antarmuka runtime untuk Java di Dockerfile Anda, atau sebagai ketergantungan dalam proyek Anda. Misalnya, untuk menginstal klien antarmuka runtime menggunakan manajer paket Maven, tambahkan yang berikut ini ke file Anda: pom.xml

<dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-runtime-interface-client</artifactId> <version>2.3.2</version> </dependency>

Untuk detail paket, lihat AWS Lambda Java Runtime Interface Client di Maven Central Repository. Anda juga dapat meninjau kode sumber klien antarmuka runtime di repositori AWS Lambda Java Support Libraries GitHub .

Contoh berikut menunjukkan cara membangun image container untuk Java menggunakan image Amazon Corretto. Amazon Corretto adalah distribusi tanpa biaya, multiplatform, siap produksi dari Open Java Development Kit (Open). JDK Proyek Maven menyertakan klien antarmuka runtime sebagai dependensi.

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

  1. Buat proyek Maven. Parameter-parameter berikut diperlukan:

    • groupId— Namespace paket lengkap aplikasi Anda.

    • artifactId— Nama proyek Anda. Ini menjadi nama direktori untuk proyek Anda.

    Linux/macOS
    mvn -B archetype:generate \ -DarchetypeArtifactId=maven-archetype-quickstart \ -DgroupId=example \ -DartifactId=myapp \ -DinteractiveMode=false
    PowerShell
    mvn -B archetype:generate ` -DarchetypeArtifactId=maven-archetype-quickstart ` -DgroupId=example ` -DartifactId=myapp ` -DinteractiveMode=false
  2. Buka direktori proyek.

    cd myapp
  3. Buka pom.xml file dan ganti isinya dengan yang berikut ini. File ini menyertakan aws-lambda-java-runtime-interface-client sebagai dependensi. Atau, Anda dapat menginstal klien antarmuka runtime di Dockerfile. Namun, pendekatan paling sederhana adalah memasukkan perpustakaan sebagai ketergantungan.

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>example</groupId> <artifactId>hello-lambda</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>hello-lambda</name> <url>http://maven.apache.org</url> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-runtime-interface-client</artifactId> <version>2.3.2</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>3.1.2</version> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
  4. Buka myapp/src/main/java/com/example/myapp direktori, dan temukan App.java filenya. Ini adalah kode untuk fungsi Lambda. Ganti kode dengan yang berikut ini.

    contoh fungsi handler
    package example; public class App { public static String sayHello() { return "Hello world!"; } }
  5. mvn -B archetype:generatePerintah dari langkah 1 juga menghasilkan kasus uji dummy di src/test direktori. Untuk keperluan tutorial ini, lewati tes yang sedang berjalan dengan menghapus seluruh /test direktori yang dihasilkan ini.

  6. Arahkan kembali ke direktori root proyek, lalu buat Dockerfile baru. Contoh berikut Dockerfile menggunakan gambar Amazon Corretto. Amazon Corretto adalah distribusi Open tanpa biaya, multiplatform, dan siap produksi. JDK

    • Atur FROM properti ke URI gambar dasar.

    • Atur ENTRYPOINT ke modul yang Anda inginkan untuk menjalankan wadah Docker saat dimulai. Dalam hal ini, modul adalah klien antarmuka runtime.

    • Atur CMD argumen ke penangan fungsi Lambda.

    Perhatikan bahwa contoh Dockerfile tidak menyertakan instruksi. USER Saat Anda menyebarkan gambar kontainer ke Lambda, Lambda secara otomatis mendefinisikan pengguna Linux default dengan izin yang paling tidak memiliki hak istimewa. Ini berbeda dari perilaku Docker standar yang default ke root pengguna ketika tidak ada USER instruksi yang diberikan.

    contoh Dockerfile
    FROM public.ecr.aws/amazoncorretto/amazoncorretto:21 as base # Configure the build environment FROM base as build RUN yum install -y maven WORKDIR /src # Cache and copy dependencies ADD pom.xml . RUN mvn dependency:go-offline dependency:copy-dependencies # Compile the function ADD . . RUN mvn package # Copy the function artifact and dependencies onto a clean base FROM base WORKDIR /function COPY --from=build /src/target/dependency/*.jar ./ COPY --from=build /src/target/*.jar ./ # Set runtime interface client as default command for the container runtime ENTRYPOINT [ "/usr/bin/java", "-cp", "./*", "com.amazonaws.services.lambda.runtime.api.client.AWSLambda" ] # Pass the name of the function handler as an argument to the runtime CMD [ "example.App::sayHello" ]
  7. Buat image Docker dengan perintah docker build. Contoh berikut menamai gambar docker-image dan memberinya test tag.

    docker build --platform linux/amd64 -t docker-image:test .
    catatan

    Perintah menentukan --platform linux/amd64 opsi untuk memastikan bahwa container Anda kompatibel dengan lingkungan eksekusi Lambda terlepas dari arsitektur mesin build Anda. Jika Anda berniat untuk membuat fungsi Lambda menggunakan arsitektur set ARM64 instruksi, pastikan untuk mengubah perintah untuk menggunakan --platform linux/arm64 opsi sebagai gantinya.

Gunakan emulator antarmuka runtime untuk menguji gambar secara lokal. Anda dapat membangun emulator ke dalam gambar Anda atau menggunakan prosedur berikut untuk menginstalnya di mesin lokal Anda.

Untuk menginstal dan menjalankan emulator antarmuka runtime di mesin lokal Anda
  1. Dari direktori proyek Anda, jalankan perintah berikut untuk mengunduh emulator antarmuka runtime (arsitektur x86-64) dari GitHub dan menginstalnya di mesin lokal Anda.

    Linux/macOS
    mkdir -p ~/.aws-lambda-rie && \ curl -Lo ~/.aws-lambda-rie/aws-lambda-rie https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie && \ chmod +x ~/.aws-lambda-rie/aws-lambda-rie

    Untuk menginstal emulator arm64, ganti GitHub repositori URL di perintah sebelumnya dengan yang berikut:

    https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie-arm64
    PowerShell
    $dirPath = "$HOME\.aws-lambda-rie" if (-not (Test-Path $dirPath)) { New-Item -Path $dirPath -ItemType Directory } $downloadLink = "https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie" $destinationPath = "$HOME\.aws-lambda-rie\aws-lambda-rie" Invoke-WebRequest -Uri $downloadLink -OutFile $destinationPath

    Untuk menginstal emulator arm64, ganti $downloadLink dengan yang berikut ini:

    https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie-arm64
  2. Mulai gambar Docker dengan perintah docker run. Perhatikan hal berikut:

    • docker-imageadalah nama gambar dan test tag.

    • /usr/bin/java -cp './*' com.amazonaws.services.lambda.runtime.api.client.AWSLambda example.App::sayHelloadalah ENTRYPOINT diikuti oleh CMD dari Dockerfile Anda.

    Linux/macOS
    docker run --platform linux/amd64 -d -v ~/.aws-lambda-rie:/aws-lambda -p 9000:8080 \ --entrypoint /aws-lambda/aws-lambda-rie \ docker-image:test \ /usr/bin/java -cp './*' com.amazonaws.services.lambda.runtime.api.client.AWSLambda example.App::sayHello
    PowerShell
    docker run --platform linux/amd64 -d -v "$HOME\.aws-lambda-rie:/aws-lambda" -p 9000:8080 ` --entrypoint /aws-lambda/aws-lambda-rie ` docker-image:test ` /usr/bin/java -cp './*' com.amazonaws.services.lambda.runtime.api.client.AWSLambda example.App::sayHello

    Perintah ini menjalankan gambar sebagai wadah dan membuat titik akhir lokal dilocalhost:9000/2015-03-31/functions/function/invocations.

    catatan

    Jika Anda membuat image Docker untuk arsitektur set ARM64 instruksi, pastikan untuk menggunakan --platform linux/arm64 opsi alih-alih. --platform linux/amd64

  3. Posting acara ke titik akhir lokal.

    Linux/macOS

    Di Linux dan macOS, jalankan perintah berikut: curl

    curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'

    Perintah ini memanggil fungsi dengan peristiwa kosong dan mengembalikan respons. Jika Anda menggunakan kode fungsi Anda sendiri daripada kode fungsi sampel, Anda mungkin ingin memanggil fungsi dengan JSON payload. Contoh:

    curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"payload":"hello world!"}'
    PowerShell

    Dalam PowerShell, jalankan Invoke-WebRequest perintah berikut:

    Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{}' -ContentType "application/json"

    Perintah ini memanggil fungsi dengan peristiwa kosong dan mengembalikan respons. Jika Anda menggunakan kode fungsi Anda sendiri daripada kode fungsi sampel, Anda mungkin ingin memanggil fungsi dengan JSON payload. Contoh:

    Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{"payload":"hello world!"}' -ContentType "application/json"
  4. Dapatkan ID kontainer.

    docker ps
  5. Gunakan perintah docker kill untuk menghentikan wadah. Dalam perintah ini, ganti 3766c4ab331c dengan ID kontainer dari langkah sebelumnya.

    docker kill 3766c4ab331c
Untuk mengunggah gambar ke Amazon ECR dan membuat fungsi Lambda
  1. Jalankan get-login-passwordperintah untuk mengautentikasi Docker CLI ke registri Amazon ECR Anda.

    • Tetapkan --region nilai ke Wilayah AWS tempat Anda ingin membuat ECR repositori Amazon.

    • Ganti 111122223333 dengan Akun AWS ID Anda.

    aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 111122223333.dkr.ecr.us-east-1.amazonaws.com
  2. Buat repositori di Amazon ECR menggunakan perintah create-repository.

    aws ecr create-repository --repository-name hello-world --region us-east-1 --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE
    catatan

    ECRRepositori Amazon harus sama Wilayah AWS dengan fungsi Lambda.

    Jika berhasil, Anda melihat respons seperti ini:

    { "repository": { "repositoryArn": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world", "registryId": "111122223333", "repositoryName": "hello-world", "repositoryUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world", "createdAt": "2023-03-09T10:39:01+00:00", "imageTagMutability": "MUTABLE", "imageScanningConfiguration": { "scanOnPush": true }, "encryptionConfiguration": { "encryptionType": "AES256" } } }
  3. Salin repositoryUri dari output pada langkah sebelumnya.

  4. Jalankan perintah tag docker untuk menandai gambar lokal Anda ke ECR repositori Amazon Anda sebagai versi terbaru. Dalam perintah ini:

    • docker-image:testadalah nama dan tag gambar Docker Anda. Ini adalah nama gambar dan tag yang Anda tentukan dalam docker build perintah.

    • Ganti <ECRrepositoryUri> dengan repositoryUri yang Anda salin. Pastikan untuk menyertakan :latest di akhirURI.

    docker tag docker-image:test <ECRrepositoryUri>:latest

    Contoh:

    docker tag docker-image:test 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
  5. Jalankan perintah docker push untuk menyebarkan gambar lokal Anda ke repositori Amazon. ECR Pastikan untuk menyertakan :latest di akhir repositoriURI.

    docker push 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
  6. Buat peran eksekusi untuk fungsi tersebut, jika Anda belum memilikinya. Anda memerlukan Amazon Resource Name (ARN) peran di langkah berikutnya.

  7. Buat fungsi Lambda. UntukImageUri, tentukan repositori URI dari sebelumnya. Pastikan untuk menyertakan :latest di akhirURI.

    aws lambda create-function \ --function-name hello-world \ --package-type Image \ --code ImageUri=111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \ --role arn:aws:iam::111122223333:role/lambda-ex
    catatan

    Anda dapat membuat fungsi menggunakan gambar di AWS akun yang berbeda, selama gambar berada di Wilayah yang sama dengan fungsi Lambda. Untuk informasi selengkapnya, lihat Izin ECR lintas akun Amazon.

  8. Memanggil fungsi.

    aws lambda invoke --function-name hello-world response.json

    Anda akan melihat tanggapan seperti ini:

    { "ExecutedVersion": "$LATEST", "StatusCode": 200 }
  9. Untuk melihat output fungsi, periksa response.json file.

Untuk memperbarui kode fungsi, Anda harus membangun gambar lagi, mengunggah gambar baru ke ECR repositori Amazon, dan kemudian menggunakan update-function-codeperintah untuk menyebarkan gambar ke fungsi Lambda.

Lambda menyelesaikan tag gambar ke intisari gambar tertentu. Ini berarti bahwa jika Anda mengarahkan tag gambar yang digunakan untuk menyebarkan fungsi ke gambar baru di AmazonECR, Lambda tidak secara otomatis memperbarui fungsi untuk menggunakan gambar baru.

Untuk menyebarkan gambar baru ke fungsi Lambda yang sama, Anda harus menggunakan update-function-codeperintah, meskipun tag gambar di ECR Amazon tetap sama. Dalam contoh berikut, --publish opsi membuat versi baru dari fungsi menggunakan gambar kontainer yang diperbarui.

aws lambda update-function-code \ --function-name hello-world \ --image-uri 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \ --publish