Tutorial: Membangun runtime kustom - 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 kustom

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 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 Ubuntu dan Bash versi terintegrasi Windows, instal Windows Subsystem for 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 tersebut memerlukan izin untuk mengirim CloudWatch log ke Logs dan mengakses fungsi Anda. Layanan AWS 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 oleh fungsi untuk menulis log ke CloudWatch Logs.

Buat fungsi

Buat fungsi Lambda dengan waktu pengoperasian kustom. Contoh ini mencakup dua file: bootstrap file waktu pengoperasian dan penangan fungsi. 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 waktu pengoperasian memuat skrip fungsi, ia menggunakan waktu pengoperasian API untuk mengambil kejadian invokasi dari Lambda, meneruskan kejadian tersebut ke penangan, dan memposting respons kembali ke Lambda. Untuk mendapatkan ID permintaan, waktu pengoperasian 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 berikut ini mendefinisikan fungsi penangan yang mengambil data kejadian, mencatat 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 terlihat seperti ini:

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

    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. Lakukan invokasi 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 tanggapan.

    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 lapisan 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 lapisan waktu pengoperasian dalam fungsi, konfigurasikan fungsi untuk menggunakan lapisan, dan hapus kode waktu pengoperasian 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. Lakukan invokasi fungsi untuk mengonfirmasi bahwa ia berfungsi dengan lapisan waktu pengoperasian.

    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 tanggapan.

    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 bash-runtime lapisan.

    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. Di setiap pernyataan, Anda dapat memberikan izin ke satu akun, semua akun, atau organisasi 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