Bekerja dengan lapisan untuk fungsi Ruby Lambda - AWS Lambda

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:

  1. Package konten layer Anda. Ini berarti membuat arsip file.zip yang berisi dependensi yang ingin Anda gunakan dalam fungsi Anda.

  2. Buat layer di Lambda.

  3. Tambahkan layer ke fungsi Anda.

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/x.x.x(di 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
  1. Buat a Gemfile untuk menentukan permata Ruby murni yang ingin Anda sertakan dalam layer Anda:

    contoh Gemfile
    source 'https://rubygems.org' gem 'tzinfo'
  2. Instal permata ke vendor/bundle direktori menggunakan Bundler:

    bundle config set --local path vendor/bundle bundle install
  3. 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/
  4. Zip konten lapisan:

    Linux/macOS
    zip -r layer.zip ruby/
    PowerShell
    Compress-Archive -Path .\ruby -DestinationPath .\layer.zip

    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, pg, mysql2, sqlite3, dan ffi. Permata ini harus dibangun di lingkungan Linux yang kompatibel dengan runtime Lambda.

Untuk membuat layer menggunakan permata dengan ekstensi asli
  1. Buat aGemfile.

    contoh Gemfile
    source 'https://rubygems.org' gem 'nokogiri' gem 'httparty'
  2. 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/
  3. 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
  1. Buat struktur direktori yang diperlukan untuk layer Anda:

    mkdir -p ruby/lib
  2. 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
  3. Zip konten lapisan:

    Linux/macOS
    zip -r layer.zip ruby/
    PowerShell
    Compress-Archive -Path .\ruby -DestinationPath .\layer.zip

    Struktur direktori file.zip Anda akan terlihat seperti ini:

    ruby/              
    └── lib/
        └── order_validator.rb
  4. 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.

AWS CLI

Jalankan publish-layer-version AWS CLI perintah untuk membuat layer Lambda:

aws lambda publish-layer-version --layer-name my-layer --zip-file fileb://layer.zip --compatible-runtimes ruby3.4

Parameter runtime yang kompatibel adalah opsional. Saat ditentukan, Lambda menggunakan parameter ini untuk memfilter lapisan di konsol Lambda.

Console
Untuk membuat lapisan (konsol)
  1. Buka halaman Fungsi di konsol Lambda.

  2. Pilih Buat lapisan.

  3. Pilih Unggah file.zip, lalu unggah arsip.zip yang Anda buat sebelumnya.

  4. (Opsional) Untuk runtime yang kompatibel, pilih runtime Ruby yang sesuai dengan versi Ruby yang Anda gunakan untuk membangun layer Anda.

  5. Pilih Buat.

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

AWS CLI

Untuk melampirkan layer ke fungsi Anda, jalankan update-function-configuration AWS CLI perintah. Untuk --layers parameter, gunakan lapisan ARN. ARN harus menentukan versi (misalnya,arn:aws:lambda:us-east-1:123456789012:layer:my-layer:1). Untuk informasi selengkapnya, lihat Versi lapisan dan lapisan.

aws lambda update-function-configuration --function-name my-function --cli-binary-format raw-in-base64-out --layers "arn:aws:lambda:us-east-1:123456789012:layer:my-layer:1"

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.

Console
Untuk menambahkan lapisan ke fungsi
  1. Buka halaman Fungsi di konsol Lambda.

  2. Pilih fungsinya.

  3. Gulir ke bawah ke bagian Layers, lalu pilih Add a layer.

  4. Di bawah Pilih layer, pilih Custom layers, dan kemudian pilih layer Anda.

    catatan

    Jika Anda tidak menambahkan runtime yang kompatibel saat membuat layer, layer Anda tidak akan tercantum di sini. Anda dapat menentukan lapisan ARN sebagai gantinya.

  5. Pilih Tambahkan.

Contoh aplikasi

Untuk contoh lebih lanjut tentang cara menggunakan layer Lambda, lihat contoh aplikasi layer-ruby di repositori Panduan Pengembang. AWS Lambda GitHub Aplikasi ini mencakup lapisan yang berisi pustaka tzinfo. Setelah membuat layer, Anda dapat menerapkan dan memanggil fungsi yang sesuai untuk mengonfirmasi bahwa lapisan berfungsi seperti yang diharapkan.