

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon Chime SDK PTSN オーディオの進行中の通話の更新
<a name="update-sip-call"></a>

PSTN オーディオサービスの一部として、SIP メディアアプリケーションでは、着信通話や DTMF ディジットなどの通話イベントに基づいてユーザー定義の Lambda 関数を呼び出すことで、通話で実行されるアクションを設定できます。[https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_UpdateSipMediaApplicationCall.html](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_UpdateSipMediaApplicationCall.html) API を使用すると、通話がアクティブであればいつでも Lambda 関数をトリガーして、この呼び出しによって返された新しいアクションで現在のアクションを置き換えることができます。

**ワークフロー**  
[https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_UpdateSipMediaApplicationCall.html](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_UpdateSipMediaApplicationCall.html) API は、会議への参加者の追加、ユーザーのミュート/ミュート解除、接続解除など、さまざまな場面で使用できます。以下のユースケースでは、一般的なワークフローについて説明しています。

Amazon Chime SDK が会議をセットアップしている間、ユーザーは電話をかけたり音楽を聴いたりしています。セットアップが完了すると、Amazon Chime SDK は音声を停止し、発信者を会議に参加させます。次に、会議を管理する別のシステム、`MyMeetingService` を使用すると仮定します。すべての着信通話を保留にする必要があります。Chime は着信通話について MyMeetingService に通知し、MyMeetingService は通話ごとに出席者を作成します。MyMeetingService は、会議を開始する準備ができたら、SIP メディアアプリケーションに通知し、会議に参加するためのトークンを提供します。

このケースを処理するには、Lambda 関数は次のロジックを実装する必要があります。
+ 新しい着信通話が届くと、Lambda が `NEW_INBOUND_CALL` イベントで呼び出されます。Lambda は `MyMeetingService` を呼び出し、現在の通話を識別する `transactionId` を渡して、`PlayAudio` アクションを返します。
+ `MyMeetingService` は、発信者を会議に追加する準備が整うと、[https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_UpdateSipMediaApplicationCall.html](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_UpdateSipMediaApplicationCall.html) API を呼び出し、引数の一部として通話の `transactionId` と `JoinToken` を渡します。この API コールにより、今度は `CALL_UPDATE_REQUESTED` イベントで Lambda 関数が再度トリガーされます。MyMeetingService は、イベントの一部として `JoinToken` を Lambda 関数に渡します。このトークンを使用して、`JoinChimeMeeting` アクションを SIP メディアアプリケーションに返します。SIP メディアアプリケーションは `PlayAudio` アクションを中断し、発信者を会議に接続します。

![UpdateSipMediaApplicationCall API でのデータの流れを示す図。](http://docs.aws.amazon.com/ja_jp/chime-sdk/latest/dg/images/update-sip-call-flow3.png)


**注記**  
[https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_UpdateSipMediaApplicationCall.html](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_UpdateSipMediaApplicationCall.html) API は HTTP 202 (Accepted) を返します。SIP メディアアプリケーションは、通話が進行中で更新可能であることを確認し、Lambda 関数を呼び出そうとします。呼び出しは非同期で実行されるため、API からの応答が成功しても、Lambda 関数が開始または完了したことは保証されません。

以下にリクエストの構文例を示します。

```
{
    "SipMediaApplicationId": "{{string}}",
    "TransactionId": "{{string}}",
    "Arguments": {
        "string": "{{string}}"
    } 
}
```

**リクエストパラメータ**
+ `SipMediaApplicationId` - 通話を処理する SIP メディアアプリケーションの ID。
+ `TransactionId` – 通話のトランザクション ID。受信通話の場合、`TransactionId` は、最初の呼び出しで Lambda 関数に渡された `NEW_INCOMING_CALL` イベントから取得できます。アウトバウンドコールの場合、`TransactionId` は [https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_CreateSipMediaApplicationCall.html](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_CreateSipMediaApplicationCall.html) のレスポンスで返されます。
+ **Arguments** - `CallUpdateRequest` アクションデータの一部として Lambda 関数で使用できるカスタム引数。キーと値のペアを 0～20 個含めることができます。

一般的なリクエストの例を次に示します。

```
aws chime update-sip-media-application-call --sip-media-application-id feb37a7e-2b66-49fb-b2dd-30f4780dc36d --transaction-id 1322a4e7-c106-4e70-aaaf-a8fa4c77c0cb --arguments '{"JoinToken": "{{abc123}}"}'
```

**レスポンスの構文**

```
{
  "SipMediaApplicationCall": {
  "TransactionId": "{{string}}"
  }
}
```

**レスポンス要素**
+ **TransactionId** - 通話トランザクションの ID。リクエストと同じ ID です。

次の例は、`CALL_UPDATE_REQUESTED` 呼び出しイベントを示しています。

```
{
  "SchemaVersion": "1.0",
  "Sequence": {{2}},
  "InvocationEventType": "CALL_UPDATE_REQUESTED",
  "ActionData": {
    "Type": "CallUpdateRequest",
    "Parameters": {
      "Arguments": {
        "{{string}}": "{{string}}"
      }
    }
  },
  "CallDetails": {
    ...
  }
}
```

**イベントの要素**
+ **SchemaVersion** - JSON スキーマのバージョン (1.0)
+ **Sequence** - 通話でのイベントのシーケンス番号
+ **InvocationEventType** - Lambda 呼び出しイベントのタイプ。ここでは `CALL_UPDATE_REQUESTED`
+ **ActionData** - `CallUpdateRequest` アクションに関連付けられたデータ
  + **Type** - アクションのタイプ。ここでは `CallUpdateRequest`
  + **Parameters** - アクションのパラメータ
    + **Arguments** - `UpdateSipMediaApplicationCall` API リクエストの一部として渡される引数
+ **CallDetails** - 現在の通話状態に関する情報

**割り込み可能なアクションと割り込みできないアクションについて**  
既存のアクションの実行中に Lambda 関数が新しいアクションのリストを返すと、進行中のアクションに続くすべてのアクションが新しいアクションに置き換えられます。場合によっては、新しいアクションをすぐに実行するために、Lambda 関数が進行中のアクションを中断することがあります。

次の図は、代表的な例を示しています。ロジックについては、図の下のテキストで説明しています。

![進行中の SIP メディアアプリケーション通話中にアクションを置き換える方法を示す図。](http://docs.aws.amazon.com/ja_jp/chime-sdk/latest/dg/images/update-sip-actions.png)


Action 2 が割り込み可能な場合は、これを停止し、代わりに新しい Action 1 を実行します。

Action 2 が割り込み可能でない場合は、これを完了してから新しい Action 1 を開始します。

いずれの場合も Action 3 は実行されません。

何かによってアクションが中断された場合は、`ACTION_INTERRUPTED` イベントによって Lambda 関数が呼び出されます。このイベントは、情報提供のみを目的として使用されます。SIP メディアアプリケーションは、この呼び出しによって返されるすべてのアクションを無視します。

割り込み可能なアクションのタイプ:
+ `PlayAudio`
+ `RecordAudio`
+ `Pause`

**サンプル Lambda 関数**  
以下の例は、音声ファイルを再生し、参加トークンを渡して、通話を更新する一般的な Lambda 関数を示しています。

```
const MMS = require('my-meeting-service');
const myMeetingServiceClient = new MMS.Client();

exports.handler = async (event) => {
    console.log('Request: ' + JSON.stringify(event));
    
    const playAudio = () => {
      return {
        Type: 'PlayAudio',
        Parameters: {
          ParticipantTag: 'LEG-A',
          AudioSource: {
            Type: 'S3',
            BucketName: '{{chime-meetings-audio-files-bucket-name}}',
            Key: '{{welcome.wav}}'
          }
        }
      }
    }
    
    const joinChimeMeeting = (joinToken) => {
      return {
        Type: 'JoinChimeMeeting',
        Parameters: {
          JoinToken: {{joinToken}}
        }
      }
    }
    
    const response = (...actions) => {
      const r = {
        SchemaVersion: '1.0',
        Actions: actions
      };
      console.log('Response: ' + JSON.stringify(r));
      return r;
    };
    
    switch (event.InvocationEventType) {
      case 'NEW_INBOUND_CALL': 
        myMeetingServiceClient.addPendingCall(event.CallDetails.TransactionId);         
        return response(playAudio());      
      case 'CALL_UPDATE_REQUESTED':
        const joinToken = event.ActionData.Parameters.Arguments['{{JoinToken}}']
        return response(joinChimeMeeting(joinToken));
      default:
        return response();
    }
}
```