Tutorial: Membangun runtime khusus - AWS Lambda

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

Tutorial: Membangun runtime khusus

Dalam tutorial ini, Anda membuat fungsi Lambda dengan waktu pengoperasian kustom. Anda memulai dengan memasukkan waktu pengoperasian dalam paket deployment fungsi. Kemudian Anda memigrasikannya ke lapisan yang Anda kelola secara terpisah dari fungsi. Terakhir, Anda membagikan lapisan waktu pengoperasian kepada dunia dengan memperbarui kebijakan izin berbasis sumber daya.

Prasyarat

Tutorial ini mengasumsikan bahwa Anda memiliki pengetahuan tentang operasi Lambda dan konsol Lambda dasar. Jika belum, ikuti petunjuk di Membuat fungsi Lambda dengan konsol untuk membuat fungsi Lambda pertama Anda.

Untuk menyelesaikan langkah-langkah berikut, Anda memerlukan AWS Command Line Interface (AWS CLI) versi 2. Perintah dan output yang diharapkan dicantumkan dalam blok terpisah:

aws --version

Anda akan melihat output berikut:

aws-cli/2.13.27 Python/3.11.6 Linux/4.14.328-248.540.amzn2.x86_64 exe/x86_64.amzn.2

Untuk perintah panjang, karakter escape (\) digunakan untuk memisahkan perintah menjadi beberapa baris.

Di Linux dan macOS, gunakan shell dan manajer paket pilihan Anda.

catatan

Di Windows, beberapa CLI perintah Bash yang biasa Anda gunakan dengan Lambda (zipseperti) tidak didukung oleh terminal bawaan sistem operasi. Untuk mendapatkan versi terintegrasi Windows dari Ubuntu dan Bash, instal Windows Subsystem untuk Linux. Contoh CLI perintah dalam panduan ini menggunakan pemformatan Linux. Perintah yang menyertakan JSON dokumen inline harus diformat ulang jika Anda menggunakan Windows. CLI

Anda memerlukan IAM peran untuk membuat fungsi Lambda. Peran memerlukan izin untuk mengirim CloudWatch log ke Log dan mengakses AWS layanan yang digunakan fungsi Anda. Jika Anda tidak memiliki peran untuk pengembangan fungsi, buatlah sekarang juga.

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

  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.

Buat fungsi

Buat fungsi Lambda dengan waktu pengoperasian kustom. Contoh ini mencakup dua file: file runtime bootstrap dan function handler. Keduanya diterapkan di Bash.

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

    mkdir runtime-tutorial cd runtime-tutorial
  2. Buat file baru bernamabootstrap. Ini adalah runtime khusus.

    contoh bootstrap
    #!/bin/sh set -euo pipefail # Initialization - load function handler source $LAMBDA_TASK_ROOT/"$(echo $_HANDLER | cut -d. -f1).sh" # Processing while true do HEADERS="$(mktemp)" # Get an event. The HTTP request will block until one is received EVENT_DATA=$(curl -sS -LD "$HEADERS" "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/next") # Extract request ID by scraping response headers received above REQUEST_ID=$(grep -Fi Lambda-Runtime-Aws-Request-Id "$HEADERS" | tr -d '[:space:]' | cut -d: -f2) # Run the handler function from the script RESPONSE=$($(echo "$_HANDLER" | cut -d. -f2) "$EVENT_DATA") # Send the response curl "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$REQUEST_ID/response" -d "$RESPONSE" done

    Waktu pengoperasian memuat skrip fungsi dari paket deployment. Runtime menggunakan dua variabel untuk menemukan skrip.LAMBDA_TASK_ROOT memberi tahu tempat paket diekstrak, dan _HANDLER mencakup nama skrip.

    Setelah runtime memuat skrip fungsi, ia menggunakan runtime API untuk mengambil acara pemanggilan dari Lambda, meneruskan acara ke handler, dan memposting respons kembali ke Lambda. Untuk mendapatkan ID permintaan, runtime menyimpan header dari API respons ke file sementara, dan membaca Lambda-Runtime-Aws-Request-Id header dari file.

    catatan

    Waktu pengoperasian memiliki tanggung jawab tambahan, termasuk penanganan kesalahan, dan memberikan informasi konteks kepada penangan. Untuk detailnya, lihat Persyaratan.

  3. Buat skrip untuk fungsi tersebut. Contoh skrip berikut mendefinisikan fungsi handler yang mengambil data peristiwa, log kestderr, dan mengembalikannya.

    contoh function.sh
    function handler () { EVENT_DATA=$1 echo "$EVENT_DATA" 1>&2; RESPONSE="Echoing request: '$EVENT_DATA'" echo $RESPONSE }

    runtime-tutorialDirektori sekarang akan terlihat seperti ini:

    runtime-tutorial ├ bootstrap └ function.sh
  4. Buat file dapat dijalankan dan tambahkan ke arsip file .zip. Ini adalah paket penyebaran.

    chmod 755 function.sh bootstrap zip function.zip function.sh bootstrap
  5. Buat fungsi bernama bash-runtime. Untuk--role, masukkan peran ARN eksekusi Lambda Anda.

    aws lambda create-function --function-name bash-runtime \ --zip-file fileb://function.zip --handler function.handler --runtime provided.al2023 \ --role arn:aws:iam::123456789012:role/lambda-role
  6. Memanggil fungsi.

    aws lambda invoke --function-name bash-runtime --payload '{"text":"Hello"}' response.txt --cli-binary-format raw-in-base64-out

    cli-binary-formatOpsi ini diperlukan jika Anda menggunakan AWS CLI versi 2. Untuk menjadikan ini pengaturan default, jalankanaws configure set cli-binary-format raw-in-base64-out. Untuk informasi selengkapnya, lihat opsi baris perintah global yang AWS CLI didukung di Panduan AWS Command Line Interface Pengguna untuk Versi 2.

    Anda akan melihat tanggapan seperti ini:

    { "StatusCode": 200, "ExecutedVersion": "$LATEST" }
  7. Verifikasi responsnya.

    cat response.txt

    Anda akan melihat tanggapan seperti ini:

    Echoing request: '{"text":"Hello"}'

Buat lapisan

Untuk memisahkan kode waktu pengoperasian dari kode fungsi, buat lapisan yang hanya berisi waktu pengoperasian. Lapisan memungkinkan Anda mengembangkan dependensi fungsi secara independen, dan dapat mengurangi penggunaan penyimpanan ketika Anda menggunakan lapisan yang sama dengan beberapa fungsi. Untuk informasi selengkapnya, lihat Mengelola dependensi Lambda dengan lapisan.

  1. Buat file.zip yang berisi bootstrap file.

    zip runtime.zip bootstrap
  2. Buat layer dengan publish-layer-versionperintah.

    aws lambda publish-layer-version --layer-name bash-runtime --zip-file fileb://runtime.zip

    Ini menciptakan versi pertama lapisan.

Perbarui fungsi

Untuk menggunakan layer runtime dalam fungsi, konfigurasikan fungsi untuk menggunakan layer, dan hapus kode runtime dari fungsi.

  1. Perbarui konfigurasi fungsi untuk menarik lapisan.

    aws lambda update-function-configuration --function-name bash-runtime \ --layers arn:aws:lambda:us-east-1:123456789012:layer:bash-runtime:1

    Ini menambahkan waktu pengoperasian ke fungsi di direktori /opt. Untuk memastikan bahwa Lambda menggunakan runtime di layer, Anda harus menghapus boostrap dari paket penerapan fungsi, seperti yang ditunjukkan dalam dua langkah berikutnya.

  2. Buat file.zip yang berisi kode fungsi.

    zip function-only.zip function.sh
  3. Perbarui kode fungsi untuk hanya memasukkan skrip penangan.

    aws lambda update-function-code --function-name bash-runtime --zip-file fileb://function-only.zip
  4. Panggil fungsi untuk mengonfirmasi bahwa ia berfungsi dengan layer runtime.

    aws lambda invoke --function-name bash-runtime --payload '{"text":"Hello"}' response.txt --cli-binary-format raw-in-base64-out

    cli-binary-formatOpsi ini diperlukan jika Anda menggunakan AWS CLI versi 2. Untuk menjadikan ini pengaturan default, jalankanaws configure set cli-binary-format raw-in-base64-out. Untuk informasi selengkapnya, lihat opsi baris perintah global yang AWS CLI didukung di Panduan AWS Command Line Interface Pengguna untuk Versi 2.

    Anda akan melihat tanggapan seperti ini:

    { "StatusCode": 200, "ExecutedVersion": "$LATEST" }
  5. Verifikasi responsnya.

    cat response.txt

    Anda akan melihat tanggapan seperti ini:

    Echoing request: '{"text":"Hello"}'

Perbarui waktu pengoperasian

  1. Untuk mencatat log informasi tentang lingkungan eksekusi, perbarui skrip waktu pengoperasian ke variabel lingkungan output.

    contoh bootstrap
    #!/bin/sh set -euo pipefail # Configure runtime to output environment variables echo "## Environment variables:" env # Load function handler source $LAMBDA_TASK_ROOT/"$(echo $_HANDLER | cut -d. -f1).sh" # Processing while true do HEADERS="$(mktemp)" # Get an event. The HTTP request will block until one is received EVENT_DATA=$(curl -sS -LD "$HEADERS" "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/next") # Extract request ID by scraping response headers received above REQUEST_ID=$(grep -Fi Lambda-Runtime-Aws-Request-Id "$HEADERS" | tr -d '[:space:]' | cut -d: -f2) # Run the handler function from the script RESPONSE=$($(echo "$_HANDLER" | cut -d. -f2) "$EVENT_DATA") # Send the response curl "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$REQUEST_ID/response" -d "$RESPONSE" done
  2. Buat file.zip yang berisi versi baru bootstrap file.

    zip runtime.zip bootstrap
  3. Buat versi baru dari bash-runtime layer.

    aws lambda publish-layer-version --layer-name bash-runtime --zip-file fileb://runtime.zip
  4. Konfigurasikan fungsi untuk menggunakan versi baru lapisan.

    aws lambda update-function-configuration --function-name bash-runtime \ --layers arn:aws:lambda:us-east-1:123456789012:layer:bash-runtime:2

Bagikan lapisan

Untuk berbagi layer dengan yang lain Akun AWS, tambahkan pernyataan izin lintas akun ke kebijakan berbasis sumber daya lapisan. Jalankan add-layer-version-permissionperintah dan tentukan ID akun sebagaiprincipal. Dalam setiap pernyataan, Anda dapat memberikan izin ke satu akun, semua akun, atau organisasi di AWS Organizations.

Contoh berikut memberikan akun 111122223333 akses ke versi 2 lapisan. bash-runtime

aws lambda add-layer-version-permission \ --layer-name bash-runtime \ --version-number 2 \ --statement-id xaccount \ --action lambda:GetLayerVersion \ --principal 111122223333 \ --output text

Anda akan melihat output yang serupa dengan yang berikut:

{"Sid":"xaccount","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::111122223333:root"},"Action":"lambda:GetLayerVersion","Resource":"arn:aws:lambda:us-east-1:123456789012:layer:bash-runtime:2"}

Izin hanya berlaku untuk satu versi lapisan. Ulangi proses ini tiap kali Anda membuat versi lapisan baru.

Bersihkan

Hapus setiap versi lapisan.

aws lambda delete-layer-version --layer-name bash-runtime --version-number 1 aws lambda delete-layer-version --layer-name bash-runtime --version-number 2

Karena fungsi memiliki referensi ke lapisan versi 2, ia masih ada di Lambda. Fungsi terus bekerja, tetapi fungsi tidak dapat lagi dikonfigurasi untuk menggunakan versi yang dihapus. Jika Anda memodifikasi daftar lapisan pada fungsi, Anda harus menentukan versi baru atau menghilangkan lapisan yang dihapus.

Hapus fungsi dengan perintah hapus-fungsi.

aws lambda delete-function --function-name bash-runtime