AmazonConnect、同時に話せる人数をシステムで制御する

Amazon Connect / Lex / Bedrock
  1. 【STEP順に解説】
    1. 🥇STEP 1:DynamoDBテーブルの作成
    2. 🥈STEP 2:Lambda関数の作成(CallLimitChecker)
    3. 🥉STEP 3:EventBridge ルールの作成
    4. 🏅STEP 4:Lambda関数の作成(CallCounterUpdater)
    5. 🛠STEP 5:Amazon Connect フロー修正
    6. 🔁まとめ:構築手順の順番
  2. 🥇STEP 1:DynamoDB テーブルの作成手順
    1. ①「テーブルの作成」ボタンをクリック
    2. ② テーブル設定画面で以下のように入力します
    3. ③ 「テーブルの作成」ボタンを押す
    4. ④ 初期データを1件登録(通話中件数=0)
    5. 📌 注意
    6. ✅ここまでで完了すべき状態
  3. 🥈 Step 2:Lambda関数「CallLimitChecker」の作成
    1. ① 関数作成画面を開く
    2. ② 各種設定を入力
    3. ③ 「関数の作成」ボタンをクリック
    4. Lambda 関数コード(Node.js 版)
    5. ✅ 注意点
    6. Deploy(デプロイ)
      1. Lambda関数「CallLimitChecker」が正常に更新(=デプロイ)された
      2. Node.js(index.mjs)ファイルが正しく編集されている
      3. Lambdaの準備は完了している
    7. ✅ その後の手順
  4. CallLimitChecker関数の実行ロールに DynamoDB 読み取り権限を追加する
    1. STEP 1:実行ロールの IAM 画面へ移動
    2. STEP 2:ポリシーの追加
  5. 🏅STEP 3:Lambda関数の作成(CallCounterUpdater)
    1. この関数の役割
    2. Lambda 関数の作成
    3. 実行ロールの IAM 画面へ移動
    4. ポリシーの追加
    5. Lambda 関数コード(Node.js 版)
    6. Deploy(デプロイ)
    7. 🔄 実際のイベントの流れ
  6. 🧷 Lambda 関数を Amazon Connect 側で認識させるためのアクセス権限追加(CLI)
    1. 🔧 CLIによる “AWS:SourceAccount” 条件付きの許可追加
  7. 🥉STEP 4:EventBridge ルールの作成
    1. 目的
    2. 準備しておくべきもの(事前チェック)
    3. EventBridge ルールの作成
      1. ① EventBridge へ移動
    4. ルールの詳細を定義
    5. イベントパターンを構築
      1. 🔍 それぞれの意味
    6. ターゲットを選択(呼び出す処理)を設定
    7. レビューと作成
    8. 作成を完了
  8. 🛠 STEP 5:Amazon Connect フロー修正(通話開始・終了でDynamoDBを更新)
    1. 🎯 目的:
    2. 構成手順
    3. 注意ポイント
    4. フロー確認が終わったら

【STEP順に解説】

🥇STEP 1:DynamoDBテーブルの作成

▶️ 目的:通話中の件数を記録する場所を準備します。

  • テーブル名例:CallSessionCounter
  • パーティションキー例:counterType(例:値は “activeCalls” など)
  • 初期データ:counterType = activeCalls、count = 0(初期値)

🥈STEP 2:Lambda関数の作成(CallLimitChecker)

▶️ 目的:着信時に通話中件数を確認して「受ける or 切る」判断をします。

  • DynamoDB を読み取り、
  • 2件以上なら disconnect を返す、
  • 少なければ success を返す。

※この Lambda は Amazon Connect フローから呼び出すことになります。

🥉STEP 3:EventBridge ルールの作成

▶️ 目的:「通話開始・通話終了」イベントをキャッチする仕組みです。

  • イベントパターン(Amazon Connect の通話イベント)
  • ターゲットに後述の Lambda(CallCounterUpdater)を指定

🏅STEP 4:Lambda関数の作成(CallCounterUpdater)

▶️ 目的:通話イベントを元に DynamoDB の件数を「+1 / -1」更新します。

  • EventBridge から渡されたイベントを解析
  • 開始なら +1、終了なら -1 を DynamoDB に反映

🛠STEP 5:Amazon Connect フロー修正

▶️ 目的:フロービルダーに CallLimitChecker を呼び出す処理を追加

  • 「Invoke AWS Lambda 関数」ブロックを使用
  • Lambda の返り値が disconnect なら「切断ブロック」へ分岐

🔁まとめ:構築手順の順番

  1. DynamoDB テーブル作成
  2. CallLimitChecker Lambda 作成(+ DynamoDB読み取りIAM)
  3. EventBridge ルール作成
  4. CallCounterUpdater Lambda 作成(+ DynamoDB書き込みIAM)
  5. Amazon Connect フロー修正で Lambda 呼び出し追加

🥇STEP 1:DynamoDB テーブルの作成手順

①「テーブルの作成」ボタンをクリック

👉 右側にあるオレンジ色の「テーブルの作成」ボタンを押してください。

② テーブル設定画面で以下のように入力します

項目名入力内容(例)
テーブル名CallSessionCounter(任意ですが、わかりやすい名前に)
パーティションキーcounterType(文字列型・String のままでOK)
ソートキー不要(☑チェックしない)

「オンデマンド(デフォルト)」の読み書き容量設定のままで大丈夫です。

③ 「テーブルの作成」ボタンを押す

画面下部の「テーブルの作成」をクリックすると、数秒でテーブルが作成されます。

④ 初期データを1件登録(通話中件数=0)

作成後、テーブルを開いて「項目を探索」ボタンをクリックし、以下のデータを入れてください。

  1. 作成した CallSessionCounter をクリックして中に入る
  2. 左メニューの「項目を探索」または「項目」をクリック
  3. 画面上部の「項目の作成」ボタンをクリック
属性名タイプ
counterType文字列(S)activeCalls
count数値(N)0

countは、新しい属性の追加から追加してください。

📌 注意

  • counterType は パーティションキーなので必須です。
  • count は現在の通話件数として使います。

✅ これにより、Lambda が通話件数を確認できる状態になります。

✅ここまでで完了すべき状態

  • テーブル:CallSessionCounter
  • パーティションキー:counterType
  • 登録データ:{ counterType: “activeCalls”, count: 0 }

🥈 Step 2:Lambda関数「CallLimitChecker」の作成

Amazon Connect での着信時に、同時通話数(例:2件)を超えていたら切断させる処理を行うための Lambda 関数「CallLimitChecker」を作成します。
この関数は DynamoDB の通話件数をチェックして、disconnect または continue のフラグを返す役割を担います。

① 関数作成画面を開く

  1. AWSコンソール > Lambda にアクセス
  2. オレンジ色の「関数の作成」をクリック
  3. 「一から作成」を選択

② 各種設定を入力

項目入力値
関数名CallLimitChecker
ランタイムNode.js 20.x
アーキテクチャx86_64(そのままでOK)

③ 「関数の作成」ボタンをクリック

これで Lambda 関数の作成は完了です。

Lambda 関数コード(Node.js 版)

以下のコードを index.mjs に貼り付け、左下の「Deploy(Ctrl + Shift + U)」をクリックしてください。

import { DynamoDBClient, GetItemCommand } from "@aws-sdk/client-dynamodb";

const client = new DynamoDBClient({ region: "ap-southeast-2" }); // シドニー

export const handler = async (event) => {
  const params = {
    TableName: "CallSessionCounter",
    Key: {
      counterType: { S: "activeCalls" },
    },
  };

  try {
    const data = await client.send(new GetItemCommand(params));
    const count = data.Item?.count?.N ? parseInt(data.Item.count.N, 10) : 0;

    if (count >= 2) {
      return { action: "disconnect" };
    } else {
      return { action: "continue" };
    }
  } catch (err) {
    console.error("DynamoDBエラー:", err);
    return { action: "error", message: "DynamoDBアクセス失敗" };
  }
};
JavaScript

✅ 注意点

  • リージョンConnectと同じ「ap-southeast-2(シドニー)、ap-northeast-1(東京)」など にしてください。
  • DynamoDBテーブル名が違う場合は “CallSessionCounter” を変更してください。
  • 貼り付けたら「Deploy(デプロイ)」を必ず実行してください。

Deploy(デプロイ)

左下の「Deploy(Ctrl + Shift + U)」をクリック。

これで変更内容が Lambda に反映されます。

Lambda関数「CallLimitChecker」が正常に更新(=デプロイ)された

  • 緑のメッセージ「関数 CallLimitChecker が正常に更新されました」が表示されている。
  • これは、コードの変更内容が AWS に反映された状態であることを意味します。

Node.js(index.mjs)ファイルが正しく編集されている

  • index.mjs ファイルが開かれており、Node.js形式の Lambda 関数として正しい構成。
  • DynamoDBClient や GetItemCommand のインポート、非同期関数なども確認済み。

Lambdaの準備は完了している

  • つまり、Amazon Connect フローからこの関数を呼び出せる状態にあるということです。
  • DynamoDB の count 値によって “disconnect” または “continue” を返す準備が整っています。
  1. Create new test event」が表示されるので、以下のように入力:
項目入力内容
Event NameTestEvent(任意)
Event sharingPrivate(既定のままでOK)
TemplateHello World(そのままでOK)
Event JSON{}(空オブジェクト) に変更する! ※ここが重要

※Event JSONは “key1”: “value1” などが入っているため、それをすべて削除して {} にしてください。

✅ その後の手順

  • 右上の「Save(保存)」をクリック
  • 続けて「Test(テスト)」を実行
  • 結果として {“action”:”continue”} が返れば 成功

(※DynamoDBの count が 0 のため)

CallLimitChecker関数の実行ロールに DynamoDB 読み取り権限を追加する

テストした際に、エラーになったら、権限を追加してください。

Lambda関数がDynamoDBのデータを読み取れるようにするには、関数に関連付けられた実行ロールに、読み取り権限(ポリシー)を追加する必要があります。これは関数本体ではなく、実行ロール側への設定です。

「関数」ではなく「ロール」(=Lambda関数の実行ロール)に対して

「ポリシー」(=DynamoDBアクセス許可)を追加する作業中です

STEP 1:実行ロールの IAM 画面へ移動

  1. Lambda 関数「CallLimitChecker」の「設定」タブを開く(画像の通り)
  2. 設定→アクセス権限をクリック
  3. 実行ロール」欄の青文字リンク(例:CallLimitChecker-role-2uc84nai)をクリック

STEP 2:ポリシーの追加

  • IAM ロールの画面が開いたら、「許可を追加」をクリック
  • 「ポリシーをアタッチ」を選択
  • 検索ボックスに入力「AmazonDynamoDBReadOnlyAccess」
  • チェックを入れて「次へ」→「許可を追加」で完了

再度 テスト動作確認 を行うと、 {“action”:”continue”} が返ります。

🏅STEP 3:Lambda関数の作成(CallCounterUpdater)

このステップでは、Amazon Connect の通話イベント(開始・終了)をトリガーとして、DynamoDB の通話中件数を更新する Lambda 関数を作成します。

この関数の役割

  • イベント発生元:Amazon EventBridge(通話の開始・終了)
  • 処理内容:
    • 通話開始 → カウントを +1
    • 通話終了 → カウントを -1
  • データ保存先:DynamoDB(counterType = “activeCalls”)

Lambda 関数の作成

  1. AWSマネジメントコンソール > Lambda > 関数の作成
  2. 「一から作成」を選択
  3. 関数名:CallCounterUpdater(任意名でOK)
  4. ランタイム:Node.js 20.x(※Node.js希望のため)
  5. アーキテクチャ:x86_64
  6. 関数の作成をクリック。

実行ロールの IAM 画面へ移動

  1. Lambda 関数「CallCounterUpdater」の「設定」タブを開く
  2. 設定→アクセス権限をクリック
  3. 実行ロール」欄の青文字リンク(例:CallCounterUpdater-role-2uc84nai)をクリック

ポリシーの追加

  • IAM ロールの画面が開いたら、「許可を追加」をクリック
  • 「ポリシーをアタッチ」を選択
  • 検索ボックスに入力「AmazonDynamoDBFullAccess」
  • チェックを入れて「次へ」→「許可を追加」で完了

Lambda 関数コード(Node.js 版)

以下のコードを index.mjs に貼り付け、左下の「Deploy(Ctrl + Shift + U)」をクリックしてください。

import { DynamoDBClient } from "@aws-sdk/client-dynamodb";
import { DynamoDBDocumentClient, UpdateCommand } from "@aws-sdk/lib-dynamodb";

const client = new DynamoDBClient();
const dynamo = DynamoDBDocumentClient.from(client);

const TABLE_NAME = 'CallSessionCounter';
const COUNTER_ID = 'activeCalls';

export const handler = async (event) => {
    console.log("Received event:", JSON.stringify(event, null, 2));

    const detail = event.detail;
    const instanceEventType = detail?.eventType;

    let updateValue = 0;

    if (instanceEventType === 'CONNECT_CONTACT_CONNECTED') {
        updateValue = 1;
    } else if (instanceEventType === 'CONNECT_CONTACT_DISCONNECTED') {
        updateValue = -1;
    } else {
        console.log("Unhandled event type. Skipping.");
        return { statusCode: 200, body: 'Ignored event' };
    }

    try {
        const params = new UpdateCommand({
            TableName: TABLE_NAME,
            Key: { counterType: COUNTER_ID },
            UpdateExpression: 'ADD #count :value',
            ExpressionAttributeNames: { '#count': 'count' },
            ExpressionAttributeValues: { ':value': updateValue },
        });

        await dynamo.send(params);
        return { statusCode: 200, body: 'Counter updated.' };
    } catch (err) {
        console.error("DynamoDB update failed:", err);
        return { statusCode: 500, body: 'Error updating counter.' };
    }
};
JavaScript

Deploy(デプロイ)

  • 左下の「Deploy(Ctrl + Shift + U)」をクリック。
  • これで変更内容が Lambda に反映されます。
  • 「Create new test event」が表示されているので、テストイベントを行います。
  • 右上の「Save(保存)」をクリック
  • 続けて「Test(テスト)」を実行
項目入力内容
Event NameTestEvent(任意)
Event sharingPrivate(既定のままでOK)
TemplateHello World(そのままでOK)
Event JSON{}(空オブジェクト) に変更する! ※ここが重要

今回のテストは、Event JSONの項目は空欄にしません。

{
  "detail": {
    "eventType": "CONNECT_CONTACT_CONNECTED"
  }
}
JSON

通話中のテストイベント。

{
  "detail": {
    "eventType": "CONNECT_CONTACT_DISCONNECTED"
  }
}
JSON

接続のテストイベント。

🔄 実際のイベントの流れ

  1. お客様が Amazon Connect に発信
  2. Amazon Connect が Contact を作成
  3. EventBridge で CONNECT_CONTACT_CONNECTED イベントが発生
  4. EventBridge ルールが Lambda をトリガー
  5. CallCounterUpdater Lambda 関数が DynamoDB を +1 更新
  6. お客様とオペレーターの通話が行われる
  7. 通話が終了(切断)
  8. EventBridge で CONNECT_CONTACT_DISCONNECTED イベントが発生
  9. 同じ EventBridge ルールが Lambda を再トリガー
  10. CallCounterUpdater Lambda 関数が DynamoDB を -1 更新

🧷 Lambda 関数を Amazon Connect 側で認識させるためのアクセス権限追加(CLI)

Amazon Connect では、フローエディタ上で Lambda 関数を使用する際、内部的に lambda:ListFunctions とリソースベースポリシーの検査が行われます。特に AWS Organizations 環境やセキュリティ制限の厳しいアカウントでは、
リソースベースポリシーに “AWS:SourceAccount” 条件が含まれていないと、Lambda関数がフローエディタ上に表示されない問題が発生することがあります。

🔧 CLIによる “AWS:SourceAccount” 条件付きの許可追加

この条件は GUI からは追加できないため、AWS CLI にて以下のコマンドを実行します。

aws lambda add-permission ^
  --function-name CallCounterUpdater ^
  --statement-id AllowExecutionFromConnectWithSourceAccount ^
  --action lambda:InvokeFunction ^
  --principal connect.amazonaws.com ^
  --source-arn arn:aws:connect:ap-southeast-2:404267024263:instance/0301b3b3-0a33-47af-9d9c-6dc51a995446 ^
  --source-account 404267024263 ^
  --region ap-southeast-2
Bash
aws lambda add-permission ^
  --function-name CallCounterUpdater ^
  --statement-id AllowConnectInvoke ^
  --action lambda:InvokeFunction ^
  --principal connect.amazonaws.com ^
  --source-account <AWSアカウントID> ^
  --source-arn arn:aws:connect:<リージョン>:<AWSアカウントID>:instance/<インスタンスID>
Bash

この設定を行うことで、Amazon Connect フローエディタ上で Lambda 関数が選択可能な状態になります。

🥉STEP 4:EventBridge ルールの作成

Lambda が自動で DynamoDB の件数を更新できるよう、Amazon Connect の通話イベント(通話開始・通話終了)をトリガーとして検出する仕組みを作ります。

その仕組みこそが「EventBridge ルール」です。

目的

  • Amazon Connect で通話が 始まったとき → count を +1
  • 通話が 終了したとき → count を -1

このような更新処理を行うために、Connectイベントを自動で Lambda に渡す設定を行います。

準備しておくべきもの(事前チェック)

要素内容
Connectのインスタンス正しく作成済みであること(リージョン一致)
Lambda関数「CallCounterUpdater」が未作成であれば後で作成
イベントソースAmazon Connect

EventBridge ルールの作成

① EventBridge へ移動

  1. AWS マネジメントコンソールで「EventBridge」を検索
  2. 左メニューから「ルール」をクリック
  3. オレンジ色の「ルールを作成」ボタンをクリック

ルールの詳細を定義

  1. 名前
     ConnectCallEventsRule など任意の名称
  2. 説明
     例:Amazon Connect の通話開始・終了イベントを検出
  3. イベントバス
     default(既定のままでOK)
  4. 選択したイベントバスでルールを有効にする
     ✅ チェックされた状態でOK
  5. ルールタイプ
     イベントパターンを持つルール
  6. 次へ

イベントパターンを構築

  1. イベントパターン↠カスタムパターン (JSON エディタ)。を選択。
  2. イベントがその他になります。

カスタムJSONで正しいイベントパターンを手動で入力します。

{
  "source": ["aws.connect"],
  "detail-type": [
    "Contact initiated",
    "Contact disconnected"
  ]
}
JSON

🔍 それぞれの意味

フィールド説明
sourceイベント発信元が Amazon Connect(=aws.connect)であることを指定
detail-typeイベントの種類。今回は2つの通話イベントに反応させる:
・Contact initiated(通話開始)
・Contact disconnected(通話終了)

右下の「次へ」ボタンをクリック。

ターゲットを選択(呼び出す処理)を設定

  1. ターゲットタイプ
     → 「AWSのサービス」にチェック(※すでに選択済み)
  2. ターゲットを選択
     → プルダウンから「Lambda関数」を選択
  3. 関数(Lambda関数)
     → 「CallCounterUpdater」(事前に作成している想定)を選択
  4. 許可(IAMロール)
     → 実行ロールを使用(推奨) にチェックを入れる(※デフォルトでONのことが多い)
  5. 実行ロール
     → 「この特定のリソースについて新しいロールを作成」を選択
     → 自動生成されたロール名(例:Amazon_EventBridge_Invoke_Lambda_1659983559)が表示される
     → このままでOK
  6. 次へ
  • ここで選ぶ関数は、Connectの通話イベントを受けて DynamoDB のカウントを +1 / -1 する処理を行う CallCounterUpdater Lambda です。
  • 関数がまだ無ければ、先に作成しておく必要があります。

※タグの設定は特に必要ないので、次へ。

レビューと作成

個々の画面でも設定することはないので、確認のみします。「ルールの作成」 をクリック。

作成後は以下の確認をおすすめします。

  1. EventBridge → ルール一覧で(ConnectCallEventsRule)「有効」になっているか確認
  2. Amazon Connect で実際に着信イベントがトリガーされるかテスト
  3. CloudWatch Logs で Lambda の動作を確認(DynamoDB 更新確認も)

作成を完了

ルールの作成」を押して完了
これで Amazon Connect の通話イベントが、自動で Lambda に流れるようになります。

🛠 STEP 5:Amazon Connect フロー修正(通話開始・終了でDynamoDBを更新)

🎯 目的:

Amazon Connect で発生する「通話開始(CONNECT_CONTACT_CONNECTED)」および「通話終了(CONNECT_CONTACT_DISCONNECTED)」イベントに応じて、DynamoDB のカウントを +1 / -1 する処理を正しく機能させるために、フローを調整してイベントが発火するように構成します。

構成手順

  1. Amazon Connect 管理画面へアクセス
  2. 「フロー」から対象のコンタクトフロー(例:問い合わせフロー)を選択
  3. 以下の2つの条件を満たすように構成を調整
    • フロー開始時に「CONNECT_CONTACT_CONNECTED」イベントが発生するようにする(例:問い合わせ受付の開始)
    • フロー終了時(切断時)に「CONNECT_CONTACT_DISCONNECTED」イベントが発生するようにする(例:切断やフローの終了)
  4. 不要なエラーブロックや未完了の分岐がないか確認
    • イベントが発火しない原因になる可能性があります

注意ポイント

項目内容
「人員の確認」ブロック等を利用する場合キューに入る or 対応エージェントの有無でフローが分岐しても、開始時点でイベントが発生します(CONNECT_CONTACT_CONNECTED)
フローが切断される条件「切断」ブロックや「オペレーター対応後に通話が終了」など、終了条件を明確にし、CONNECT_CONTACT_DISCONNECTED が発火するようにします
デバッグ実際の通話後、Lambda(CallCounterUpdater)の CloudWatch Logs で Received event: ログが出ているか確認

フロー確認が終わったら

  • EventBridge のルールが「有効」
  • Lambda に AmazonDynamoDBFullAccess または最小権限のポリシーが付与済み
  • DynamoDB のテーブルとカウンター項目(例:activeCalls)が作成済み

これで構成はすべて完了です。


必要であれば、「構成図」や「動作確認手順」もあわせてお出しできます。希望があればお知らせください。

タイトルとURLをコピーしました