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 (zip
seperti) tidak didukung oleh terminal bawaan sistem operasi. Untuk mendapatkan versi terintegrasi Windows dari Ubuntu dan Bash, instal Windows Subsystem untuk
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
-
Buka halaman peran
di IAM konsol. -
Pilih Buat peran.
-
Buat peran dengan properti berikut.
-
Entitas tepercaya – Lambda.
-
Izin — AWSLambdaBasicExecutionRole.
-
Nama peran –
lambda-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.
-
Buat direktori untuk proyek, dan kemudian beralih ke direktori itu.
mkdir runtime-tutorial cd runtime-tutorial
-
Buat file baru bernama
bootstrap
. 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.
-
Buat skrip untuk fungsi tersebut. Contoh skrip berikut mendefinisikan fungsi handler yang mengambil data peristiwa, log ke
stderr
, dan mengembalikannya.contoh function.sh
function handler () { EVENT_DATA=$1 echo "$EVENT_DATA" 1>&2; RESPONSE="Echoing request: '$EVENT_DATA'" echo $RESPONSE }
runtime-tutorial
Direktori sekarang akan terlihat seperti ini:runtime-tutorial ├ bootstrap └ function.sh
-
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
-
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
-
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, jalankan
aws 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" }
-
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.
-
Buat file.zip yang berisi
bootstrap
file.zip runtime.zip bootstrap
-
Buat layer dengan publish-layer-version
perintah. 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.
-
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:1Ini menambahkan waktu pengoperasian ke fungsi di direktori
/opt
. Untuk memastikan bahwa Lambda menggunakan runtime di layer, Anda harus menghapusboostrap
dari paket penerapan fungsi, seperti yang ditunjukkan dalam dua langkah berikutnya. -
Buat file.zip yang berisi kode fungsi.
zip function-only.zip function.sh
-
Perbarui kode fungsi untuk hanya memasukkan skrip penangan.
aws lambda update-function-code --function-name bash-runtime --zip-file fileb://function-only.zip
-
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, jalankan
aws 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" }
-
Verifikasi responsnya.
cat response.txt
Anda akan melihat tanggapan seperti ini:
Echoing request: '{"text":"Hello"}'
Perbarui waktu pengoperasian
-
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 -
Buat file.zip yang berisi versi baru
bootstrap
file.zip runtime.zip bootstrap
-
Buat versi baru dari
bash-runtime
layer.aws lambda publish-layer-version --layer-name bash-runtime --zip-file fileb://runtime.zip
-
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-permissionprincipal
. 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