本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
針對 Ruby Lambda 函數使用層
Lambda 層是含有補充程式碼或資料的 .zip 封存檔。層通常具備程式庫相依性、自訂執行期或組態檔案。建立層包含三個一般步驟:
-
封裝層內容。這表示建立 .zip 封存檔,其中包含您要在函數中使用的相依項。
-
在 Lambda 中建立層。
-
將層新增至函數中。
本主題包含如何正確封裝和建立具有外部程式庫相依項的 Ruby Lambda 層的步驟和指導。
必要條件
若要完成本節中的步驟,您必須執行下列各項:
-
Ruby 3.3
,與 gem
套件安裝程式一起發布。
在本主題中,我們會參考 awsdocs GitHub 儲存庫上的 layer-ruby
在 layer-ruby
範例應用程式中,您將 tzinfo
layer/
目錄包含用於產生層的指令碼。function/
目錄包含一個範例函數,可協助測試層是否正常運作。本教學課程的主要部分會逐步說明如何建立和封裝此層。
Ruby 層與 Lambda 執行時期環境的相容性
當您在 Ruby 層中封裝程式碼時,可以指定與程式碼相容的 Lambda 執行時期環境。若要評估程式碼與執行時期的相容性,請考慮程式碼適用的 Ruby 版本、作業系統以及指令集架構。
Lambda Ruby 執行時期會指定其 Ruby 版本和作業系統。在本文件中,您會使用以 AL2023 為基礎的 Ruby 3.3 執行時期。如需執行時期版本的詳細資訊,請參閱支援的執行期。建立 Lambda 函數時,可以指定指令集架構。在此文件中,您會使用 x86_64
架構。如需 Lambda 架構的詳細資訊,請參閱選取和設定 Lambda 函數的指令集架構。
當您使用套件中的程式碼時,每個套件維護器會獨立定義其相容性。大多數 Gem 套件完全以 Ruby 編寫,並且與使用相容 Ruby 語言版本的任何執行時期相容。
有時候,Gem 套件會使用稱為延伸項目的 Ruby 功能來編譯程式碼,或在安裝程序中包含預先編譯的程式碼。如果您依賴具有原生擴展的 Gem 套件,則必須評估作業系統和指令集架構相容性。若要評估 Gem 套件與 Ruby 執行時期之間的相容性,您需要檢查 Gem 套件及其文件。您可以透過檢查 Gem 套件規格中是否定義了 extensions
,來識別 Gem 套件是否使用了延伸項目。Ruby 透過 RUBY_PLATFORM
全域常數來識別其正在執行的平台。Lambda Ruby 執行時期會將平台定義為 aarch64-linux
(當在 arm64
架構上執行時) 或 x86_64-linux
(當在 x86_64
架構上執行時)。沒有確鑿的方法檢查 Gem 套件是否與這些平台相容,但有些 Gem 套件會透過 platform
Gem 規格屬性宣告其支援的平台。
Ruby 執行時期的層路徑
將層新增至函數時,Lambda 會將層內容載入該執行環境的 /opt
目錄。在每一次 Lambda 執行期中,PATH
變數已包含 /opt
目錄中的特定資料夾路徑。為確定 PATH
變數能夠擷取您的層內容,您的層 .zip 檔案應該在下列資料夾路徑中有其相依項:
-
ruby/gems/
,其中 x 是執行時期上的 Ruby 版本,例如x
3.3.0
。 -
ruby/lib/
在此文件中,使用 ruby/gems/
路徑。Lambda 預計此目錄的內容會對應至 Bundler 安裝目錄的結構。將您的 Gem 套件相依項與其他中繼資料子目錄一起存放在層路徑的 x
/gems
子目錄中。例如,您在本教學課程中建立的層 .zip 檔案具有下列目錄結構:
layer_content.zip
└ ruby
└ gems
└ 3.3.0
└ gems
└ tzinfo-2.0.6
└ <other_dependencies> (i.e. dependencies of the tzinfo package)
└ ...
└ <metadata generated by bundle>
tzinfo
程式庫位於正確的 ruby/gems/3.3.0/
目錄中。這樣可以確保 Lambda 能夠在函數調用期間找到程式庫。
封裝層內容
在此範例中,您會將 Ruby tzinfo
程式庫封裝到層 .zip 檔案中。請完成下列步驟,以安裝和封裝層內容。
安裝和封裝層內容
-
複製
aws-lambda-developer-guide
GitHub 儲存庫,其中包含您在 sample-apps/layer-ruby
目錄中需要的範例程式碼。git clone https://github.com/awsdocs/aws-lambda-developer-guide.git
-
導覽至
layer-ruby
範例應用程式的layer
目錄。此目錄包含您用來正確建立和封裝層的指令碼。cd aws-lambda-developer-guide/sample-apps/layer-ruby/layer
-
檢查
Gemfile
。此檔案會定義您要包含在層中的相依項,也就是 tzinfo
程式庫。您可以更新此檔案,加入想要包含在自己的層中的任何相依項。範例 Gemfile
source "https://rubygems.org" gem "tzinfo"
-
確定您有執行這兩個指令碼的許可。
chmod 744 1-install.sh && chmod 744 2-package.sh
-
使用以下命令來執行
1-install.sh
指令碼: ./1-install.sh
此指令碼會設定搭配程式在您的專案目錄中安裝相依項。接著,它在
vendor/bundle/
目錄中安裝所有必要的相依項。範例 1-install.sh
bundle config set --local path 'vendor/bundle' bundle install
-
使用以下命令來執行
2-package.sh
指令碼: ./2-package.sh
此指令碼會將
vendor/bundle
目錄中的內容複製到名為ruby
的新目錄。然後,它會將ruby
目錄的內容壓縮成名為layer_content.zip
的檔案。這是層的 .zip 檔案。您可以解壓縮該檔案,並確認其包含正確的檔案結構,如Ruby 執行時期的層路徑一節所示。範例 2-package.sh
mkdir -p ruby/gems/3.3.0 cp -r vendor/bundle/ruby/3.3.0/* ruby/gems/3.3.0/ zip -r layer_content.zip ruby
建立層
在本節中,您會取得您在上一節中產生的 layer_content.zip
檔案,並將其上傳為 Lambda 層。您可以透過 AWS Command Line Interface (AWS CLI) 使用 AWS Management Console或 Lambda API 上傳層。當您上傳層 .zip 檔案時,請在下列 PublishLayerVersion AWS CLI 命令中,將 ruby3.3
指定為相容的執行時期,將 arm64
指定為相容的架構。
aws lambda publish-layer-version --layer-name ruby-requests-layer \ --zip-file fileb://layer_content.zip \ --compatible-runtimes ruby3.3 \ --compatible-architectures "arm64"
從回應中記下 LayerVersionArn
,它類似於 arn:aws:lambda:us-east-1:
。在本教學課程的下一個步驟中,當您將層新增至函數時,將需要此 Amazon Resource Name (ARN)。123456789012
:layer:ruby-requests-layer:1
將層新增至函數
在本節中,您會部署一個在函數程式碼中使用 tzinfo
程式庫的範例 Lambda 函數,然後連接層。若要部署函數,您需要使用執行角色定義 Lambda 函數許可。如果沒有現有的執行角色,請依可摺疊區段中的步驟操作。
若要建立執行角色
-
在 IAM 主控台中開啟 角色頁面
。 -
選擇 建立角色。
-
建立具備下列屬性的角色。
-
信任實體 - Lambda。
-
許可 - AWSLambdaBasicExecutionRole。
-
角色名稱 -
lambda-role
。
AWSLambdaBasicExecutionRole 政策具備函數將日誌寫入到 CloudWatch Logs 時所需的許可。
-
Lambda 函數程式碼tzinfo
程式庫,然後傳回狀態碼和當地語系化日期字串。
require 'json' require 'tzinfo' def lambda_handler(event:, context:) tz = TZInfo::Timezone.get('America/New_York') { statusCode: 200, body: tz.to_local(Time.utc(2018, 2, 1, 12, 30, 0)) } end
部署 Lambda 函數
-
導覽至
function/
目錄。如果您目前在layer/
目錄中,則執行下列命令:cd ../function
-
使用以下命令建立 .zip 檔案部署套件:
zip my_deployment_package.zip lambda_function.rb
-
部署函數。在下列 AWS CLI 命令中,將
--role
參數取代為您的執行角色 ARN:aws lambda create-function --function-name ruby_function_with_layer \ --runtime ruby3.3 \ --architectures "arm64" \ --handler lambda_function.lambda_handler \ --role
arn:aws:iam::
\ --zip-file fileb://my_deployment_package.zip123456789012
:role/lambda-role -
接著,將層連接至您的函數。在下列 AWS CLI 命令中,將
--layers
參數取代為您先前記下的層版本 ARN:aws lambda update-function-configuration --function-name ruby_function_with_layer \ --cli-binary-format raw-in-base64-out \ --layers "
arn:aws:lambda:us-east-1:
"123456789012
:layer:ruby-requests-layer:1 -
最後,嘗試使用以下 AWS CLI 命令調用您的函數:
aws lambda invoke --function-name ruby_function_with_layer \ --cli-binary-format raw-in-base64-out \ --payload '{ "key": "value" }' response.json
您應該會看到輸出,如下所示:
{ "StatusCode": 200, "ExecutedVersion": "$LATEST" }
輸出的
response.json
檔案包含回應的詳細資訊。
除非您想要保留為此教學課程建立的資源,否則您現在便可刪除。透過刪除您不再使用的 AWS 資源,可為 AWS 帳戶 避免不必要的費用。
刪除 Lambda 層
-
開啟 Lambda 主控台中的 層頁面
。 -
選取您建立的層。
-
選擇刪除,然後再次選擇刪除。
若要刪除 Lambda 函數
-
開啟 Lambda 主控台中的 函數頁面
。 -
選擇您建立的函數。
-
選擇 Actions (動作)、Delete (刪除)。
-
在文字輸入欄位中輸入
delete
,然後選擇刪除。