調用 AWS Lambda 函數 - Amazon Connect

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

調用 AWS Lambda 函數

Amazon Connect​ 可與您的系統互動,動態採取流程中的不同路徑。若要達成此目的,​請調用流程中的 AWS Lambda 函數、擷取結果,並呼叫您自己的服務,或與其他 AWS​ 資料存放區或服務互動。如需詳細資訊,請參閱《AWS Lambda 開發人員指南》

若要從流程調用 Lambda 函數,請完成以下任務。

建立 Lambda 函數

使用任何執行期建立 Lambda 函數並進行設定。如需詳細資訊,請參閱 AWS Lambda 開發人員指南中的 Lambda 入門

若您在相同區域建立 Lambda 函數作為聯絡中心,可以如下個任務 新增 Lambda 函數至 Amazon Connect 執行個體 所述,使用 Amazon Connect 主控台,新增 Lambda 函數到您的執行個體。這會自動新增資源許可,讓 Amazon Connect 調用 Lambda 函數。否則,如果 Lambda 函數位於不同的區域,您可以使用流程設計工具將其新增到流程中,並使用 add-permission 命令新增資源許可,其中包含 Amazon Connect 執行個體的主體 connect.amazonaws.com 和 ARN。詳情請參閱 AWS Lambda 使用者指南中的為 AWS Lambda 使用資源型政策

新增 Lambda 函數至 Amazon Connect 執行個體

您必須先將 Lambda 函數新增至 Amazon Connect 執行個體,然後才可在流程中使用該函數。

將 Lambda 函數新增到您的執行個體
  1. https://console.aws.amazon.com/connect/ 開啟 Amazon Connect 主控台。

  2. 在執行個體頁面的執行個體別名資料欄中選擇您的執行個體名稱。此執行個體名稱會出現在您用來存取 Amazon Connect 的 URL 中。

    Amazon Connect 虛擬聯絡中心執行個體頁面、執行個體別名。
  3. 在導覽窗格中,選擇流程

  4. AWS Lambda 區段中,使用 函數 下拉式清單,選擇要新增到執行個體的函數。

    提示

    下拉式清單僅列出與您執行個體相同區域中的函數。如果未列出任何函數,請選擇建立新的 Lambda 函數,這將開啟 AWS Lambda 主控台。

    若要在不同區域或帳戶中使用 Lambda,您可以在 叫用 AWS Lambda 函式選擇函數下輸入 Lambda 的 ARN。然後在該 Lambda 上設定對應的資源型政策,以允許流程呼叫它。

    如要呼叫 lambda:AddPermission,您需要:

    • 將主體設置為 connect.amazonaws.com

    • 將來源帳戶設定為執行個體所在的帳戶。

    • 將來源 ARN 設定為執行個體的 ARN。

    如需詳細資訊,請參閱​授予函數對其他帳戶的存取權

  5. 選擇新增 Lambda 函數。確認函數的 ARN 已新增至 Lambda 函數

現在,您可以在您的流程中參考 Lambda 函數。

從流程調用 Lambda 函數

  1. 開啟或建立流程。

  2. 叫用 AWS Lambda 函式 區塊 (在 整合 群組中) 新增至網格。將分支連接到區塊或從區塊連接。

  3. 選擇 叫用 AWS Lambda 函式 區塊的標題,以開啟其屬性頁面。

  4. 選擇函數 下,從新增到執行個體的函數清單中選擇。

  5. (選用) 在 函數輸入參數 下,選擇 新增參數。您可以指定在調用 Lambda 函數時,要傳送至該函數的鍵值對。您也可以指定函數的 逾時 值。

  6. 逾時 (最多 8 秒) 中,指定 Lambda 在進入逾時前的等待時間。在此時間之後,連絡人會沿著錯誤分支向下路由。

對於從流程調用的每個 Lambda 函數,您都會傳遞一組與進行中聯絡人相關的預設資訊,以及針對新增的調用 AWS Lambda 函數區塊在函數輸入參數區段中定義的任何其他屬性。

​以下是對​ Lambda 函數的 JSON 請求範例:

{ "Details": { "ContactData": { "Attributes": { "exampleAttributeKey1": "exampleAttributeValue1" }, "Channel": "VOICE", "ContactId": "4a573372-1f28-4e26-b97b-XXXXXXXXXXX", "CustomerEndpoint": { "Address": "+1234567890", "Type": "TELEPHONE_NUMBER" }, "CustomerId": "someCustomerId", "Description": "someDescription", "InitialContactId": "4a573372-1f28-4e26-b97b-XXXXXXXXXXX", "InitiationMethod": "INBOUND | OUTBOUND | TRANSFER | CALLBACK", "InstanceARN": "arn:aws:connect:aws-region:1234567890:instance/c8c0e68d-2200-4265-82c0-XXXXXXXXXX", "LanguageCode": "en-US", "MediaStreams": { "Customer": { "Audio": { "StreamARN": "arn:aws:kinesisvideo::eu-west-2:111111111111:stream/instance-alias-contact-ddddddd-bbbb-dddd-eeee-ffffffffffff/9999999999999", "StartTimestamp": "1571360125131", // Epoch time value "StopTimestamp": "1571360126131", "StartFragmentNumber": "100" // Numberic value for fragment number } } }, "Name": "ContactFlowEvent", "PreviousContactId": "4a573372-1f28-4e26-b97b-XXXXXXXXXXX", "Queue": { "ARN": "arn:aws:connect:eu-west-2:111111111111:instance/cccccccc-bbbb-dddd-eeee-ffffffffffff/queue/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", "Name": "PasswordReset" "OutboundCallerId": { "Address": "+12345678903", "Type": "TELEPHONE_NUMBER" } }, "References": { "key1": { "Type": "url", "Value": "urlvalue" } }, "SystemEndpoint": { "Address": "+1234567890", "Type": "TELEPHONE_NUMBER" } }, "Parameters": {"exampleParameterKey1": "exampleParameterValue1", "exampleParameterKey2": "exampleParameterValue2" } }, "Name": "ContactFlowEvent" }

​該請求分為兩個部分:

  • 聯絡資料 – 這是每個聯絡都會由 Amazon Connect 傳遞。部分參數是選用的。

    此區段可能包括之前與聯絡人關聯的屬性,例如在流程中使用設定聯絡人屬性區塊時。​如果沒有任何已儲存的屬性,此對應可能是空的。

    下圖顯示這些屬性在設定連絡人屬性的屬性頁面中的顯示位置。

    設定聯絡屬性區塊的屬性頁面。
  • 參數 – 這些參數專屬於此呼叫,在您建立 Lambda 函數時​即已定義。下圖顯示這些參數在調用 AWS Lambda 函數區塊屬性頁面中的顯示位置。

    調用 AWS Lambda 函數區塊中的函數輸入參數。

調用 Lambda 區塊可以接收 JSON 格式的輸入參數,同時容納基本資料類型和巢狀 JSON。以下是可在調用 Lambda 區塊中使用的 JSON 輸入範例。

{ "Name": "Jane", "Age":10, "isEnrolledInSchool": true, "hobbies": { "books":["book1", "book2"], "art":["art1", "art2"] } }

呼叫重試政策

如果流程中的 Lambda 呼叫受到調節,就會重試請求。如果發生一般服務故障 (500 錯誤),也會重試請求。

當同步調用傳回錯誤時,Amazon Connect 最多會重試 3 次,最長 8 秒。此時,流程會進入錯誤分支。

若要進一步了解 Lambda 如何重試,請參閱 AWS Lambda 中的錯誤處理和自動重試

調用多個 Lambda 函數

當 Lambda 函數執行時,客戶不會收到通知。我們建議在函數之間加入播放提示區塊,持續讓客戶保持參與,並感受長時間互動。

設定您的 Lambda 函數以剖析事件

​若要在您的 Lambda 函數與 Amazon Connect 之間成功傳遞屬性,請將您的函數設定為正確剖析調用 AWS Lambda 函數區塊或設定聯絡屬性傳送的 JSON 請求,並定義任何應套用的商業邏輯。JSON 如何剖析,取決於您函數使用的執行時間。

例如,以下程式碼顯示如何使用 Node.JS 從調用 AWS Lambda 函數區塊存取 exampleParameterKey1 和從設定聯絡屬性區塊存取 exampleAttributeKey1

exports.handler = function(event, context, callback) { // Example: access value from parameter (Invoke AWS Lambda function) let parameter1 = event['Details']['Parameters']['exampleParameterKey1']; // Example: access value from attribute (Set contact attributes block) let attribute1 = event['Details']['ContactData']['Attributes']['exampleAttributeKey1']; // Example: access customer's phone number from default data let phone = event['Details']['ContactData']['CustomerEndpoint']['Address']; // Apply your business logic with the values // ... }

驗證函數回應​

提示

在流程中不支援參考陣列。陣列只能在另一個 Lambda 函數中使用。

Lambda 函數回應可以是 STRING_MAP 或 JSON,並且必須在流程中設定 Invoke AWS Lambda function (調用 Lambda 函數區塊) 時進行設定。如果回應驗證設為 STRING_MAP,則 Lambda 函數應該傳回字串類型鍵/值對的一般物件。否則,如果回應驗證設為 JSON,則 Lambda 函數可以傳回任何有效的 JSON,包括巢狀 JSON。

突出顯示字串對應或 json 使用的調用 AWS Lambda 函數流程區塊。

Lambda 回應可以高達 32 KB。如果您無法連接 Lambda、函數出現例外狀況、回應無法了解​,或 Lambda 函數所需時間超過限制,聯絡流程會跳至 Error 標籤。

測試您 Lambda 函數傳回的輸出,確認它在傳回 Amazon Connect 時會被正確使用。​以下範例顯示 Node.JS 的回應範例:

exports.handler = function(event, context, callback) { // Extract data from the event object let phone = event['Details']['ContactData']['CustomerEndpoint']['Address']; // Get information from your APIs let customerAccountId = getAccountIdByPhone(phone); let customerBalance = getBalanceByAccountId(customerAccountId); let resultMap = { AccountId: customerAccountId, Balance: '$' + customerBalance, } callback(null, resultMap); }

此範例顯示使用 Python 的回應範例:

def lambda_handler(event, context): // Extract data from the event object phone = event['Details']['ContactData']['CustomerEndpoint']['Address'] // Get information from your APIs customerAccountId = getAccountIdByPhone(phone) customerBalance = getBalanceByAccountId(customerAccountId) resultMap = { "AccountId": customerAccountId, "Balance": '$%s' % customerBalance } return resultMap

從函數傳回的輸出必須為一般物件 (flat object) 的鍵值對​,其中的值僅能包含英數字元、破折號及底線。傳回資料的大小必須為小於​ 32 KB 的 UTF-8 資料。

​以下範例為這些 Lambda 函數的 JSON 輸出:

{ "AccountId": "a12345689", "Balance": "$1000" }

如果回應驗證設為 JSON,那麼 Lambda 函數甚至可以傳回巢狀 JSON,例如:

{ "Name": { "First": "John", "Last": "Doe" }, "AccountId": "a12345689", "OrderIds": ["x123", "y123"] }

只要它們是簡單的鍵值對,您可以傳回任何結果。

使用 Lambda 函數回應

有兩種方式可在您的流程中使用函數回應。​ 您可以直接參考 Lambda 傳回的變數,或將函數傳回的數值存放為聯絡屬性,然後參考存放的屬性。​ 對 Lambda 函數的回應使用外部參考​時,參考會一律從最新調用的函數接收回應。若要在後續函數叫用前使用函數的回應,回應必須儲存為聯絡屬性,或以參數形式傳遞至下一個函數。​

1. 直接存取變數

​如果您直接存取變數,可以在流程區塊中使用它們,但它們不會包含在聯絡記錄中。若要在流程區塊中直接存取這些變數,請將區塊新增在調用 AWS Lambda 函數區塊之後,然後按照下列範例參考這些屬性:

Name - $.External.Name Address - $.External.Address CallerType - $.External.CallerType

下圖顯示播放提示區塊的屬性頁面。這些變數會在文字轉語音區塊中指定。

播放提示區塊的屬性頁面。

​確認在來源屬性中指定的名稱與 Lambda 回傳的金鑰名稱相同。

2. 將變數存為聯絡屬性​

如果您將變數存放為聯絡屬性,則可以在流程任何地方使用這些屬性,而且它們會包含在聯絡紀錄中​。

若要儲存傳回為聯絡屬性的值然後進行參考,請在調用 AWS Lambda 函數區塊之後使用流程中的設定聯絡屬性區塊。針對類型選擇使用屬性外部。按照我們使用的範例,將目標屬性設為 MyAccountId,並將屬性設為 AccountId,並為 MyBalance平衡執行相同的操作。此組態顯示於下圖中。

設定聯絡屬性區塊的屬性頁面。

將地址新增為來源屬性,並用 returnedContactAddress 作為目標金鑰。然後新增 CallerType 作為來源屬性,並將 returnedContactType 用於目標鍵,如下圖所示。

播放提示區塊的屬性頁面。

​確認在來源外部屬性中指定的名稱與 Lambda 回傳的金鑰名稱相同。

教學課程:建立 Lambda 函數並在流程中調用

步驟 1:建立 Lambda 範例

  1. 請登入 AWS Management Console,並開啟位於 https://console.aws.amazon.com/lambda/ 的 AWS Lambda 主控台。

  2. 在 AWS Lambda 中選擇建立函數

  3. 如果尚未選擇,請選擇從頭開始撰寫。在基本資訊下的函數名稱輸入 MyFirstConnectLambda。針對所有其他選項,請接受預設值。這些選項顯示在 AWS Lambda 主控台的下圖中。

    AWS Lambda 主控台。
  4. 選擇建立函數

  5. 程式碼原始碼方塊的 index.js 索引標籤中,刪除程式碼編輯器中的範本程式碼。

  6. 複製下列程式碼並貼至程式碼編輯器,如下圖所示:

    程式碼原始碼區段的部署按鈕。
    exports.handler = async (event, context, callback) => { // Extract information const customerNumber = event.Details.ContactData.CustomerEndpoint.Address; const companyName = event.Details.Parameters.companyName; // Fetch data const balance = await fetchBalance(customerNumber, companyName); const support = await fetchSupportUrl(companyName); // Prepare result const resultMap = { customerBalance: balance, websiteUrl: support } callback(null, resultMap); } async function fetchBalance(customerPhoneNumber, companyName) { // Get data from your API Gateway or Database like DynamoDB return Math.floor(Math.random() * 1000); } async function fetchSupportUrl(companyName) { // Get data from your API Gateway or Database like DynamoDB return 'www.GGG.com/support'; }

    此程式碼將為 customerBalance 產生隨機結果。

  7. 選擇部署

  8. 選擇部署後,請選擇測試以啟動測試編輯器。

  9. 設定測試事件對話方塊中,選擇建立新事件。在事件名稱中,輸入 ConnectMock 做為測試名稱。

  10. 事件 JSON 方塊中,刪除範例程式碼並改為輸入下列程式碼。

    { "Details": { "ContactData": { "Attributes": {}, "Channel": "VOICE", "ContactId": "4a573372-1f28-4e26-b97b-XXXXXXXXXXX", "CustomerEndpoint": { "Address": "+1234567890", "Type": "TELEPHONE_NUMBER" }, "InitialContactId": "4a573372-1f28-4e26-b97b-XXXXXXXXXXX", "InitiationMethod": "INBOUND | OUTBOUND | TRANSFER | CALLBACK", "InstanceARN": "arn:aws:connect:aws-region:1234567890:instance/c8c0e68d-2200-4265-82c0-XXXXXXXXXX", "PreviousContactId": "4a573372-1f28-4e26-b97b-XXXXXXXXXXX", "Queue": { "ARN": "arn:aws:connect:eu-west-2:111111111111:instance/cccccccc-bbbb-dddd-eeee-ffffffffffff/queue/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", "Name": "PasswordReset" }, "SystemEndpoint": { "Address": "+1234567890", "Type": "TELEPHONE_NUMBER" } }, "Parameters": { "companyName": "GGG" } }, "Name": "ContactFlowEvent" }
  11. 選擇儲存

  12. 選擇 測試。您應該會看到類似下列影像的內容:

    程式碼原始碼區段的測試按鈕。

    您的餘額將不同。產生亂數的原始碼。

步驟 2:將 Lambda 新增到 Amazon Connect

  1. 前往 Amazon Connect 主控台:https://console.aws.amazon.com/connect/

  2. 選擇您的 Amazon Connect 執行個體別名。

    Amazon Connect 虛擬聯絡中心執行個體頁面、執行個體別名。
  3. 在導覽功能表中,選擇流程

  4. 在 AWS Lambda 區段中,使用 Lambda 函數下拉式方塊以選擇 MyFirstConnectLambda

    流程頁面,AWS Lambda 區段。
  5. 選擇新增 Lambda 函數

步驟 3:建立聯絡流程

以下影像是您要使用此程序中的步驟建置的流程範例。它包含以下區塊:設定聯絡屬性播放提示調用 AWS Lambda 函數,另一個設定聯絡屬性區塊、另一個播放提示塊,最後是中斷連線區塊。

呼叫調用 AWS Lambda 函數區塊的流程。
  1. 登入 Amazon Connect 管理網站 https://instance name.my.connect.aws/。

  2. 在導覽功能表中,移至路由流程建立連絡流程

  3. 設定聯絡屬性 區塊拖曳到網格上,並設定其屬性頁面,如下圖所示:

    ​設定聯絡屬性區塊。
    1. 命名空間 = 使用者定義

    2. 屬性 = companyName

    3. 選擇手動設定 = GGG

    4. 選擇儲存

  4. 播放提示 區塊拖曳到網格上,並設定其屬性頁面,如下圖所示:

    播放提示區塊。
    1. 選擇文字轉語音或聊天文字手動設定,並將解譯為設為 SSML。在要朗讀文字的方塊中輸入下列文字:

      Hello, thank you for calling $.Attributes.companyName inc.

    2. 選擇儲存

  5. 將另一個 播放提示 區塊拖曳到網格上,並設定其屬性頁面,如下圖所示:

    播放提示區塊。
    1. 選擇文字轉語音或聊天文字手動設定,並將解譯為設為文字。在要朗讀文字的方塊中輸入下列文字:

      Please try again later.

    2. 選擇儲存

  6. 叫用 AWS Lambda 函式 區塊拖曳到網格上,並設定其屬性頁面,如下圖所示:

    調用 AWS Lambda 函數區塊。
    1. 選擇手動選擇,然後從下拉式清單中選擇 MyFirstConnectLambda

    2. 目的地金鑰方塊中,輸入 companyName。(這會被傳送到 Lambda。)

    3. 選擇動態設定方塊

    4. 對於命名空間,選擇使用者定義

    5. 對於屬性,輸入 companyName

    6. 選擇儲存

  7. 設定聯絡屬性 區塊拖曳到網格上,並選擇新增另一屬性,然後設定其屬性頁面,如下圖所示:

    ​設定聯絡屬性區塊。
    1. 命名空間 = 使用者定義屬性 = MyBalance

    2. 選擇動態設定

    3. 命名空間 = 外部

    4. 屬性 = customerBalance。這是來自 Lambda 的結果。

    5. 選擇 新增其他屬性

    6. 命名空間 = User-defined

    7. 屬性 = MyURL

    8. 選擇動態設定命名空間 = 外部

    9. 屬性 = websiteUrl。這是來自 Lambda 的結果。

    10. 選擇儲存

  8. 播放提示 區塊拖曳到網格上,並設定其屬性頁面,如下圖所示:

    播放提示區塊。
    1. 選擇文字轉語音或聊天文字,並將解譯為設定為 SSML。將以下文字輸入方塊:

      Your remaining balance is <say-as interpret-as="characters">$.Attributes.MyBalance</say-as>.

      Thank you for calling $.Attributes.companyName.

      Visit $.Attributes.MyURL for more information.

    2. 選擇儲存

  9. 中斷連線 / 掛斷 區塊拖曳到網格上。

  10. 連接所有區塊,使您的流程看起來像此程序頂部顯示的影像。

  11. 輸入 MyFirstConnectFlow 作為名稱,然後選擇發佈

  12. 在導覽功能表中,請前往頻道電話號碼

  13. 請選擇您的電話號碼。

  14. 選擇 MyFirstConnectFlow,然後選擇儲存

現在嘗試一下。撥打該電話號碼。您應該聽到一條問候訊息,您的餘額,以及要造訪的網站。