Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Bekerja dengan lapisan untuk fungsi Ruby Lambda
Gunakan lapisan Lambda untuk mengemas kode dan dependensi yang ingin Anda gunakan kembali di beberapa fungsi. Lapisan biasanya berisi dependensi pustaka, runtime kustom, atau file konfigurasi. Membuat layer melibatkan tiga langkah umum:
-
Package konten layer Anda. Ini berarti membuat arsip file.zip yang berisi dependensi yang ingin Anda gunakan dalam fungsi Anda.
-
Buat layer di Lambda.
-
Tambahkan layer ke fungsi Anda.
Topik
Package konten layer Anda
Untuk membuat layer, bundel paket Anda ke dalam arsip file.zip yang memenuhi persyaratan berikut:
-
Buat layer menggunakan versi Ruby yang sama yang Anda rencanakan untuk digunakan untuk fungsi Lambda. Misalnya, jika Anda membuat layer untuk Ruby 3.4, gunakan runtime Ruby 3.4 untuk fungsi Anda.
-
File.zip layer Anda harus menggunakan salah satu struktur direktori ini:
-
ruby/gems/
(dix.x.x
x.x.x
mana versi Ruby Anda, misalnya3.4.0
) -
ruby/lib
Untuk informasi selengkapnya, lihat Jalur lapisan untuk setiap runtime Lambda.
-
-
Paket di lapisan Anda harus kompatibel dengan Linux. Fungsi Lambda berjalan di Amazon Linux.
Anda dapat membuat layer yang berisi permata Ruby pihak ketiga atau modul dan kelas Ruby Anda sendiri. Banyak permata Ruby populer berisi ekstensi asli (kode C) yang harus dikompilasi untuk lingkungan Linux Lambda.
Permata Ruby murni hanya berisi kode Ruby dan tidak memerlukan kompilasi. Permata ini lebih mudah untuk dikemas dan bekerja di berbagai platform.
Untuk membuat layer menggunakan permata Ruby murni
-
Buat a
Gemfile
untuk menentukan permata Ruby murni yang ingin Anda sertakan dalam layer Anda:contoh Gemfile
source 'https://rubygems.org' gem 'tzinfo'
-
Instal permata ke
vendor/bundle
direktori menggunakan Bundler:bundle config set --local path vendor/bundle bundle install
-
Salin permata yang diinstal ke struktur direktori yang dibutuhkan
ruby/gems/3.4.0
Lambda):mkdir -p ruby/gems/3.4.0 cp -r vendor/bundle/ruby/3.4.0*/* ruby/gems/3.4.0/
-
Zip konten lapisan:
Struktur direktori file.zip Anda akan terlihat seperti ini:
ruby/ └── gems/ └── 3.4.0/ ├── gems/ │ ├── concurrent-ruby-1.3.5/ │ └──
tzinfo-2.0.6/
├── specifications/ ├── cache/ ├── build_info/ └── (other bundler directories)catatan
Anda harus meminta setiap permata satu per satu dalam kode fungsi Anda. Anda tidak dapat menggunakan
bundler/setup
atauBundler.require
. Untuk informasi selengkapnya, lihat Menggunakan permata dari lapisan dalam suatu fungsi.
Banyak permata Ruby populer berisi ekstensi asli (kode C) yang harus dikompilasi untuk platform target. Permata populer dengan ekstensi asli termasuk nokogiri
Untuk membuat layer menggunakan permata dengan ekstensi asli
-
Buat a
Gemfile
.contoh Gemfile
source 'https://rubygems.org' gem 'nokogiri' gem 'httparty'
-
Gunakan Docker untuk membangun permata di lingkungan Linux yang kompatibel dengan Lambda. Tentukan gambar AWS dasar di Dockerfile Anda:
contoh Dockerfile untuk Ruby 3.4
FROM
public.ecr.aws/lambda/ruby:3.4
# Copy Gemfile COPY Gemfile ./ # Install system dependencies for native extensions RUN dnf update -y && \ dnf install -y gcc gcc-c++ make # Configure bundler and install gems RUN bundle config set --local path vendor/bundle && \ bundle install # Create the layer structure RUN mkdir -p ruby/gems/3.4.0 && \ cp -r vendor/bundle/ruby/3.4.0
*/* ruby/gems/3.4.0
/ # Create the layer zip file RUN zip -r layer.zip ruby/ -
Bangun gambar dan ekstrak layer:
docker build -t ruby-layer-builder . docker run --rm -v $(pwd):/output --entrypoint cp ruby-layer-builder layer.zip /output/
Ini membangun permata di lingkungan Linux yang benar dan menyalin
layer.zip
file ke direktori lokal Anda. Struktur direktori file.zip Anda akan terlihat seperti ini:ruby/ └── gems/ └── 3.4.0/ ├── gems/ │ ├── bigdecimal-3.2.2/ │ ├── csv-3.3.5/ │ ├──
httparty-0.23.1/
│ ├── mini_mime-1.1.5/ │ ├── multi_xml-0.7.2/ │ ├──nokogiri-1.18.8-x86_64-linux-gnu/
│ └── racc-1.8.1/ ├── build_info/ ├── cache/ ├── specifications/ └── (other bundler directories)catatan
Anda harus meminta setiap permata satu per satu dalam kode fungsi Anda. Anda tidak dapat menggunakan
bundler/setup
atauBundler.require
. Untuk informasi selengkapnya, lihat Menggunakan permata dari lapisan dalam suatu fungsi.
Untuk membuat layer menggunakan kode Anda sendiri
-
Buat struktur direktori yang diperlukan untuk layer Anda:
mkdir -p ruby/lib
-
Buat modul Ruby Anda di
ruby/lib
direktori. Modul contoh berikut memvalidasi pesanan dengan mengonfirmasi bahwa mereka berisi informasi yang diperlukan.contoh ruby/lib/order_validator.rb
require 'json' module OrderValidator class ValidationError < StandardError; end def self.validate_order(order_data) # Validates an order and returns formatted data required_fields = %w[product_id quantity] # Check required fields missing_fields = required_fields.reject { |field| order_data.key?(field) } unless missing_fields.empty? raise ValidationError, "Missing required fields: #{missing_fields.join(', ')}" end # Validate quantity quantity = order_data['quantity'] unless quantity.is_a?(Integer) && quantity > 0 raise ValidationError, 'Quantity must be a positive integer' end # Format and return the validated data { 'product_id' => order_data['product_id'].to_s, 'quantity' => quantity, 'shipping_priority' => order_data.fetch('priority', 'standard') } end def self.format_response(status_code, body) # Formats the API response { statusCode: status_code, body: JSON.generate(body) } end end
-
Zip konten lapisan:
Struktur direktori file.zip Anda akan terlihat seperti ini:
ruby/ └── lib/ └── order_validator.rb
-
Dalam fungsi Anda, membutuhkan dan menggunakan modul. Anda harus meminta setiap permata satu per satu dalam kode fungsi Anda. Anda tidak dapat menggunakan
bundler/setup
atauBundler.require
. Untuk informasi selengkapnya, lihat Menggunakan permata dari lapisan dalam suatu fungsi. Contoh:require 'json' require 'order_validator' def lambda_handler(event:, context:) begin # Parse the order data from the event body order_data = JSON.parse(event['body'] || '{}') # Validate and format the order validated_order = OrderValidator.validate_order(order_data) OrderValidator.format_response(200, { message: 'Order validated successfully', order: validated_order }) rescue OrderValidator::ValidationError => e OrderValidator.format_response(400, { error: e.message }) rescue => e OrderValidator.format_response(500, { error: 'Internal server error' }) end end
Anda dapat menggunakan peristiwa pengujian berikut untuk menjalankan fungsi:
{ "body": "{\"product_id\": \"ABC123\", \"quantity\": 2, \"priority\": \"express\"}" }
Tanggapan yang diharapkan:
{ "statusCode": 200, "body": "{\"message\":\"Order validated successfully\",\"order\":{\"product_id\":\"ABC123\",\"quantity\":2,\"shipping_priority\":\"express\"}}" }
Buat layer di Lambda
Anda dapat mempublikasikan layer Anda menggunakan konsol AWS CLI atau Lambda.
Menggunakan permata dari lapisan dalam suatu fungsi
Dalam kode fungsi Anda, Anda harus secara eksplisit meminta setiap permata yang ingin Anda gunakan. Perintah bundler seperti bundler/setup
dan Bundler.require
tidak didukung. Berikut cara menggunakan permata dengan benar dari lapisan dalam fungsi Lambda:
# Correct: Use explicit requires for each gem require 'nokogiri' require 'httparty' def lambda_handler(event:, context:) # Use the gems directly doc = Nokogiri::HTML(event['html']) response = HTTParty.get(event['url']) # ... rest of your function end # Incorrect: These Bundler commands will not work # require 'bundler/setup' # Bundler.require
Tambahkan layer ke fungsi Anda
Contoh aplikasi
Untuk contoh lebih lanjut tentang cara menggunakan layer Lambda, lihat contoh aplikasi layer-ruby