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 (zip
seperti) tidak didukung oleh terminal bawaan sistem operasi. Untuk mendapatkan Ubuntu dan Bash versi terintegrasi Windows, instal Windows Subsystem for
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
-
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 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.
-
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 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.
-
Buat skrip untuk fungsi tersebut. Contoh berikut ini mendefinisikan fungsi penangan yang mengambil data kejadian, mencatat 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 terlihat seperti ini:runtime-tutorial ├ bootstrap └ function.sh
-
Buat file dapat dijalankan dan tambahkan ke arsip file .zip. Ini paket deployment.
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
-
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, 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 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.
-
Buat file .zip yang berisi
bootstrap
file.zip runtime.zip bootstrap
-
Buat lapisan 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 lapisan waktu pengoperasian dalam fungsi, konfigurasikan fungsi untuk menggunakan lapisan, dan hapus kode waktu pengoperasian 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
-
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, 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 tanggapan.
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
bash-runtime
lapisan.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
. 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