在 AWS Lambda 中檢測 Ruby 代碼 - AWS Lambda

在 AWS Lambda 中檢測 Ruby 代碼

Lambda 會與 AWS X-Ray 整合,讓您能夠追蹤、偵錯和最佳化 Lambda 應用程式。您可以使用 X-Ray 來追踪請求,因為它會周遊應用程式中的資源,從前端 API 到後端的存儲體和資料庫。只要將 X-Ray SDK 程式庫新增至您的建置組態,就可以針對函數對 AWS 服務所進行的任何呼叫記錄錯誤和延遲。

在設定主動追蹤之後,您可以透過應用程式來觀察特定請求。X-Ray 服務圖顯示了有關應用程式及其所有元件的資訊。下列來自錯誤處理器範例應用程式的範例顯示了具有兩個函式的應用程式。主要函式會處理事件,有時會傳回錯誤。第二個函數會處理出現在第一個函數日誌群組中的錯誤,並使用 AWS SDK 來呼叫 X-Ray、Amazon Simple Storage Service (Amazon S3) 和 Amazon CloudWatch Logs。


        在 X-Ray 中顯示兩個單獨的應用程式,及其各自服務映射的圖表

若要使用控制台在 Lambda 函數上切換主動追蹤,請按照下列步驟操作:

開啟主動追蹤

  1. 開啟 Lambda 主控台中的 Functions (函數) 頁面

  2. 選擇一個函數。

  3. 選擇 Configuration (組態),然後選擇 Monitoring and operations tools (監控和操作工具)。

  4. 選擇 Edit (編輯)

  5. X-Ray 下,打開 Active tracing (主動追蹤)。

  6. 選擇 Save (儲存)。

定價

作為 AWS 免費方案的一部分,您可以每月免費使用 X-Ray 追蹤,但有一定限制。達到閾值後,X-Ray 會收取追蹤儲存及擷取的費用。如需詳細資訊,請參閱 AWS X-Ray 定價

您的函數需要將追蹤資料上傳至 X-Ray 的許可。當您在 Lambda 主控台中啟用追蹤時,Lambda 會將必要的許可新增至函數的執行角色。否則,請將 AWSXRayDaemonWriteAccess 政策新增至執行角色。

X-Ray 無法追蹤應用程式的所有請求。X-Ray 會套用取樣演算法以確保追蹤的效率,同時仍提供所有請求的代表範本。取樣率為每秒 1 次請求和 5% 的額外請求。

注意

您無法針對函數設定 X-Ray 取樣率。

使用主動追蹤時,Lambda 會在每個追蹤上記錄 2 個區段,它在服務圖表上會建立兩個節點。下圖反白顯示了上方錯誤處理器範例中的主要函數的兩個節點。


      具有單一函數的 X-Ray 服務映射。

左側第一個節點代表接收叫用請求的 Lambda 服務。第二個節點代表您特定的 Lambda 函數。下列範例顯示了具有這 2 個區段的追蹤。兩者都被命名為 my-function,但其中之一具有 AWS::Lambda 的來源,而另一個具有來源 AWS::Lambda::Function


        顯示特定 Lambda 叫用每個子區段延遲的 X-Ray 追蹤。

此範例會展開函數區段以顯示其子區段︰

  • 初始化 - 表示載入函數和執行初始化程式碼所花費的時間。只有函數的每個執行個體所處理的第一個事件會顯示此子區段。

  • 叫用 – 表示執行處理常式程式碼所花費的時間。

  • 額外負荷 - 表示 Lambda 執行時間為做好準備以處理下一個事件所花費的時間。

您可以測試處理常式程式碼,以記錄中繼資料並追蹤下游呼叫。若要記錄處理常式對其他資源和服務所進行之呼叫的詳細資料,請使用適用於 Ruby 的 X-Ray 開發套件。若要取得開發套件,請將 aws-xray-sdk 套件新增至應用程式的相依性。

範例 blank-ruby/function/Gemfile

# Gemfile source 'https://rubygems.org' gem 'aws-xray-sdk', '0.11.4' gem 'aws-sdk-lambda', '1.39.0' gem 'test-unit', '3.3.5'

若要檢測 AWS 開發套件用戶端,請在初始化程式碼中建立用戶端之後要求該 aws-xray-sdk/lambda 模組。

範例 blank-ruby/function/lambda_function.rb - 追蹤 AWS 開發套件用戶端

# lambda_function.rb require 'logger' require 'json' require 'aws-sdk-lambda' $client = Aws::Lambda::Client.new() $client.get_account_settings() require 'aws-xray-sdk/lambda' def lambda_handler(event:, context:) logger = Logger.new($stdout) ...

使用主動追蹤時,Lambda 會在每個追蹤上記錄 2 個區段,它在服務圖表上會建立兩個節點。下圖反白顯示了上方錯誤處理器範例中的主要函數的兩個節點。


      具有單一函數的 X-Ray 服務映射。

左側第一個節點代表接收叫用請求的 Lambda 服務。第二個節點代表您特定的 Lambda 函數。下列範例顯示了具有這 2 個區段的追蹤。兩者都被命名為 my-function,但其中之一具有 AWS::Lambda 的來源,而另一個具有來源 AWS::Lambda::Function


        顯示特定 Lambda 叫用每個子區段延遲的 X-Ray 追蹤。

此範例會展開函數區段以顯示其子區段︰

  • 初始化 - 表示載入函數和執行初始化程式碼所花費的時間。只有函數的每個執行個體所處理的第一個事件會顯示此子區段。

  • 叫用 – 表示執行處理常式程式碼所花費的時間。

  • 額外負荷 - 表示 Lambda 執行時間為做好準備以處理下一個事件所花費的時間。

您也可以檢測 HTTP 用戶端、記錄 SQL 查詢,以及建立具有註釋和中繼資料的自訂子區段。如需詳細資訊,請參閱《AWS X-Ray 開發人員指南》中的適用於 Ruby 的 X-Ray 開發套件

透過 Lambda API 啟用主動追蹤

若要使用 AWS CLI 或 AWS 開發套件管理追蹤組態,請使用下列 API 操作:

下列範例 AWS CLI 命令啟用對名稱為 my-function 之函數的主動追蹤。

aws lambda update-function-configuration --function-name my-function \ --tracing-config Mode=Active

追蹤模式是您發布函數版本時版本特定組態的一部分。您無法變更已發佈版本上的追蹤模式。

搭配 AWS CloudFormation 啟用主動追蹤

若要在 AWS CloudFormation 範本中啟用對 AWS::Lambda::Function 資源的追蹤,請使用 TracingConfig 屬性。

範例 function-inline.yml - 追蹤組態

Resources: function: Type: AWS::Lambda::Function Properties: TracingConfig: Mode: Active ...

對於 AWS Serverless Application Model (AWS SAM) AWS::Serverless::Function 資源,請使用 Tracing 屬性。

範例 template.yml - 追蹤組態

Resources: function: Type: AWS::Serverless::Function Properties: Tracing: Active ...

將執行時間相依性儲存在圖層中

如果您使用 X-Ray 開發套件來測試 AWS 開發套件用戶端,您的函數程式碼、您的部署套件可能會變得相當大。為了避免每次更新函數程式碼時上傳執行時間相依性,請將 X-Ray SDK 封裝在一個 Lambda 層中。

下面的例子顯示了儲存適用於 Ruby 的 X-Ray 開發套件的 AWS::Serverless::LayerVersion 資源。

範例 template.yml - 相依性層

Resources: function: Type: AWS::Serverless::Function Properties: CodeUri: function/. Tracing: Active Layers: - !Ref libs ... libs: Type: AWS::Serverless::LayerVersion Properties: LayerName: blank-ruby-lib Description: Dependencies for the blank-ruby sample app. ContentUri: lib/. CompatibleRuntimes: - ruby2.5

透過此組態,您只有在變更執行時間相依性時才會更新程式庫層。由於函數部署套件僅含有您的程式碼,因此有助於減少上傳時間。

為相依性建立圖層需要建置變更,才能在部署之前產生圖層封存。如需工作範例,請參閱 blank-ruby 範例應用程式。