

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

# Amazon Chime SDK PSTN 오디오 서비스를 위한 AWS Lambda 함수 빌드
<a name="writing-lambdas"></a>

이 섹션의 주제에서는 PSTN 오디오 서비스에서 사용하는 AWS Lambda 함수를 빌드하는 방법을 설명합니다.

**Topics**
+ [Amazon Chime SDK PSTN 오디오 서비스의 텔레포니 이벤트 이해](pstn-invocations.md)
+ [Amazon Chime SDK PSTN 오디오 서비스 작업 이해](about-actions.md)
+ [Amazon Chime SDK PSTN 오디오 서비스의 AWS Lambda 함수를 호출하는 텔레포니 이벤트에 대해 알아봅니다.](invoking-Lambda.md)
+ [Amazon Chime SDK PSTN 오디오 서비스를 사용하여 작업 목록으로 간접 호출에 응답](invoke-on-call-leg.md)
+ [Amazon Chime SDK PSTN 오디오 서비스에 지원되는 작업](specify-actions.md)
+ [Amazon Chime SDK PTSN 오디오 서비스에서 SIP 헤더 사용](sip-headers.md)
+ [Amazon Chime SDK PTSN 오디오 서비스에서 통화 세부 정보 기록 사용](attributes.md)
+ [Amazon Chime SDK PTSN 오디오 서비스의 제한 시간 및 재시도 이해](timeouts.md)
+ [Amazon Chime SDK PTSN 오디오 서비스 디버깅 및 문제 해결](debug-pstn.md)
+ [Amazon Chime SDK PTSN 오디오 서비스용 VoiceFocus 이해](voice-focus.md)
+ [Amazon Chime SDK PSTN 오디오 서비스 용어집](chm-dg-glossary.md)

# Amazon Chime SDK PSTN 오디오 서비스의 텔레포니 이벤트 이해
<a name="pstn-invocations"></a>

오디오 서비스는 호출 중에 특정 이벤트가 발생할 때 AWS AWS Lambda 함수를 호출합니다. 다음 예제는 이벤트를 보여주며, 예제 아래 텍스트는 각 이벤트를 설명합니다.

```
{ 
    "SchemaVersion": "1.0", 
    "Sequence": 3, 
    "InvocationEventType": "event-type", 
    "CallDetails": { 
        "TransactionId": "transaction-id-1", 
        "AwsAccountId": "aws-acct-id-1", 
        "AwsRegion": "us-east-1", 
        "SipMediaApplicationId": "sip-media-app-id-1", 
        "Participants": [ 
            { 
                "CallId": "call-id-1", 
                "ParticipantTag": "LEG-A", 
                "To": "e164PhoneNumber", 
                "From": "e164PhoneNumber", 
                "Direction": "Inbound/Outbound", 
                "StartTimeInMilliseconds": "1641998241509", 
                "Status": "Connected/Disconnected" 
            } 
        ] 
    } 
}
```

**SchemaVersion**  
이 이벤트 객체를 만드는 데 사용된 스키마 버전입니다.

**Sequence**  
 AWS Lambda 함수를 호출하는 이벤트 시퀀스입니다. 통화 중에 함수가 간접 호출될 때마다 시퀀스가 증가합니다.

**InvocationEventType**  
 AWS Lambda 호출을 트리거하는 이벤트 유형입니다. 자세한 내용은 본 주제의 후반부에서 [이벤트 유형](#pstn-event-types)을 참조하세요.

**CallDetails**  
 AWS Lambda 호출과 연결된 호출에 대한 정보입니다.

**TransactionId**  
 AWS Lambda 호출과 연결된 호출의 ID입니다.

**AwsAccountId**  
통화 라우팅을 초래한 SIP 미디어 애플리케이션과 연결된 AWS 계정 ID입니다.

**SipMediaApplicationId**  
통화와 관련된 SIP 미디어 애플리케이션의 ID입니다.

**Participants**  
함수를 호출하는 호출의 참가자에 대한 정보입니다 AWS AWS Lambda .

**CallId**  
각 참가자에게 할당한 고유 ID입니다.

**ParticipantTag**  
각 통화 참가자는 `LEG-A` 또는 `LEG-B` 태그를 받습니다.

**To**  
E.164 형식의 참가자 ‘착신’ 전화번호입니다.

**From**  
E.164 형식의 참가자 착신 전화번호입니다.

**Direction**  
통화 레그의 발신 방향입니다. `Inbound`는 오디오 서비스에 걸려온 통화를 나타냅니다. `Outbound`는 오디오 서비스에서 걸려온 통화를 나타냅니다.

**StartTimeInMilliseconds**  
참가자가 통화에 참여할 때부터 시작되는 epoch 시간(밀리초)입니다.

**Status**  
참가자가 `Connected` 또는 `Disconnected`인지 여부입니다.

## 이벤트 유형
<a name="pstn-event-types"></a>

오디오 서비스는 다음과 같은 이벤트 유형으로 Lambda 함수를 간접 호출합니다.

**NEW\$1INBOUND\$1CALL**  
SIP 미디어 애플리케이션과 연결된 전화번호에서 새 통화가 시작되었습니다.

**NEW\$1OUTBOUND\$1CALL**  
[CreateSipMediaApplicationCall](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_CreateSipMediaApplicationCall.html) API를 통해 새 아웃바운드 통화가 생성되었습니다.

**ACTION\$1SUCCESSFUL**  
 AWS Lambda 함수에서 반환된 작업이 성공했습니다. 성공한 작업에는 성공한 작업과 일치하는 `ActionData`가 포함됩니다.  

```
    "ActionData": {
        // The previous successful action 
    },
```

**ACTION\$1FAILED**  
 AWS Lambda 함수에서 반환된 작업이 성공하지 못했습니다. 실패한 작업에는 실패한 작업과 일치하는 `ActionData`, 오류 유형, 실패를 설명하는 오류 메시지가 포함됩니다.  

```
    "ActionData": {
        // The previous unsuccessful action
        "ErrorType": "error-type",
        "ErrorMessage": "error message"
    },
```

**ACTION\$1INTERRUPTED**  
실행 중인 작업이 [UpdateSipMediaApplicationCall](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_UpdateSipMediaApplicationCall.html) API 간접 호출로 중단되었습니다. `ActionData`에는 중단된 작업이 포함됩니다.  

```
"ActionData": {
        // The action that was interrupted
    },
```

**HANGUP**  
사용자 또는 애플리케이션이 통화 레그를 끊었습니다. `ActionData`에는 이벤트에 대한 다음과 같은 세부 정보가 포함됩니다.  

```
   "ActionData": {
        "Type": "Hangup",
        "Parameters": {
            "SipResponseCode": 486,
            "CallId": "c70f341a-adde-4406-9dea-1e01d34d033d",
            "ParticipantTag": "LEG-A"
        }
    },
```  
**Type**  
Hangup  
**Parameters**  
`HANGUP` 이벤트에 대한 정보입니다.  
+ **SipResponseCode** – 이벤트와 관련된 응답 코드입니다. 가장 일반적인 코드는 다음과 같습니다.
  + **0** - 일반적인 지우기
  + **480** – 응답 없음
  + **486** - 사용자 사용 중
+ **CallId** 전화를 끊은 참가자의 ID입니다.
+ **ParticipantTag** 전화를 끊은 참가자의 태그입니다.

**CALL\$1ANSWERED**  
오디오 서비스가 걸려오는 전화에 응답했습니다. 통화가 연결되지 않는 한 이 이벤트를 다이얼 아웃 통화에 반환합니다.

**INVALID\$1LAMBDA\$1RESPONSE**  
마지막 AWS Lambda 호출에 제공된 응답으로 인해 문제가 발생했습니다. `ActionData`에는 다음과 같은 추가 필드가 포함됩니다.  

```
    "ErrorType": "error-type-1", 
    "ErrorMessage": "error-msg-1"
```

**DIGITS\$1RECEIVED**  
`ReceiveDigits` 작업 완료 후 애플리케이션이 DTMF 숫자를 수신했습니다. `ActionData`에는 수신된 숫자가 포함됩니다.  

```
    "ActionData": {
        "ReceivedDigits": ###
        // The ReceiveDigits action data
    },
```

**CALL\$1UPDATE\$1REQUESTED**  
[UpdateSipMediaApplicationCall](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_UpdateSipMediaApplicationCall.html) API가 간접 호출되었습니다. `ActionData`에는 업데이트 요청에 대한 정보가 포함됩니다.  

```
    "ActionData": {
        "Type": "CallUpdateRequest", 
        "Parameters": {
            "Arguments": {
                "leg": "LEG-A"
                }
            }
        },
    }
```

**RINGING**  
통화 레그가 울리고 있습니다.

# Amazon Chime SDK PSTN 오디오 서비스 작업 이해
<a name="about-actions"></a>

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

# 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 미디어 애플리케이션은 작업을 무시합니다.

# Amazon Chime SDK PSTN 오디오 서비스를 사용하여 작업 목록으로 간접 호출에 응답
<a name="invoke-on-call-leg"></a>

호출의 개별 참가자에 대해 실행할 작업 목록으로 AWS Lambda 호출 이벤트에 응답할 수 있습니다. 호출당 최대 10개의 작업으로 응답할 수 AWS Lambda 있으며 호출당 1,000회 AWS Lambda 함수를 호출할 수 있습니다.

Lambda 함수가 응답하지 않으면 기본적으로 20초 후 SIP 미디어 애플리케이션은 시간 초과됩니다.

다음은 예제는 일반 응답 구조를 보여줍니다.

```
{
    "SchemaVersion": "1.0",
    "Actions": [        
        {
            "Type": "PlayAudio",
            "Parameters": {
                "ParticipantTag": "LEG-A",
                "AudioSource": {
                    "Type": "S3",
                    "BucketName": "bucket-name",
                    "Key": "audio-file.wav"
                }
            }
        },
        {
            "Type": "RecordAudio",
            "Parameters": {
                "DurationInSeconds": "10",
                "RecordingTerminators": ["#"],
                "RecordingDestination": {
                    "Type": "S3",
                    "BucketName": "bucket-name"
                }
            }
        }
    ]
}
```

 AWS Lambda 함수가 SIP 미디어 애플리케이션에 작업 목록을 반환하면 다음 작업이 발생합니다.

1. 애플리케이션은 통화에서 현재 작업의 실행을 완료합니다.

1. 그런 다음 애플리케이션은 기존 작업 세트를 최신 간접 호출 이벤트에서 수신한 새 작업 세트로 대체합니다.

SIP 미디어 애플리케이션이 `NULL` 작업 세트를 수신한 경우 기존 작업을 유지합니다.

# Amazon Chime SDK PSTN 오디오 서비스에 지원되는 작업
<a name="specify-actions"></a>

 AWS Lambda 함수의 응답에서 다양한 유형의 신호 및 미디어 작업을 지정할 수 있습니다. 각 작업에는 서로 다른 속성이 있습니다. 다음 주제에서는 예제 코드를 제공하고 작업 사용 방법을 설명합니다.

**Topics**
+ [TransactionAttributes 사용하기](transaction-attributes.md)
+ [통화 녹음 사용](sip-apps-call-record.md)
+ [CallAndBridge](call-and-bridge.md)
+ [Hangup](hangup.md)
+ [JoinChimeMeeting](join-chime-meeting.md)
+ [ModifyChimeMeetingAttendee(오디오 음소거 및 음소거 해제)](mute-unmute.md)
+ [Pause](pause.md)
+ [PlayAudio](play-audio.md)
+ [PlayAudioAndGetDigits](play-audio-get-digits.md)
+ [ReceiveDigits](listen-to-digits.md)
+ [RecordAudio](record-audio.md)
+ [SendDigits](send-digits.md)
+ [Speak](speak.md)
+ [SpeakAndGetDigits](speak-and-get-digits.md)
+ [StartBotConversation](start-bot-conversation.md)

# TransactionAttributes 사용하기
<a name="transaction-attributes"></a>

`TransactionAttributes` 데이터 구조를 사용하여 통화 상태 또는 회의 IDs와 같은 애플리케이션별 정보를 저장한 다음 해당 데이터를 AWS Lambda 간접 호출에 전달합니다. 이 구조는 Amazon DynamoDB와 같은 외부 데이터베이스에 데이터를 저장할 필요가 없습니다.

`TransactionAttributes`는 키/값 쌍을 포함하는 [JSON 객체](https://www.w3schools.com/js/js_json_objects.asp)입니다. 객체는 최대 100개의 키/값 쌍을 포함할 수 있으며 객체의 최대 페이로드 크기는 20KB입니다. `TransactionAttributes` 구조의 데이터는 트랜잭션의 수명 동안 지속됩니다.

 AWS Lambda 함수가 SIP 미디어 애플리케이션`TransactionAttributes`으로 전달되면 애플리케이션은 저장된 속성을 업데이트합니다. 기존 키 세트를 사용하여 `TransactionAttributes` 객체를 전달하면 저장된 값이 업데이트됩니다. 다른 키 세트를 전달하면 기존 값을 다른 키 세트의 값으로 대체합니다. 빈 맵(`{}`)을 전달하면 저장된 모든 값이 지워집니다.

**Topics**
+ [TransactionAttributes 설정](set-trans-attributes.md)
+ [TransactionAttributes 업데이트](update-trans-attributes.md)
+ [TransactionAttributes 지우기](clear-trans-attributes.md)
+ [ACTION\$1SUCCESSFUL 이벤트 처리](attribute-trans-success.md)
+ [잘못된 입력](attribute-trans-invalid.md)

# TransactionAttributes 설정
<a name="set-trans-attributes"></a>

다음 예제에서는 [PlayAudio](play-audio.md) 작업과 `TransactionAttributes` 함께를 설정하고 AWS Lambda 함수의 속성을 SIP 미디어 애플리케이션에 전달하는 방법을 보여줍니다.

```
{
    "SchemaVersion": "1.0",
    "Actions": [
        {
            "Type": "PlayAudio",
            "Parameters": {
                "ParticipantTag": "LEG-A",
                "AudioSource": {
                    "Type": "S3",
                    "BucketName": "mtg1-sipmedia-app-iad",
                    "Key": "Welcome3.wav"
                }
            }
        }
    ],
    "TransactionAttributes": {
        "key1": "value1",
        "key2": "value2"
    }
}
```

# TransactionAttributes 업데이트
<a name="update-trans-attributes"></a>

저장된 `TransactionAttributes`를 수정하려면 JSON 객체의 콘텐츠를 새 값으로 업데이트합니다. 다음 예제에서는 키 `NewKey1` 및 `NewKey2`를 `TransactionAttributes`에 추가합니다. 이러한 키는 각각 값 `NewValue1` 및 `NewValue2`와 쌍을 이룹니다.

```
{
    "SchemaVersion": "1.0",
    "Actions": [
        {
            "Type": "PlayAudio",
            "Parameters": {
                "ParticipantTag": "LEG-A",
                "AudioSource": {
                    "Type": "S3",
                    "BucketName": "mtg1-sipmedia-app-iad",
                    "Key": "Welcome3.wav"
                }
            }
        }
    ],
    "TransactionAttributes": {
        "NewKey1": "NewValue1",
        "NewKey2": "NewValue2"
    }
}
```

이전 예제에서 `NewValue1`을 `key1`로 전달했다면 `key1`의 기존 값이 `NewValue1`로 대체됩니다. 하지만 `NewKey1`에 값을 전달하면 새 키/값 쌍을 생성합니다.

# TransactionAttributes 지우기
<a name="clear-trans-attributes"></a>

`TransactionAttributes` 객체의 콘텐츠를 지우려면 빈 JSON 객체와 함께 `TransactionAttributes` 필드를 전달합니다.

```
{
    "SchemaVersion": "1.0",
    "Actions": [
        {
            "Type": "PlayAudio",
            "Parameters": {
                "ParticipantTag": "LEG-A",
                "AudioSource": {
                    "Type": "S3",
                    "BucketName": "mtg1-sipmedia-app-iad",
                    "Key": "Welcome3.wav"
                }
            }
        }
    ],
    "TransactionAttributes": {
    }
}
```

**참고**  
해당 값을 `null`로 설정하여 `TransactionAttributes` 구조에서 데이터를 지울 수는 없습니다. 또한 `TransactionAttribute` 구조를 생략해도 데이터가 지워지지 않습니다. 항상 빈 JSON 객체를 `TransactionAttributes`와 함께 전달하여 객체에서 데이터를 지웁니다.

# ACTION\$1SUCCESSFUL 이벤트 처리
<a name="attribute-trans-success"></a>

다음 예제는 성공적인 [PlayAudio](play-audio.md)가 저장된 `TransactionAttributes`를 `CallDetails `의 일부로 전송하는 방법을 보여줍니다.

```
{ 
    "SchemaVersion": "1.0", 
    "Sequence": 2, 
    "InvocationEventType": "ACTION_SUCCESSFUL", 
    "ActionData": { 
        "Type": "PlayAudio", 
        "Parameters": { 
            "AudioSource": { 
                "Type": "S3", 
                "BucketName": "mtg1-sipmedia-app-iad", 
                "Key": "Welcome3.wav" 
            }, 
            "Repeat": 1, 
            "ParticipantTag": "LEG-A" 
        } 
    }, 
    "CallDetails": { 
        "TransactionId": "mtg1-tx-id", 
        "TransactionAttributes": { 
            "key1": "value1", 
            "key2": "value2" 
        }, 
        "AwsAccountId": "166971021612", 
        "AwsRegion": "us-east-1", 
        "SipRuleId": "aafbd402-b7a2-4992-92f8-496b4563c492", 
        "SipMediaApplicationId": "e88f4e49-dd21-4a3f-b538-bc84eae11505", 
        "Participants": [ 
            { 
                "CallId": "bbff30c5-866a-41b5-8d0a-5d23d5e19f3e", 
                "ParticipantTag": "LEG-A", 
                "To": "+14345550101", 
                "From": "+14255550199", 
                "Direction": "Inbound", 
                "StartTimeInMilliseconds": "1644539405907", 
                "Status": "Connected" 
            } 
        ] 
    } 
}
```

# 잘못된 입력
<a name="attribute-trans-invalid"></a>

다음 예제에서는 잘못된 입력을 보여줍니다. 이 경우 JSON 객체가 SIP 미디어 애플리케이션에 너무 많은 항목을 전달합니다.

```
{ 
    "SchemaVersion": "1.0", 
    "Actions": [ 
        { 
            "Type": "PlayAudio", 
            "Parameters": { 
                "ParticipantTag": "LEG-A", 
                "AudioSource": { 
                    "Type": "S3", 
                    "BucketName": "mtg1-sipmedia-app-iad", 
                    "Key": "Welcome3.wav" 
                } 
            } 
        } 
    ], 
    "TransactionAttributes": { 
        "key1": "value1", 
        "key2": "value2", 
        "key3": "value3", 
        "key4": "value4", 
        "key5": "value5", 
        "key6": "value6", 
        "key7": "value7", 
        "key8": "value8", 
        "key9": "value9", 
        "key10": "value10", 
        "key11": "value11" 
    } 
}
```

다음 예제에서는 이전에 주어진 입력에 대한 응답을 보여줍니다. 이 출력은 SIP 미디어 애플리케이션에서 애플리케이션을 호출한 AWS Lambda 함수로 다시 전달됩니다.

```
{ 
    "SchemaVersion": "1.0", 
    "Sequence": 2, 
    "InvocationEventType": "INVALID_LAMBDA_RESPONSE", 
    "CallDetails": { 
        "TransactionId": "mtg1-tx-id", 
        "AwsAccountId": "166971021612", 
        "AwsRegion": "us-east-1", 
        "SipRuleId": "aafbd402-b7a2-4992-92f8-496b4563c492", 
        "SipMediaApplicationId": "e88f4e49-dd21-4a3f-b538-bc84eae11505", 
        "Participants": [ 
            { 
                "CallId": "72cbec69-f098-45d8-9ad6-e26cb9af663a", 
                "ParticipantTag": "LEG-A", 
                "To": "+14345550101", 
                "From": "+14255550199", 
                "Direction": "Inbound", 
                "StartTimeInMilliseconds": "1644540839987" 
            } 
        ] 
    }, 
    "ErrorType": "TransactionAttributesInvalidMapSize", 
    "ErrorMessage": "Transaction Attributes has too many mappings. Maximum number of mappings is 10" 
}
```

# 통화 녹음 사용
<a name="sip-apps-call-record"></a>

SIP 미디어 애플리케이션의 통화 녹음 작업을 통해 다양한 용도의 통화 녹음 및 통화 후 녹음 솔루션을 구축할 수 있습니다. 예를 들어 고객 지원 통화를 녹음하여 교육에 사용할 수 있습니다.

통화 녹음 작업은 SIP 미디어 애플리케이션과 함께 사용할 수 있습니다. 작업을 온디맨드 방식으로 사용하거나 SIP 이벤트에 대한 응답으로 사용할 수도 있습니다.
+ SIP 미디어 애플리케이션에서 통화의 온디맨드 녹음을 시작하려면 [https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_voice_chime_UpdateSipMediaApplication.html](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_voice_chime_UpdateSipMediaApplication.html) API를 사용하여 애플리케이션을 간접 호출하고 [https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_voice-chime_StartCallRecording.html](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_voice-chime_StartCallRecording.html) 작업을 반환합니다.
+ SIP 이벤트에 대한 응답으로 통화 녹음을 시작하려면 애플리케이션에서 `StartCallRecording` 작업을 반환합니다.

진행 중인 녹음을 일시 중지하고 재개할 수 있습니다. 일시 중지하려면 [https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_voice-chime_PauseCallRecording.html](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_voice-chime_PauseCallRecording.html) 작업을 사용합니다. 재개하려면 `ResumeCallRecording` 작업을 사용합니다. 녹화를 일시 중지하거나 재개할 때마다 작업은 일시 중지 또는 재개를 나타내는 신호음을 캡처합니다. 일시 중지하는 경우 작업이 무음을 녹음하며, Amazon Chime SDK는 이를 사용하여 일시 중지 시간을 추적하고 청구서에 일시 중지를 포함합니다. 필요할 때마다 녹음을 일시 중지하고 재개할 수 있습니다.

통화 녹음을 중지하려면 [https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_voice-chime_StopCallRecording.html](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_voice-chime_StopCallRecording.html) 작업을 반환합니다. 하지만 통화가 중지된 경우 통화 녹음이 자동으로 중지되므로 이 경우 명시적으로 `StopCallRecording` 작업을 반환할 필요가 없습니다. 개별 통화 레그에서 녹음을 한 번만 시작하고 중지할 수 있습니다.

Amazon Chime SDK는 사용자가 선택한 Amazon S3 버킷으로 통화 녹음을 전송합니다. 버킷은 AWS 계정에 속해야 합니다. 통화가 중지되면 SIP 미디어 애플리케이션은 [StartCallRecording](start-call-recording.md) 작업의 `Destination` 파라미터에 지정된 폴더로 녹음을 전송합니다. Amazon Chime SDK는 개방형 WAV 형식으로 통화를 녹음합니다. 수신 및 발신 트랙을 녹음하는 통화는 스테레오 모드를 사용하며, 수신 트랙은 왼쪽 채널에, 발신 트랙은 오른쪽 채널에 있습니다. 수신 또는 발신 트랙만 녹음하는 경우 시스템은 모노 모드를 사용합니다.

**참고**  
이 기능을 사용하여 녹음한 경우 전자 통신 녹음에 관한 법률 또는 규정이 적용될 수 있습니다. 녹음에 관한 모든 관련 법률을 준수하는 것은 귀하와 최종 사용자의 책임입니다. 여기에는 세션 또는 통신이 녹음되고 있다는 사실을 녹음된 세션의 모든 참가자에게 적절하게 알리고 동의를 구하는 것도 포함됩니다.

## 통화 녹음 청구
<a name="call-billing"></a>

Amazon Chime SDK는 통화 레그에서 통화 녹음이 활성화된 시간에 대해 분당 요금을 청구하며, 이 시간에는 모든 일시 중지가 포함됩니다. 통화 녹음이 Amazon S3 버킷으로 전송되면 통화 녹음 사용량에 대한 요금이 청구됩니다.

# 오디오 트랙 녹음
<a name="record-legs"></a>

수신 또는 발신 통화 트랙만 녹음하거나 두 통화 트랙을 모두 녹음할 수 있습니다.

이 이미지는 일반적인 단일 레그 또는 비연결 수신 통화를 보여줍니다.

![\[SIP 미디어 애플리케이션과만 통신하는 수신 통화입니다.\]](http://docs.aws.amazon.com/ko_kr/chime-sdk/latest/dg/images/call-record-sma-one-leg.png)


통화에는 **call-id-1**의 `callID`가 있는 레그가 하나만 있습니다. `INCOMING` 오디오 트랙은 발신자가 SIP 미디어 애플리케이션으로 보내는 오디오입니다. `OUTGOING` 오디오 트랙은 SIP 미디어 애플리케이션이 발신자로 보내는 오디오입니다. SIP 미디어 애플리케이션은 녹음하려는 통화의 `CallId`를 지정합니다. 전화를 건 참가자를 녹음하려면 `INCOMING`을 지정합니다. 전화를 받은 참가자를 녹음하려면 `OUTGOING`을 지정합니다. 두 참가자를 모두 녹음하려면 `BOTH`를 지정합니다.

이 이미지는 참가자 2명과의 일반적인 다중 통화를 보여줍니다.

![\[SIP 미디어 애플리케이션 및 두 번째 참가자와 통신하는 수신 통화입니다.\]](http://docs.aws.amazon.com/ko_kr/chime-sdk/latest/dg/images/call-record-sma-bridged.png)


이 예시에서는 통화에는 두 가지 통화 레그인 **call-id-1** 및 **call-id-2**가 있으며, **call-id-1**은 **call-id-2**에 연결됩니다. 그러면 두 통화 ID 모두에 대한 수신 및 발신 오디오 스트림으로 네 개의 오디오 트랙이 만들어집니다. 녹음할 통화 ID와 오디오 트랙이 무엇인지 지정할 수 있습니다. 예를 들어, 전화를 받은 참가자의 오디오 트랙을 녹음하려면 **call-id-2**를 `CallId`로, `INCOMING`을 트랙으로 지정하여 `INCOMING` 오디오 트랙을 녹음합니다.

발신자가 듣는 모든 내용을 녹음하려면 **call-id-1**을 `CallId`로, `OUTGOING`을 트랙으로 지정하여 `OUTGOING` 오디오 트랙을 녹음합니다. `Caller`가 말하고 들은 모든 오디오를 녹음하려면 `call-id-1`을 `CallId`로, `BOTH`를 트랙으로 지정하여 `BOTH` 오디오 트랙을 녹음합니다.

# 샘플 사용 사례
<a name="recording-use-cases"></a>

SIP 미디어 애플리케이션은 통화 녹음 작업을 구성 요소로 제공합니다. 이를 통해 비즈니스 사용 사례에 맞는 통화 녹음 솔루션을 유연하게 구축할 수 있습니다. 다음 사례는 몇 가지 일반적인 사용 시나리오를 보여줍니다.

**Topics**
+ [사례 1: SIP 작업이 포함된 단일 레그 통화 녹음](#recording-case-1)
+ [사례 2: 다중 통화의 선택적 오디오 녹음](#recording-case-2)
+ [사례 3: 여러 통화 레그 녹음](#recording-case-3)
+ [사례 4: 일시 중지 및 재개를 통한 온디맨드 녹음](#on-demand-pause-resume)

## 사례 1: SIP 작업이 포함된 단일 레그 통화 녹음
<a name="recording-case-1"></a>

발신자와 [PlayAudio](play-audio.md) 및 [PlayAudioAndGetDigits](play-audio-get-digits.md) 작업과 같은 SIP 미디어 애플리케이션 작업으로 생성된 모든 오디오를 녹음할 수 있습니다. 녹음하는 동안 발신자가 숫자를 누르면 해당 숫자의 신호음이 녹음에 캡처됩니다. 이 예에서는 `PlayAudioAndGetDigits` 작업을 사용하지만 대화형 음성 응답(IVR)은 복잡한 일련의 SIP 미디어 애플리케이션 작업일 수 있습니다.

이 예에서 SIP 미디어 애플리케이션은 발신자와 SIP 미디어 애플리케이션 사이의 두 오디오 트랙을 모두 녹음합니다. 통화가 설정되면 녹음이 시작되고 발신자가 전화를 끊으면 중지됩니다. 통화가 설정되면 요금 청구가 시작되고 발신자가 전화를 끊으면 중지됩니다.

![\[두 오디오 트랙을 녹음하는 SIP 미디어 애플리케이션의 다이어그램으로, 이 경우에는 발신자와 앱 사이의 녹음입니다.\]](http://docs.aws.amazon.com/ko_kr/chime-sdk/latest/dg/images/sma-recording-case-1.png)


## 사례 2: 다중 통화의 선택적 오디오 녹음
<a name="recording-case-2"></a>

단일 통화 참가자의 오디오 트랙을 선택적으로 녹음할 수 있습니다. 이 기능을 사용하여 특정 참가자에 대한 통화 녹음만 선택적으로 활성화할 수 있습니다.

이 예에서 SIP 미디어 응용 프로그램은 **call-id-2**를 `CallId`로, `INCOMING`을 트랙으로 지정하여 수신자와 SIP 미디어 애플리케이션 사이의 수신 오디오 트랙을 녹음합니다. 발신자가 수신자와 연결되면 통화 녹음이 시작되며, 요금 청구 또한 시작됩니다. 수신자가 전화를 끊으면 녹음이 중단되며, 요금 청구 또한 종료됩니다. 이 녹음에는 수신자의 오디오 트랙만 들어 있습니다.

![\[트랙 하나를 선택적으로 녹음하는 SIP 미디어 애플리케이션의 다이어그램입니다.\]](http://docs.aws.amazon.com/ko_kr/chime-sdk/latest/dg/images/sma-recording-case-2.png)


## 사례 3: 여러 통화 레그 녹음
<a name="recording-case-3"></a>

여러 통화 레그를 녹음할 수 있습니다. 예를 들어 참가자에게 통화를 연결한다고 가정해 보겠습니다. 해당 참가자가 전화를 끊으면 전화 통화는 다른 참가자에게 연결됩니다. 세 개의 통화 레그 모두에 대해 통화 녹음을 활성화할 수 있습니다.

이 예에서는 세 개의 개별 녹음 파일을 보여줍니다. 첫 번째 통화 레그의 녹음은 발신자, 애플리케이션, 통화에 연결된 두 참가자 사이의 대화를 캡처합니다. 두 번째 통화 레그의 녹음은 발신자와 첫 번째 참가자 사이의 대화를 캡처합니다. 두 번째 통화 레그의 녹음은 발신자와 두 번째 참가자 사이의 대화를 캡처합니다.

이 사례에서는 세 개의 통화 레그가 생성되며 각 통화 레그의 시작과 종료에 요금 청구가 적용됩니다. 다시 말해, 시스템은 세 개의 녹음을 S3 버킷으로 전송하며, 각각에 대해 요금이 청구됩니다.

![\[여러 통화 레그를 녹음하는 SIP 미디어 애플리케이션의 다이어그램입니다.\]](http://docs.aws.amazon.com/ko_kr/chime-sdk/latest/dg/images/sma-recording-case-3.png)


## 사례 4: 일시 중지 및 재개를 통한 온디맨드 녹음
<a name="on-demand-pause-resume"></a>

[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를 사용하여 온디맨드 방식으로 통화 녹음을 시작, 중지, 일시 중지 및 재개할 수 있습니다. `UpdateSipMediaApplicationCall` API를 직접 호출하고 SIP 미디어 애플리케이션을 간접 호출하여 통화 녹음 작업을 반환하는 클라이언트 애플리케이션을 구축할 수 있습니다.

최종 사용자는 클라이언트 애플리케이션을 사용하여 통화 녹음을 제어합니다. 예를 들어 콜 센터에서 상담원은 데스크톱 클라이언트 애플리케이션을 사용하여 온디맨드 방식으로 통화 녹음 작업을 트리거합니다. 콜 센터 예에서 상담원은 발신자에게 전화 통화 녹음 권한을 요청할 수 있으며, 발신자가 동의하면 클라이언트 애플리케이션에서 클릭하여 녹음을 시작할 수 있습니다. 또 다른 예로, 발신자가 사회보장번호(SSN)와 같은 정보를 제공해야 할 수도 있습니다. 하지만 콜 센터 정책에 따라 상담원은 고객의 SSN과 같은 정보를 녹음해서는 안 됩니다. 상담원은 고객이 정보를 제공하는 동안 애플리케이션을 클릭하여 녹음을 일시 중지한 다음 다시 클릭하여 녹음을 재개할 수 있습니다. 상담원이 발신자의 요청을 처리하면 상담원은 애플리케이션을 클릭하여 녹음을 중지하고 통화를 끊습니다.

이 사용 사례에서 SIP 미디어 애플리케이션은 발신자와 SIP 미디어 애플리케이션 사이의 두 오디오 트랙을 모두 녹음합니다. `call-id-1` 레그가 `call-id-2` 레그에 연결되어 있기 때문에 시스템은 발신자와 수신자 양쪽 레그에서 오디오를 녹음합니다. 녹음과 요금 청구는 `UpdateSipMediaApplicationCall` API가 `StartCallRecording` 작업을 간접 호출할 때 시작됩니다. 녹음과 요금 청구는 `UpdateSipMediaApplicationCall` API가 `StopCallRecording` 작업을 간접 호출할 때 중지됩니다. 다시 말해서, 녹음을 일시 중지해도 녹음 기간은 변경되지 않으며 모든 일시 중지에 대해 요금이 청구됩니다.

![\[온디맨드 방식으로 녹음이 일시 중지되었다가 재개된 SIP 미디어 애플리케이션 녹음의 다이어그램입니다.\]](http://docs.aws.amazon.com/ko_kr/chime-sdk/latest/dg/images/sma-recording-on-demand.png)


# SIP 미디어 애플리케이션의 통화 녹음 작업
<a name="use-recording-apis"></a>

SIP 미디어 애플리케이션의 AWS Lambda 함수에서 응답으로 다른 통화 녹음 작업을 지정할 수 있습니다. 다음 주제에서는 예제 코드를 제공하고 작업 사용 방법을 설명합니다.

**Topics**
+ [StartCallRecording](start-call-recording.md)
+ [StopCallRecording](stop-call-recording.md)
+ [PauseCallRecording](pause-call-recording.md)
+ [ResumeCallRecording](resume-call-recording.md)

# StartCallRecording
<a name="start-call-recording"></a>

`StartCallRecording` 작업은 통화 레그의 녹음을 시작합니다. 온디맨드 또는 SIP 이벤트에 대한 응답으로 SIP 미디어 애플리케이션에서 통화 녹음을 시작합니다.
+ 통화의 온디맨드 녹음을 시작하려면 `UpdateSipMediaApplication` API를 사용하여 애플리케이션을 간접 호출하고 `StartCallRecording` 작업을 반환합니다.
+ SIP 이벤트에 대한 응답으로 통화 녹음을 시작하려면 애플리케이션에서 `StartCallRecording` 작업을 반환합니다.

수신 레그, 발신 레그 또는 모두에 대해 오디오 트랙을 녹음할지 여부를 지정합니다. 다음 섹션에서는 `StartCallRecording` 작업을 사용하는 방법을 설명합니다.

**참고**  
이 기능을 사용하여 녹음한 경우 전자 통신 녹음에 관한 법률 또는 규정이 적용될 수 있습니다. 녹음에 관한 모든 관련 법률을 준수하는 것은 귀하와 최종 사용자의 책임입니다. 여기에는 세션 또는 통신이 녹음되고 있다는 사실을 녹음된 세션의 모든 참가자에게 적절하게 알리고 동의를 구하는 것도 포함됩니다.

**Topics**
+ [StartCallRecording 작업 요청](#request-start)
+ [녹음 대상 지정](#recording-destination)
+ [Amazon S3 버킷 권한 부여](#grant-s3-perms)
+ [작업 성공 응답](#action-successful)
+ [작업 오류 응답](#action-error)

## StartCallRecording 작업 요청
<a name="request-start"></a>

다음 예제는 `BOTH` 트랙의 `StartCallRecording` 작업을 요청하는 방법을 보여줍니다.

```
{
    "SchemaVersion": "1.0",
    "Actions": [
        {
            "Type": "StartCallRecording",
            "Parameters":
            {
                "CallId": "call-id-1",
                "Track": "BOTH",
                "Destination":
                {
                    "Type": "S3",
                    "Location": "valid-bucket-name-and-optional-prefix"
                }
            }
        }
    ]
}
```

**CallId**  
*설명* - AWS Lambda 함수 호출의에 있는 `CallId` 참가자`CallDetails`의 설명  
허용된 값** - 유효한 통화 ID  
필수** - 예  
*기본값* – 없음

**Track**  
설명** - 통화 녹음의 오디오 `Track`입니다.  
허용된 값** - `BOTH`, `INCOMING` 또는 `OUTGOING`  
필수** - 예  
*기본값* – 없음

**Destination.Type**  
설명** - 대상 유형입니다. Amazon S3만 허용됩니다.  
허용된 값** - Amazon S3  
필수** - 예  
*기본값* – 없음

**Destination.Location**  
설명** - 유효한 Amazon S3 버킷과 선택 사항인 Amazon S3 키 접두사입니다. 버킷에는 Amazon Chime SDK Voice Connector 서비스 보안 주체인 voiceconnector.chime.amazonaws.com에 대한 권한이 있어야 합니다.  
허용된 값** - Amazon Chime SDK가 `s3:PutObject` 및 `s3:PutObjectAcl` 작업에 대한 권한을 가진 유효한 Amazon S3 경로  
필수** - 예  
*기본값* – 없음

## 녹음 대상 지정
<a name="recording-destination"></a>

Amazon Chime SDK는 Amazon S3 버킷으로 통화 녹음을 전송합니다. 버킷은 AWS 계정에 속해야 합니다. `StartCallRecording` 작업의 `Destination` 파라미터에 버킷의 위치를 지정합니다. `Destination` 파라미터의 `Type` 필드는 `S3`이어야 합니다. `Location` 필드는 Amazon S3 버킷과 선택 사항인 통화 녹음이 전달되는 객체 키 접두사로 구성됩니다.

SIP 미디어 애플리케이션은 지정된 `Location`, 통화 레그의 날짜 및 시간, 트랜잭션 ID, 통화 ID를 사용하여 Amazon S3 객체 키의 형식을 지정합니다. `StartCallRecording` 작업 응답은 전체 Amazon S3 객체 키를 반환합니다.

`Location` 필드에 Amazon S3 버킷만 제공하는 경우 SIP 미디어 애플리케이션은 Amazon S3 경로에 기본 접두사인 `Amazon-Chime-SMA-Call-Recordings`를 추가합니다. 또한 SIP 미디어 애플리케이션은 통화 시작 시간의 연, 월, 일을 추가하여 녹음을 정리하는 데 도움이 됩니다. 다음 예제는 기본 접두사를 포함한 Amazon S3 경로의 일반 형식을 보여줍니다. 이 예제에서는 `myRecordingBucket`을 `Location` 값으로 사용합니다.

```
myRecordingBucket/Amazon-Chime-SMA-Call-Recordings/2019/03/01/2019–03–01–17–10–00–010_c4640e3b–1478–40fb-8e38–6f6213adf70b_7ab7748e–b47d–4620-ae2c–152617d3333c.wav
```

다음 예제는 통화 녹음 Amazon S3 경로에 표시된 데이터를 보여줍니다.

```
s3Bucket/Amazon-Chime-SMA-Call-Recordings/year/month/date/year-month-date-hour-minute-second-millisecond_transactionId_callId.wav
```

Amazon S3 버킷과 객체 키 접두사를 `Location` 필드에 입력하면 SIP 미디어 애플리케이션은 기본 접두사 대신 대상 Amazon S3 경로의 객체-키 접두사를 사용합니다. 다음 예제는 접두사를 포함한 통화 녹음 Amazon S3 경로의 일반 형식을 보여줍니다. 예를 들어, myRecordingBucket/technicalSupport/english를 `Location`으로 지정할 수 있습니다.

```
myRecordingBucket/technicalSupport/english/2019/03/01/2019–03–01–17–10–00–010_c4640e3b1478–40fb–8e38-6f6213adf70b_7ab7748e–b47d–4620–ae2c–152617d3333c.wav
```

다음 예제는 Amazon S3 경로의 데이터를 보여줍니다.

```
s3Bucket/yourObjectKeyPrefix/year/month/date/year-month-date-hour-minute-second-millisecond_transactionId_callId.wav
```

Amazon S3 버킷으로 전송된 녹음에는 통화 레그에 대한 추가 [Amazon S3 객체 메타데이터](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingMetadata.html)가 포함되어 있습니다. 다음 표에는 지원되는 Amazon S3 객체 메타데이터가 나와 있습니다.


| 이름 | 설명 | 
| --- | --- | 
| transaction-id | 전화 통화의 트랜잭션 ID | 
| call-id |  AWS Lambda 함수 호출의 CallDetailsCallId | 
| recording-duration | 통화 녹음 기간(초) | 
| recording-audio-file-format | 인터넷 미디어 유형으로 표시된 통화 녹음 오디오 파일 형식 | 

## Amazon S3 버킷 권한 부여
<a name="grant-s3-perms"></a>

대상 Amazon S3 버킷은 애플리케이션과 동일한 AWS 계정에 속해야 합니다. 또한 작업은 Amazon Chime SDK Voice Connector 서비스 보안 주체인 `voiceconnector.chime.amazonaws.com`에 `s3:PutObject` 및 `s3:PutObjectAcl` 권한을 부여해야 합니다. 다음 예제는 적절한 권한을 부여합니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "SIP media applicationRead",
            "Effect": "Allow",
            "Principal": {
                "Service": "voiceconnector.chime.amazonaws.com"
            },
            "Action": [                
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::bucket-name/*",
	    "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "123456789012"
                }
            }
        }
    ]
}
```

------

PSTN 오디오 서비스는 SIP 미디어 애플리케이션을 대신하여 S3 버킷을 읽고 씁니다. [혼동된 대리자 문제](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)를 피하기 위해 S3 버킷 권한을 단일 SIP 미디어 애플리케이션으로 제한할 수 있습니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "SIP media applicationRead",
            "Effect": "Allow",
            "Principal": {
                "Service": "voiceconnector.chime.amazonaws.com"
            },
            "Action": [                
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::bucket-name/*",
	    "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "111122223333",
                    "aws:SourceArn": "arn:aws:chime:us-east-1:111122223333:sma/sip-media-application-id"
                }
            }
        }
    ]
}
```

------

## 작업 성공 응답
<a name="action-successful"></a>

통화 레그에서 통화 녹음이 성공적으로 시작되면 SIP 미디어 애플리케이션이 `ACTION_SUCCESSFUL` 이벤트 유형으로 AWS Lambda 함수를 호출합니다. 통화 녹음 위치가 응답으로 반환됩니다.

```
{
    "SchemaVersion": "1.0",
    "Sequence": INTEGER,
    "InvocationEventType": "ACTION_SUCCESSFUL",
    "ActionData": {
        "Type" : "StartCallRecording",
        "Parameters": {
            "CallId": "call-id-1",
            "Track": "BOTH",
            "Destination": {
                "Type": "S3",
                "Location": "valid-bucket-name"
            }
        }
        "CallRecordingDestination": {
            "Type": "S3",
            "Location": "call-recording-bucket-and-key"
        }
    }
    "CallDetails": {
        ...
    }
}
```

## 작업 오류 응답
<a name="action-error"></a>

검증 오류의 경우 SIP 미디어 애플리케이션은 적절한 오류 메시지와 함께 AWS Lambda 함수를 호출합니다. 다음 표에는 오류 메시지가 나열되어 있습니다.




| 오류 | 메시지 | 이유 | 
| --- | --- | --- | 
| `InvalidActionParameter` | `CallId` parameter for action is invalid | 파라미터가 유효하지 않습니다. | 
| `SystemException` | System error while running an action. | 작업을 실행하는 동안 다른 유형의 시스템 오류가 발생했습니다. | 

작업이 통화 레그에서 미디어 녹음을 실패하면 SIP 미디어 애플리케이션은 `ActionFailed` 이벤트 유형의 AWS Lambda 함수를 간접 호출합니다.

다음 예제는 일반적인 오류 응답을 보여줍니다.

```
{
    "SchemaVersion": "1.0",
    "Sequence": 5,
    "InvocationEventType": "ACTION_FAILED",
    "ActionData": {
        "Type" : "StartCallRecording",
        "Parameters": {
            "CallId": "call-id-1",
            "Track": "BOTH",
            "Destination": {
                "Type": "S3",
                "Location": "valid-bucket-name"
            }
        }
        "Error": "NoAccessToDestination: Error while accessing destination"
    }
    "CallDetails": {
        ...
    }
}
```

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

# StopCallRecording
<a name="stop-call-recording"></a>

`StopCallRecording` 작업은 통화 레그의 녹음을 중지합니다. 통화가 종료되면 녹음이 자동으로 중지되며 애플리케이션에서 `StopCallRecording` 작업을 명시적으로 반환할 필요가 없습니다. 통화 레그에 대한 녹음이 중지되면 다시 시작할 수 없으며 `StartCallRecording` 작업에 지정된 대상으로 녹음이 전달됩니다.

다음 예제는 `call-id-1` 통화 레그의 녹음을 중지합니다.

```
{
    "SchemaVersion": "1.0",
    "Actions":[
        {
            "Type": "StopCallRecording",
            "Parameters": {
                "CallId": "call-id-1"
            }
        }
    ]
}
```

**CallId**  
*설명* - AWS Lambda 함수 호출의에 있는 `CallId` 참가자`CallDetails`의 설명  
허용된 값** - 유효한 통화 ID  
필수** - 예  
*기본값* – 없음

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

# PauseCallRecording
<a name="pause-call-recording"></a>

`PauseCallRecording` 작업은 통화 레그의 녹음을 일시 중지합니다. 녹음을 일시 중지할 때마다 녹음은 일시 중지를 나타내는 신호음을 캡처합니다. 일시 중지하면 녹음은 계속되지만 무음만 캡처됩니다. 녹음을 일시 중지해도 총 녹음 기간에는 영향을 주지 않습니다. 필요할 때마다 녹음을 일시 중지하고 재개할 수 있습니다.

다음 예제는 녹음을 일시 중지합니다.

```
{
    "SchemaVersion": "1.0",
    "Actions":[
        {
            "Type": "PauseCallRecording",
            "Parameters": {
                "CallId": "call-id-1"
            }
        }
    ]
}
```

**CallId**  
*설명* - AWS Lambda 함수 호출의에 있는 `CallId` 참가자`CallDetails`의 설명  
허용된 값** - 유효한 통화 ID  
필수** - 예  
*기본값* – 없음

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

# ResumeCallRecording
<a name="resume-call-recording"></a>

`ResumeCallRecording` 작업은 통화 레그의 녹음을 재개합니다. 녹음이 다시 시작되기 전에 짧은 신호음이 재생됩니다. 통화 레그 기간 동안 녹음을 여러 번 일시 중지했다가 재개할 수 있습니다.

다음 예제는 녹음을 재개합니다.

```
{
    "SchemaVersion": "1.0",
    "Actions":[
        {
            "Type": "ResumeCallRecording",
            "Parameters": {
                "CallId": "call-id-1"
            }
        }
    ]
}
```

**CallId**  
*설명* - AWS Lambda 함수 호출의에 있는 `CallId` 참가자`CallDetails`의 설명  
허용된 값** - 유효한 통화 ID  
필수** - 예  
*기본값* – 없음

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

# CallAndBridge
<a name="call-and-bridge"></a>

PSTN 전화번호 또는 Amazon Chime SDK Voice Connector 또는 Amazon Chime SDK Voice Connector 그룹으로 구성된 SIP 트렁크에 대한 아웃바운드 통화를 생성한 다음 기존 통화와 연결합니다. 전화번호로 전화를 걸 때 `PSTN`을, SIP 트렁크에 전화를 걸 때 `AWS`를 사용합니다.

기존 통화는 [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를 사용하여 생성된 아웃바운드 통화 또는 `NewInboundCall` 이벤트와 함께 함수를 호출하는 SIP 규칙에 의해 생성된 인바운드 통화일 수 있습니다 AWS Lambda . Voice Connector 또는 Voice Connector 그룹 엔드포인트에 `CallAndBridge` 작업을 구현할 때는 Voice Connector 또는 Voice Connector 그룹의 Amazon 리소스 번호(ARN)를 지정해야 합니다.

아웃바운드 통화 및 AWS Lambda 함수에 사용자 지정 SIP 헤더를 추가할 수도 있습니다. 사용자 지정 헤더를 사용하면 층수 및 우편번호와 같은 값을 전달할 수 있습니다. 사용자 지정 헤더에 대한 내용은 [Amazon Chime SDK PTSN 오디오 서비스에서 SIP 헤더 사용](sip-headers.md) 섹션을 참조하세요.

호출 및 브리지 함수를 사용할 때는 각 호출이 SMA 활성 호출 제한을 계산하는 데 사용되는 활성 동시 호출 수에 포함된다는 점에 유의해야 합니다. 이 점을 염두에 두고 통화 및 브리지에 대한 SMA 활성 통화 제한을 관리할 때는 호출 및 브리지 작업 1개마다 호출 2개를 계산해야 합니다. 자세한 내용은의 [SIP 트렁킹 및 음성 할당량을 참조하세요](https://docs.aws.amazon.com/general/latest/gr/chime-sdk.html#chm-sdk-pstn-quotas)*AWS 일반 참조*.

다음 예제 코드는 PSTN 엔드포인트에 연결하는 일반적인 작업을 보여줍니다.

```
{
    "SchemaVersion": "1.0",
    "Actions": [{
            "Type": "CallAndBridge",
            "Parameters": {
                "CallTimeoutSeconds": 30,
                "CallerIdNumber": "e164PhoneNumber", // required            
                "Endpoints": [{
                    "BridgeEndpointType": "PSTN", // required
                    "Uri": "e164PhoneNumber", // required                       
                }],
            }
        }
    ]
}
```

다음 예제는 Voice Connector 또는 Voice Connector 그룹과 사용자 지정 SIP 헤더를 사용하는 일반적인 작업을 보여줍니다.

```
{
   "SchemaVersion":"1.0",
   "Actions":[
      {
         "Type":"CallAndBridge",
         "Parameters":{
            "CallTimeoutSeconds":30,
            "CallerIdNumber": "e164PhoneNumber", // required
            "RingbackTone": { // optional
                    "Type": "S3",
                    "BucketName": "s3_bucket_name",
                    "Key": "audio_file_name"
                },
            "Endpoints":[
               {
                  "BridgeEndpointType":"AWS", // enum type, required                                  
                  "Arn":"arn:aws:chime:us-east-1:0123456789101:vc/abcdefg1hijklm2nopq3rs" //VC or VCG ARN, required for AWS endpoints
                  "Uri":"ValidString", // required, see description below  
               }
            ],
            "SipHeaders": { 
                "x-String":"String"
            }
         }
      }
   ]
}
```

**CallTimeoutSeconds**  
설명** - 통화가 시간 제한을 초과하기 전까지의 간격입니다. 타이머는 통화 설정 시 시작됩니다.  
허용된 값** - 1 이상 120 이하  
필수** - 아니요  
기본값** - 30

**CallerIdNumber**  
설명** - 고객 소유의 번호 또는 A 레그의 발신 번호  
허용된 값** - E.164 형식의 유효한 전화번호  
필수** - 예  
*기본값* – 없음

**Endpoints**  
설명** - 통화의 엔드포인트입니다.  
허용된 값:**   
+ `BridgeEndpointType` - Voice Connector 및 Voice Connector 그룹의 경우 `AWS`, 그 외에는 `PSTN`입니다.
+ `Arn` - Voice Connector 또는 Voice Connector 그룹의 ARN입니다. `AWS`를 `BridgeEndpointType`으로 사용하는 경우에만 필요합니다.
+ `Uri` - URI 값은 엔드포인트 유형에 따라 달라집니다.

  `PSTN` 엔드포인트의 경우 URI는 유효한 E.164 전화번호여야 합니다.

  `AWS` 엔드포인트의 경우 URI 값이 `Request-URI`의 `user` 부분을 설정합니다. [Augmented Backus-Naur Format](https://datatracker.ietf.org/doc/html/rfc2234)을 사용해야 합니다. 필수 길이: 1\$136. 값은 `a-z, A-Z, 0-9, &, =, +, $, /, %, -, _, !, ~, *, `(`,`), (`.`)을 사용합니다.

  `Request-URI`의 호스트 값은 대상 Voice Connector의 인바운드 경로에서 파생됩니다. 다음 예제는 `AWS` 엔드포인트가 있는 `CallAndBridge` 작업을 보여줍니다.

  ```
  {
     "SchemaVersion":"1.0",
     "Actions":[
        {
           "Type":"CallAndBridge",
           "Parameters":{
              "CallTimeoutSeconds":30,
              "CallerIdNumber": "+18005550122",
              "Endpoints":[
                 {
                    "BridgeEndpointType":"AWS",                                   
                    "Arn":"arn:aws:chime:us-east-1:0123456789101:vc/abcdefg1hijklm2nopq3rs", 
                    "Uri":"5550"   
                 }
              ],
              "SipHeaders": { 
                  "x-String":"String"
              }
           }
        }
     ]
  }
  ```

  인바운드 경로 및 Voice Connector에 대한 자세한 내용은 [Editing Amazon Chime SDK Voice Connector settings](https://docs.aws.amazon.com/chime-sdk/latest/ag/edit-voicecon.html)를 참조하세요.
필수** - 예  
*기본값* – 없음

**SipHeaders**  
설명- 추가 값을 전달할 수 있도록 합니다.** `AWS` 엔드포인트 유형에만 사용합니다.  
허용된 값** - 유효한 SIP 헤더  
필수** - 아니요  
*기본값* – 없음

다음 예제는 PSTN 엔드포인트를 사용하는 성공적인 `CallAndBridge` 작업을 보여줍니다.

```
{
   "SchemaVersion": "1.0",
   "Sequence": 3,
   "InvocationEventType": "ACTION_SUCCESSFUL",
   "ActionData": {
      "Type": "CallAndBridge",
      "Parameters": {
         "CallTimeoutSeconds": 30,
         "CallerIdNumber": "e164PhoneNumber",
         "Endpoints":[
            {
               "BridgeEndpointType": "PSTN",
               "Uri": "e164PhoneNumber"               
            }
         ],
         "CallId": "call-id-1"
      }
   },
   "CallDetails":{
      .....
      .....
      "Participants":[
         {
            "CallId": "call-id-1",
            "ParticipantTag": "LEG-A",
            .....   
            "Status": "Connected"
         },
         {
            "CallId": "call-id-2",
            "ParticipantTag": "LEG-B",
            .....
            "Status": "Connected"
         }
      ]
   }
}
```

다음은 예제는 실패한 `CallAndBridge` 작업을 보여줍니다.

```
{
   "SchemaVersion": "1.0",
   "Sequence":2,
   "InvocationEventType": "ACTION_FAILED",
      "ActionData":{
      "Type": "CallAndBridge",
      "Parameters":{
         "CallTimeoutSeconds": 30,
         "CallerIdNumber": "e164PhoneNumber",
         "Endpoints": [
            {
               "BridgeEndpointType": "PSTN",
               "Uri": "e164PhoneNumber"           
            }
         ],
         "CallId": "call-id-1"
      },
      "ErrorType": "CallNotAnswered",
      "ErrorMessage": "Call not answered"
   },
   "CallDetails":{
      .....
      .....
      "Participants":[
         {
            "CallId": "call-id-1",
            "ParticipantTag": "LEG-A",
            .....   
         }
      ]
   }
}
```

## 통화 흐름
<a name="call-bridge-flows"></a>

이 `CallAndBridge` 작업은 레그 연결 여부 및 파라미터에 따라 기존 통화 레그에 다른 통화 신호 및 오디오 경험을 제공합니다.

다음 다이어그램은 인바운드 통화 레그 A가 이미 연결되어 있을 때 다양한 파라미터를 사용하는 통화 흐름을 보여줍니다.

![\[CallAndBridge 작업을 통하는 응답한 통화의 흐름입니다.\]](http://docs.aws.amazon.com/ko_kr/chime-sdk/latest/dg/images/call-bridge-ans-2.png)


다음 다이어그램은 응답하지 않은 통화의 통화 흐름을 보여줍니다.

![\[CallAndBridge 작업을 통한 응답하지 않은 통화의 흐름입니다.\]](http://docs.aws.amazon.com/ko_kr/chime-sdk/latest/dg/images/SMA_Bridging_NotAns.png)


**추가 세부 정보**  
`CallAndBridge` 작업에 관한 다음 사실을 유념하세요.
+ `CallTimeoutSeconds` - 이 타이머는 B 레그에서 SIP 초대가 전송될 때 시작됩니다. 원하는 대상 값을 설정할 수 있지만 업스트림 캐리어에서는 이 값을 무시할 수 있습니다.
+ `CallerIdNumber` – 이 전화번호는 고객의 전화번호이거나 A 레그의 발신 번호여야 합니다.
+ **끊는 행동 및 엣지 케이스** - 한 통화 레그가 끊기더라도 다른 쪽 통화 레그는 자동으로 전화를 끊지 않습니다. `Hangup` 이벤트가 AWS Lambda 함수로 전송되면 나머지 레그를 독립적으로 연결 해제해야 합니다. 통화 레그가 계속 걸려 있는 경우 끊길 때까지 통화 요금이 청구됩니다. 예를 들어 다음 시나리오에서는 예상치 못한 요금이 부과될 수 있습니다.
  + 대상 전화번호로 연결하려고 합니다. 대상이 통화 중이고 전화를 바로 음성 메일로 보냅니다. 오디오 서비스의 관점에서 보면 음성 메일로 가는 것은 전화를 받는 것과 같습니다. A 레그는 전화를 끊지만 B 레그는 계속해서 음성 메일 메시지를 수신합니다. B 레그가 수신하는 동안에는 요금이 청구됩니다.
  + 가장 좋은 방법은 AWS Lambda 함수 또는 통화 상대방을 사용하여 각 통화 레그를 독립적으로 끊는 것입니다.
+ **청구** - `CallAndBridge` 사용 시 요금은 다음과 같이 청구됩니다.
  + PSTN에 생성된 각 통화 레그(A 레그, B 레그 등)에 대한 활성 통화 시간(분)
  + 오디오 서비스 사용 시간(분)

GitHub에서 작업 예제를 확인하세요.
+ [https://github.com/aws-samples/amazon-chime-sma-bridging](https://github.com/aws-samples/amazon-chime-sma-bridging)
+ [https://github.com/aws-samples/amazon-chime-sma-call-forwarding](https://github.com/aws-samples/amazon-chime-sma-call-forwarding)
+ [https://github.com/aws-samples/amazon-chime-sma-on-demand-recording](https://github.com/aws-samples/amazon-chime-sma-on-demand-recording)

# Hangup
<a name="hangup"></a>

통화 레그에 `SipStatusCode`와 함께 `Hangup` 값을 전송합니다.

오디오 서비스가 통화 레그에서 `Hangup` 작업을 실행하는 경우:
+ 통화 레그가 하나뿐인 통화의 경우 SIP 미디어 애플리케이션은 `HANGUP` 이벤트와 함께 AWS Lambda 함수를 호출하고 응답을 무시합니다. 그러면 통화 연결이 끊어집니다.
+ 다른 통화 레그(레그 B)에 연결된 통화 레그(레그 A)의 경우 연결된 통화 레그(레그 B)와 `Hangup` 작업이 연결되면 PSTN 오디오 서비스는 연결된 통화 레그의 연결을 끊은 다음 레그 B에 대한 `HANGUP` 이벤트와 함께 Lambda 함수를 간접 호출합니다. 그러면 PSTN 오디오 서비스는 해당 Lambda 간접 호출에서 반환된 모든 작업을 실행합니다.
+ 다른 통화 레그(레그 B)에 연결된 통화 레그(레그 A)의 경우 기존 통화 레그(레그 A)와 `Hangup` 작업이 연결되면 PSTN 오디오 서비스는 기존 통화 레그의 연결을 끊은 다음 레그 A에 대한 `HANGUP` 이벤트와 함께 Lambda 함수를 간접 호출합니다. 그러면 PSTN 오디오 서비스는 해당 Lambda 간접 호출에서 반환된 모든 작업을 실행합니다.
+ `JoinMeeting` 작업을 사용하여 회의에 참여한 통화 레그의 경우 `Hangup` 작업이 회의 레그(보통 레그 B)와 연결되면 발신자는 회의 연결을 끊고 `Hangup` 작업에 대한 `ACTION_SUCCESSFUL` 이벤트를 수신합니다.

다음은 예제는 일반적인 `Hangup` 작업을 보여줍니다.

```
{
    "Type": "Hangup",
    "Parameters": {
        "CallId": "call-id-1",
        "ParticipantTag": "LEG-A",
        "SipResponseCode": "0"
    }
}
```

**CallId**  
*설명* - AWS Lambda 함수 호출의에 있는 `CallId` 참가자에 `CallDetails` 대한 설명  
허용된 값** - 유효한 통화 ID  
필수** - 아니요  
*기본값* – 없음

**ParticipantTag**  
설명** - `CallDetails`의 연결된 참가자 중 한 명의 `ParticipantTag`입니다.  
허용된 값** – `LEG-A` 또는 `LEG-B`  
필수** - 아니요  
기본값** - 간접 호출된 `callLeg`의 `ParticipantTag`(`CallId`를 지정한 경우 무시됨)

**SipResponseCode**  
설명** - 지원되는 모든 SIP 응답 코드입니다.  
허용된 값** - 480(사용 불가), 486(사용 중), 0(정상 종료)  
필수** - 아니요  
기본값** - 0

사용자가 통화를 종료하면 SIP 미디어 애플리케이션은에 나열된 코드를 사용하여 AWS Lambda 함수를 호출합니다[Amazon Chime SDK PSTN 오디오 서비스를 사용한 통화 종료](case-5.md).

GitHub에서 작업 예제를 확인하세요.
+ [https://github.com/aws-samples/amazon-chime-sma-bridging](https://github.com/aws-samples/amazon-chime-sma-bridging)
+ [https://github.com/aws-samples/amazon-chime-sma-call-forwarding](https://github.com/aws-samples/amazon-chime-sma-call-forwarding)
+ [https://github.com/aws-samples/amazon-chime-sma-outbound-call-notifications](https://github.com/aws-samples/amazon-chime-sma-outbound-call-notifications)
+ [https://github.com/aws-samples/amazon-chime-sma-on-demand-recording](https://github.com/aws-samples/amazon-chime-sma-on-demand-recording)

# JoinChimeMeeting
<a name="join-chime-meeting"></a>

참석자에게 참여 토큰을 제공하여 Amazon Chime SDK 회의에 참여합니다. 이렇게 하려면 [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) APIs에 AWS SDK를 호출하여 토큰을 가져와 작업에서 전달합니다. 다음 예를 참조하세요.

**참고**  
다중 통화에서는 이 작업을 실행할 수 없습니다.

```
{
    "Type": "JoinChimeMeeting",
    "Parameters": {
        "JoinToken": "meeting-attendee-join-token",
        "CallId": "call-id-1",
        "ParticipantTag": "LEG-A",
        "MeetingId": "meeting-id"
    }
}
```

**JoinToken**  
설명** - Amazon Chime SDK 회의 참석자의 유효한 참여 토큰입니다.  
허용된 값** - 유효한 참여 토큰  
필수** - 예  
*기본값* – 없음

**CallId**  
*설명* - AWS Lambda 함수 호출의에 있는 `CallId` 참가자에 `CallDetails` 대한 설명  
허용된 값** - 유효한 통화 ID  
필수** - 아니요  
*기본값* – 없음

**ParticipantTag**  
설명** - `CallDetails`의 연결된 참가자 중 한 명의 `ParticipantTag`입니다.  
허용된 값** - `LEG-A`  
필수** - 아니요  
기본값** - 간접 호출된 `callLeg`의 `ParticipantTag`(`CallId`를 지정한 경우 무시됨)

**MeetingId**  
설명** - `JoinToken`과 관련된 유효한 Amazon Chime SDK 회의 ID입니다. [Amazon Chime](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_Operations_Amazon_Chime.html) 네임스페이스의 API를 사용하여 회의를 생성한 경우 회의 ID는 필요하지 않습니다. [Amazon Chime SDK 회의](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_Operations_Amazon_Chime_SDK_Meetings.html) 네임스페이스의 API를 사용하여 회의를 생성한 경우 회의 ID가 필요합니다. 회의를 생성하는 데 사용된 API 엔드포인트를 사용하여 회의에 참여합니다.  
*허용된 값* - 유효한 회의 ID  
필수** - 아니요  
기본값** – 없음

SIP 미디어 애플리케이션은이 작업을 실행한 후 항상 AWS Lambda 함수를 호출합니다. `ACTION_SUCCESSFUL` 또는 `ACTION_FAILED` 간접 호출 이벤트 유형을 반환합니다. 다음 예제에서는 성공적인 간접 호출 이벤트 구조를 보여줍니다.

```
{
    "SchemaVersion": "1.0",
    "Sequence": 4,
    "InvocationEvent": "ACTION_SUCCESSFUL",
    "ActionData": {
        "Type": "JoinChimeMeeting",
        "Parameters": {
            "JoinToken": "meeting-attendee-join-token",
            "CallId": "call-id-1"
            "ParticipantTag": "LEG-A"
        }
    }
    "CallDetails": {
        ...
    }
}
```

**오류 처리**  
회의를 브리징하는 동안 검증 오류가 발생하면 SIP 애플리케이션은 다음 표에 표시된 오류 메시지 중 하나를 사용하여 AWS Lambda 함수를 호출합니다.


|  오류  |  메시지  |  이유  | 
| --- | --- | --- | 
|  `InvalidActionParameter`  |  `JoinToken` parameter value is invalid.  |  작업의 다른 파라미터가 유효하지 않거나 누락되었습니다.  | 
|  `SystemException`  |  System error while running action.  |  작업을 실행하는 동안 다른 유형의 시스템 오류가 발생했습니다.  | 

다음 예제는 일반적인 실패 이벤트를 보여줍니다.

```
{
    "SchemaVersion": "1.0",
    "Sequence": 3,
    "InvocationEvent": "ACTION_FAILED",
    "ActionData": {
        "Type": "JoinChimeMeeting",
        "Parameters": {
            "JoinToken": "meeting-attendee-join-token",
            "CallId": "call-id-1",
            "ParticipantTag": "LEG-A"
        },
        "Error": "ErrorJoiningMeeting: Error while joining meeting."
    }
    "CallDetails": {
        ...
    }
}
```

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

# ModifyChimeMeetingAttendee(오디오 음소거 및 음소거 해제)
<a name="mute-unmute"></a>

Amazon Chime SDK 회의 ID 및 참석자 목록을 제공하여 SIP 미디어 애플리케이션이 텔레포니 참석자의 상태를 수정할 수 있도록 합니다.

**참고**  
이 작업은 현재 텔레포니 참석자에 대한 음소거 및 음소거 해제 작업을 지원합니다. 또한 사용자는 `JoinChimeMeeting` 작업을 사용하여 회의에 참여해야 합니다. 이 작업은 `participantTag=“LEG-B”` 또는 해당 `CallId`에서 수행할 수 있습니다.

이 작업은 SIP 미디어 애플리케이션에서 `"+`*13605550122*`"`, LEG-B로 참여한 callLeg 또는 SIP 미디어 애플리케이션에서 회의로 참여된 레그에만 적용됩니다.

```
{
"SchemaVersion": "1.0",
  "Actions": [
    {
      "Type" : "ModifyChimeMeetingAttendees",
      "Parameters" : {
        "Operation": "Mute",
        "MeetingId": "meeting-id",
        "CallId": "call-id",
        "ParticipantTag": LEG-B",
        "AttendeeList": ["attendee-id-1", "attendee-id-2"]
      }
    }
  ]
}
```

**Operation**  
설명** - 참석자 목록에서 수행할 작업입니다.  
허용된 값** - Mute, Unmute  
필수** - 예  
*기본값* – 없음

**MeetingId**  
설명** - 참석자가 속한 회의의 ID입니다.  
허용된 값** - 유효한 회의 ID. 음소거하거나 음소거를 해제하는 사람도 회의에 속해야 합니다.  
필수** - 예  
*기본값* – 없음

**CallId**  
설명** - 참석자가 속한 회의의 ID입니다.  
허용된 값** - 유효한 호출 ID  
필수** - 아니요  
*기본값* – 없음

**ParticipantTag**  
설명** - 참석자에게 할당된 태그입니다.  
허용된 값** - 유효한 태그  
필수** - 아니요  
*기본값* – 없음

**AttendeeList**  
설명** - 음소거 또는 음소거 해제할 참석자 ID 목록입니다.  
허용된 값** - 유효한 참석자 ID 목록  
필수** - 예  
기본값** - 없음, 최대 100

이 작업을 실행한 후 오디오 서비스는 항상 `ACTION_SUCCESSFUL` 또는 `ACTION_FAILED` 간접 호출 이벤트 유형과 함께 AWS Lambda 함수를 간접 호출합니다. 다음 예제 코드에서는 일반적인 `ACTION_SUCCESSFUL` 간접 호출 이벤트를 보여줍니다.

```
{
    "SchemaVersion": "1.0",
    "Sequence": INTEGER,
    "InvocationEventType": "ACTION_SUCCESSFUL",
    "ActionData": {
        "Type" : "ModifyChimeMeetingAttendees",
        "Parameters" : {
            "Operation": "Mute",
            "MeetingId": "meeting-id",
            "CallId": "call-id",
            "ParticipantTag": "LEG-B",
            "AttendeeList": ["attendee-id-1", "attendee-id-2"]
        }
    }
    "CallDetails": {
        ...
    }
}
```

**오류 처리**  
잘못된 명령 파라미터 또는 API 실패의 경우 SIP 미디어 애플리케이션은 실패한 명령 또는 API와 관련된 오류 메시지와 함께 AWS Lambda 함수를 호출합니다.


|  오류  |  메시지  |  이유  | 
| --- | --- | --- | 
|  `InvalidActionParameter`  |  The `ModifyChimeMeetingAttendees Operation` parameter value is invalid  |  `Operation` 값은 Mute 또는 Unmute여야 합니다.  | 
|     |  Meeting ID parameter value is invalid.  |  회의 ID가 비어 있습니다.  | 
|     |  Attendee List parameter value is invalid.  |  참석자 ID 목록이 비어 있거나 최대 100명을 초과합니다.  | 
|     |  Invalid action on the call.  |  통화가 연결되지 않았습니다.  | 
|     |  Call is not connected to Chime Meeting.  |  참석자가 Chime 회의에 연결되어 있지 않습니다.  | 
|     |  One or more attendees are not part of this meeting. All attendees must be part of this meeting.  |  참석자는 회의에서 참석자를 수정할 권한이 없습니다.  | 
|  `SystemException`  |  System error while running action.  |  작업을 실행하는 동안 시스템 오류가 발생했습니다.  | 

다음 예제 코드는 일반적인 실패 이벤트를 보여줍니다.

```
{
    "SchemaVersion": "1.0",
    "Sequence": INTEGER,
    "InvocationEventType": "ACTION_FAILED",
    "ActionData": {
        "Type" : "ModifyChimeMeetingAttendees",
        "Parameters" : {
            "Operation": "Mute",
            "MeetingId": "meeting-id",
            "CallId": "call-id",
            "ParticipantTag": "LEG-B",
            "AttendeeList": ["attendee-id-1", "attendee-id-2"]
        },
        "ErrorType": "",
        "ErrorMessage": "",
        "ErrorList": []
    }
    "CallDetails": {
        ...
    }
}
```

GitHub에서 작업 예제를 확인하세요.
+ [https://github.com/aws-samples/amazon-chime-sma-bridging](https://github.com/aws-samples/amazon-chime-sma-bridging).
+ [https://github.com/aws-samples/amazon-chime-sma-update-call](https://github.com/aws-samples/amazon-chime-sma-update-call)

# Pause
<a name="pause"></a>

지정된 시간 동안 통화를 일시 중지합니다.

```
{
    "Type": "Pause",
    "Parameters": {
        "CallId": "call-id-1",
        "ParticipantTag": "LEG-A",
        "DurationInMilliseconds": "3000"
    }
}
```

**CallId**  
*설명* - AWS Lambda 함수 호출의에 있는 `CallId` 참가자에 `CallDetails` 대한 설명  
허용된 값** - 유효한 통화 ID  
필수** - 아니요  
*기본값* – 없음

**ParticipantTag**  
설명** - `CallDetails`의 연결된 참가자 중 한 명의 `ParticipantTag`입니다.  
허용된 값** – `LEG-A` 또는 `LEG-B`  
필수** - 아니요  
기본값** - 간접 호출된 `callLeg`의 `ParticipantTag`(`CallId`를 지정한 경우 무시됨)

**DurationInMilliseconds**  
설명** - 일시 중지 기간(밀리초)  
허용된 값** - 0보다 큰 정수  
필수** - 예  
*기본값* – 없음

GitHub에서 작업 예제를 확인하세요.
+ [https://github.com/aws-samples/amazon-chime-sma-outbound-call-notifications](https://github.com/aws-samples/amazon-chime-sma-outbound-call-notifications)
+ [https://github.com/aws-samples/amazon-chime-sma-on-demand-recording](https://github.com/aws-samples/amazon-chime-sma-on-demand-recording)

# PlayAudio
<a name="play-audio"></a>

통화 레그에서 오디오 파일을 재생합니다. 오디오는 여러 번 반복될 수 있습니다. `PlaybackTerminators`에 설정된 DTMF 숫자를 사용하여 진행 중인 오디오를 종료할 수 있습니다.

현재 Amazon Chime SDK는 Amazon Simple Storage Service(S3) 버킷의 오디오 파일 재생만 지원합니다. S3 버킷은 SIP 미디어 애플리케이션과 동일한 AWS 계정에 속해야 합니다. 또한 Amazon Chime SDK Voice Connector 서비스 보안 주체에 `s3:GetObject` 권한을 부여해야 합니다. S3 콘솔 또는 명령줄 인터페이스(CLI)를 사용하여 이를 수행할 수 있습니다.

다음 예제 코드는 일반적인 버킷 정책을 보여줍니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "SMARead",
            "Effect": "Allow",
            "Principal": {
                "Service": "voiceconnector.chime.amazonaws.com"
            },
            "Action": [
                "s3:GetObject"
            ],
            "Resource": "arn:aws:s3:::bucket-name/*",
                "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "111122223333"
                }
            }
        }
    ]
}
```

------

오디오 서비스는 SIP 미디어 애플리케이션을 대신하여 S3 버킷을 읽고 씁니다. [혼동된 대리자 문제](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)를 피하기 위해 S3 버킷 액세스를 단일 SIP 미디어 애플리케이션으로 제한할 수 있습니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "SMARead",
            "Effect": "Allow",
            "Principal": {
                "Service": "voiceconnector.chime.amazonaws.com"
            },
            "Action": [
                "s3:GetObject"
            ],
            "Resource": "arn:aws:s3:::bucket-name/*",
                "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "111122223333",
                    "aws:SourceArn": "arn:aws:chime:us-east-1:111122223333:sma/sip-media-application-id"
                }
            }
        }
    ]
}
```

------

다음은 예제는 일반적인 작업을 보여줍니다.

```
{
    "Type": "PlayAudio",
    "Parameters": {
        "CallId": "call-id-1",
        "ParticipantTag": "LEG-A",
        "PlaybackTerminators": ["1", "8", "#"],
        "Repeat": "5",
        "AudioSource": {
            "Type": "S3",
            "BucketName": "valid-S3-bucket-name",
            "Key": "wave-file.wav"
        }
    }
}
```

**CallID**  
설명** - `CallDetails`에서 참가자의 `CallId`입니다.  
허용된 값** - 유효한 호출 ID  
필수** - 아니요(`ParticipantTag`가 있는 경우)  
기본값** – 없음

**ParticipantTag**  
설명** - `CallDetails`의 연결된 참가자 중 한 명의 `ParticipantTag`입니다.  
*허용된 값* – `LEG-A` 또는 `LEG-B`  
필수** - 아니요(`CallId`가 있는 경우)  
*기본값* - 간접 호출된 `callLeg`의 `ParticipantTag`. `CallId`를 지정한 경우 무시됩니다.

**PlaybackTerminator**  
설명** - 사용자의 DTMF 입력을 사용하여 진행 중인 오디오를 종료합니다.  
*허용된 값* - 다음 값의 배열: “0”, “1”, “2”, “3”, “4”, “5”, “6”, “7”, “8”, “9”, “\$1”, “\$1”  
필수** - 아니요  
*기본값* – 없음

**Repeat**  
설명** - 오디오를 지정된 횟수만큼 반복합니다.  
*허용된 값* - 0보다 큰 정수  
필수** - 아니요  
기본값** – 1

**AudioSource.Type**  
설명** - 오디오 파일에 대한 소스 유형입니다.  
*허용된 값* - S3  
필수** - 예  
기본값** – 없음

**AudioSource.BucketName**  
*설명* - S3 소스 유형의 경우 S3 버킷은 SIP 애플리케이션과 동일한 AWS 계정에 속해야 합니다. 버킷에는 Amazon Chime SDK Voice Connector 서비스 보안 주체인 voiceconnector.chime.amazonaws.com에 대한 액세스 권한이 있어야 합니다.  
*허용된 값* - Amazon Chime SDK가 `s3:GetObject` 작업에 대한 액세스 권한을 가진 유효한 S3 버킷  
필수** - 예  
기본값** – 없음

**AudioSource.key**  
설명** - S3 소스 유형의 경우 `AudioSource.BucketName` 속성에 지정된 S3 버킷의 파일 이름입니다.  
*허용된 값* - 유효한 오디오 파일  
필수** - 예  
기본값** – 없음

SIP 미디어 애플리케이션은 소스 URL에서 오디오를 재생하려고 합니다. 크기가 50MB 이하인 압축되지 않은 원시 PCM .wav 파일을 사용할 수 있습니다. Amazon Chime SDK는 8kHz 모노를 권장합니다.

다이얼 계획의 마지막 명령이 `PlayAudio` 이고 파일이 재생을 완료하거나 사용자가 키를 눌러 재생을 중지하면 애플리케이션은 다음 예제에 표시된 이벤트와 함께 AWS Lambda 함수를 호출합니다.

```
{
    "SchemaVersion": "1.0",
    "Sequence": INTEGER,
    "InvocationEventType": "ACTION_SUCCESSFUL",
    "ActionData": {
        "Type": "PlayAudio",
        "Parameters" : {
            "CallId": "call-id-1",
            "AudioSource": {
                "Type": "S3",
                "BucketName": "valid-S3-bucket-name",
                "Key": "wave-file.wav",
         }           
     }
}
```

종료 숫자가 오디오를 멈춘 후에는 오디오가 반복되지 않습니다.

**오류 처리**  
검증 파일에 오류가 있거나 작업을 실행하는 동안 오류가 발생하면 SIP 미디어 애플리케이션이 적절한 오류 코드와 함께 AWS Lambda 함수를 호출합니다.


|  오류  |  메시지  |  이유  | 
| --- | --- | --- | 
|  `InvalidAudioSource`  |  The audio source parameter is invalid.  |  여러 가지 이유로 이 오류가 발생할 수 있습니다. 예를 들어 권한 문제 또는 URL 관련 문제로 인해 SIP 미디어 애플리케이션이 파일에 액세스할 수 없습니다. 또한 형식, 길이, 크기 등으로 인해 오디오 파일이 검증에 실패할 수 있습니다.  | 
|  `SystemException`  |  System error while running action.  |  작업을 실행하는 동안 다른 시스템 오류가 발생했습니다.  | 
|  `InvalidActionParameter`  |  CallId or ParticipantTag parameter for action is invalid.  |  작업에 유효하지 않은 파라미터가 있습니다.  | 

다음 예제 코드에서는 일반적인 간접 호출 실패를 보여줍니다.

```
{
    "SchemaVersion": "1.0",
    "Sequence": 2,
    "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": {
        ...
    }
}
```

GitHub에서 작업 예제를 확인하세요.
+ [https://github.com/aws-samples/amazon-chime-sma-bridging](https://github.com/aws-samples/amazon-chime-sma-bridging).
+ [https://github.com/aws-samples/amazon-chime-sma-call-forwarding](https://github.com/aws-samples/amazon-chime-sma-call-forwarding)
+ [https://github.com/aws-samples/amazon-chime-sma-outbound-call-notifications](https://github.com/aws-samples/amazon-chime-sma-outbound-call-notifications)
+ [https://github.com/aws-samples/amazon-chime-sma-on-demand-recording](https://github.com/aws-samples/amazon-chime-sma-on-demand-recording)
+ [https://github.com/aws-samples/amazon-chime-sma-update-call](https://github.com/aws-samples/amazon-chime-sma-update-call)

# PlayAudioAndGetDigits
<a name="play-audio-get-digits"></a>

오디오를 재생하고 DTMF 숫자를 수집합니다. 사용자가 올바른 DTMF 숫자를 입력하지 않는 등 실패가 발생하면 작업은 “실패” 오디오를 재생한 다음 SIP 미디어 애플리케이션이 `Repeat` 파라미터에 정의된 시도 횟수를 전부 소진할 때까지 기본 오디오를 재생합니다.

S3 버킷에서 오디오 파일을 재생해야 합니다. S3 버킷은 SIP 미디어 애플리케이션과 동일한 AWS 계정에 속해야 합니다. 또한 [Amazon Chime SDK Voice Connector 서비스 보안 주체](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html)인 `voiceconnector.chime.amazonaws.com`에 `s3:GetObject` 권한을 부여해야 합니다. S3 콘솔 또는 CLI를 사용하여 이를 수행할 수 있습니다.

다음 예제 코드는 일반적인 S3 버킷 정책을 보여줍니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "SMARead",
            "Effect": "Allow",
            "Principal": {
                "Service": "voiceconnector.chime.amazonaws.com"
            },
            "Action": [
                "s3:GetObject"
            ],
            "Resource": "arn:aws:s3:::bucket-name/*",
                "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "111122223333"
                }
            }
        }
    ]
}
```

------

오디오 서비스는 SIP 미디어 애플리케이션을 대신하여 S3 버킷을 읽고 씁니다. [혼동된 대리자 문제](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)를 피하기 위해 S3 버킷 액세스를 단일 SIP 미디어 애플리케이션으로 제한할 수 있습니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "SMARead",
            "Effect": "Allow",
            "Principal": {
                "Service": "voiceconnector.chime.amazonaws.com"
            },
            "Action": [
                "s3:GetObject"
            ],
            "Resource": "arn:aws:s3:::bucket-name/*",
                "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "111122223333",
                    "aws:SourceArn": "arn:aws:chime:us-east-1:111122223333:sma/sip-media-application-id"
                }
            }
        }
    ]
}
```

------

다음은 예제는 일반적인 `PlayAudioAndGetDigits` 작업을 보여줍니다.

```
{
    "Type" : "PlayAudioAndGetDigits",
    "Parameters" : {
        "CallId": "call-id-1",
        "ParticipantTag": "LEG-A"      
        "InputDigitsRegex": "^\d{2}#$",
        "AudioSource": {
            "Type": "S3",
            "BucketName": "bucket-name",
            "Key": "audio-file-1.wav"
        },
        "FailureAudioSource": {
            "Type": "S3",
            "BucketName": "bucket-name",
            "Key": "audio-file-failure.wav"
        },
        "MinNumberOfDigits": 3,
        "MaxNumberOfDigits": 5,
        "TerminatorDigits": ["#"],        
        "InBetweenDigitsDurationInMilliseconds": 5000,
        "Repeat": 3,
        "RepeatDurationInMilliseconds": 10000
    }
}
```

**CallId**  
*설명* - AWS Lambda 함수 호출의에 있는 `CallId` 참가자`CallDetails`의 설명  
허용된 값** - 유효한 통화 ID  
필수** - 아니요  
*기본값* – 없음

**ParticipantTag**  
설명** - `CallDetails`의 연결된 참가자 중 한 명의 `ParticipantTag`입니다.  
허용된 값** – `LEG-A` 또는 `LEG-B`  
필수** - 아니요  
기본값** - 간접 호출된 `callLeg`의 `ParticipantTag`(`CallId`를 지정한 경우 무시됨)

**InputDigitsRegex**  
설명** - 정규 표현식 패턴입니다.  
허용된 값** - 유효한 정규 표현식 패턴  
필수** - 아니요  
*기본값* – 없음

**AudioSource.Type**  
설명** - 오디오 파일 유형에 대한 소스 유형입니다.  
허용된 값** - S3 버킷  
필수** - 예  
기본값** – `"S3"`

**AudioSource.BucketName**  
*설명* - S3 `AudioSource.Type` 값의 경우 S3 버킷은 SIP 미디어 애플리케이션과 동일한 AWS 계정에 속해야 합니다. 버킷 S3에는 [Amazon Chime SDK Voice Connector 서비스 보안 주체](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html)인 `voiceconnector.chime.amazonaws.com`에 대한 액세스 권한이 있어야 합니다.  
허용된 값** - Amazon Chime SDK가 `s3:GetObject` 작업 액세스 권한을 가진 유효한 S3 버킷  
필수** - 예  
*기본값* – 없음

**AudioSource.Key**  
설명** - `AudioSource.BucketName` S3 버킷에 있는 오디오 객체의 키 이름입니다.  
허용된 값** - 유효한 오디오 파일  
필수** - 예  
*기본값* – 없음

**FailureAudioSource.Type**  
설명** - `FailureAudioSource.BucketName` S3 버킷에 있는 오디오 객체의 키 이름입니다.  
허용된 값** - S3  
필수** - 예  
*기본값* – 없음

**FailureAudioSource.BucketName**  
*설명* - S3 소스 유형의 경우 S3 버킷은 SIP 미디어 애플리케이션과 동일한 AWS 계정에 속해야 합니다. [Amazon Chime SDK Voice Connector 서비스 보안 주체](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html)인 `voiceconnector.chime.amazonaws.com`에는 S3 버킷에 대한 액세스 권한이 있어야 합니다.  
허용된 값** - Amazon Chime SDK가 `s3:GetObject` 작업 액세스 권한을 가진 유효한 S3 버킷  
필수** - 예  
*기본값* – 없음

**FailureAudioSource.Key**  
설명** - `FailureAudioSource.BucketName` S3 버킷에 있는 오디오 객체의 키 이름입니다.  
허용된 값** - 유효한 오디오 파일  
필수** - 예  
*기본값* – 없음

**MinNumberOfDigits**  
설명** - 시간 초과나 ‘통화 실패’ 오디오 재생 전에 캡처하는 숫자의 최소 개수입니다.  
허용된 값** – 0 이상  
필수** - 아니요  
기본값** - 0

**MaxNumberOfDigits**  
설명** - 종료 숫자 없이 중지 전 캡처하는 숫자의 최대 개수입니다.  
허용된 값** - `MinNumberOfDigits` 초과  
필수** - 아니요  
기본값** - 128

**TerminatorDigits**  
설명** - 사용자가 `MaxNumberOfDigits`보다 적은 숫자를 입력하면 입력을 종료하는 데 사용되는 숫자  
허용되는 값** - 다음 숫자 중 하나: 0123456789\$1\$1  
필수** - 아니요  
기본값** - \$1

**InBetweenDigitsDurationInMilliseconds**  
설명** - `FailureAudio` 재생 전 숫자 입력 사이의 대기 시간(밀리초)입니다.  
허용된 값** – 0 초과  
필수** - 아니요  
기본값** - `RepeatDurationInMilliseconds` 값(지정하지 않은 경우)

**Repeat**  
설명** - 숫자를 얻기 위한 총 시도 횟수입니다.  
허용된 값** – 0 초과  
필수** - 아니요  
기본값** – 1

**RepeatDurationInMilliseconds**  
설명** - `Repeat` 시도 사이의 대기 시간(밀리초)입니다.  
허용된 값** – 0 초과  
필수** - 예  
*기본값* – 없음

SIP 미디어 애플리케이션은 `PlayAudioAndGetDigits` 작업을 실행한 후 `ACTION_SUCCESSFUL` 또는 호출 이벤트 유형으로 항상 AWS Lambda 함수를 `ACTION_FAILED` 호출합니다. 애플리케이션이 성공적으로 숫자를 수집한 경우 `ActionData` 객체에 `ReceivedDigits` 값을 설정합니다. 다음 예제에서는 해당 AWS Lambda 함수의 호출 이벤트 구조를 보여줍니다.

```
{
    "SchemaVersion": "1.0",
    "Sequence": 3,
    "InvocationEventType": "ACTION_SUCCESSFUL",
    "ActionData": {
        "Type": "PlayAudioAndGetDigits",
        "Parameters" : {
            "CallId": "call-id-1",
            "ParticipantTag": "LEG-A",
            "InputDigitsRegex": "^\d{2}#$",
            "AudioSource": {
                "Type": "S3",
                "BucketName": "bucket-name",
                "Key": "audio-file-1.wav"
            },
            "FailureAudioSource": {
                "Type": "S3",
                "BucketName": "bucket-name",
                "Key": "audio-file-failure.wav"
            },
            "MinNumberOfDigits": 3,
            "MaxNumberOfDigits": 5,
            "TerminatorDigits": ["#"],
            "InBetweenDigitsDurationInMilliseconds": 5000,
            "Repeat": 3,
            "RepeatDurationInMilliseconds": 10000
        },
        "ErrorType": "InvalidAudioSource",
        "ErrorMessage": "Audio Source parameter value is invalid."
    },
        "ReceivedDigits": "1234"
    },
    "CallDetails": {
        ...
    }
}
```

**오류 처리**  
유효성 검사 오류가 발생한 경우 SIP 미디어 애플리케이션이 해당 오류 메시지와 함께 AWS Lambda 함수를 직접 호출합니다. 다음 표에는 가능한 오류 메시지가 나열되어 있습니다.


|  오류  |  메시지  |  이유  | 
| --- | --- | --- | 
|  `InvalidAudioSource`  |  Audio source parameter value is invalid.  |  여러 가지 이유로 이 오류가 발생할 수 있습니다. 예를 들어 권한 문제 또는 S3 버킷 관련 문제로 인해 SIP 미디어 애플리케이션이 파일에 액세스할 수 없습니다. 또한 길이, 크기 또는 지원되지 않는 형식으로 인해 오디오 파일이 검증에 실패할 수 있습니다.  | 
|  `InvalidActionParameter`  |  `CallId` or `ParticipantTag` parameter for the action is invalid.  |  `CallId`, `ParticipantTag` 또는 다른 파라미터가 유효하지 않습니다.  | 
|  `SystemException`  |  System error while running the action.  |  작업을 실행하는 동안 시스템 오류가 발생했습니다.  | 

작업이 제한 시간 또는 너무 많은 재시도로 인해 지정된 자릿수를 수집하지 못하면 SIP 미디어 애플리케이션은 호출 이벤트 유형으로 AWS Lambda 함수를 `ACTION_FAILED` 호출합니다.

```
{
    "SchemaVersion": "1.0",
    "Sequence": 4,
    "InvocationEventType": "ACTION_FAILED",
    "ActionData": {
        "Type": "PlayAudioAndGetDigits",
        "Parameters" : {
            "CallId": "call-id-1",
            "ParticipantTag": "LEG-A",
            "InputDigitsRegex": "^\d{2}#$",
            "AudioSource": {
                "Type": "S3",
                "BucketName": "bucket-name",
                "Key": "audio-file-1.wav"
            },
            "FailureAudioSource": {
                "Type": "S3",
                "BucketName": "bucket-name",
                "Key": "audio-file-failure.wav"
            },
            "MinNumberOfDigits": 3,
            "MaxNumberOfDigits": 5,
            "TerminatorDigits": ["#"],
            "InBetweenDigitsDurationInMilliseconds": 5000,
            "Repeat": 3,
            "RepeatDurationInMilliseconds": 10000
        },
        "ErrorType": "InvalidAudioSource",
        "ErrorMessage": "Audio Source parameter value is invalid."
    }
    "CallDetails": {
        ...
    }
}
```

GitHub에서 작업 예제를 확인하세요.
+ [https://github.com/aws-samples/amazon-chime-sma-bridging](https://github.com/aws-samples/amazon-chime-sma-bridging).
+ [https://github.com/aws-samples/amazon-chime-sma-update-call](https://github.com/aws-samples/amazon-chime-sma-update-call)

# ReceiveDigits
<a name="listen-to-digits"></a>

사용자가이 작업에 지정된 정규식 패턴과 일치하는 숫자를 입력하면 SIP 미디어 애플리케이션이 AWS Lambda 함수를 호출합니다.

```
{
    "Type": "ReceiveDigits",
    "Parameters": {
        "CallId": "call-id-1",
        "ParticipantTag": "LEG-A",
        "InputDigitsRegex": "^\d{2}#$",
        "InBetweenDigitsDurationInMilliseconds": 1000, 
        "FlushDigitsDurationInMilliseconds": 10000
    }
}
```

**CallId**  
*설명* - AWS Lambda 함수 호출의에 있는 `CallId` 참가자에 `CallDetails` 대한 설명  
허용된 값** - 유효한 통화 ID  
필수** - 아니요  
*기본값* – 없음

**ParticipantTag**  
설명** - `CallDetails`의 연결된 참가자 중 한 명의 `ParticipantTag`입니다.  
허용된 값** – `LEG-A` 또는 `LEG-B`  
필수** - 아니요  
기본값** - 간접 호출된 `callLeg`의 `ParticipantTag`(`CallId`를 지정한 경우 무시됨)

**InputDigitsRegex**  
설명** - 정규 표현식 패턴입니다.  
허용된 값** - 유효한 정규 표현식 패턴  
필수** - 예  
*기본값* – 없음

**InBetweenDigitsDurationInMilliseconds**  
설명** - 입력이 정규 표현식 패턴과 일치하는지 확인하기 전의 숫자 사이 간격입니다.  
*허용된 값* - 기간(밀리초)  
필수** - 예  
*기본값* – 없음

**FlushDigitsDurationInMilliseconds**  
*설명* - 수신된 DTMF 숫자가 플러시되고 AWS Lambda 함수로 전송되는 간격입니다. 간격이 끝난 후 SIP 미디어 애플리케이션이 새 숫자를 수신하면 타이머가 다시 시작됩니다.  
허용된 값** - `InBetweenDigitsDurationInMilliseconds`  
필수** - 예  
*기본값* – 없음

SIP 미디어 애플리케이션은 새 `ReceiveDigits` 작업을 수신할 때까지 통화가 진행되는 동안 DTMF 숫자를 삭제합니다. 이 `FlushDigitsDurationInMilliseconds` 간격은 SIP 미디어 애플리케이션이 첫 번째 DTMF 숫자를 수신할 때 시작됩니다. 간격이 만료되기 전에 사용자가 올바른 숫자를 입력하면 SIP 미디어 애플리케이션이에 설명된 AWS Lambda 함수를 호출합니다[Amazon Chime SDK PSTN 오디오 서비스의 발신자 입력 수신](case-4.md).

사용자 입력이 정규 표현식 패턴과 일치하지 않는 경우 SIP 미디어 애플리케이션은 애플리케이션이 반복 횟수를 소진하거나 사용자가 유효한 숫자를 입력할 때까지 “실패” 오디오 파일 메시지를 반복합니다.

GitHub에서 작업 예제를 확인하세요.
+ [https://github.com/aws-samples/amazon-chime-sma-outbound-call-notifications](https://github.com/aws-samples/amazon-chime-sma-outbound-call-notifications)
+ [https://github.com/aws-samples/amazon-chime-sma-on-demand-recording](https://github.com/aws-samples/amazon-chime-sma-on-demand-recording)
+ [https://github.com/aws-samples/amazon-chime-sma-update-call](https://github.com/aws-samples/amazon-chime-sma-update-call)

# RecordAudio
<a name="record-audio"></a>

SIP 미디어 애플리케이션이 주어진 통화 ID의 미디어를 녹음할 수 있도록 합니다. 예를 들어 음성 메일 애플리케이션 및 회의 참가자 알림이 있습니다. 애플리케이션은 설정한 기간에 도달하거나, 사용자가 `RecordingTerminators` 중 하나를 누르거나, 애플리케이션이 무음을 감지할 때까지 녹음합니다. 이러한 경우 작업은 애플리케이션에 결과 미디어 파일을 지정된 S3 버킷에 저장하라고 지시합니다. S3 버킷은 SIP 미디어 애플리케이션과 동일한 AWS 계정에 속해야 합니다. 또한 이 작업은 [Amazon Chime SDK Voice Connector 서비스 보안 주체](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html)인 `voiceconnector.chime.amazonaws.com`에 `s3:PutObject` 및 `s3:PutObjectAcl` 권한을 부여해야 합니다.

**참고**  
이 기능을 사용하여 녹음한 경우 전자 통신 녹음에 관한 법률 또는 규정이 적용될 수 있습니다. 녹음에 관한 모든 관련 법률을 준수하는 것은 귀하와 최종 사용자의 책임입니다. 여기에는 세션 또는 통신이 녹음되고 있다는 사실을 녹음된 세션의 모든 참가자에게 적절하게 알리고 동의를 구하는 것도 포함됩니다.

다음 예제는 Amazon Chime SDK Voice Connector 서비스 보안 주체에 `s3:PutObject` 및 `s3:PutObjectAcl` 권한을 부여합니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "SMARead",
            "Effect": "Allow",
            "Principal": {
                "Service": "voiceconnector.chime.amazonaws.com"
            },
            "Action": [                
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::bucket-name/*"
        }
    ]
}
```

------

다음 예제는 발신자가 우물 정자 키(\$1)를 누르거나, 10초 동안 아무런 활동이 없거나, 발신자가 3초 동안 침묵을 유지한 경우 녹음을 중지하고 결과 미디어 파일을 `RecordingDestination` 파라미터로 정의된 위치에 작성합니다.

**참고**  
이 예제에서는 `CallId` 파라미터를 사용합니다. `ParticipantTag` 파라미터를 대신 사용할 수는 있지만 둘 다 사용할 수는 없습니다.

```
{
    "Type": "RecordAudio",
    "Parameters": {
        "CallId": "call-id-1",
        "DurationInSeconds": "10",
        "SilenceDurationInSeconds": 3,
        "SilenceThreshold": 100,
        "RecordingTerminators": [
            "#"
        ],
        "RecordingDestination": {
            "Type": "S3",
            "BucketName": "valid-bucket-name",
            "Prefix": "valid-prefix-name"
        }
    }
}
```

**CallId**  
*설명* - AWS Lambda 함수 호출의에 있는 `CallId` 참가자`CallDetails`의 설명  
허용된 값** - 유효한 통화 ID  
필수** - 아니요  
*기본값* – 없음

**ParticipantTag**  
설명** - `CallDetails`의 연결된 참가자 중 한 명의 `ParticipantTag`입니다.  
허용된 값** – `LEG-A` 또는 `LEG-B`  
필수** - 아니요  
기본값** - 간접 호출된 `callLeg`의 `ParticipantTag`(`CallId`를 지정한 경우 무시됨)

**RecordingDestination.Type**  
설명** - 대상 유형입니다. S3만 해당됩니다.  
허용된 값** - S3  
필수** - 예  
*기본값* – 없음

**RecordingDestination.BucketName**  
설명** - 유효한 S3 버킷 이름입니다. 버킷에는 [Amazon Chime SDK Voice Connector 서비스 보안 주체](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html)인 `voiceconnector.chime.amazonaws.com`에 대한 액세스 권한이 있어야 합니다.  
*허용된 값* - Amazon Chime SDK가 `s3:PutObject` 및 `s3:PutObjectAcl` 작업에 대한 액세스 권한을 가진 유효한 S3 버킷  
필수** - 예  
*기본값* – 없음

****RecordingDestination.Prefix****  
설명** - 녹음 파일의 S3 접두사입니다.  
*허용된 값* - 최대 979개의 사용 가능 문자를 포함하는 유효한 접두사 이름. 사용 가능 문자에 대한 자세한 내용은 Amazon Storage Service 사용 설명서의 [사용 가능 문자](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-guidelines-safe-characters)를 참조하세요.  
필수** - 아니요  
기본값** - 없음. 지정하지 않으면 녹음을 S3 버킷의 루트에 저장합니다.

**DurationInSeconds**  
설명** - 녹음 시간(초)입니다.  
허용된 값** – 0 초과  
필수** - 아니요  
*기본값* – 없음

****SilenceDurationInSeconds****  
설명** - 녹음이 중지되기 전의 무음 시간(초)입니다. 지정하지 않으면 무음 감지가 비활성화됩니다.  
*허용된 값* - [1;1000]  
필수** - 아니요  
기본값** - 200

****SilenceThreshold****  
설명** - ‘무음’으로 간주되는 소음 수준입니다. `SilenceDurationInSeconds`를 지정하지 않으면 이 파라미터는 무시됩니다.  

**기준값(소음을 무음으로 처리하는 소음 수준 및 임계값):**
+ 1: 30dB 이하(예: 조용한 방)
+ 100: 40\$150dB(예: 귓속말 또는 조용한 사무실)
+ 200: 60dB(예: 혼잡한 사무실)
+ 1000: 75dB(예: 시끄러운 사람 또는 음악)
*허용된 값* - [1;1000]  
필수** - 아니요  
기본값** - 200

**RecordingTerminators**  
설명** - 사용 가능한 모든 녹음 종결자를 나열합니다.  
허용되는 값** - [123456789\$10\$1]에서 단일 숫자와 기호로 구성된 배열  
필수** - 예  
*기본값* – 없음

## ACTION\$1SUCCESSFUL 이벤트 처리
<a name="handle-action-successful"></a>

녹음이 끝나면 Amazon Chime SDK SIP 미디어 애플리케이션이 AWS Lambda 함수를 호출하고 호출 결과와 함께 ACTION\$1SUCCESSFUL 이벤트를 전달합니다.

```
{
    "SchemaVersion": "1.0",
    "Sequence": INTEGER,
    "InvocationEventType": "ACTION_SUCCESSFUL",
    "ActionData": {
        "Type" : "RecordAudio",
        "Parameters": {
           ...           
        },
        "RecordingDestination": {
            "Type": "S3",
            "BucketName": "valid-bucket-name",
            "Key": "valid-S3-key"              
        },
        "RecordingTerminatorUsed":"#"
    },
    "CallDetails": {
        ...
    }
}
```

`ACTION_SUCCESSFUL` 이벤트에는 다음과 같은 필드가 포함된 `ActionData`가 있습니다.

**Type**  
설명** - 작업 유형인 `RecordAudio`입니다.

**Parameters**  
설명** - 작업의 파라미터입니다.

**RecordingDestination.Type**  
설명** - 대상 유형입니다. S3만 해당됩니다.

**RecordingDestination.BucketName**  
설명** - 녹음 파일이 포함된 S3 버킷입니다.

**RecordingDestination.Key**  
설명** - 녹음 파일의 S3 키입니다.

**RecordingTerminatorUsed**  
설명** - 녹음을 중지하는 데 사용되는 종결자로, `RecordingTerminators` 파라미터에 전달된 종결자 중 하나입니다. 최대 기간(`DurationInSeconds`)에 도달한 후 또는 무음(`SilenceDurationInSeconds`)으로 인해 녹음이 중지되면 이 키-값 쌍은 출력에 포함되지 않습니다.

**오류 처리**  
검증 오류의 경우 SIP 미디어 애플리케이션은 적절한 오류 메시지와 함께 AWS Lambda 함수를 호출합니다. 다음 표에는 가능한 오류 메시지가 나열되어 있습니다.


|  오류  |  메시지  |  이유  | 
| --- | --- | --- | 
|  `InvalidActionParameter`  |  `CallId` or `ParticipantTag` parameter for action is invalid. `DurationInSeconds` parameter value is invalid. `SilenceDurationInSeconds` parameter value is invalid. `SilenceThreshold` parameter value is invalid. `RecordingDestination` parameter value is invalid. Error occurred while uploading recording to S3 bucket.  |  파라미터가 유효하지 않습니다.  | 
|  `SystemException`  |  System error while running an action.  |  작업을 실행하는 동안 다른 유형의 시스템 오류가 발생했습니다.  | 

## ACTION\$1FAILED 이벤트 처리
<a name="handle-action-failed"></a>

작업이 통화 레그에 미디어를 기록하지 못하면 SIP 미디어 애플리케이션이 `ACTION_FAILED` 이벤트 유형으로 AWS Lambda 함수를 호출합니다. 다음 예제를 참조하세요.

```
{
    "SchemaVersion": "1.0",
    "Sequence": 5,
    "InvocationEventType": "ACTION_FAILED",
    "ActionData": {
        "Type" : "RecordAudio",
        "Parameters": {
           ...           
        },
        "ErrorType": "InvalidActionParameter",
        "ErrorMessage": "RecordingDestination parameter value is invalid."
    },
    "CallDetails": {
        ...
    }
}
```

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

# SendDigits
<a name="send-digits"></a>

통화 레그에서 최대 50개의 이중 톤 다중 주파수(DTMF) 숫자를 전송합니다. 신호에는 다음이 포함될 수 있습니다.
+ 0에서 9까지의 숫자
+ 특수 문자 별표(\$1) 및 우물 정자(\$1)
+ 네트워크 제어 신호 A, B, C, D
+ 쉼표 문자(,). 이 신호는 이전 신호와 다음 신호 사이에 0.5초 지연을 추가합니다.

**Topics**
+ [SendDigits 작업 사용](#send-digits-action)
+ [ACTION\$1SUCCESSFUL 이벤트 처리](#send-digit-success)
+ [ACTION\$1FAILED 이벤트 처리](#send-digit-fail)
+ [통화 흐름](#send-digits-call-flow)

## SendDigits 작업 사용
<a name="send-digits-action"></a>

다음은 예제는 일반적인 `SendDigits` 작업을 보여줍니다.

```
{
    "SchemaVersion": "1.0",
    "Actions":[
        {
            "Type": "SendDigits",
            "Parameters": {
                "CallId": "call-id-1", // required
                "Digits": ",,*1234,56,7890ABCD#", // required
                "ToneDurationInMilliseconds": 100 // optional
            }
        }
    ]
}
```

**CallId**  
설명** - AWS Lambda 함수 간접 호출의 `CallDetails`에 있는 참가자의 `CallId`입니다.  
허용된 값** - 유효한 통화 ID  
필수** - 예  
*기본값* – 없음

**Digits**  
설명** - `CallId`에 해당하는 통화 레그에 전송되는 숫자입니다.  
허용되는 값** - 0\$19, \$1, \$1, A, B, C, D, 쉼표(,)  
필수** - 예  
*기본값* – 없음

**ToneDurationInMilliseconds**  
설명** - 각 숫자를 전송하는 데 허용된 시간(밀리초)입니다.  
*허용된 값* - 50에서 24,000 사이의 정수  
필수** - 아니요  
기본값** - 250

## ACTION\$1SUCCESSFUL 이벤트 처리
<a name="send-digit-success"></a>

다음은 예제는 `SendDigits` 작업의 일반적인 `ACTION_SUCCESSFUL` 이벤트를 보여줍니다.

```
{
    "SchemaVersion": "1.0",
    "Sequence": 3,
    "InvocationEventType": "ACTION_SUCCESSFUL",
    "ActionData": {
        "Type": "SendDigits",
        "Parameters": {
            "Digits": "1,2A#",
            "ToneDurationInMilliseconds": 100,
            "CallId": "call-id-1"
        },  
    "CallDetails": { 
        ...
        }
    }
}
```

## ACTION\$1FAILED 이벤트 처리
<a name="send-digit-fail"></a>

다음은 예제는 `SendDigits` 작업의 일반적인 `ACTION_FAILED` 이벤트를 보여줍니다.

```
{
    "SchemaVersion": "1.0",
    "Sequence": 3,
    "InvocationEventType": "ACTION_FAILED",
    "ActionData": {
        "Type": "SendDigits",
        "Parameters": {
            "Digits": "1,2A#",
            "ToneDurationInMilliseconds": 20000000,
            "CallId": "call-id-1"
        },
    "ErrorType": "InvalidActionParameter",
    "ErrorMessage": "ToneDuration parameter value is invalid."
    },
    "CallDetails": {
        ...
        }
    }
}
```

## 통화 흐름
<a name="send-digits-call-flow"></a>

다음 다이어그램은 발신자에서 수신자로 숫자를 전송하는 프로그램 흐름을 보여줍니다.

![\[SendDigits 작업의 프로그램 흐름을 보여주는 다이어그램입니다.\]](http://docs.aws.amazon.com/ko_kr/chime-sdk/latest/dg/images/send-digits-1.png)


# Speak
<a name="speak"></a>

텍스트를 입력하여 통화 레그에서 음성을 재생할 수 있습니다. 일반 텍스트 또는 음성 합성 마크업 언어(SSML)를 사용할 수 있습니다. SSML을 사용하면 일시 중지를 추가하거나, 특정 단어를 강조하거나, 말하기 스타일을 변경하여 Amazon Chime SDK가 음성을 생성하는 방식을 보다 세부적으로 제어할 수 있습니다.

Amazon Chime SDK는 Amazon Polly 서비스를 사용하여 텍스트를 음성으로 변환합니다. Amazon Polly를 사용하면 표준 엔진과 신경 엔진 중 하나를 선택하여 음성 품질을 개선할 수 있습니다. Amazon Polly는 20개 이상의 언어와 60개 이상의 음성을 지원하여 애플리케이션의 사용자 환경을 사용자 지정합니다. Amazon Chime SDK는 음성 기능을 무료로 제공하지만 Amazon Polly 사용에는 비용을 지불해야 합니다. 요금 정보는 Amazon Polly [요금 페이지](https://aws.amazon.com/polly/pricing/) 또는 청구 대시보드를 참조하세요.

**중요**  
Amazon Polly를 사용할 경우 AWS Machine Learning 및 인공 지능 서비스와 관련된 약관을 비롯한 [AWS 서비스 약관](https://aws.amazon.com/service-terms/)이 적용됩니다.

**Topics**
+ [Speak 작업 사용](#speak-action)
+ [ACTION\$1SUCCESSFUL 이벤트 처리](#speak-action-success)
+ [ACTION\$1FAILED 이벤트 처리](#speak-action-fail)
+ [프로그램 흐름](#speak-flow)

## Speak 작업 사용
<a name="speak-action"></a>

다음은 예제는 `Speak` 작업의 일반적인 사용을 보여줍니다.

```
{
    "SchemaVersion": "1.0",
    "Actions":[
        {
            "Type": "Speak",
            "Parameters": {
                "Text": "Hello, World!",        // required
                "CallId": "call-id-1",          // required
                "Engine": "neural",             // optional. Defaults to standard
                "LanguageCode": "en-US",        // optional
                "TextType": "text",             // optional
                "VoiceId": "Joanna"             // optional. Defaults to Joanna
            }
        }
    ]
}
```

**CallId**  
설명** - Lambda 함수 간접 호출의 `CallDetails`에 있는 참가자의 `CallId`입니다.  
허용된 값** - 유효한 통화 ID  
필수** - 예  
*기본값* – 없음

**Text**  
설명** - 음성으로 합성할 입력 텍스트를 지정합니다. `ssml`을 `TextType`으로 지정하는 경우 입력 텍스트의 SSML 형식을 따릅니다.  
*허용된 값* - 문자열  
필수** - 예  
*기본값* – 없음

**Engine**  
설명** - 음성 합성을 위해 텍스트를 처리할 때 사용할 엔진(표준 또는 신경)을 지정합니다.  
*허용된 값* - standard \$1 neural  
필수** - 아니요  
기본값** - standard

**LanguageCode**  
설명** - 언어 코드를 지정합니다. 이중 언어 음성을 사용하는 경우에만 필요합니다. 언어 코드 없이 이중 언어 음성을 사용하는 경우 이중 언어 음성의 기본 언어를 사용합니다.  
*허용된 값* - [Amazon Polly 언어 코드](https://docs.aws.amazon.com/polly/latest/dg/API_SynthesizeSpeech.html#polly-SynthesizeSpeech-request-LanguageCode)  
필수** - 아니요  
*기본값* – 없음

**TextType**  
설명** - 입력 텍스트, 일반 텍스트 또는 SSML의 유형을 지정합니다. 입력 유형을 지정하지 않은 경우 일반 텍스트를 기본값으로 사용합니다. SSML에 대한 자세한 내용은 Amazon Polly 개발자 안내서**의 [SSML 문서에서 음성 생성](https://docs.aws.amazon.com/polly/latest/dg/ssml.html)을 참조하세요.  
*허용된 값* - ssml \$1 text  
필수** - 아니요  
*기본값* – 없음

**VoiceId**  
설명** - 사용하려는 음성의 ID를 지정합니다.  
*허용된 값* - [Amazon Polly 음성 ID](https://docs.aws.amazon.com/polly/latest/dg/API_SynthesizeSpeech.html#polly-SynthesizeSpeech-request-VoiceId)  
필수** - 아니요  
기본값** - Joanna

## ACTION\$1SUCCESSFUL 이벤트 처리
<a name="speak-action-success"></a>

다음 예제는 Amazon Polly의 `Joanna` 음성을 사용하여 “Hello Worl”"라는 텍스트를 영어로 된 음성으로 합성하는 작업의 일반적인 `ACTION_SUCCESSFUL` 이벤트를 보여줍니다.

```
{
    "SchemaVersion": "1.0",
    "Sequence": 3,
    "InvocationEventType": "ACTION_SUCCESSFUL",
    "ActionData": {
       "Type": "Speak",
       "Parameters": {
          "CallId": "call-id-1",          
          "Engine":  "neural",             
          "LanguageCode":  "en-US",        
          "Text": "Hello World",          
          "TextType":  "text",             
          "VoiceId":  "Joanna"        
       }
    },
    "CallDetails":{       
       ...
    }
}
```

## ACTION\$1FAILED 이벤트 처리
<a name="speak-action-fail"></a>

다음 예제는 이전 예제에서 사용한 동일한 이벤트에 대한 일반적인 `ACTION_FAILED` 이벤트를 보여줍니다.

```
{
    "SchemaVersion": "1.0",
    "Sequence":2,
    "InvocationEventType": "ACTION_FAILED",
    "ActionData":{
       "Type": "Speak",
       "Parameters": {
          "CallId": "call-id-1",          
          "Engine":  "neural",             
          "LanguageCode":  "en-US",        
          "Text": "Hello  World",          
          "TextType":  "text",             
          "VoiceId":  "Joanna"        
       },
       "ErrorType": "SystemException",
       "ErrorMessage": "System error while running  action"
    },
    "CallDetails":{       
       ...
    }
}
```

**오류 처리**  
이 표는 `Speak` 작업에서 발생한 오류 메시지를 나열하고 설명합니다.


| 오류 | 메시지 | 이유 | 
| --- | --- | --- | 
| `AccessDenied` | The `AWSServiceRoleForAmazonChimeVoiceConnector` service-linked role is not configured correctly. | Amazon Polly에 요청하는 데 사용된 서비스 연결 역할이 없거나 역할에 권한이 없습니다. 문제를 해결하려면 [Amazon Chime SDK Voice Connector 서비스 연결 역할 사용](speak-and-get-digits.md#speak-digits-policy) 섹션의 단계를 참조하세요. | 
| `InvalidActionParameter` |   | 작업 파라미터를 검증하는 동안 오류가 발생했습니다. 파라미터에 대한 자세한 내용은 Amazon Polly 개발자 안내서의** [SynthizeSpeech API](https://docs.aws.amazon.com/polly/latest/dg/API_SynthesizeSpeech)를 참조하세요. | 
| ActionExecutionThrottled | Amazon Polly is throttling the request to synthesize speech. | Amazon Polly에 대한 요청이 제한 예외를 반환합니다. Amazon Polly 제한 한도에 대한 자세한 내용은 [https://docs.aws.amazon.com/polly/latest/dg/limits.html\$1limits-throttle](https://docs.aws.amazon.com/polly/latest/dg/limits.html#limits-throttle)을 참조하세요. | 
| `MissingRequiredActionParameter` | `Text` is a required parameter. | 작업 파라미터에는 `Text` 값이 있어야 합니다. | 
| `MissingRequiredActionParameter` | `Text` is limited to 1,000 characters | 텍스트가 문자 제한을 초과했습니다. | 
| `SystemException` | System error while running action. | 작업을 실행하는 동안 시스템 오류가 발생했습니다. | 

## 프로그램 흐름
<a name="speak-flow"></a>

다음 다이어그램은 발신자의 `Speak` 작업을 활성화하는 프로그램 흐름을 보여줍니다. 이 예시에서 발신자는 다음과 같은 텍스트를 듣습니다.

![\[발신자의 Speak 작업을 활성화하는 프로그램 흐름을 보여주는 다이어그램입니다.\]](http://docs.aws.amazon.com/ko_kr/chime-sdk/latest/dg/images/Speak1.png)


**다이어그램에서,**  
발신자는 소프트폰을 사용하여 SIP 미디어 애플리케이션에 등록된 번호를 입력합니다. 애플리케이션은 SIP `INVITE` 메서드를 사용하여 발신자에게 `Trying (100)` 응답을 보냅니다. 이는 next-hop 서버가 통화 요청을 받았음을 나타냅니다. 그러면 SIP 애플리케이션이 `INVITE`를 사용하여 엔드포인트에 연결합니다. 연결이 설정되면 애플리케이션이 발신자에게 `Ringing (180)` 응답을 보내고 경고가 시작됩니다.

그런 다음 SIP 미디어 애플리케이션은 Lambda 함수로 `NEW_INBOUND_CALL` 이벤트를 전송하며, Lambda 함수는 발신자 ID와 음성으로 변환하려는 텍스트를 포함하는 `Speak` 작업으로 응답합니다. 그러면 SIP 애플리케이션이 `200 (OK)` 응답을 보내 통화에 응답했음을 알립니다. 또한 이 프로토콜은 미디어를 활성화합니다.

`Speak` 작업이 성공하고 텍스트를 음성으로 변환하면 SIP 미디어 애플리케이션에 `ACTION_SUCCESSFUL` 이벤트를 반환하며, SIP 미디어 애플리케이션은 다음 작업 세트를 반환합니다. 작업이 실패하면 SIP 미디어 애플리케이션이 Lambda 함수에 `ACTION_FAILED` 이벤트를 전송하며, Lambda 함수는 `Hangup` 작업 세트로 응답합니다. 애플리케이션이 발신자의 전화를 끊고 Lambda 함수에 `HANGUP` 이벤트를 반환하며, 이 함수는 추가 작업을 취하지 않습니다.



다음 다이어그램은 수신자의 `Speak` 작업을 활성화하는 프로그램 흐름을 보여줍니다.

![\[수신자의 Speak 작업을 활성화하는 프로그램 흐름을 보여주는 다이어그램입니다. 모든 다중 통화에서 이를 수행할 수 있습니다.\]](http://docs.aws.amazon.com/ko_kr/chime-sdk/latest/dg/images/Speak2.png)


**다이어그램에서,**  
발신자가 SIP 미디어 애플리케이션에 등록된 번호를 입력하고 애플리케이션은 이전 다이어그램에 설명된 대로 응답합니다. Lambda 함수가 `NEW_INBOUND_CALL` 이벤트를 수신한 경우 [CallAndBridge](call-and-bridge.md) 작업을 SIP 애플리케이션에 반환합니다. 그러면 애플리케이션은 SIP `INVITE` 메서드를 사용하여 수신자에게 `Trying (100)` 및 `Ringing (180)` 응답을 보냅니다.

수신자가 응답하면 SIP 미디어 애플리케이션이 `200 (OK)` 응답을 수신하고 동일한 응답을 발신자에게 보냅니다. 이로 인해 미디어가 설정되고 SIP 애플리케이션은 [CallAndBridge](call-and-bridge.md) 작업에 대한 `ACTION_SUCCESSFUL` 이벤트를 Lambda 함수에 전송합니다. 그런 다음 함수는 Speak 작업 및 데이터를 SIP 애플리케이션에 반환하며, SIP 애플리케이션은 이를 변환합니다.

# SpeakAndGetDigits
<a name="speak-and-get-digits"></a>

텍스트를 제공하여 음성을 재생하고 사용자로부터 이중 톤 다중 주파수(DTMF) 숫자를 수집합니다. 텍스트에는 일반 텍스트를 사용하거나, 지원되는 기타 SSML 기능 중에서 일시 중지를 추가하거나 특정 단어를 강조하거나 발화 스타일을 변경하여 Amazon Chime SDK가 음성을 생성하는 방식을 보다 세부적으로 제어하는 음성 합성 마크업 언어(SSML)로 향상된 텍스트를 사용할 수 있습니다. 사용자가 올바른 개수의 DTMF 숫자를 입력하지 않는 등 실패가 발생하면 작업은 “실패” 음성을 재생한 다음 SIP 미디어 애플리케이션이 `Repeat` 파라미터에 정의된 시도 횟수를 전부 소진할 때까지 기본 음성을 재생합니다.

Amazon Chime SDK는 텍스트를 실제와 같은 음성으로 변환하는 클라우드 서비스인 Amazon Polly를 사용합니다. Amazon Polly는 20개 이상의 지원 언어와 60개 이상의 음성으로 음성 품질을 개선하는 표준 엔진 및 신경 엔진을 모두 제공합니다. Amazon Polly는 음성 기능을 무료로 제공하지만 Amazon Polly를 사용하면 비용을 지불해야 합니다. 요금 정보는 Amazon Polly [요금 페이지](https://aws.amazon.com/polly/pricing/) 또는 청구 대시보드를 참조하세요.

**중요**  
Amazon Polly의 사용에는 AWS Machine Learning 및 인공 지능 서비스와 관련된 [AWS 조건을 포함하여 서비스 ](https://aws.amazon.com/service-terms/)약관이 적용됩니다.

**Topics**
+ [SpeakAndGetDigits 작업 사용](#speak-digits-action)
+ [ACTION\$1SUCCESSFUL 이벤트 처리](#speak-digits-success)
+ [ACTION\$1FAILED 이벤트 처리](#speak-digits-fail)
+ [Amazon Chime SDK Voice Connector 서비스 연결 역할 사용](#speak-digits-policy)

## SpeakAndGetDigits 작업 사용
<a name="speak-digits-action"></a>

다음은 예제는 `SpeakAndGetDigits` 작업의 일반적인 사용을 보여줍니다.

```
{
    "SchemaVersion": "1.0",
    "Actions":[
        {
            "Type": "SpeakAndGetDigits",
            "Parameters": {
                "CallId": "call-id-1",          // required
                "InputDigitsRegex": "^\d{2}#$", // optional
                "SpeechParameters": {
                    "Text": "Hello World",      // required
                    "Engine": "neural",         // optional. Defaults to standard
                    "LanguageCode": "en-US",    // optional
                    "TextType": "text",         // optional
                    "VoiceId": "Joanna"         // optional. Defaults to Joanna
                },
                "FailureSpeechParameters": {
                    "Text": "Hello World",      // required
                    "Engine": "neural",         // optional. Defaults to the Engine value in SpeechParameters
                    "LanguageCode": "en-US",    // optional. Defaults to the LanguageCode value in SpeechParameters
                    "TextType": "text",         // optional. Defaults to the TextType value in SpeechParameters
                    "VoiceId": "Joanna"         // optional. Defaults to the VoiceId value in SpeechParameters
                },
                "MinNumberOfDigits": 3,         // optional
                "MaxNumberOfDigits": 5,         // optional
                "TerminatorDigits": ["#"],      // optional
                "InBetweenDigitsDurationInMilliseconds": 5000,  // optional
                "Repeat": 3,                    // optional
                "RepeatDurationInMilliseconds": 10000           // required
            }
        }
    ]
}
```

**CallId**  
설명** - Lambda 함수 간접 호출의 CallDetails에 있는 참가자의 `CallId`입니다.  
*허용된 값* - 유효한 `callID`  
필수** - 예  
기본값** - 아니요

**InputDigitsRegex**  
설명** - 사용자가 올바른 숫자와 문자를 입력하는 데 도움이 되는 정규 표현식 패턴입니다.  
허용된 값** - 유효한 정규 표현식 패턴  
필수** - 아니요  
*기본값* – 없음

**SpeechParameters.Engine**  
설명** - 음성 합성을 위해 텍스트를 처리할 때 사용할 엔진(표준 또는 신경)을 지정합니다.  
*허용된 값* - `standard` \$1 `neural`  
필수** - 아니요  
기본값** - Standard

**SpeechParameters.LanguageCode**  
설명** - 언어 코드를 지정합니다. 이는 이중 언어 음성을 사용하는 경우에만 필요합니다. 이중 언어 음성을 사용하고 언어 코드를 지정하지 않은 경우 이중 언어 음성의 기본 언어를 사용합니다.  
*허용된 값* - [Amazon Polly 언어 코드](https://docs.aws.amazon.com/polly/latest/dg/API_SynthesizeSpeech.html#polly-SynthesizeSpeech-request-LanguageCode)  
필수** - 아니요  
*기본값* – 없음

**SpeechParameters.Text**  
설명** - 입력 텍스트를 지정합니다. `ssml`을 `SpeechParameters.TextType`으로 지정하는 경우 입력 텍스트의 SSML 형식을 따라야 합니다. SSML에 대한 자세한 내용은 Amazon Polly 개발자 안내서**의 [SSML 문서에서 음성 생성](https://docs.aws.amazon.com/polly/latest/dg/ssml.html)을 참조하세요.  
*허용된 값* - 문자열  
필수** - 예  
*기본값* – 없음

**SpeechParameters.TextType**  
설명** - `SpeechParameters.Text`의 텍스트 형식을 지정합니다. 지정하지 않으면 기본적으로 `text`가 사용됩니다. SSML에 대한 자세한 내용은 Amazon Polly 개발자 안내서**의 [SSML 문서에서 음성 생성](https://docs.aws.amazon.com/polly/latest/dg/ssml.html)을 참조하세요.  
*허용된 값* - `ssml` \$1 `text`  
필수** - 아니요  
기본값** – `text`

**SpeechParameters.VoiceId**  
설명** - `SpeechParameters.Text`의 텍스트를 말하는 데 사용되는 Amazon Polly 음성의 ID입니다.  
*허용된 값* - [Amazon Polly 음성 ID](https://docs.aws.amazon.com/polly/latest/dg/API_SynthesizeSpeech.html#polly-SynthesizeSpeech-request-VoiceId)  
필수** - 아니요  
기본값** - Joanna

**FailureSpeechParameters.Engine**  
설명** - 고객이 음성 합성에 잘못된 응답을 입력한 경우에 사용되는 실패 메시지를 처리할 때 사용할 엔진(표준 또는 신경망)을 지정합니다.  
*허용된 값* - `standard` \$1 `neural`  
필수** - 아니요  
기본값** - `SpeechParameters.Engine` 값

**FailureSpeechParameters.LanguageCode**  
설명** - 고객이 잘못된 응답을 입력하는 경우에 사용되는 언어 코드를 지정합니다. 이중 언어 음성을 사용하는 경우에만 필요합니다. 언어 코드를 지정하지 않고 이중 언어 음성을 사용하는 경우 이중 언어 음성의 기본 언어를 사용합니다.  
*허용된 값* - [Amazon Polly 언어 코드](https://docs.aws.amazon.com/polly/latest/dg/API_SynthesizeSpeech.html#polly-SynthesizeSpeech-request-LanguageCode)  
필수** - 아니요  
기본값** - `SpeechParameters.LanguageCode` 값

**FailureSpeechParameters.Text**  
설명** - 고객이 잘못된 응답을 입력하는 경우에 재생되는 입력 텍스트를 지정합니다. `ssml`을 `FailureSpeechParameters.TextType`으로 지정하는 경우 입력 텍스트의 SSML 형식을 따라야 합니다.  
*허용된 값* - 문자열  
필수** - 예  
*기본값* – 없음

**FailureSpeechParameters.TextType**  
설명** - `FailureSpeechParameters.Text`에서 지정한 입력 텍스트가 일반 텍스트인지 SSML인지를 지정합니다. 기본값은 일반 텍스트입니다. 자세한 내용은 Amazon Polly 개발자 안내서**의 [SSML 문서에서 음성 생성](https://docs.aws.amazon.com/polly/latest/dg/ssml.html)을 참조하세요.  
*허용된 값* - `ssml` \$1 `text`  
필수** - 아니요  
기본값** - `SpeechParameters.Text` 값

**FailureSpeechParameters.VoiceId**  
설명** - `FailureSpeechParameters.Text`의 문자열을 말하는 데 사용되는 음성의 ID입니다.  
*허용된 값* - [Amazon Polly 음성 ID](https://docs.aws.amazon.com/polly/latest/dg/API_SynthesizeSpeech.html#polly-SynthesizeSpeech-request-VoiceId)  
필수** - 예  
기본값** - `SpeechParameters.VoiceId` 값

**MinNumberOfDigits**  
설명** - 시간 초과나 “통화 실패” 메시지 재생 전에 캡처하는 숫자의 최소 개수입니다.  
*허용된 값* - 0 이상  
필수** - 아니요  
기본값** - 0

**MaxNumberOfDigits**  
설명** - 종료 숫자 없이 중지 전 캡처하는 숫자의 최대 개수입니다.  
*허용된 값* - `MinNumberOfDigits` 초과  
필수** - 아니요  
기본값** - 128

**TerminatorDigits**  
설명** - 사용자가 MaxNumberOfDigits보다 적은 숫자를 입력하면 입력을 종료하는 데 사용되는 숫자입니다.  
*허용된 값* - 다음 중 하나: 0 1 2 3 4 5 6 7 8 9 \$1 \$1  
필수** - 아니요  
기본값** - \$1

**InBetweenDigitsDurationInMilliseconds**  
설명** - 실패 음성 재생 전 숫자 입력 사이의 대기 시간(밀리초)입니다.  
*허용된 값* - 0 초과  
필수** - 아니요  
기본값** – `RepeatDurationInMilliseconds` 값(지정하지 않는 경우)

**Repeat**  
설명** - 숫자를 얻기 위한 총 시도 횟수입니다. 이 파라미터를 생략하면 숫자 수집을 시도하는 기본값은 한 번입니다.  
*허용된 값* - 0 초과  
필수** - 아니요  
기본값** – 1

**RepeatDurationInMilliseconds**  
설명** - 숫자를 얻는 각 시도의 시간 제한(밀리초)입니다.  
*허용된 값* - 0 초과  
필수** - 예  
*기본값* – 없음

## ACTION\$1SUCCESSFUL 이벤트 처리
<a name="speak-digits-success"></a>

다음 예제는 일반적인 `ACTION_SUCCESSFUL` 이벤트를 보여줍니다.

```
{
    "SchemaVersion": "1.0",
    "Sequence": 3,
    "InvocationEventType": "ACTION_SUCCESSFUL",
    "ActionData": {
            "Type":  "SpeakAndGetDigits",
            "Parameters": {
                "CallId": "call-id-1",          
                "InputDigitsRegex":  "^\d{2}#$", 
                "SpeechParameters": {
                    "Engine":  "neural",         
                    "LanguageCode": "en-US",    
                    "Text":  "Hello World",           
                    "TextType":  "text",         
                    "VoiceId": "Joanna"         
                },
                "FailureSpeechParameters": {
                    "Engine":  "neural",         
                    "LanguageCode":  "en-US",    
                    "Text":  "Hello World",           
                    "TextType": "text",         
                    "VoiceId": "Joanna"         
                },
                "MinNumberOfDigits": 3,         
                "MaxNumberOfDigits": 5,         
                "TerminatorDigits": ["#"],      
                "InBetweenDigitsDurationInMilliseconds": 5000,  
                "Repeat": 3,                    
                "RepeatDurationInMilliseconds": 10000           
            },
            "ReceivedDigits": "1234"
    },
    "CallDetails":{       
       ...
    }
}
```

## ACTION\$1FAILED 이벤트 처리
<a name="speak-digits-fail"></a>

다음 예제는 일반적인 `ACTION_FAILED` 이벤트를 보여줍니다.

```
{
    "SchemaVersion": "1.0",
    "Sequence":2,
    "InvocationEventType": "ACTION_FAILED",
    "ActionData":{
            "Type":  "SpeakAndGetDigits",
            "Parameters": {
                "CallId": "call-id-1",          
                "InputDigitsRegex":  "^\d{2}#$", 
                "SpeechParameters": {
                    "Engine":  "neural",         
                    "LanguageCode": "en-US",    
                    "Text":  "Hello World",           
                    "TextType":  "text",         
                    "VoiceId": "Joanna"         
                },
                "FailureSpeechParameters": {
                    "Engine":  "neural",         
                    "LanguageCode":  "en-US",    
                    "Text":  "Hello World",          
                    "TextType": "text",        
                    "VoiceId": "Joanna"        
                },
                "MinNumberOfDigits": 3,      
                "MaxNumberOfDigits": 5,        
                "TerminatorDigits": ["#"],      
                "InBetweenDigitsDurationInMilliseconds": 5000,  
                "Repeat": 3,                    
                "RepeatDurationInMilliseconds": 10000         
            },
            "ErrorType":  "SystemException",
            "ErrorMessage":  "System error while running action"
    },
    "CallDetails":{       
       ...
    }
}
```

**오류 처리**  
이 표는 `Speak` 작업에서 발생한 오류 메시지를 나열하고 설명합니다.


| 오류 | 메시지 | 이유 | 
| --- | --- | --- | 
| `AccessDenied` | The `AWSServiceRoleForAmazonChimeVoiceConnector` role is not configured correctly. | Amazon Polly에 요청하는 데 사용된 역할이 없거나 역할에 권한이 없습니다. 문제를 해결하려면 [Amazon Chime SDK Voice Connector 서비스 연결 역할 사용](#speak-digits-policy) 섹션의 단계를 참조하세요. | 
| `InvalidActionParameter` |   | 작업 파라미터를 검증하는 동안 오류가 발생했습니다. 이 작업에 사용 가능한 파라미터와 해당 옵션을 검토하려면 Amazon Polly 개발자 안내서에서 [SynthesizeSpeech](https://docs.aws.amazon.com/polly/latest/dg/API_SynthesizeSpeech.html)를 참조하세요. | 
| `MissingRequiredActionParameter` | `Text` is a required parameter. | 작업 파라미터에 `Text` 값이 있어야 합니다. | 
| `MissingRequiredActionParameter` | `Text` is limited to 1,000 characters | 텍스트가 문자 제한을 초과했습니다. | 
| `SystemException` | System error while running action. | 작업을 실행하는 동안 시스템 오류가 발생했습니다. | 

## Amazon Chime SDK Voice Connector 서비스 연결 역할 사용
<a name="speak-digits-policy"></a>

`Speak` 또는 `SpeakAndGetDigits` 작업의 서비스 연결 역할을 수동으로 생성할 필요가 없습니다. Amazon Chime SDK 콘솔, 또는 AWS API에서 SIP 미디어 애플리케이션을 생성 AWS Command Line Interface하거나 업데이트하면 Amazon Chime SDK가 서비스 연결 역할을 생성합니다.

자세한 내용은 Amazon Chime SDK 관리자 안내서**의 [Amazon Chime 서비스 연결 역할 사용](https://docs.aws.amazon.com/chime/latest/ag/using-service-linked-roles-stream.html)을 참조하세요.

# StartBotConversation
<a name="start-bot-conversation"></a>

이 `StartBotConversation` 작업은 최종 사용자와 Amazon Lex v2 봇 간에 음성 대화를 설정합니다. 사용자는 봇에 필요한 정보를 제공합니다. 그런 다음 봇은 공중 교환 전화망(PSTN) 오디오 Lambda 함수에 정보를 반환하고 함수는 요청된 작업을 수행합니다.

예를 들어 봇은 대화 시작 시 선택적 환영 메시지를 재생하여 PSTN 오디오 Lambda 함수가 수행할 수 있는 작업을 간략하게 설명할 수 있습니다. 봇이 필요한 정보를 수집할 때까지 사용자와 봇 간에 대화가 오갑니다. 대화가 끝나면 Amazon Chime SDK는 봇이 수집한 정보가 포함된 작업 성공 이벤트와 함께 PSTN 오디오 Lambda 함수를 간접 호출합니다. PSTN 오디오 Lambda 함수는 정보를 처리하고 요청된 작업을 수행합니다.

오디오 서비스는 사용자와 실제와 같은 대화형 상호 작용을 제공합니다. 예를 들어 사용자는 오디오 프롬프트가 끝나기 전에 봇을 중단하고 질문에 답할 수 있습니다. 또한 사용자는 음성과 DTMF 숫자를 조합하여 정보를 제공할 수 있습니다. 봇은 응답하기 전에 사용자가 입력을 제공할 때까지 기다립니다. 봇이 음성 입력을 해석하기 전에 사용자가 말을 마칠 때까지 기다리는 시간을 구성할 수 있습니다. 또한 사용자는 통화 중에 신용 카드 번호와 같은 추가 정보를 찾을 시간이 필요한 경우 봇에게 대기하도록 지시할 수 있습니다.

이 `StartBotConversation` 액션은 봇 대화가 진행되는 동안 Amazon Lex와 Amazon Polly를 사용합니다. 표준 Amazon Lex 및 Amazon Polly 요금이 적용됩니다. 자세한 요금 정보는 [Amazon Lex 스트리밍 대화 요금](https://aws.amazon.com/lex/pricing/) 및 [Amazon Polly 요금](https://aws.amazon.com/polly/pricing/) 페이지를 참조하세요.

**참고**  
다중 통화 또는 Amazon Chime SDK 회의에 참여한 통화에서는 이 작업을 실행할 수 없습니다.

**중요**  
Amazon Lex 및 Amazon Polly 사용에는 AWS Machine Learning 및 인공 지능 서비스와 관련된 [AWS 조건을 포함하여 서비스 ](https://aws.amazon.com/service-terms/)약관이 적용됩니다.

**Topics**
+ [StartBotConversation 구문](#startbot-syntax)
+ [StartBotConversation 작업 사용](#using-startbot)
+ [ACTION\$1SUCCESSFUL 이벤트 처리](#bot-action-success)
+ [ACTION\$1FAILED 이벤트 처리](#bot-action-fail)
+ [봇 사용 권한 부여](#bot-permissions)
+ [음성 및 DTMF 시간 제한 구성](#bot-timeouts)
+ [대화 중 DTMF 입력 사용](#bot-dtmf)
+ [청구 및 서비스 할당량](#bot-billing)

## StartBotConversation 구문
<a name="startbot-syntax"></a>

다음은 예제는 일반적인 `StartBotConversation` 구문을 보여줍니다.

```
{
  "SchemaVersion": "1.0",
  "Actions":[
    {
      "Type": "StartBotConversation",
      "Parameters": {
        "CallId": "string",
        "ParticipantTag": "string",
        "BotAliasArn": "string",
        "LocaleId": "string",
        "Configuration": {
          "SessionState": {
             "SessionAttributes": {
                "string": "string" 
             },
             "DialogAction" : {
               "Type": "string"
             }
          },
          "WelcomeMessages": [
            {
              "Content": "string",
              "ContentType": "string" 
            }
          ]
        }
      }
    }
  ]
}
```

**CallId**  
*설명* - AWS Lambda 함수 호출의에 있는 `CallID` 참가자`CallDetails`의 입니다. `StartBotConversation` 액션은 이 ID를 봇의 `SessionId`로 사용합니다. 통화에서 이루어지는 모든 봇 대화는 동일한 대화 세션을 공유합니다. [Amazon Lex PutSession](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_PutSession.html) API를 사용하여 사용자와 봇 사이의 세션 상태를 수정할 수 있습니다. 자세한 내용은 *Amazon Lex 개발자 안내서*에서 [Amazon Lex v2 API로 세션 관리](https://docs.aws.amazon.com/lexv2/latest/dg/using-sessions.html)를 참조하세요.  
허용된 값** - 유효한 호출 ID  
필수** - 아니요(`ParticipantTag`가 있는 경우)  
기본값** – 없음

**ParticipantTag**  
설명** - `CallDetails`의 연결된 참가자 중 한 명의 `ParticipantTag`입니다.  
허용된 값** - `LEG-A`  
필수** - 아니요(`CallId`가 있는 경우)  
*기본값* - 간접 호출된 `callLeg`의 `ParticipantTag`. `CallDetails`를 지정한 경우 무시됩니다.

**BotAliasArn**  
설명 - Lex 봇의 봇 별칭 ARN입니다.** 봇은 PSTN 오디오 애플리케이션과 동일한 AWS 리전에 생성해야 합니다. 유효한 Amazon Lex 봇 별칭의 형식은 `arn:aws:lex:region:awsAccountId:bot-alias/botId/botAliasId`입니다. 여기서 *`region`*은 봇이 위치한 AWS 리전입니다. `awsAccountId`는 Amazon Lex 봇이 생성된 AWS 계정 ID입니다. `botId` 값은 봇을 만들 때 봇에 할당한 식별자입니다. Amazon Lex 콘솔의 **봇 세부 정보** 페이지에서 봇 ID를 확인할 수 있습니다. `botAliasId`는 봇을 만들 때 봇 별칭에 할당한 식별자입니다. Amazon Lex 콘솔의 봇 **별칭** 페이지에서 봇 별칭 ID를 확인할 수 있습니다.  
허용된 값** - 유효한 봇 ARN  
필수** - 예  
*기본값* – 없음

**LocaleId**  
설명** – 봇에 사용한 로캘의 식별자입니다. 로캘 및 언어 코드 목록은 [Amazon Lex에서 지원하는 언어 및 로캘](https://docs.aws.amazon.com/lexv2/latest/dg/how-languages.html)을 참조하세요.  
허용된 값** - [Amazon Lex에서 지원하는 언어 및 로캘](https://docs.aws.amazon.com/lexv2/latest/dg/how-languages.html)  
필수** - 아니요  
기본값** – `en_US`

**Configuration**  
설명 - 세션 상태 및 환영 메시지를 포함한 대화 구성입니다.** `Configuration` 객체의 JSON 문자열 표현의 총 크기는 10KB로 제한됩니다.  
허용된 값** - `Configuration` 객체  
필수** - 아니요  
기본값** – 없음

**Configuration.SessionState**  
설명** - Amazon Lex v2를 사용한 사용자 세션의 상태입니다.  
허용된 값** - `SessionState` 객체  
필수** - 아니요  
기본값** – 없음

**Configuration.SessionState.SessionAttributes**  
설명** – 세션별 컨텍스트 정보를 나타내는 키/값 페어의 맵입니다. 이 맵에는 Amazon Lex v2와 클라이언트 애플리케이션 간에 전달되는 애플리케이션 정보가 포함되어 있습니다.  
허용된 값** - 문자열 간 맵  
필수** - 아니요  
기본값** – 없음

**Configuration.SessionState.DialogAction.Type**  
설명** - 봇이 사용자와의 상호작용에서 취하는 다음 작업입니다. 가능한 값은 다음과 같습니다.  
+ Delegate** Amazon Lex v2가 다음 작업을 결정합니다.
+ ElicitIntent** 다음 작업은 사용자의 의도를 이끌어냅니다.
허용된 값** -`Delegate` \$1 `ElicitIntent`  
필수** - 아니요  
기본값** – 없음

**Configuration.WelcomeMessages**  
설명** - 대화를 시작할 때 사용자에게 보낼 메시지 목록입니다. `welcomeMessage` 필드를 설정하는 경우 `DialogAction.Type` 값을 `ElicitIntent`로 설정해야 합니다.  
허용된 값** - 메시지 객체  
필수** - 아니요  
기본값** – 없음

**Configuration.WelcomeMessages.Content**  
설명** - 환영 메시지 텍스트입니다.  
허용된 값** - 문자열  
필수** - 아니요  
기본값** – 없음

**Configuration.WelcomeMessages.ContentType**  
설명** - 환영 메시지 유형을 나타냅니다.  
허용된 값**: – ` PlainText` \$1 `SSML`  
+ PlainText** – 메시지가 일반 UTF-8 텍스트를 포함합니다.
+ SSML** – 메시지가 음성 출력용으로 형식이 지정된 텍스트를 포함합니다.
필수** - 예  
기본값** – 없음

## StartBotConversation 작업 사용
<a name="using-startbot"></a>

다음은 예제는 일반적인 `StartBotConversation` 작업을 보여줍니다.

```
{
  "SchemaVersion": "1.0",
  "Actions":[
    {
      "Type": "StartBotConversation",
      "Parameters": {
        "CallId": "call-id-1",
        "BotAliasArn": "arn:aws:lex:us-east-1:123456789012:bot-alias/ABCDEFGHIH/MNOPQRSTUV",
        "LocaleId": "en_US",
        "Configuration": {
          "SessionState": {
             "SessionAttributes": {
                "mykey1": "myvalue1" 
             },
             "DialogAction" : {
               "Type": "ElicitIntent"
             }
          },
          "WelcomeMessages": [
            {
              "Content": "Welcome. How can I help you?",
              "ContentType": "PlainText" 
            }
          ]
        }
      }
    }
  ]
}
```

## ACTION\$1SUCCESSFUL 이벤트 처리
<a name="bot-action-success"></a>

다음은 예제는 `StartBotConversation` 작업의 일반적인 `ACTION_SUCCESSFUL` 이벤트를 보여줍니다.

```
{
    "SchemaVersion": "1.0",
    "Sequence": number,
    "InvocationEventType": "ACTION_SUCCESSFUL",
    "ActionData":
    {
        "CallId": "string",
        "Type": "StartBotConversation",
        "Parameters": {
            // parameters provided in the StartBotConversation action.
        },
        "CallDetails": {
            // Information about the call associated with the AWS Lambda invocation.
        },
        "IntentResult": {
            "SessionId": "string",
            "SessionState": {
                "SessionAttributes": {
                    "string": "string"
                },
                "Intent": {
                    "Name": "string",
                    "Slots":  {
                        "string": {
                            "Value": {
                                "OriginalValue": "string",
                                "InterpretedValue": "string",
                                "ResolvedValues": ["string"]
                            },
                            "Values": []
                        }
                    },
                    "State": "string",
                    "ConfirmationState": "string"
                }
            },
            "Interpretations": [
                {
                    "NluConfidence": {
                        "Score": number
                    },
                    "Intent": {
                        "Name": "string",
                        "Slots": {
                            "string": {
                                "Value": {
                                    "OriginalValue": "string",
                                    "InterpretedValue": "string",
                                    "ResolvedValues": ["string"]
                                },
                                "Values": []
                            }
                        },
                        "State": "string",
                        "ConfirmationState": "string"
                    }
                }
            ]
        }
    }
}
```

**IntentResult**  
사용자와 봇 간의 대화 결과입니다.

**SessionId**  
봇 대화 세션의 식별자입니다. 사용자가 봇과 대화를 시작할 때 Amazon Lex는 세션을 생성합니다. 세션은 사용자와 봇 간에 교환되는 정보를 캡슐화합니다. `StartBotConversation` 작업은 통화 ID를 봇의 `SessionId`로 사용합니다. [https://docs.aws.amazon.com/lexv2/latest/dg/API_runtime_PutSession.html](https://docs.aws.amazon.com/lexv2/latest/dg/API_runtime_PutSession.html) API를 사용하여 사용자와 봇 사이의 세션 상태를 수정할 수 있습니다. 자세한 내용은 Amazon Lex 개발자 안내서**의 [Amazon Lex V2 API로 세션 관리](https://docs.aws.amazon.com/lexv2/latest/dg/using-sessions.html)를 참조하세요.

**SessionState**  
사용자의 Amazon Lex v2 세션 상태입니다.

**SessionState.SessionAttributes**  
세션별 컨텍스트 정보를 나타내는 키/값 페어의 맵입니다. 맵에는 봇에 연결된 Lambda 함수와 PSTN 오디오 Lambda 함수 간에 전달된 봇 대화 정보가 포함되어 있습니다.

**Interpretations**  
Amazon Lex에서 도출한 고객의 말을 만족시킬 수 있는 의도의 목록입니다. 가장 높은 `NluConfidence` 점수를 받은 의도는 `SessionState`의 의도가 됩니다.

**Interpretations.NluConfidence.Score**  
Amazon Lex v2에서 의도가 사용자의 의도를 충족한다고 확신하는 정도를 나타내는 점수입니다. 범위는 0.00에서 1.00 사이입니다. 점수가 높을수록 신뢰도가 높습니다.

**Intent**  
사용자가 수행하고자 하는 작업입니다.

**Intent.Name**  
의도의 이름.

**Intent.Slots**  
의도에 대한 모든 슬롯의 맵입니다. 슬롯의 이름은 슬롯의 값에 매핑됩니다. 슬롯이 채워지지 않은 경우 값은 null입니다.

**Intent.Slots.Value**  
슬롯의 값입니다.

**Intent.Slots.Values**  
슬롯에 사용자가 제공한 하나 이상의 값 목록입니다.

**Intent.Slots.Value.OriginalValue**  
슬롯에 입력된 사용자 응답 텍스트입니다.

**Intent.Slots.Value.InterpretedValue**  
설명** - Amazon Lex v2가 슬롯에 대해 결정하는 값입니다. 실제 값은 봇의 값 선택 전략 설정에 따라 달라집니다. 사용자가 입력한 값을 사용하거나 Amazon Lex v2가 `resolvedValues` 목록의 첫 번째 값을 선택하도록 할 수 있습니다.

**Intent.Slots.Value.ResolvedValues**  
Amazon Lex v2가 슬롯에 대해 인식하는 추가 값의 목록입니다.

**Intent.State**  
설명** - 의도 충족에 대한 정보입니다. 가능한 값은 다음과 같습니다.  
+ `Failed` – Lambda 함수가 의도를 충족하지 못했습니다.
+ `Fulfilled` - Lambda 함수가 의도를 충족했습니다.
+ `ReadyForFulfillment` - 의도에 대한 정보가 표시되며 Lambda 함수가 의도를 충족할 수 있습니다.

**Intent.ConfirmationState**  
설명** - 의도 확인을 나타냅니다. 가능한 값은 다음과 같습니다.  
+ Confirmed** - 의도가 충족되었습니다.
+ Denied** – 사용자가 확인 프롬프트에 “아니요”라고 응답했습니다.
+ None** – 사용자에게 확인 프롬프트가 표시되지 않았거나 표시되었지만 확인 또는 거부하지 않았습니다.

## ACTION\$1FAILED 이벤트 처리
<a name="bot-action-fail"></a>

다음은 예제는 `StartBotConversation` 작업의 일반적인 `ACTION_FAILED` 이벤트를 보여줍니다.

```
{
    "SchemaVersion": "1.0",
    "Sequence": number,
    "InvocationEventType": "ACTION_FAILED",
    "ActionData":{
        "CallId": "string",
        "Type": "StartBotConversation",
        "Parameters": {
            // parameters provided in the StartBotConversation action
        },
        "ErrorType": "string",
        "ErrorMessage": "string"
    },
    "CallDetails":{
    }
}
```

**ErrorType**  
오류 상태를 식별하는 고유한 문자열입니다.

**ErrorMessage**  
오류 상태의 일반적인 설명입니다.

### 오류 코드
<a name="action-errors"></a>

다음 표에는 Lambda 함수가 `ACTION_FAILED` 이벤트에서 반환할 수 있는 오류 메시지가 나와 있습니다.


| 오류 | 설명 | 
| --- | --- | 
|  `InvalidActionParameter` | 하나 이상의 작업 파라미터가 유효하지 않습니다. 오류 메시지가 잘못된 파라미터를 설명합니다. | 
| `SystemException` | 작업을 실행하는 동안 시스템 오류가 발생했습니다. | 
| `ResourceNotFound` | 지정된 봇을 찾을 수 없습니다. | 
| `ResourceAccessDenied` | 봇에 대한 액세스가 거부됩니다. | 
| `ActionExecutionThrottled` | 봇 대화 서비스 한도를 초과했습니다. 오류 메시지가 초과된 특정 서비스 한도를 설명합니다. | 

## 봇 사용 권한 부여
<a name="bot-permissions"></a>

다음 예제는 Amazon Chime SDK에 Amazon Lex [https://docs.aws.amazon.com/lexv2/latest/dg/API_runtime_StartConversation.html](https://docs.aws.amazon.com/lexv2/latest/dg/API_runtime_StartConversation.html) API를 직접 호출할 수 있는 권한을 부여합니다. 봇을 사용할 수 있는 오디오 서비스 권한을 명시적으로 부여해야 합니다. 조건 블록은 서비스 보안 주체에게 필요합니다. 조건 블록은 글로벌 컨텍스트 키 `AWS:SourceAccount` 및 `AWS:SourceArn`을 사용해야 합니다. `AWS:SourceAccount`는 AWS 계정 ID입니다. `AWS:SourceArn`은 Lex 봇을 간접 호출하는 PSTN 오디오 애플리케이션의 리소스 ARN입니다.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowChimePstnAudioUseBot",
      "Effect": "Allow",
      "Principal": {
        "Service": "voiceconnector.chime.amazonaws.com"
      },
      "Action": "lex:StartConversation",
  "Resource": "arn:aws:lex:us-east-1:123456789012:bot-alias/botId/aliasId",
      "Condition": {
        "StringEquals": {
          "AWS:SourceAccount": "123456789012"
        },
        "ArnEquals": {
        "AWS:SourceArn": "arn:aws:chime:us-east-1:123456789012:sma/smaId"
        }
      }
    }
  ]
}
```

------

## 음성 및 DTMF 시간 제한 구성
<a name="bot-timeouts"></a>

사용자 입력을 캡처할 때 음성 및 DTMF 시간 제한을 구성할 수 있습니다. 봇과 대화를 시작할 때 세션 속성을 통해 시간 제한을 구성하고 필요한 경우 Lex 봇의 Lambda 함수에서 이를 덮어쓸 수 있습니다. Amazon Lex를 사용하면 의도 또는 봇에 대해 여러 개의 슬롯을 설정할 수 있습니다. 세션 속성이 의도 및 슬롯 수준에 적용되도록 지정할 수 있으므로 특정 유형의 입력을 수집하는 경우에만 속성이 설정되도록 지정할 수 있습니다. 예를 들어 계정 번호를 수집할 때는 날짜를 수집하는 경우보다 더 긴 시간 제한을 지정할 수 있습니다. 세션 속성 키에 와일드카드를 사용할 수 있습니다.

예를 들어 모든 의도의 모든 슬롯에 대한 음성 제한 시간을 4,000밀리초로 설정하려면 `x-amz-lex:start-timeout-ms:*:*`를 세션 속성 이름으로, `4000`을 세션 속성 값으로 사용하여 세션 속성을 제공할 수 있습니다. 자세한 내용은 Amazon Lex 개발자 안내서**의 [사용자 입력 캡처를 위한 시간 제한 구성](https://docs.aws.amazon.com/lexv2/latest/dg/session-attribs-speech.htm)을 참조하세요.

## 대화 중 DTMF 입력 사용
<a name="bot-dtmf"></a>

Amazon Lex 봇은 대화 중에 음성 및 키패드 입력을 지원합니다. 봇은 키패드 입력을 DTMF 숫자로 해석합니다. 우물 정자 키(\$1)를 눌러 입력을 끝내거나 별표 키(\$1)를 사용하여 대화를 취소하도록 할 수 있습니다. 고객에게 우물 정자 키로 입력을 종료하도록 안내하지 않으면 Lex는 5초 동안 추가 키 입력을 기다립니다.

## 청구 및 서비스 할당량
<a name="bot-billing"></a>

AWS 는 다음 비용을 청구합니다.
+ 통화에 대한 Amazon Chime SDK 사용량. 자세한 내용은 [Amazon Chime SDK 요금](https://aws.amazon.com/chime/chime-sdk/pricing/)을 참조하세요.
+ 사용자의 말을 해석한 Amazon Lex 사용량. 자세한 내용은 [Amazon Lex 스트리밍 대화 요금](https://aws.amazon.com/lex/pricing/)을 참조하세요.
+ 봇의 텍스트 응답을 합성한 Amazon Polly 사용량. 자세한 내용은 [Amazon Polly 요금](https://aws.amazon.com/polly/pricing/)을 참조하세요.

다음과 같은 서비스 할당량에도 유의해야 합니다.
+ Amazon Chime SDK에는 PSTN 오디오 [StartBotConversation](#start-bot-conversation) 작업에 사용할 수 있는 최대 Amazon Lex 봇 수에 대한 서비스 할당량이 있습니다. 자세한 내용은 *AWS 일반 참조*에서 [SIP 트렁킹 및 음성 할당량](https://docs.aws.amazon.com/general/latest/gr/chime-sdk.html#chm-sdk-pstn-quotas)을 참조하세요.
+ Amazon Lex에는 Lex 봇당 최대 동시 음성 대화 수에 대한 서비스 할당량이 있습니다. Amazon Lex 서비스 팀에 문의하여 할당량을 늘릴 수 있습니다. 자세한 내용은 Amazon Lex 개발자 안내서**의 Amazon Lex [지침 및 할당량](https://docs.aws.amazon.com/lexv2/latest/dg/quotas.html)을 참조하세요.
+ Amazon Polly에는 텍스트 응답 합성에 대한 서비스 할당량이 있습니다. Amazon Polly 서비스 팀에 문의하여 할당량을 늘릴 수 있습니다. Amazon Lex 서비스 할당량에 대한 자세한 내용은 Amazon Polly 개발자 안내서**의 [Amazon Polly의 할당량](https://docs.aws.amazon.com/polly/latest/dg/limits.html)을 참조하세요.

# Amazon Chime SDK PTSN 오디오 서비스에서 SIP 헤더 사용
<a name="sip-headers"></a>

이제 SIP 인프라와 통화 컨텍스트 정보를 교환하려는 경우 AWS Lambda 함수의 User-To-User 헤더, 전환 헤더 및 사용자 지정 SIP 헤더를 보내고 받을 수 있습니다.
+ User-to-User(UUI) 헤더를 사용하여 통화 제어 데이터를 전송할 수 있습니다. 이 데이터는 세션을 시작하는 애플리케이션에서 삽입되며 세션을 수락하는 애플리케이션에서 사용됩니다. 기본 SIP 기능에는 사용되지 않습니다. 예를 들어 콜 센터에서 UUI 헤더를 사용하여 상담원 간에 통화에 대한 정보를 전달할 수 있습니다.
+ Diversion 헤더는 통화가 어디에서 전환되었고 그 이유를 표시하는 데 사용됩니다. 이 헤더를 사용하여 다른 SIP 에이전트의 전환 정보를 확인하거나 전달할 수 있습니다.
+ 사용자 지정 SIP 헤더를 사용하면 원하는 다른 정보를 전달할 수 있습니다. 예를 들어 계정 ID를 전달하려는 경우 ‘X-Account-Id’라는 X 헤더를 만들고 이 정보를 추가할 수 있습니다.

사용자 지정 SIP 헤더에 접두사 `x-`를 붙여야 합니다. 헤더는 AWS Lambda 함수에 노출되고 인바운드 통화 중에 `NEW_INBOUND_CALL` 이벤트의 일부로 수신됩니다. [CallAndBridge](call-and-bridge.md) 작업 또는 [https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_voice-chime_CreateSipMediaApplicationCall.html](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_voice-chime_CreateSipMediaApplicationCall.html) API를 트리거할 때 아웃바운드 통화 레그에 이러한 헤더를 포함할 수도 있습니다.

Lambda 함수의 `Participants` 부분에는 `SipHeaders` 필드가 포함됩니다. 이 필드는 사용자 지정 헤더를 수신할 때나 `User-to-User` 또는 `Diversion` 헤더를 채울 때 사용할 수 있습니다.

이 예제는 AWS Lambda 호출에 SIP 헤더가 포함된 경우 예상되는 응답을 보여줍니다.

```
{
    "SchemaVersion": "1.0",
    "Sequence": 3,
    "InvocationEventType": "ACTION_SUCCESSFUL",
    "ActionData": {
        "Type":"actionType",
        "Parameters":{
            // Parameters vary by actionType
        }
    },
    "CallDetails":{
        .....
        .....
        "Participants":[
            {
                "CallId": "call-id-1",
                "ParticipantTag": "LEG-A",
                ..... 
                "Status": "Connected"
                "SipHeaders": {
                    "X-Test-Value": "String",
                    "User-to-User": "616d617a6f6e5f6368696d655f636f6e6e6563745f696e746567726174696f6e;encoding=hex",
                    "Diversion": "sip:+11234567891@public.test.com;reason=unconditional"
                }
            },
            {
            "CallId": "call-id-2",
            "ParticipantTag": "LEG-B",
            .....
            "Status": "Connected"
            }
        ]
    }
}
```

다음 예제는 `SipHeaders` 파라미터에 대한 유효하지 않은 입력으로 인해 성공한 [CallAndBridge](call-and-bridge.md) 작업을 보여줍니다.

```
{
    "SchemaVersion": "1.0",
    "Actions":[
        {
            "Type": "CallAndBridge",
            "Parameters":{
            "CallTimeoutSeconds": 30,
            "CallerIdNumber": "e164PhoneNumber", // required
            "RingbackTone": { // optional
                "Type": "S3",
                "BucketName": "s3_bucket_name",
                "Key": "audio_file_name"
            },
            "Endpoints":[
               {
                    "Uri":"e164PhoneNumber", // required
                    "BridgeEndpointType":"PSTN" // required
               }
            ],
            "SipHeaders": {
                "X-Test-Value": "String",
                "User-to-User": "616d617a6f6e5f6368696d655f636f6e6e6563745f696e746567726174696f6e;encoding=hex",
                "Diversion": "sip:+11234567891@public.test.com;reason=unconditional"
            }
         }
      }
   ]
}
```

다음 예제는 유효하지 않은 `SipHeaders` 파라미터로 인해 실패한 [CallAndBridge](call-and-bridge.md) 작업을 보여줍니다.

```
{
    "SchemaVersion":"1.0",
    "Sequence":3,
    "InvocationEventType":"ACTION_FAILED",
    "ActionData":{
        "Type":"actionType",
        "Parameters":{
            // Parameters vary by Action Type
            "SipHeaders": {
                "X-AMZN": "String",
                "User-to-User": "616d617a6f6e5f6368696d655f636f6e6e6563745f696e746567726174696f6e;encoding=hex",
                "Diversion": "sip:+11234567891@public.test.com;reason=unconditional"
             },
        },
        "ErrorType": "InvalidActionParameter",
        "ErrorMessage": "Invalid SIP header(s) provided: X-AMZN"
   },
   "CallDetails":{
      .....
      "Participants":[
         {
            "CallId":"call-id-1",
            "ParticipantTag":"LEG-A",
            .....   
            "Status":"Connected"
         },
         {
            "CallId":"call-id-2",
            "ParticipantTag":"LEG-B",
            .....
            "Status":"Connected"
         }
      ]
   }
}
```

## SipHeaders 필드 사용
<a name="custom-headers"></a>

[https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_voice-chime_CreateSipMediaApplicationCall.html](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_voice-chime_CreateSipMediaApplicationCall.html) API를 트리거하는 경우 선택적 `SipHeaders` 필드를 사용하여 사용자 지정 SIP 헤더를 아웃바운드 통화 레그에 전달할 수 있습니다. 유효한 헤더 키는 다음 중 하나를 포함해야 합니다.
+ 접두사 `x-`
+ `User-to-User` 헤더
+ `Diversion` 헤더

`X-AMZN`은 예약된 헤더입니다. API 직접 호출에서 이 헤더를 사용하면 실패합니다. 헤더의 최대 길이는 2,048자입니다.

다음 예제는 명령줄 인터페이스의 일반적인 [https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_voice-chime_CreateSipMediaApplicationCall.html](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_voice-chime_CreateSipMediaApplicationCall.html) API를 선택적 `SipHeaders` 파라미터와 함께 보여줍니다.

```
create-sip-media-application-call
    --from-phone-number value // (string)
    --to-phone-number value // (string)
    --sip-media-application-id value // (string)
    --sip-headers // (map)
```

자세한 내용은 [A Mechanism for Transporting User-to-User Call Control Information in SIP](https://datatracker.ietf.org/doc/html/rfc7433) 및 [Diversion Indication in SIP](https://datatracker.ietf.org/doc/html/rfc5806)를 참조하세요.

# Amazon Chime SDK PTSN 오디오 서비스에서 통화 세부 정보 기록 사용
<a name="attributes"></a>

Amazon Chime SDK 관리자는 *통화 세부 정보 기록*(CDR)을 저장하도록 Amazon Chime SDK Voice Connector를 구성할 수 있습니다. Amazon Chime SDK Voice Connector가 CDR을 저장하도록 구성하는 방법에 대한 자세한 내용은 Amazon Chime SDK 관리 안내서**의 [Amazon Chime SDK의 전역 설정 관리](https://docs.aws.amazon.com/chime-sdk/latest/ag/manage-global.html)를 참조하세요.

CDR을 활성화하면 각 통화 후에 SIP 미디어 애플리케이션이 기록을 S3 버킷의 **Amazon-Chime-SMADRs**라는 폴더로 전송합니다.

다음 표는 CDR의 속성 목록을 나열하며 속성의 적절한 형식을 보여줍니다. 기록에는 모든 통화에 대해 여기에 나열된 모든 필드가 포함됩니다.


|  값  |  설명  | 
| --- | --- | 
|  `"AwsAccountId":"AWS-account-ID"`  |  PSTN 사용을 시작한 SIP 미디어 애플리케이션과 연결된 AWS 계정 ID  | 
|  `"TransactionId":"transaction-ID" `  |  통화의 트랜잭션 ID  | 
|  `"CallId":"SIP-media-application-call-ID"`  |  관련 사용에 대한 참가자의 통화 ID  | 
|  `"VoiceConnectorId":"voice-connector-ID"`  |  Amazon Chime SDK Voice Connector ID UUID  | 
|  `"Status":"status"`  |  통화 상태(완료, 실패)  | 
|  `"BillableDurationSeconds":"billable-duration-in-seconds"`  |  청구되는 통화 기간(초)  | 
|  `"SchemaVersion":"schema-version"`  |  CDR 스키마 버전  | 
|  `"SourcePhoneNumber":"12075550155"`  |  E.164 발신 전화번호  | 
| "SourcePhoneNumberName":"North Campus Reception" | 소스 전화번호에 할당된 이름 | 
|  `"DestinationPhoneNumber":"13605551214"`  |  E.164 착신 전화번호  | 
| "DestinationPhoneNumberName":"South Campus Reception" | 대상 전화번호에 할당된 이름 | 
|  `"UsageType":"usage-type"`  |  Price List API의 개별 항목에 대한 사용량 세부 정보  | 
|  `"ServiceCode":"service-code" `  |  Price List API의 서비스 코드  | 
|  `"Direction":"direction"`  |  통화 방향, `Outbound` 또는 `Inbound`  | 
|  `"TimeStampEpochSeconds":"start-time-epochseconds"`  |  epoch/Unix 타임스탬프 형식인 기록의 타임스탬프  | 
|  `"Region":"AWS-region"`  |  AWS Amazon Chime SDK 음성 커넥터의 리전  | 
|  `"SipRuleId":"sip-rule-id"`  |  통화가 PSTN 오디오 서비스에 연결될 때 트리거되는 SIP 규칙의 ID  | 
|  `"SipApplicationId":"sip-application-id"`  |  통화를 처리하는 SIP 애플리케이션의 ID  | 
|  `"CallLegTriggerType":"trigger-type"`  |  통화를 트리거한 이벤트 유형  | 
|  `"BillableVoiceFocusSeconds":"billable-voice-focus-in-seconds"`  |  청구되는 Voice Focus 사용량(초)  | 

# Amazon Chime SDK PTSN 오디오 서비스의 제한 시간 및 재시도 이해
<a name="timeouts"></a>

PSTN 오디오 서비스는 AWS Lambda 함수와 동기적으로 상호 작용합니다. 애플리케이션은 호출을 다시 시도하기 전에 AWS Lambda 함수가 응답할 때까지 5초 동안 기다립니다. 20초 후에도 응답이 수신되지 않으면 PSTN 오디오 서비스가 전화를 [끊](unexpected-hangups.md)습니다. 함수가 4*XX* 상태 코드 중 하나와 함께 오류를 반환하면 기본적으로 SIP 미디어 애플리케이션은 간접 호출을 한 번만 재시도합니다. 재시도 횟수를 소진하면 `480 Unavailable` 오류 코드와 함께 통화가 종료됩니다. AWS Lambda 오류에 대한 자세한 내용은 [의 호출 문제 해결을 AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/troubleshooting-invocation.html) 참조하세요.

# Amazon Chime SDK PTSN 오디오 서비스 디버깅 및 문제 해결
<a name="debug-pstn"></a>

다음 정보를 사용하여 Amazon Chime SDK PSTN 오디오 서비스에서 작업할 때 발생할 수 있는 일반적인 문제를 진단하고 수정할 수 있습니다.

**Topics**
+ [Amazon Chime SDK PTSN 오디오 서비스의 로그 확인](check-logs.md)
+ [Amazon Chime SDK PTSN 오디오 서비스의 예기치 않은 끊김 디버깅](unexpected-hangups.md)
+ [예기치 못한 ACTION\$1FAILED 이벤트 디버깅](unexpected-action-fail.md)

# Amazon Chime SDK PTSN 오디오 서비스의 로그 확인
<a name="check-logs"></a>

SIP 미디어 애플리케이션을 디버깅하는 경우 Cloudwatch Logs에서 애플리케이션과 관련된 AWS Lambda 함수를 확인합니다.

다음으로 SIP 미디어 애플리케이션과 관련된 로그를 확인합니다. 필요에 따라 로깅을 위해 SIP 미디어 애플리케이션을 구성할 수 있습니다. 자세한 내용은 Amazon Chime SDK 관리자 안내서**의 [SIP 미디어 애플리케이션 사용](https://docs.aws.amazon.com/chime-sdk/latest/ag/use-sip-apps.html)을 참조하세요. 로깅을 활성화하면 `/aws/ChimeSipMediaApplicationSipMessages/<SIP-media-application-Id>` 로그 그룹에서 Cloudwatch의 로그를 찾을 수 있습니다.

# Amazon Chime SDK PTSN 오디오 서비스의 예기치 않은 끊김 디버깅
<a name="unexpected-hangups"></a>

PSTN 오디오 서비스에 대한 AWS Lambda 함수와 함께 예기치 않은 중단 또는 오류 메시지가 발생하는 경우 다음 문제 해결 작업을 완료합니다.
+  AWS Lambda 정책이 [voiceconnector.chime.amazonaws.com](http://voiceconnector.chime.amazonaws.com/) 서비스 보안 주체에 `lambda:InvokeFunction` 권한을 부여하는지 확인합니다.
+  AWS Lambda 함수의 로그를 확인하여 함수가 성공적으로 호출되고 있는지 확인합니다.
+ 로그에 수신 이벤트와 반환된 작업이 표시되면 AWS Lambda 함수가 호출될 때에서 중단 작업을 반환하지 않는지 확인합니다.
+ SIP 미디어 애플리케이션의 CloudWatch 로그를 확인합니다. 다음 표에는 발생할 수 있는 몇 가지 메시지가 나와 있습니다.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/chime-sdk/latest/dg/unexpected-hangups.html)

# 예기치 못한 ACTION\$1FAILED 이벤트 디버깅
<a name="unexpected-action-fail"></a>

예기치 못한 `ACTION_FAILED` 이벤트가 발생하면 다음을 확인합니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/chime-sdk/latest/dg/unexpected-action-fail.html)

# Amazon Chime SDK PTSN 오디오 서비스용 VoiceFocus 이해
<a name="voice-focus"></a>

공중 교환 전화망(PSTN) 통화에서 인바운드 및 아웃바운드 통화 레그에 Amazon Voice Focus 잡음 억제를 적용할 수 있습니다. Amazon Voice Focus를 적용하면 사람의 음성에 영향을 주지 않으면서 주변 소음을 줄입니다. 이렇게 하면 현재 화자가 더 쉽게 들을 수 있습니다.

인바운드 통화 레그를 만들려면 `NewInboundCall` 이벤트와 함께 AWS Lambda 함수를 간접 호출하는 [SIP 규칙을](https://docs.aws.amazon.com/chime/latest/ag/manage-sip-applications.html) 사용합니다. [CallAndBridge](call-and-bridge.md) 작업을 사용하거나 [https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_voice-chime_CreateSipMediaApplicationCall.html](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_voice-chime_CreateSipMediaApplicationCall.html) API 작업을 사용하여 아웃바운드 통화 레그를 생성할 수 있습니다. Amazon Voice Focus에 대한 자세한 내용은 [How Amazon Chime's noise cancellation works](https://www.amazon.science/blog/how-amazon-chimes-challenge-winning-noise-cancellation-works)를 참조하세요.

 Amazon Voice Focus는 다음을 포함하여 원치 않는 비음성 소음을 줄여줍니다.
+ **환경 소음** - 바람, 선풍기, 흐르는 물
+ **배경 소음** - 잔디깎이, 개 짖는 소리
+ **전경 소음** - 타자 소리, 책장 넘기는 소리

**참고**  
Amazon Voice Focus를 사용하는 경우는 각 통화 레그의 활성 통화 시간과 SIP 미디어 애플리케이션 사용의 각 분에 대해 AWS 요금을 청구합니다.

이 예제에서는 일반적인 `VoiceFocus` 작업을 보여줍니다.

```
{
    "SchemaVersion": "1.0",
    "Actions":[
        {
            "Type": "VoiceFocus",
            "Parameters": {
                "Enable": True|False,            // required
                "CallId": "call-id-1",           // required    
            }
        }
    ]
}
```

**Enable**  
설명** - Amazon Voice Focus를 활성화 또는 비활성화합니다.  
*허용된 값* - `True` \$1 `False`  
필수** - 예  
*기본값* – 없음

**CallId**  
*설명* - AWS Lambda 함수 호출의에 있는 참가자`CallDetails`의 CallId   
허용된 값** - 유효한 통화 ID  
필수** - 예  
*기본값* – 없음

이 예제는 `VoiceFocus` 작업의 성공한 `ACTION_SUCCESSFUL` 이벤트를 보여줍니다.

```
{
   "SchemaVersion": "1.0",
   "Sequence": 3,
   "InvocationEventType": "ACTION_SUCCESSFUL",
   "ActionData": {
      "Type": "VoiceFocus",
      "Parameters": {
         "Enable": True,
         "CallId": "call-id-1"
      }
   },
   "CallDetails":{
      .....
      .....
      "Participants":[
         {
            "CallId": "call-id-of-caller",
            .....   
            "Status": "Connected"
         },
         {
            "CallId": "call-id-of-callee",
            .....
            "Status": "Connected"
         }
      ]
   }
}
```

이 예제는 `VoiceFocus` 작업의 일반적인 `ACTION_FAILED` 이벤트를 보여줍니다.

```
{
   "SchemaVersion": "1.0",
   "Sequence":2,
   "InvocationEventType": "ACTION_FAILED",
      "ActionData":{
      "Type": "VoiceFocus",
      "Parameters": {
         "Enable": True,
         "CallId": "call-id-1"
      }
      },
      "ErrorType": "SystemException",
      "ErrorMessage": "System error while running action"
   },
   "CallDetails":{
      .....
      .....
      "Participants":[
         {
            "CallId": "call-id-of-caller",
            .....   
         }
      ]
   }
}
```

**오류 처리**  
보안상의 이유로 PSTN 오디오 작업은 고객 계정마다 초당 통화 요청(CPS)을 5개로 제한됩니다. 통화 요청이 5CPS 제한을 초과하는 경우 작업은 오류 메시지를 반환합니다. 이 표에는 `VoiceFocus` 작업에서 반환되는 오류 메시지가 나와 있습니다.


| 오류 | 메시지 | 이유 | 
| --- | --- | --- | 
| `ActionExecutionThrottled` | Failed to run action. The maximum number of actions per second has been reached. | 초당 Voice Focus 작업 요청 수가 시스템 한도를 초과했습니다. | 
| `MissingRequiredActionParameter` | Missing required action parameter. | 작업을 실행하는 동안 필요한 파라미터가 하나 이상 누락되었습니다. | 
| `SystemException` | System error while running action. | 작업을 실행하는 동안 시스템 오류가 발생했습니다. | 

**통화 흐름**  
이 다이어그램은 두 PSTN 통화 사이의 `CallAndBridge` 작업에 대해 Amazon Voice Focus를 활성화 및 비활성화하는 통화 흐름을 보여줍니다.

![\[두 개의 다중 PSTN 통화에 대해 Amazon Voice Focus를 활성화 또는 비활성화하는 경우의 통화 흐름입니다.\]](http://docs.aws.amazon.com/ko_kr/chime-sdk/latest/dg/images/voice_focus-pstn1.png)


아웃바운드 통화 레그의 경우 AWS Lambda 함수는 호출자에 대해 Amazon Voice 포커스를 활성화하고를 포함한 일련의 작업을 반환합니다`CallAndBridge`. 통화가 연결되면 `VoiceFocus` 작업은 `ACTION_SUCCESSFUL` 이벤트를 반환하고 Lambda 함수는 전화를 받은 사람에 대해 Amazon Voice Focus를 활성화하는 또 다른 이벤트 세트를 반환합니다. 해당 작업 세트에는`VoiceFocus`, `Enable`, `True` 및 발신자 ID가 포함됩니다. 발신자가 전화를 끊기 전까지는 추가 작업을 수행하지 않습니다. 그런 다음 Lambda 함수는 SIP 미디어 애플리케이션에 `Hangup` 작업을 전송합니다. 애플리케이션은 전화를 받은 사람의 전화를 끊고 Lambda 함수로 Hangup 함수를 다시 전송하며, Lambda 함수는 추가 작업을 수행하지 않습니다.

# Amazon Chime SDK PSTN 오디오 서비스 용어집
<a name="chm-dg-glossary"></a>

\$1 [A](#a) \$1 [C](#c) \$1 [E](#e) \$1 [정보](#i) \$1 [L](#l) \$1 [M](#m) \$1 [N](#n) \$1 [O](#o) \$1 [P](#p) \$1 [S](#s) \$1 [T](#t) \$1 [V](#v) \$1 

## A
<a name="a"></a>

**작업**  
 AWS Lambda 함수에서 작업은 숫자 전송 또는 수신, 회의 참여 등과 같이 전화 통화의 레그에서 실행하려는 항목입니다. PSTN 오디오 서비스가 지원하는 작업에 대한 자세한 내용은 [Amazon Chime SDK PSTN 오디오 서비스에 지원되는 작업](specify-actions.md) 단원을 참조하세요.

**AWS Lambda**  
서버를 프로비저닝하거나 관리하지 않고도 거의 모든 유형의 애플리케이션 또는 백엔드 서비스에 대한 코드를 실행할 수 있는 컴퓨팅 서비스입니다.

**AWS Lambda 함수**  
PSTN 오디오 서비스의 컨텍스트에서 아웃바운드 통화 걸기와 같이 SIP 미디어 애플리케이션이 전달한 데이터에 대한 응답으로 실행되는 함수입니다.

## C
<a name="c"></a>

**호출 세부 정보 레코드**  
계정 ID, 발신자 전화번호, 수신자 국가 등 Amazon Chime SDK Voice Connector 통화에서 수집한 데이터입니다. 레코드는 계정의 Amazon S3(Simple Storage Service) 버킷에 객체로 저장됩니다. 자세한 내용은 Amazon Chime SDK 관리자 안내서**의 [Amazon Chime SDK에서 글로벌 설정 관리](https://docs.aws.amazon.com/chime-sdk/latest/ag/manage-global.html)를 참조하세요. 레코드 스키마에 대한 자세한 정보는 이 안내서의 [Amazon Chime SDK PTSN 오디오 서비스에서 통화 세부 정보 기록 사용](attributes.md) 섹션을 참조하세요.

**콜 ID**  
모든 수신 전화의 레그에 할당되는 ID입니다.

**콜 레그**  
통화의 일부입니다. Amazon Chime SDK 애플리케이션에서는 유효한 전화번호, PSTN 또는 Amazon Chime SDK Voice Connector를 통해 전화를 걸 수 있습니다. 자세한 내용은 이 안내서의 [Amazon Chime SDK PSTN 오디오 서비스 호출 레그 사용에 대해 알아보기](call-architecture.md) 섹션을 참조하세요.

**통신 사업자**  
모바일 서비스를 제공하는 회사입니다. **무선 통신 사업자**의 줄임말입니다.

**Amazon Chime**  
에서 제공하는 통합 커뮤니케이션 및 협업 서비스입니다 AWS.

**Amazon Chime SDK**  
개발자가 맞춤형 커뮤니케이션 애플리케이션에 실시간 미디어 및 커뮤니케이션을 추가하는 데 사용하는 소프트웨어 개발 키트입니다.

## E
<a name="e"></a>

**E.164**  
PSTN 오디오 서비스에서 유일하게 허용되는 전화번호 형식입니다. ITU-T 권장 사항에 따르면 번호는 1\$13자리 국가 코드를 사용하고 그 뒤에 최대 12자리의 가입자 번호를 사용합니다. 예를 들어 미국은 `+14155552671`, 영국은 `+442071838750 44`, 오스트레일리아는 `+61285993444`를 사용합니다.

**엔드포인트**  
 전화 또는 통합 통신 애플리케이션과 같은 하드웨어 디바이스 또는 소프트웨어 서비스입니다.

**EventBridge**  
애플리케이션을 다양한 소스의 데이터에 연결할 수 있는 서버리스 이벤트 버스 서비스입니다.  
SIP 미디어 애플리케이션은 EventBridge로 데이터를 보내지 않습니다. 자세한 내용은 Amazon Chime SDK 관리자 안내서[https://docs.aws.amazon.com/chime-sdk/latest/ag/automating-chime-with-cloudwatch-events.html](https://docs.aws.amazon.com/chime-sdk/latest/ag/automating-chime-with-cloudwatch-events.html)의 *EventBridge를 사용한 Amazon Chime SDK 자동화*를 참조하세요.

## 정보
<a name="i"></a>

**IVR**  
대화형 음성 응답입니다. 음성 인식 또는 터치톤 키패드를 통해 컴퓨터로 작동하는 전화 시스템과 상호 작용할 수 있게 해주는 시스템입니다.

## L
<a name="l"></a>

**레그**  
[Call leg](#call-leg)을 참조하세요.

## M
<a name="m"></a>

**미디어**  
Amazon Chime SDK 회의 중에 사용할 수 있는 오디오, 비디오 또는 채팅 메시지입니다. 사용자 지정 통신 애플리케이션은 각 미디어 유형을 하나 이상 포함할 수 있습니다.

**미디어 파이프라인**  
Amazon Chime SDK 회의 중에 오디오, 비디오, 메시지 및 이벤트를 스트리밍하고 캡처하기 위한 메커니즘입니다. 자세한 내용은 이 안내서의 [Amazon Chime SDK 미디어 파이프라인 생성](media-pipelines.md) 섹션을 참조하세요.

## N
<a name="n"></a>

**숫자 이동성**  
통신사 또는 통합 커뮤니케이션 시스템 간에 전화번호를 이동할 수 있는 기능입니다.

## O
<a name="o"></a>

**시작**  
PSTN에서 전화를 받고 해당 통화를 VoIP 엔드포인트로 전달하는 프로세스입니다.

## P
<a name="p"></a>

**참가자 태그**  
각 통화 참여자 `LEG-A` 또는 `LEG-B`에게 할당된 식별자입니다.

**정책**  
Amazon Chime SDK에는 다음과 같은 유형의 정책이 필요합니다.  
+ **IAM 사용자 정책** - Identity 및 Access Management 사용자의 권한을 정의하는 정책입니다.
+ **회의 정책** - 회의 중에 화면을 공유할 때 한 사용자가 다른 사용자의 컴퓨터를 제어할 수 있도록 하고, 회의 참석자가 Amazon Chime SDK로부터 전화를 수신하여 회의에 참여할 수 있도록 하는 정책입니다.

**PSTN**  
공공 통신 사업자가 운영하는 공중 전화 교환망입니다. 전화 통화 기능을 제공하는 인프라와 서비스입니다.

**PSTN 오디오 서비스**  
개발자가 통신 솔루션에 오디오 기능을 추가할 수 있게 해주는 Amazon Chime SDK 서비스입니다.

## R
<a name="r"></a>

**라우팅**  
Amazon Chime SDK를 사용하여 만든 앱은 하나 이상의 라우팅 유형을 사용합니다.  
+ **네트워크 라우팅** - 네트워크 내 또는 여러 네트워크 간 또는 여러 네트워크 간의 트래픽 경로를 선택하는 프로세스입니다.
+ **상호 작용 라우팅** - 통화가 올바른 수신자나 엔드포인트로 전달되도록 하는 프로세스입니다.
+ **통화 라우팅** - 인바운드 통화를 대기시키고 사전 정의된 수신자 또는 엔드포인트로 분배하는 통화 관리 기능입니다.

## S
<a name="s"></a>

**SBC**  
세션 보더 컨트롤러입니다. SIP 기반 Voice Over Internet Protocol(VoIP) 네트워크를 보호하기 위해 배포된 네트워크 요소입니다.

**시퀀스**  
 AWS Lambda 함수를 호출하는 이벤트 시퀀스입니다. 호출 중에 함수가 호출될 때마다 시퀀스가 증가합니다.

**서비스 한도/서비스 할당량**  
Amazon Chime SDK에서 허용하는 회의, 오디오 스트림 또는 콘텐츠 공유와 같은 리소스의 최대 수입니다. 자세한 내용은 이 안내서의 [Audio](meetings-sdk.md#audio) 섹션을 참조하세요.

**SIP**  
세션 시작 프로토콜, 즉 음성, 비디오 및 메시징 애플리케이션의 모든 조합을 포함하는 실시간 세션을 시작, 유지, 종료하는 데 사용되는 시그널링 프로토콜입니다. 자세한 내용은 [SIP: 세션 시작 프로토콜](https://www.rfc-editor.org/rfc/rfc3261.html)을 참조하세요.

**SIP 헤더**  
통화 제어 데이터와 사용자 계정 ID와 같은 기타 데이터가 포함된 AWS Lambda 함수의 파라미터입니다. IDs

**SIP 미디어 애플리케이션**  
SIP 규칙의 값을 대상 AWS Lambda 함수로 전달하는 관리형 객체입니다. 개발자는 [https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_voice-chime_CreateSipMediaApplication.html](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_voice-chime_CreateSipMediaApplication.html) API를 직접 호출하여 SIP 미디어 애플리케이션을 생성할 수 있지만, 그렇게 하려면 관리자 권한이 있어야 합니다.

**SIP 규칙**  
Amazon Chime SDK 음성 커넥터 URI의 전화번호를 대상 SIP 미디어 애플리케이션에 전달하는 관리형 객체입니다.

**SIP 트렁크**  
[Amazon Chime SDK Voice Connector](#voice-connector)을 참조하세요.

**SMA**  
SIP 미디어 애플리케이션을 참조하세요.

**SMA ID**  
SIP 미디어 애플리케이션을 참조하세요.

## T
<a name="t"></a>

**Telco**  
통신 서비스 제공업체입니다.

**종료**  
통화를 종료하는 프로세스입니다.

**트랜잭션**  
통화 레그가 하나 이상 포함된 통화입니다. 자세한 내용은 이 안내서의 [Amazon Chime SDK PSTN 오디오 서비스 호출 레그 사용에 대해 알아보기](call-architecture.md) 섹션을 참조하세요.

**트랜잭션 ID**  
여러 호출 레그를 포함하는 트랜잭션의 ID입니다. 자세한 내용은 이 안내서의 [Amazon Chime SDK PSTN 오디오 서비스 호출 레그 사용에 대해 알아보기](call-architecture.md) 섹션을 참조하세요.

## V
<a name="v"></a>

**Amazon Chime SDK Voice Connector**  
전화 시스템에 대한 SIP(세션 시작 프로토콜) 트렁킹 서비스를 제공하는 객체입니다. 관리자는 Amazon Chime SDK 관리 콘솔을 사용하여 관리형 Voice Connector를 생성합니다. 자세한 내용은 Amazon Chime SDK 관리자 안내서**의 [Amazon Chime SDK Voice Connector 관리](https://docs.aws.amazon.com/chime-sdk/latest/ag/voice-connectors.html)를 참조하세요.

**Amazon Chime SDK Voice Connector 그룹**  
다른 AWS 리전의 여러 Voice Connector가 포함된 래퍼입니다. 그룹을 사용하면 여러 리전 간에 수신 통화를 장애 조치할 수 있으므로 내결함성 메커니즘이 생성됩니다. 자세한 내용은 Amazon Chime SDK 관리자 안내서**의 [Amazon Chime SDK Voice Connector 그룹 관리](https://docs.aws.amazon.com/chime-sdk/latest/ag/voice-connector-groups.html)를 참조하세요.