

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Amazon Chime SDK PSTN 오디오 서비스의 AWS Lambda 함수를 호출하는 텔레포니 이벤트에 대해 알아봅니다.
<a name="invoking-Lambda"></a>

오디오 서비스는 다양한 이벤트에 대한 응답으로 AWS Lambda 함수를 호출합니다. 각 간접 호출은 간접 호출 이벤트 유형을 지정하고 해당하는 경우 참여자를 포함한 통화 세부 정보를 제공합니다. 다음 주제에서는 AWS Lambda 함수를 호출하는 오디오 서비스 이벤트에 대해 설명합니다.

# Amazon Chime SDK PSTN 오디오 서비스 사용을 위한 아웃바운드 통화 생성
<a name="use-create-call-api"></a>

아웃바운드 통화를 생성하려면 [https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_CreateSipMediaApplicationCall.html](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_CreateSipMediaApplicationCall.html) API를 사용합니다. API는 지정된 `SIP media application ID`의 엔드포인트를 간접 호출합니다. 고객은 다양한 신호 및 엔드포인트의 [https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_SipMediaApplication.html](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_SipMediaApplication.html) 작업을 제공하여 통화 흐름을 제어할 수 있습니다.

응답이 성공한 경우 API는 transactionId와 함께 202 HTTP 상태 코드를 반환합니다. 이를 [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와 함께 사용하여 진행 중인 통화를 업데이트할 수 있습니다.

다음 다이어그램은 아웃바운드 통화의 AWS Lambda 함수 엔드포인트에 대한 호출을 보여줍니다.

![\[AWS Lambda 엔드포인트에 대한 간접 호출의 프로그래밍 흐름을 보여주는 다이어그램입니다.\]](http://docs.aws.amazon.com/ko_kr/chime-sdk/latest/dg/images/sip-api-1.png)


SIP 미디어 애플리케이션에 대해 구성된 엔드포인트는 아웃바운드 통화의 다양한 상태에 대해 간접 호출됩니다. 고객이 통화를 시작하면 Amazon Chime SDK는 `NEW_OUTBOUND_CALL` 간접 호출 이벤트 유형과 함께 엔드포인트를 간접 호출합니다.

이 예제는 `NEW_OUTBOUND_CALL`에 대한 일반적인 간접 호출 이벤트를 보여줍니다.

```
{
    "SchemaVersion": "1.0",
        "Sequence": 1,
        "InvocationEventType": "NEW_OUTBOUND_CALL",
        "CallDetails": {
            "TransactionId": "transaction-id",
            "AwsAccountId": "aws-account-id",
            "AwsRegion": "us-east-1",
            "SipApplicationId": "sip-application-id",
            "Participants": [
                {
                    "CallId": "call-id-1",
                    "ParticipantTag": "LEG-A",
                    "To": "+1xxxx",
                    "From": "+1xxxxxxx",
                    "Direction": "Outbound",
                    "StartTimeInMilliseconds": "159700958834234"
                }
            ]
    }
}
```

이벤트 관련 AWS Lambda 호출에 대한 모든 응답은 무시됩니다.

수신자로부터 `RINGING` 알림을 받으면 Amazon Chime SDK가 구성된 엔드포인트를 다시 간접 호출합니다.

이 예제는 `RINGING`에 대한 일반적인 간접 호출 이벤트를 보여줍니다.

```
{
    "SchemaVersion": "1.0",
        "Sequence": 1,
        "InvocationEventType": "RINGING",
        "CallDetails": {
            "TransactionId": "transaction-id",
            "AwsAccountId": "aws-account-id",
            "AwsRegion": "us-east-1",
            "SipApplicationId": "sip-application-id",
            "Participants": [
                {
                    "CallId": "call-id-1",
                    "ParticipantTag": "LEG-A",
                    "To": "+1xxxx",
                    "From": "+1xxxxxxx",
                    "Direction": "Outbound",
                    "StartTimeInMilliseconds": "159700958834234"
                }
           ]
    }
}
```

이벤트 관련 AWS Lambda 호출에 대한 모든 응답은 무시됩니다.

수신자가 통화에 응답하지 않거나 오류로 인해 통화에 실패하면 Chime은 통화 연결을 끊고 `Hangup` 이벤트 유형과 함께 엔드포인트를 간접 호출합니다. `Hangup` 이벤트 유형에 대한 자세한 내용은 [Amazon Chime SDK PSTN 오디오 서비스를 사용한 통화 종료](case-5.md) 섹션을 참조하세요.

통화에 응답하면 Chime은 `CALL_ANSWERED` 작업과 함께 엔드포인트를 간접 호출합니다. 이 예제는 일반적인 간접 호출 이벤트를 보여줍니다.

```
{
  "SchemaVersion": "1.0",
    "Sequence": 1,
    "InvocationEventType": "CALL_ANSWERED",
    "CallDetails": {
        ""TransactionId": "transaction-id",
            "AwsAccountId": "aws-account-id",
            "AwsRegion": "us-east-1",
            "SipApplicationId": "sip-application-id",
            "Participants": [
                {
                    "CallId": "call-id-1",
                    "ParticipantTag": "LEG-A",
                    "To": "+1xxxx",
                    "From": "+1xxxxxxx",
                    "Direction": "Outbound",
                    "StartTimeInMilliseconds": "159700958834234",
                "Status": "Connected"
            }
        ]
    }
}
```

이 시점에서 작업 목록으로 간접 호출에 응답하여 작업을 반환할 수 있습니다. 작업 실행을 원치 않는 경우 빈 목록으로 응답합니다. 각 AWS Lambda 호출에 대해 최대 10개의 작업으로 응답할 수 있으며 호출당 1,000회 Lambda 함수를 호출할 수 있습니다. 작업 세트를 사용한 응답에 대한 자세한 내용은 [Amazon Chime SDK PSTN 오디오 서비스를 사용하여 작업 목록으로 간접 호출에 응답](invoke-on-call-leg.md)을 참조하세요.

# Amazon Chime SDK PSTN 오디오 서비스를 사용하여 인바운드 통화 수신
<a name="case-1"></a>

`NEW_INCOMING_CALL` 이벤트가 발생한 경우 오디오 서비스는 `HANGUP` 이벤트가 발생할 때까지 지속되는 고유 `TransactionID` 및 고유 `CallID`를 생성합니다.

`NEW_INCOMING_CALL` 이벤트에 여러 가지 방법으로 응답할 수 있습니다. 예를 들어,
+ `PlayAudio` 또는 `RecordAudio` 작업을 전송하고 자동으로 통화에 응답합니다.
+ `Pause` 작업을 전송합니다.
+ `Hangup` 작업을 전송하면 통화에 응답하지 않고 고객에게 요금이 청구되지 않습니다.
+ `CallAndBridge` 작업을 전송하고 통화에 다른 사용자를 추가합니다.
+ 아무 것도 하지 않으면 30초 후에 통화 시도가 시간 초과됩니다.

새 인바운드 통화를 수신한 경우 SIP 미디어 애플리케이션은 이 페이로드를 사용하여 AWS Lambda 함수를 간접 호출합니다.

```
{
    "SchemaVersion": "1.0",
    "Sequence": 2,
    "InvocationEventType": "NEW_INBOUND_CALL"
    "CallDetails": {
        "TransactionId": "transaction-id",
        "AwsAccountId": "aws-account-id",
        "AwsRegion": "us-east-1",
        "SipRuleId": "sip-rule-id",
        "SipApplicationId": "sip-application-id",
        "Participants": [
            {
                "CallId": "call-id-1",
                "ParticipantTag": "LEG-A",
                "To": "+12065551212",
                "From": "+15105550101",
                "Direction": "Inbound",
                "StartTimeInMilliseconds": "159700958834234",
                "Status": "Connected"
            }
        ]
    }
}
```

# Amazon Chime SDK PSTN 오디오 서비스의 텔레포니 이벤트에 대한 응답 작업 지정
<a name="use-case-2"></a>

오디오 서비스에서 SIP 미디어 애플리케이션은 AWS Lambda 함수를 호출합니다. 그러면 Lambda 함수는 actions**라는 명령어 목록을 반환할 수 있습니다. 작업은 전화 통화 레그에서 실행하려는 항목으로, 숫자 전송이나 수신, 회의 참여 등이 있습니다. PSTN 오디오 서비스에서 간접 호출하는 작업에 대한 자세한 내용은 [Amazon Chime SDK PSTN 오디오 서비스의 텔레포니 이벤트 이해](pstn-invocations.md) 단원을 참조하세요.

SIP 미디어 애플리케이션이 작업 목록을 성공적으로 실행하면 애플리케이션은 호출 이벤트 유형이 인 AWS Lambda 함수를 호출합니다`ACTION_SUCCESSFUL`. 작업이 완료되지 않으면 SIP 미디어 애플리케이션이 `ACTION_FAILED` 이벤트와 함께 AWS Lambda 함수를 호출합니다.

SIP 미디어 애플리케이션은 목록에 있는 모든 작업이 성공한 경우에만 `ACTION_SUCCESSFUL`을 반환합니다. 목록에 있는 작업 중 하나라도 실패하면 SIP 미디어 애플리케이션은 `ACTION_FAILED` 이벤트와 함께 AWS Lambda 함수를 호출하고 실패한 작업 후 목록에 있는 나머지 작업을 지웁니다. 그런 다음 SIP 미디어 애플리케이션은 AWS Lambda 함수에서 반환되는 다음 작업을 실행합니다. `ActionData` 키를 사용하여 함수를 간접 호출한 호출이 무엇인지 식별할 수 있습니다.

다음 이벤트는 `PlayAudioAndGetDigits` 작업 후의 `ACTION_SUCCESSFUL` 간접 호출 이벤트 유형에 대한 샘플 페이로드를 보여줍니다.

```
{
    "SchemaVersion": "1.0",
    "Sequence": 3,
    "InvocationEventType": "ACTION_SUCCESSFUL",
    "ActionData": {
        "Type": "PlayAudioAndGetDigits",
        "Parameters" : {
            "CallId": "call-id-1",
            "AudioSource": {
                "Type": "S3",
                "BucketName": "bucket-name",
                "Key": "failure-audio-file.wav"
            },
            "FailureAudioSource": {
                "Type": "S3",
                "BucketName": "bucket-name",
                "Key": "failure-audio-file.wav"
            },
            "MinNumberOfDigits": 3,
            "MaxNumberOfDigits": 5,
            "TerminatorDigits": ["#"],
            "InBetweenDigitsDurationInMilliseconds": 5000,
            "Repeat": 3,
            "RepeatDurationInMilliseconds": 10000
        },
        "ReceivedDigits": "123"
    }
    "CallDetails": {
        "TransactionId": "transaction-id",
        "AwsAccountId": "aws-account-id",
        "AwsRegion": "us-east-1",
        "SipRuleId": "sip-rule-id",
        "SipApplicationId": "sip-application-id",
        "Participants": [
            {
                "CallId": "call-id-1",
                "ParticipantTag": "LEG-A",
                "To": "+12065551212",
                "From": "+15105550101",
                "Direction": "Inbound",
                "StartTimeInMilliseconds": "159700958834234",
                "Status": "Connected"
                }
            ]
        }
    }
}
```

목록의 작업이 성공적으로 완료되지 않으면 SIP 미디어 애플리케이션이 AWS Lambda 함수를 호출하여 실패를 알리고 해당 호출에서 실행할 새 작업 세트를 가져옵니다. 다음 이벤트는 `PlayAudio` 작업 후의 `ACTION_FAILED` 간접 호출 이벤트 유형에 대한 샘플 페이로드를 보여줍니다.

```
{
    "SchemaVersion": "1.0",
    "Sequence": 4,
    "InvocationEventType": "ACTION_FAILED",
    "ActionData": {
        "Type": "PlayAudio",
        "Parameters" : {
            "CallId": "call-id-1",
            "AudioSource": {
                "Type": "S3",
                "BucketName": "bucket-name",
                "Key": "audio-file.wav"            
            }
        },
        "ErrorType": "InvalidAudioSource",
        "ErrorMessage": "Audio Source parameter value is invalid."
    }
    "CallDetails": {
        "TransactionId": "transaction-id",
        "AwsAccountId": "aws-account-id",
        "AwsRegion": "us-east-1",
        "SipRuleId": "sip-rule-id",
        "SipApplicationId": "sip-application-id",
        "Participants": [
            {
                "CallId": "call-id-1",
                "ParticipantTag": "LEG-A",
                "To": "+12065551212",
                "From": "+15105550101",
                "Direction": "Inbound",
                "StartTimeInMilliseconds": "159700958834234",
                "Status": "Connected"
            }
        ]
    }
}
}
```

# Amazon Chime SDK PSTN 오디오 서비스의 발신자 입력 수신
<a name="case-4"></a>

`ReceiveDigits` 작업을 사용하여 인바운드 DTMF 숫자를 수집하고 이를 정규 표현식과 일치시킵니다. SIP 미디어 애플리케이션이 정규식과 일치하는 숫자를 수신하면 `ACTION_SUCCESSFUL` 이벤트와 함께 AWS Lambda 함수를 호출합니다. 수집된 숫자는 `ActionData` 객체의 `ReceivedDigits` 값에 표시됩니다.

예제:

```
{
    "SchemaVersion": "1.0",
    "Sequence": 4,
    "InvocationEventType": "ACTION_SUCCESSFUL",
    "ActionData": {
        "ReceivedDigits": "",
        "Type": "ReceiveDigits",
        "Parameters": {
            "CallId": "call-id-1",
            "InputDigitsRegex": "^\d{2}#$",
            "InBetweenDigitsDurationInMilliseconds": 5000,
            "FlushDigitsDurationInMilliseconds": 10000
        }
    },
    "CallDetails": {
        "TransactionId": "transaction-id",
        "AwsAccountId": "aws-account-id",
        "AwsRegion": "us-east-1",
        "SipRuleId": "sip-rule-id",
        "SipApplicationId": "sip-application-id",
        "Participants": [
            {
                "CallId": "call-id-1",
                "ParticipantTag": "LEG-A",
                "To": "+12065551212",
                "From": "+15105550101",
                "Direction": "Inbound",
                "StartTimeInMilliseconds": "159700958834234",
                "Status": "Connected"
            }
        ]
    }
}
```

호출자가 정규 표현식 패턴과 일치하는 숫자를 입력하면 SIP 미디어 애플리케이션은 다음 유형의 페이로드를 반환하는 AWS Lambda 함수를 호출합니다.

```
{
    "SchemaVersion": "1.0",
    "Sequence": 5,
    "InvocationEventType": "DIGITS_RECEIVED",
    "ActionData": {
        "ReceivedDigits": "11#",
        "Type": "ReceiveDigits",
        "Parameters": {
            "CallId": "call-id-1",
            "InputDigitsRegex": "^\d{2}#$",
            "InBetweenDigitsDurationInMilliseconds": 5000,
            "FlushDigitsDurationInMilliseconds": 10000
        }
    },
    "CallDetails": {
        "TransactionId": "transaction-id",
        "AwsAccountId": "aws-account-id",
        "AwsRegion": "us-east-1",
        "SipRuleId": "sip-rule-id",
        "SipApplicationId": "sip-application-id",
        "Participants": [
            {
                "CallId": "call-id-1",
                "ParticipantTag": "LEG-A",
                "To": "+12065551212",
                "From": "+15105550101",
                "Direction": "Inbound",
                "StartTimeInMilliseconds": "159700958834234",
                "Status": "Connected"
            }
        ]
    }
}
```

GitHub에서 작업 예제 참조: [https://github.com/aws-samples/amazon-chime-sma-on-demand-recording](https://github.com/aws-samples/amazon-chime-sma-on-demand-recording)

# 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 미디어 애플리케이션에 반환하는 데 사용되며, 이로 인해 `PlayAudio` 작업이 중단되고 발신자를 회의에 연결합니다.

![\[UpdateSipMediaApplicationCall API의 데이터 흐름을 보여주는 다이어그램입니다.\]](http://docs.aws.amazon.com/ko_kr/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(수락됨)를 반환합니다. SIP 미디어 애플리케이션은 통화가 진행 중이며 업데이트가 가능한지를 확인하여 Lambda 함수 간접 호출을 시도합니다. 간접 호출은 비동기적으로 수행되므로 API의 응답이 성공했다고 해서 Lambda 함수가 시작 또는 완료되었다는 보장이 없습니다.

다음 예제는 요청 구문을 보여줍니다.

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

**요청 파라미터**
+ `SipMediaApplicationId` – 통화를 처리하는 SIP 미디어 애플리케이션의 ID입니다.
+ `TransactionId` – 통화 트랜잭션의 ID입니다. 인바운드 통화의 경우 첫 간접 호출 시 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)의 응답으로 `TransactionId`가 반환됩니다.
+ **Arguments** – Lambda 함수에서 `CallUpdateRequest` 작업 데이터의 일부로 사용 가능한 사용자 지정 인수입니다. 0\$120개의 키-값 쌍을 포함할 수 있습니다.

다음 예제는 일반적인 요청을 보여줍니다.

```
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/ko_kr/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();
    }
}
```

# Amazon Chime SDK PSTN 오디오 서비스를 사용한 통화 종료
<a name="case-5"></a>

[https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_CreateSipMediaApplicationCall.html](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_CreateSipMediaApplicationCall.html) API를 사용하여 아웃바운드 통화를 종료할 수 있습니다. API는 지정된 **SIP 미디어 애플리케이션 ID**의 엔드포인트를 간접 호출합니다. 고객은 SIP 미디어 애플리케이션에 작업을 반환하여 통화 흐름을 제어할 수 있습니다.

응답이 성공한 경우 API는 `transactionId`와 함께 202 HTTP 상태 코드를 반환합니다. 이를 [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와 함께 사용하여 진행 중인 통화를 업데이트할 수 있습니다.

다음 다이어그램은 아웃바운드 통화의 AWS Lambda 함수 엔드포인트에 대한 호출을 보여줍니다.

![\[CreateSipMediaApplicationCall API를 간접 호출할 때의 데이터 흐름입니다. API는 아웃바운드 통화의 상태가 변경될 때 다른 엔드포인트를 간접 호출합니다.\]](http://docs.aws.amazon.com/ko_kr/chime-sdk/latest/dg/images/sip-api-1.png)


SIP 미디어 애플리케이션에 대해 구성된 엔드포인트는 아웃바운드 통화의 다양한 상태에 대해 간접 호출됩니다. 고객이 통화를 종료하면 Amazon Chime SDK는 `HANGUP` 간접 호출 이벤트 유형과 함께 엔드포인트를 간접 호출합니다.

이 예제는 `HANGUP`에 대한 일반적인 간접 호출 이벤트를 보여줍니다.

```
{
    "SchemaVersion": "1.0",
    "Sequence": 6,
    "InvocationEventType": "HANGUP",
    "ActionData": {
        "Type": "Hangup",
        "Parameters": {
            "CallId": "call-id-1",
            "ParticipantTag": "LEG-A"
        }
    },
    "CallDetails": {
        "TransactionId": "transaction-id",
        "AwsAccountId": "aws-account-id",
        "AwsRegion": "us-east-1",
        "SipRuleId": "sip-rule-id",
        "SipApplicationId": "sip-application-id",
        "Participants": [
            {
                "CallId": "call-id-1",
                "ParticipantTag": "LEG-A",
                "Direction": "Inbound",
                 "To": "+12065551212",
                "From": "+15105550101",
                "StartTimeInMilliseconds": "1597009588",
                "Status": "Disconnected"
            }
        ]
    }
}

// if LEG-B receives a hangup in a bridged call, such as a meeting ending
{
    "SchemaVersion": "1.0",
    "Sequence": 6,
    "InvocationEventType": "HANGUP",
    "ActionData": {
        "Type": "ReceiveDigits",
        "Parameters": {
            "CallId": "call-id-2",
            "ParticipantTag": "LEG-B"
        }
    },
    "CallDetails": {
        "TransactionId": "transaction-id",
        "AwsAccountId": "aws-account-id",
        "AwsRegion": "us-east-1",
        "SipRuleId": "sip-rule-id",
        "SipApplicationId": "sip-application-id",
        "Participants": [
            {
                "CallId": "call-id-1",
                "ParticipantTag": "Leg-A",
                 "To": "+12065551212",
                "From": "+15105550101",
                "Direction": "Inbound",
                "StartTimeInMilliseconds": "1597009588",
                "Status": "Connected"
            },
            {
                "CallId": "call-id-2",
                "ParticipantTag": "Leg-B",
                "To": "+17035550122",
                "From": "SMA",
                "Direction": "Outbound",
                "StartTimeInMilliseconds": "15010595",
                "Status": "Disconnected"
            }
        ]
    }
}
```

# Amazon Chime SDK PSTN 오디오 서비스의 종단 간 통화 이해
<a name="use-cases"></a>

이 사용 사례는 PSTN 발신자로부터 통화를 수신하고, 음성 메시지로 발신자에게 인사말을 전하고, 발신자로부터 회의 PIN을 받고, 오디오를 재생하고, 발신자를 회의에 참여시키기 위한 예제 코드를 제공합니다.

**간접 호출 이벤트 및 작업**  
오디오 서비스는 호출 이벤트를 JSON 객체로 AWS Lambda 함수에 전달합니다. 객체에는 간접 호출 이벤트 유형과 모든 관련 메타데이터가 포함됩니다. 또한 AWS Lambda 함수는 SIP 미디어 애플리케이션 작업을 JSON 객체로 반환하며, 이러한 객체에는 작업 유형 및 관련 메타데이터가 포함됩니다.

다음 표에는 간접 호출 이벤트와 간접 호출 이벤트 수신 시 가능한 `ActionData.Type`이 나열되어 있습니다.


|  간접 호출 이벤트  |  ActionData.Type  | 
| --- | --- | 
|  ACTION\$1SUCCESSFUL  |  CallAndBridge ReceiveDigits PlayAudio PlayAudioAndGetDigits  JoinChimeMeeting ModifyChimeMeetingAttendees RecordMeeting  | 
|  ACTION\$1FAILED  |  CallAndBridge PlayAudio PlayAudioAndGetDigits ModifyChimeMeetingAttendees RecordMeeting  | 
| HANGUP |  HangUp  | 
|  DIGITS\$1RECEIVED  | ReceiveDigits | 

**참고**  
다음 사용 사례를 구현하려면 Amazon Chime SDK 인벤토리에 하나 이상의 전화번호, Amazon 리소스 이름(ARN)이 포함된 AWS Lambda 함수를 사용하는 SIP 미디어 애플리케이션 관리형 객체, 전화번호를 트리거로 사용하는 SIP 규칙이 있어야 합니다.

Amazon Chime SDK가 규칙에 지정된 전화번호로 전화를 받으면 PSTN 오디오 서비스는 호출 이벤트 유형으로 AWS Lambda 함수를 `NEW_INBOUND_CALL` 호출합니다.

```
{
    "SchemaVersion": "1.0",
    "Sequence": 1,
    "InvocationEventType": "NEW_INBOUND_CALL",
    "CallDetails": {
        "TransactionId": "transaction-id",
        "AwsAccountId": "aws-account-id",
        "AwsRegion": "us-east-1",
        "SipRuleId": "sip-rule-id",
        "SipApplicationId": "sip-application-id",
        "Participants": [
            {
                "CallId": "call-id-1",
                "ParticipantTag": "LEG-A",
                "To": "+11234567890",
                "From": "+19876543210",
                "Direction": "Inbound",
                "StartTimeInMilliseconds": "159700958834234",
                "Status": "Connected"
            }
        ]
    }
}
```

 AWS Lambda 함수를 프로그래밍하여 통화 세부 정보를 검증하고 나중에 사용할 수 있도록 저장할 수 있습니다. `NEW_INBOUND_CALL` 이벤트의 경우 AWS Lambda 함수는 환영 프롬프트를 재생하고 회의 PIN을 요청하는 일련의 작업으로 응답합니다.

오디오 파일의 요구 사항은 다음과 같습니다.
+ 오디오 파일은 Amazon Simple Storage Service(S3) 버킷에서 재생해야 합니다. S3 버킷은 SIP 미디어 애플리케이션과 동일한 AWS 계정에 속해야 합니다. 또한 Amazon Chime SDK Voice Connector 서비스 보안 주체인 `voiceconnector.chime.amazonaws.com`에 `s3:GetObject` 권한을 부여해야 합니다. S3 콘솔 또는 명령줄 인터페이스(CLI)를 사용하여 이를 수행할 수 있습니다.
+ 크기가 50MB 이하인 PCM WAV 파일을 사용해야 합니다. Amazon Chime SDK는 8kHz 모노를 권장합니다.
+ 각 WAV 파일의 S3 메타데이터에는 `{'ContentType': 'audio/wav'}`가 포함되어야 합니다.

```
{
    "SchemaVersion": "1.0",
    "Actions": [
        {
            "Type" : "PlayAudio",    
            "Parameters" : {
                "CallId": "call-id-1",
                
                "AudioSource": {
                    "Type": "S3",
                    "BucketName": "chime-meetings-audio-files-bucket-name",
                    "Key": "welcome-to-meetings.wav"
                }
            }
        },
        {
            "Type": "PlayAudioAndGetDigits",
            "Parameters" : {
                "ParticipantTag": "LEG-A",
                
                "AudioSource": {
                    "Type": "S3",
                    "BucketName": "chime-meetings-audio-files-bucket-name",
                    "Key": "enter-meeting-pin.wav"
                },
                "FailureAudioSource": {
                    "Type": "S3",
                    "BucketName": "chime-meetings-audio-files-bucket-name",
                    "Key": "invalid-meeting-pin.wav"
                },
                "MinNumberOfDigits": 3,
                "MaxNumberOfDigits": 5,
                "TerminatorDigits": ["#"],
                "InBetweenDigitsDurationInMilliseconds": 5000,
                "Repeat": 3,
                "RepeatDurationInMilliseconds": 10000
            }
        }
    ]
}
```

SIP 미디어 애플리케이션은 통화 레그 A에서 이러한 작업을 실행합니다. `PlayAudioAndGetDigits` 작업이 숫자를 수신한다고 가정하면 SIP 미디어 애플리케이션은 `ACTION_SUCCESSFUL` 이벤트 유형으로 AWS Lambda 함수를 호출합니다.

```
{
    "SchemaVersion": "1.0",
    "Sequence": 2,
    "InvocationEventType": "ACTION_SUCCESSFUL",
    "ActionData": {
        "Type": "PlayAudioAndGetDigits",
        "Parameters" : {
            "ParticipantTag": "LEG-A",
            "AudioSource": {
                "Type": "S3",
                "BucketName": "chime-meetings-audio-files-bucket-name",
                "Key": "enter-meeting-pin.wav"
            },
            "FailureAudioSource": {
                "Type": "S3",
                "BucketName": "chime-meetings-audio-files-bucket-name",
                "Key": "invalid-meeting-pin.wav"
            },
            "MinNumberOfDigits": 3,
            "MaxNumberOfDigits": 5,
            "TerminatorDigits": ["#"],
            "InBetweenDigitsDurationInMilliseconds": 5000,
            "Repeat": 3,
            "RepeatDurationInMilliseconds": 10000
        },
        "ReceivedDigits": "12345" // meeting PIN
    },
    "CallDetails": {
        ... // same as in previous event
    }
}
}
```

`CallDetails` 데이터를 기반으로 호출자를 식별하도록 AWS Lambda 함수를 프로그래밍할 수 있습니다. 이전에 수신한 회의 PIN을 확인할 수도 있습니다. PIN이 정확하다면 [https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_CreateMeeting.html](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_CreateMeeting.html) 및 [https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_CreateAttendee.html](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_CreateAttendee.html) API를 사용하여 Amazon Chime SDK 회의를 생성하고 회의 참석자가 사용하는 참여 토큰을 생성합니다. AWS Lambda 함수는 Amazon Chime SDK 회의에 참여하기 위한 작업으로 응답합니다.

```
{
    "SchemaVersion": "1.0",
    "Actions": [
        {
            "Type": "JoinChimeMeeting",
            "Parameters": {
                "JoinToken": "meeting-attendee-join-token"
            }
        }
    ]
}
```

가 유효하다고 가정하면 SIP 미디어 애플리케이션`JoinToken`은 Amazon Chime SDK 회의에 참여하고 `ACTION_SUCCESSFUL` 이벤트와 함께 AWS Lambda 함수를 호출합니다. 여기서는 SIP 미디어 애플리케이션 및 Chime 미디어 서비스의 데이터를 `CallDetails` 포함합니다(`LEG-B`).

```
{
    "SchemaVersion": "1.0",
    "Sequence": 3,
    "InvocationEventType": "ACTION_SUCCESSFUL",
    "ActionData": {
        "Type" : "JoinChimeMeeting",
        "Parameters" : {
            "JoinToken": "meeting-attendee-join-token"
        }
    },
    "CallDetails": {
        "TransactionId": "transaction-id", 
        "AwsAccountId": "aws-account-id",
        "AwsRegion": "us-east-1",
        "SipRuleId": "sip-rule-id",
        "SipApplicationId": "sip-application-id",
        "Participants": [
            {
                "CallId": "call-id-1",
                "ParticipantTag": "LEG-A",
                "To": "+11234567890",
                "From": "+19876543210",
                "Direction": "Inbound",
                "StartTimeInMilliseconds": "159700958834234",
                "Status": "Connected"
            },
            {
                "CallId": "call-id-2",
                "ParticipantTag": "LEG-B",
                "To": "SMA",
                "From": "+17035550122",
                "Direction": "Outbound",
                "StartTimeInMilliseconds": "159700958834234",
                "Status": "Connected"
            }
        ]
    }
}
```

이 시점의 통화 또는 통화 레그에서 작업 실행을 중지하려면 빈 작업 세트로 응답할 수 있습니다.

```
{
    "SchemaVersion": "1.0"
    "Actions": []
}
```

호출자가 전화를 끊으면 SIP 미디어 애플리케이션이 `HANGUP` 이벤트와 함께 AWS Lambda 함수를 호출합니다.

```
{
    "SchemaVersion": "1.0",
    "Sequence": 4,
    "InvocationEventType": "HANGUP",
    "ActionData": {
        "Type": "Hangup",
        "Parameters": {
            "CallId": "call-id-1",
            "ParticipantTag": "LEG-A"
        }
    },
    "CallDetails": {
        "TransactionId": "transaction-id", 
        "AwsAccountId": "aws-account-id",
        "AwsRegion": "us-east-1",
        "SipRuleId": "sip-rule-id",
        "SipApplicationId": "sip-application-id",
        "Participants": [
            {
                "CallId": "call-id-1",
                "ParticipantTag": "LEG-A",
                "To": "+11234567890",
                "From": "+19876543210",
                "Direction": "Inbound",
                "StartTimeInMilliseconds": "159700958834234",
                "Status": "Disconnected"
            },
            {
                "CallId": "call-id-2",
                "ParticipantTag": "LEG-B",
                "To": "SMA",
                "From": "+17035550122",
                "Direction": "Outbound",
                "StartTimeInMilliseconds": "159700958834234",
                "Status": "Disconnected"
            }
        ]
    }
}
```

작업과 함께 `Hangup` 이벤트에 응답하는 경우에 `Status`가 `Connected`인 다른 `Participants`가 없으면 SIP 미디어 애플리케이션은 작업을 무시합니다.