

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

# Amazon Lex V2 봇에 AWS Lambda함수 통합
<a name="lambda"></a>

[AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 함수를 사용하면 사용자가 정의하는 사용자 지정 함수를 통해 Amazon Lex V2 봇의 동작을 확장하고 더 잘 제어할 수 있습니다. Amazon Lex V2는 각 의도에 대해 하나의 Lambda 함수를 사용하는 대신 언어별로 봇 별칭당 하나의 Lambda 함수를 사용합니다. 시작하기 전에 정보를 가져올 [입력 이벤트](https://docs.aws.amazon.com/lexv2/latest/dg/lambda-input-format)의 필드와 Lambda 함수에서 조작하고 반환할 [응답](https://docs.aws.amazon.com/lexv2/latest/dg/lambda-response-format)의 필드를 결정합니다.

Lambda 함수를 Amazon Lex V2 봇과 통합하려면 다음 단계를 수행하세요.

1. 선택한 프로그래밍 언어를 AWS Lambda사용하여에서 [함수를 생성하고](https://docs.aws.amazon.com/lexv2/latest/dg/lambda-attach) 스크립트를 작성합니다.

1. 함수가 [응답 형식](https://docs.aws.amazon.com/lexv2/latest/dg/lambda-response-format)과 일치하는 구조를 반환하는지 확인하세요.

1. Lambda 함수를 배포합니다.

1. Lambda 함수를 Amazon Lex V2 봇 별칭과 연결하여 [콘솔](https://docs.aws.amazon.com/lexv2/latest/dg/lambda-attach-console) 또는 [API 작업](https://docs.aws.amazon.com/lexv2/latest/dg/lambda-attach-api)을 수행합니다.

1. [콘솔](https://docs.aws.amazon.com/lexv2/latest/dg/lambda-attach-console) 또는 [API 작업](https://docs.aws.amazon.com/lexv2/latest/dg/lambda-attach-api)을 사용하여 Lambda 함수를 호출하려는 대화 단계를 선택합니다.

1. Amazon Lex V2 봇을 구축하고 Lambda 함수가 의도한 대로 작동하는지 테스트하세요. Amazon CloudWatch를 사용하여 함수를 [디버깅](https://docs.aws.amazon.com/lexv2/latest/dg/lambda-debug)할 수 있습니다.

**Topics**
+ [AWS LambdaLex V2의 입력 이벤트 형식](lambda-input-format.md)
+ [AWS LambdaLex V2의 응답 형식](lambda-response-format.md)
+ [Amazon Lex V2 AWS Lambda함수의 공통 구조](lambda-common-structures.md)
+ [Amazon Lex V2 봇에 대한 AWS Lambda함수 생성](lambda-attach.md)
+ [CloudWatch Logs 로그를 사용하여 Lambda 함수 디버깅](lambda-debug.md)

# AWS LambdaLex V2의 입력 이벤트 형식
<a name="lambda-input-format"></a>

Lambda 함수를 Amazon Lex V2 봇에 통합하는 첫 번째 단계는 Amazon Lex V2 이벤트의 필드를 이해하고 이러한 필드에서 스크립트를 작성할 때 사용할 정보를 결정하는 것입니다. 다음 JSON 객체는 Lambda 함수에 전달되는 Amazon Lex V2 이벤트의 일반적인 형식을 보여줍니다.

**참고**  
`messageVersion`에 대한 해당하는 내용을 변경하지 않아도 입력 형식을 변경할 수 있습니다. 새 필드가 있는 경우 코드에서 오류가 발생하면 안 됩니다.

```
{
    "messageVersion": "1.0",
    "invocationSource": "DialogCodeHook | FulfillmentCodeHook",
    "inputMode": "DTMF | Speech | Text",
    "responseContentType": "audio/mpeg | audio/ogg | audio/pcm | text/plain; charset=utf-8",
    "sessionId": string,
    "inputTranscript": string,
    "invocationLabel": string,
    "bot": {
        "id": string,
        "name": string,
        "localeId": string,
        "version": string,
        "aliasId": string,
        "aliasName": string
    },
    "interpretations": [
        {
            "interpretationSource": "Bedrock | Lex",
            "intent": {
                // see 의도 for details about the structure
            },
            "nluConfidence": number,
            "sentimentResponse": {
                "sentiment": "MIXED | NEGATIVE | NEUTRAL | POSITIVE",
                "sentimentScore": {
                    "mixed": number,
                    "negative": number,
                    "neutral": number,
                    "positive": number
                }
            }
        },
        ...
    ],
    "proposedNextState": {
        "dialogAction": {
            "slotToElicit": string,
            "type": "Close | ConfirmIntent | Delegate | ElicitIntent | ElicitSlot"
        },
        "intent": {
            // see 의도 for details about the structure
        },
        "prompt": {
            "attempt": string 
        }
    },
    "requestAttributes": {
        string: string,
        ...
    },
    "sessionState": {
        // see 세션 상태 for details about the structure
    },
    "transcriptions": [
        {
            "transcription": string,
            "transcriptionConfidence": number,
            "resolvedContext": {
                "intent": string
            },
            "resolvedSlots": {
                slot name: {
                    // see Slots for details about the structure
                },
                ...
            }
        },
        ...
    ]
}
```

다음은 입력 이벤트의 각 필드에 대한 설명입니다.

## messageVersion
<a name="lambda-input-messageversion"></a>

Lambda 함수로 이동하는 이벤트 데이터의 형식과 Lambda 함수에서 나올 것으로 예상되는 응답 형식을 식별하는 메시지 버전입니다.

**참고**  
의도를 정의할 때 이 값을 구성합니다. 현재 구현에서 Amazon Lex V2는 메시지 버전 1.0만 지원합니다. 따라서 콘솔은 기본값을 1.0으로 가정하며 이는 메시지 버전에 표시되지 않습니다.

## invocationSource
<a name="lambda-input-invocationsource"></a>

Lambda 함수를 호출한 코드 후크입니다. 다음과 같은 값이 가능합니다.

`DialogCodeHook`– Amazon Lex V2는 사용자 입력 후 Lambda 함수를 호출했습니다.

`FulfillmentCodeHook`– Amazon Lex V2는 필요한 슬롯을 모두 채운 후 Lambda 함수를 호출하고 의도를 이행할 준비가 된 후 Lambda 함수를 호출했습니다.

## inputMode
<a name="lambda-input-inputmode"></a>

사용자 발화의 모드입니다. 가능한 값은 다음과 같습니다.

`DTMF`– 사용자가 터치톤 키패드(듀얼 톤 다중 주파수)를 사용하여 발화를 입력합니다.

`Speech`– 사용자가 말을 했습니다.

`Text`– 사용자가 발화를 입력했습니다.

## responseContentType
<a name="lambda-input-responsecontenttype"></a>

사용자에 대한 봇의 응답 모드입니다. `text/plain; charset=utf-8`은 마지막 발화를 기록했음을 나타내며, `audio`로 시작하는 값은 마지막 발화를 말했음을 나타냅니다.

## sessionId
<a name="lambda-input-sessionid"></a>

대화에 사용된 영숫자 세션 식별자입니다.

## inputTranscript
<a name="lambda-input-inputtranscript"></a>

사용자의 입력 내용에 대한 트랜스크립션입니다.
+ 텍스트 입력의 경우 사용자가 입력한 텍스트입니다. DTMF 입력의 경우 사용자가 입력하는 키입니다.
+ 음성 입력의 경우, 이 텍스트는 의도를 호출하거나 슬롯을 채우기 위해 Amazon Lex V2가 사용자 표현을 변환하는 텍스트입니다.

## invocationLabel
<a name="lambda-input-invocationlabel"></a>

Lambda 함수를 호출한 응답을 나타내는 값입니다. 초기 응답, 슬롯 및 확인 응답에 대한 호출 레이블을 설정할 수 있습니다.

## bot
<a name="lambda-input-bot"></a>

요청을 처리한 봇에 대한 정보로, 다음 필드로 구성됩니다.
+ **ID** – 봇을 만들 때 봇에 할당된 식별자입니다. Amazon Lex V2 콘솔의 봇 **설정** 페이지에서 봇 ID를 확인할 수 있습니다.
+ **이름** - 봇을 만들 때 지정한 이름입니다.
+ **localeId** – 봇에 사용한 로캘의 식별자입니다. 로캘 목록은 [Amazon Lex V2에서 지원하는 언어 및 로캘](how-languages.md) 섹션을 참조하세요.
+ **버전** – 요청을 처리한 봇의 버전입니다.
+ **aliasId** – 봇 별칭을 만들 때 봇 별칭에 할당된 식별자입니다. Amazon Lex V2 콘솔의 봇 **별칭** 페이지에서 봇 별칭 ID를 확인할 수 있습니다. 목록에서 별칭 ID가 보이지 않는 경우 오른쪽 상단의 톱니바퀴 아이콘을 선택하고 **별칭 ID**를 켜십시오.
+ **aliasName** – 봇 별칭을 부여한 이름입니다.

## 해석
<a name="lambda-input-interpretations"></a>

Amazon Lex V2에서 사용자의 발화와 일치할 가능성이 있다고 간주하는 의도에 대한 정보 목록입니다. 각 항목은 다음과 같은 형식으로 발화가 의도와 일치하는지에 대한 정보를 제공하는 구조입니다.

```
{
    "intent": {
        // see 의도 for details about the structure
    },
    "interpretationSource": "Bedrock | Lex",
    "nluConfidence": number,
    "sentimentResponse": {
        "sentiment": "MIXED | NEGATIVE | NEUTRAL | POSITIVE",
        "sentimentScore": {
            "mixed": number,
            "negative": number,
            "neutral": number,
            "positive": number
        }
    }
}
```

구조 내의 필드는 다음과 같습니다.
+ **의도** – 의도에 대한 정보가 들어 있는 구조입니다. 구조에 대한 자세한 내용은 [의도](lambda-common-structures.md#lambda-intent)를 참조하세요.
+ **nluConfidence** – Amazon Lex V2가 의도가 사용자의 의도와 일치한다고 얼마나 확신하는지 나타내는 점수입니다.
+ **sentimentResponse** – 응답의 감정에 대한 분석으로, 다음 필드를 포함합니다.
  + **sentiment** – 발화의 감정이 `POSITIVE`, `NEGATIVE`, `NEUTRAL`, 또는 `MIXED`인지를 나타냅니다.
  + **sentimentScore** – 각 감정을 숫자로 매핑하는 구조로서 Amazon Lex V2가 해당 발언이 해당 감정을 전달한다고 얼마나 확신하는지 나타냅니다.
+ **interpretationSource** - 슬롯이 Amazon Lex V2 또는 Amazon Bedrock에 의해 확인되는지 여부를 나타냅니다.

## proposedNextState
<a name="lambda-input-proposednextstate"></a>

Lambda 함수가 `sessionState`의 `dialogAction`을 `Delegate`로 설정하면 이 필드가 나타나고 대화의 다음 단계에 대한 Amazon Lex V2의 제안을 표시합니다. 그렇지 않으면 Lambda 함수의 응답에서 반환하는 설정에 따라 다음 상태가 달라집니다. 이 구조에는 다음 두 가지 조건이 모두 충족될 때만 나타납니다.

1. `invocationSource` 값은 `DialogCodeHook`입니다.

1. `dialogAction`의 예측 `type`은 `ElicitSlot`입니다.

이 정보를 사용하여 대화의 적절한 시점에 `runtimeHints`를 추가할 수 있습니다. 자세한 내용은 [대화에서 런타임 힌트를 통한 슬롯 값 인식 개선](using-hints.md)를 참조하세요. `proposedNextState`는 다음 필드가 포함된 구조입니다.

`proposedNextState`의 구조는 다음과 같습니다.

```
"proposedNextState": {
    "dialogAction": {
        "slotToElicit": string,
        "type": "Close | ConfirmIntent | Delegate | ElicitIntent | ElicitSlot"
    },
    "intent": {
        // see 의도 for details about the structure
    },
    "prompt": {
        "attempt": string 
    }
}
```
+ **dialogAction** – Amazon Lex V2에서 제안하는 다음 단계에 대한 정보가 들어 있습니다. 구조의 필드는 다음과 같습니다.
  + **slotToElicit** – Amazon Lex V2에서 제안한 다음 슬롯을 이끌어낼 수 있는 슬롯입니다. 이 필드는 `type`이 `ElicitSlot`인 경우에만 표시됩니다.
  + **type** – Amazon Lex V2에서 제안한 대화의 다음 단계입니다. 다음과 같은 값이 가능합니다.

    `Delegate`– Amazon Lex V2가 다음 작업을 결정합니다.

    `ElicitIntent`– 다음 작업은 사용자로부터 의도를 이끌어내는 것입니다.

    `ElicitSlot`– 다음 작업은 사용자로부터 슬롯 값을 추출하는 것입니다.

    `Close`– 의도 이행 프로세스를 종료하고 사용자로부터 응답이 없을 것임을 나타냅니다.

    `ConfirmIntent`– 다음 작업은 슬롯이 올바른지, 의도를 충족할 준비가 되었는지 사용자에게 묻는 것입니다.
+ **intent** – 봇이 사용자가 이행하려고 한다고 판단한 의도입니다. 구조에 대한 자세한 내용은 [의도](lambda-common-structures.md#lambda-intent)를 참조하세요.
+ **prompt** – Amazon Lex V2가 사용자에게 다음 슬롯을 묻는 메시지를 표시한 횟수를 지정하는 값에 매핑되는 `attempt` 필드가 포함된 구조입니다. 사용 가능한 값은 첫 번째 시도의 경우 `Initial`, 후속 시도의 경우 `Retry1`, `Retry2`, `Retry3`, `Retry4` 및 `Retry5`입니다.

## requestAttributes
<a name="lambda-input-requestattributes"></a>

클라이언트가 요청에서 전송하는 요청별 속성을 포함하는 구조입니다. 전체 세션에서 유지할 필요가 없는 정보를 전달하려면 요청 속성을 사용합니다. 요청 속성이 존재하지 않는 경우, 값은 null이 됩니다. 자세한 내용은 [Lex V2 봇의 요청 특성 설정](context-mgmt-request-attribs.md) 단원을 참조하십시오.

## sessionState
<a name="lambda-input-sessionstate"></a>

사용자와 Amazon Lex V2 봇 간의 현재 대화 상태입니다. 구조에 대한 자세한 내용은 [세션 상태](lambda-common-structures.md#lambda-session-state)를 참조하세요.

## transcriptions
<a name="lambda-input-transcriptions"></a>

Amazon Lex V2에서 사용자의 발화와 일치할 가능성이 있다고 간주하는 트랜스크립션 목록입니다. 자세한 내용은 [음성 트랜스크립션 신뢰도 점수를 사용하여 Lex V2 봇에서 대화 향상](using-transcript-confidence-scores.md) 단원을 참조하십시오. 각 항목은 가능한 한 가지 트랜스크립션에 대한 정보를 포함하는 다음 형식의 객체입니다.

```
{
    "transcription": string,
    "transcriptionConfidence": number,
    "resolvedContext": {
        "intent": string
    },
    "resolvedSlots": {
        slot name: {
            // see Slots for details about the structure
        },
        ...
    }
}
```

필드는 아래에 설명되어 있습니다.
+ **transcription** – Amazon Lex V2가 사용자의 오디오 발화와 일치할 가능성이 있는 것으로 간주하는 트랜스크립션입니다.
+ **transcriptionConfidence** – Amazon Lex V2가 의도가 사용자의 의도와 일치한다고 얼마나 확신하는지 나타내는 점수입니다.
+ **resolvedContext** – 발화가 관련된 의도에 매핑되는 `intent` 필드를 포함하는 구조입니다.
+ **resolvedSlots** – 발화에 따라 확인되는 각 슬롯의 이름을 키로 하는 구조입니다. 각 슬롯 이름은 해당 슬롯에 대한 정보가 포함된 구조에 매핑됩니다. 구조에 대한 자세한 내용은 [Slots](lambda-common-structures.md#lambda-slot)를 참조하세요.

# AWS LambdaLex V2의 응답 형식
<a name="lambda-response-format"></a>

Lambda 함수를 Amazon Lex V2 봇에 통합하는 두 번째 단계는 Lambda 함수 응답의 필드를 이해하고 조작하려는 파라미터를 결정하는 것입니다. 다음 JSON 객체는 Amazon Lex V2로 반환되는 Lambda 응답의 일반적인 형식을 보여줍니다.

```
{
    "sessionState": {
        // see 세션 상태 for details about the structure
    },
    "messages": [
        {
            "contentType": "CustomPayload | ImageResponseCard | PlainText | SSML",
            "content": string,
            "imageResponseCard": {
                "title": string,
                "subtitle": string,
                "imageUrl": string,
                "buttons": [
                    {
                        "text": string,
                        "value": string
                    },
                    ...
                ]
            }
        },
        ...
    ],
    "requestAttributes": {
        string: string,
        ...
    }
}
```

응답의 각 필드는 아래에 설명되어 있습니다.

## sessionState
<a name="lambda-response-sessionstate"></a>

사용자와 반환하려는 Amazon Lex V2 봇 간의 대화 상태입니다. 구조에 대한 자세한 내용은 [세션 상태](lambda-common-structures.md#lambda-session-state)를 참조하세요. 이 필드는 항상 필수 항목입니다.

## messages
<a name="lambda-response-messages"></a>

Amazon Lex V2가 다음 대화를 위해 고객에게 반환하는 메시지 목록입니다. 제공하는 `contentType`이 `PlainText`, `CustomPayload` 또는 `SSML`인 경우 `content` 필드에 고객에게 반환할 메시지를 작성합니다. 제공하는 `contentType`이 `ImageResponseCard`인 경우 `imageResponseCard` 필드에 카드의 세부 정보를 입력합니다. 메시지를 제공하지 않는 경우 Amazon Lex V2는 봇이 생성될 때 정의된 적절한 메시지를 사용합니다.

`dialogAction.type`이 `ElicitIntent` 또는 `ConfirmIntent`인 경우 `messages` 필드는 필수입니다.

목록의 각 항목은 사용자에게 반환할 메시지에 대한 정보를 포함하는 다음 형식의 구조입니다. 다음 예를 참고하세요

```
{
    "contentType": "CustomPayload | ImageResponseCard | PlainText | SSML",
    "content": string,
    "imageResponseCard": {
        "title": string,
        "subtitle": string,
        "imageUrl": string,
        "buttons": [
            {
                "text": string,
                "value": string
            },
            ...
        ]
    }
}
```

각 필드에 대한 설명은 다음과 같습니다.
+ **contentType** – 사용할 메시지 유형입니다.

  `CustomPayload`– 애플리케이션에 대한 데이터 또는 메타데이터를 포함하도록 사용자 지정할 수 있는 응답 문자열입니다.

  `ImageResponseCard`– 고객이 선택할 수 있는 버튼이 있는 이미지입니다. 자세한 내용은 [ImageResponseCard](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_ImageResponseCard.html)를 참조하세요.

  `PlainText`– 일반 텍스트 문자열입니다.

  `SSML`– 오디오 응답을 사용자 지정하기 위한 Speech Synthesis Markup Language가 포함된 문자열입니다.
+ **content** – 사용자에게 전송할 메시지입니다. 메시지 유형이 `PlainText`, `CustomPayload` 또는 `SSML`인 경우 이 필드를 사용하세요.
+ **imageResponseCard** – 사용자에게 표시할 응답 카드의 정의를 포함합니다. 메시지 유형이 `ImageResponseCard`인 경우 이 필드를 사용하세요. 다음 필드가 포함된 구조에 매핑합니다
  + **제목** – 응답 카드의 제목입니다.
  + **자막** – 사용자가 버튼을 선택하라는 메시지입니다.
  + **imageUrl** – 카드의 이미지로 연결되는 링크입니다.
  + **버튼** – 버튼에 대한 정보가 포함되어 있는 구조 목록입니다. 각 구조에는 표시할 텍스트가 있는 `text` 필드와 Amazon Lex V2에 고객이 해당 버튼을 선택할 경우 Amazon Lex V2로 전송할 값이 포함된 `value` 필드가 포함되어 있습니다. 최대 세 개의 버튼을 포함할 수 있습니다.

## requestAttributes
<a name="lambda-response-requestattributes"></a>

고객에 대한 응답에 대한 요청별 속성을 포함하는 구조입니다. 자세한 정보는 [Lex V2 봇의 요청 특성 설정](context-mgmt-request-attribs.md)을 참조하세요. 이 필드는 선택 사항입니다.

## 응답의 필수 필드
<a name="lambda-response-required"></a>

최소한 Lambda 응답에는 `sessionState` 객체가 포함되어야 합니다. 그 안에 `dialogAction` 객체를 제공하고 `type` 필드를 지정하세요. 제공하는 `dialogAction`의 `type`에 따라 Lambda 응답에 다른 필수 필드가 있을 수 있습니다. 이러한 요구 사항은 최소한의 작업 예시와 함께 다음과 같이 설명됩니다.

### Delegate
<a name="lambda-response-delegate"></a>

**Delegate**를 통해 Amazon Lex V2에서 다음 단계를 결정할 수 있습니다. 다른 필드는 필요하지 않습니다.

```
{
    "sessionState": {
        "dialogAction": {
            "type": "Delegate"
    }
}
```

### ElicitIntent
<a name="lambda-response-elicitintent"></a>

**ElicitIntent**는 고객에게 의도를 표현하라는 메시지를 표시합니다. 의도를 유도하려면 `messages` 필드에 메시지를 하나 이상 포함해야 합니다.

```
{
    "sessionState": {
        "dialogAction": {
            "type": "ElicitIntent"
    },
    "messages": [
        {
            "contentType": PlainText,
            "content": "How can I help you?"
        }
    ]
}
```

### ElicitSlot
<a name="lambda-response-elicitslot"></a>

**ElicitSlot**은 고객에게 슬롯 값을 제공하라는 메시지를 표시합니다. `dialogAction` 객체의 `slotToElicit` 필드에 슬롯 이름을 포함해야 합니다. 또한 `sessionState` 객체에 `intent`의 `name`을 포함해야 합니다.

```
{`
    "sessionState": {
        "dialogAction": {
            "slotToElicit": "OriginCity",
            "type": "ElicitSlot"
        },
        "intent": {
            "name": "BookFlight"
        }
    }
}
```

### ConfirmIntent
<a name="lambda-response-confirmintent"></a>

**ConfirmIntent**는 고객의 슬롯 값과 의도를 이행할 준비가 되었는지 여부를 확인합니다. `sessionState` 객체에 `intent`의 `name`과 확인할 `slots`을 포함해야 합니다. 또한 사용자에게 슬롯 값 확인을 요청하는 메시지를 하나 이상 `messages` 필드에 포함해야 합니다. 메시지에 “예” 또는 “아니요” 응답이 표시되어야 합니다. 사용자가 "예"라고 응답하면 Amazon Lex V2는 의도의 `confirmationState`를 `Confirmed`로 설정합니다. 사용자가 “아니요”라고 응답하면 Amazon Lex V2는 의도의 `confirmationState`를 `Denied`로 설정합니다.

```
{
    "sessionState": {
        "dialogAction": {
            "type": "ConfirmIntent"
        },
        "intent": {
            "name": "BookFlight",
            "slots": {
                "DepartureDate": {
                    "value": {
                        "originalValue": "tomorrow",
                        "interpretedValue": "2023-05-09",
                        "resolvedValues": [
                            "2023-05-09"
                    ]
                 }
                },
                "DestinationCity": {
                    "value": {
                        "originalValue": "sf",
                        "interpretedValue": "sf",
                        "resolvedValues": [
                            "sf"
                        ]
                    }
                },
                "OriginCity": {
                    "value": {
                        "originalValue": "nyc",
                        "interpretedValue": "nyc",
                        "resolvedValues": [
                            "nyc"
                        ]
                    }
                }
            }
        }
    },
    "messages": [
        {
            "contentType": PlainText,
            "content": "Okay, you want to fly from {OriginCity} to \
            {DestinationCity} on {DepartureDate}. Is that correct?"
        }
    ]
}
```

### Close
<a name="lambda-response-close"></a>

**Close**는 의도의 이행 프로세스를 종료하고 사용자로부터 추가 응답이 예상되지 않음을 나타냅니다. `sessionState` 객체에 `intent`의 `name`과 `state`를 포함해야 합니다. 호환되는 의도 상태는`Failed`, `Fulfilled`, `InProgress`입니다.

```
"sessionState": {
    "dialogAction": {
        "type": "Close"
    },
    "intent": {
        "name": "BookFlight",
        "state": "Failed | Fulfilled | InProgress"
    }
}
```

# Amazon Lex V2 AWS Lambda함수의 공통 구조
<a name="lambda-common-structures"></a>

Lambda 응답 내에는 여러 구조가 반복됩니다. 이러한 공통 구조에 대한 세부 정보는 이 섹션에 나와 있습니다.

## 의도
<a name="lambda-intent"></a>

```
"intent": {
    "confirmationState": "Confirmed | Denied | None",
    "name": string,
    "slots": {
        // see Slots for details about the structure
    },
    "state": "Failed | Fulfilled | FulfillmentInProgress | InProgress | ReadyForFulfillment | Waiting",
    "kendraResponse": {
        // Only present when intent is KendraSearchIntent. For details, see
// https://docs.aws.amazon.com/kendra/latest/dg/API_Query.html#API_Query_ResponseSyntax       }
}
```

`intent` 필드는 다음 필드가 있는 객체에 매핑됩니다.

### confirmationState
<a name="lambda-intent-confirmationstate"></a>

사용자가 의도에 사용할 슬롯을 확인했고 의도가 이행될 준비가 되었는지 나타냅니다. 다음과 같은 값이 가능합니다.

`Confirmed`– 사용자가 슬롯 값이 정확한지 확인합니다.

`Denied`– 사용자가 슬롯 값이 잘못되었다고 표시합니다.

`None`– 사용자가 아직 확인 단계에 도달하지 않았습니다.

### 이름
<a name="lambda-intent-name"></a>

의도의 이름.

### slots
<a name="lambda-intent-slots"></a>

의도를 이행하는 데 필요한 슬롯에 대한 정보입니다. 구조에 대한 자세한 내용은 [Slots](#lambda-slot)를 참조하세요.

### state
<a name="lambda-intent-state"></a>

의도의 이행 상태를 나타냅니다. 다음과 같은 값이 가능합니다.

`Failed`– 봇이 의도를 이행하지 못했습니다.

`Fulfilled`– 봇이 의도 이행을 완료했습니다.

`FulfillmentInProgress`– 봇이 의도를 이행하는 중입니다.

`InProgress`– 봇이 의도를 충족하는 데 필요한 슬롯 값을 도출하는 중입니다.

`ReadyForFulfillment`– 봇이 의도에 대한 모든 슬롯 값을 가져왔고 의도를 이행할 준비가 되었습니다.

`Waiting`– 봇이 사용자의 응답을 기다리고 있습니다(스트리밍 대화로 제한됨).

### kendraResponse
<a name="lambda-intent-kendraresponse"></a>

Kendra 검색 쿼리 결과에 대한 정보가 들어 있습니다. 이 필드는 의도가 `KendraSearchIntent`인 경우에만 표시됩니다. 자세한 내용은 [Kendra용 쿼리 API 호출의 응답 구문](https://docs.aws.amazon.com/kendra/latest/dg/API_Query.html#API_Query_ResponseSyntax)을 참조하세요.

## Slots
<a name="lambda-slot"></a>

`slots` 필드는 `intent` 구조 내에 존재하며 해당 의도의 슬롯 이름을 키로 하는 구조에 매핑됩니다. 슬롯이 다중 값 슬롯이 아닌 경우(자세한 내용은 [슬롯에서 여러 값 사용](multi-valued-slots.md) 참조) 다음 형식의 구조에 매핑됩니다. 참고로, `shape`은 `Scalar`입니다.

```
{
    slot name: {
        "shape": "Scalar",
        "value": {
            "originalValue": string,
            "interpretedValue": string,
            "resolvedValues": [
                string,
                ...
            ]
        }
    }
}
```

슬롯이 다중 값 슬롯인 경우, 슬롯이 매핑되는 객체에는 `values`라는 또 다른 필드가 포함되며, 이 필드는 다중 값 슬롯을 구성하는 슬롯에 대한 정보를 각각 포함하는 구조 목록에 매핑됩니다. 목록에 있는 각 객체의 형식은 일반 슬롯이 매핑되는 객체의 형식과 일치합니다. 참고로 `shape`은 `List`지만 `values` 아래 컴포넌트 슬롯의 `shape`은 `Scalar`입니다.

```
{
    slot name: {
    "shape": "List",
    "value": {
        "originalValue": string,
        "interpretedValue": string,
        "resolvedValues": [
            string,
            ...
        ]
    },
    "values": [
        {
            "shape": "Scalar",
            "value": {
                "originalValue": string,
                "interpretedValue": string,
                "resolvedValues": [
                    string,
                    ...
                ]
            }
        },
        {
            "shape": "Scalar",
            "value": {
                "originalValue": string,
                "interpretedValue": string,
                "resolvedValues": [
                    string,
                    ...
                ]
            }
        },
        ...
    ]
}
```

슬롯 객체의 필드는 다음과 같습니다.

### shape
<a name="lambda-slots-shape"></a>

슬롯의 모양입니다. 이 값은 슬롯에 여러 값이 있는 경우 `List`이고(자세한 내용은 [슬롯에서 여러 값 사용](multi-valued-slots.md) 참조), 그렇지 않은 경우 `Scalar`입니다.

### value
<a name="lambda-slots-value"></a>

사용자가 슬롯에 제공한 값과 Amazon Lex V2의 해석에 대한 정보를 다음 형식으로 포함하는 객체입니다.

```
{
    "originalValue": string,
    "interpretedValue": string,
    "resolvedValues": [
        string,
        ...
    ]
}
```

필드는 아래에 설명되어 있습니다.
+ **originalValue** - Amazon Lex V2가 슬롯 값과 관련이 있다고 판단하는 슬롯 유도에 대한 사용자 응답의 부분입니다.
+ **interpretedValue** - 사용자 입력을 고려하여 Amazon Lex V2가 슬롯에 대해 결정하는 값입니다.
+ **resolvedValues** - Amazon Lex V2가 사용자 입력에 대해 가능한 해상도라고 판단하는 값의 목록입니다.

### values
<a name="lambda-slots-values"></a>

다중 값 슬롯을 구성하는 슬롯에 대한 정보가 들어 있는 객체 목록입니다. 각 개체의 형식은 위에서 설명한 `shape` 및 `value` 필드가 있는 일반 슬롯의 형식과 일치합니다. `values`는 슬롯이 여러 값으로 구성된 경우에만 표시됩니다(자세한 내용은 [슬롯에서 여러 값 사용](multi-valued-slots.md) 참조). 다음 JSON 객체는 두 개의 구성 요소 슬롯을 보여줍니다.

```
"values": [
    {
        "shape": "Scalar",
        "value": {
            "originalValue": string,
            "interpretedValue": string,
            "resolvedValues": [
                string,
                ...
            ]
        }
    },
    {
        "shape": "Scalar",
        "value": {
            "originalValue": string,
            "interpretedValue": string,
            "resolvedValues": [
                string,
                ...
            ]
        }
    },
    ...
]
```

## 세션 상태
<a name="lambda-session-state"></a>

`sessionState` 필드는 사용자와의 대화 상태에 대한 정보가 포함된 객체에 매핑됩니다. 객체에 나타나는 실제 필드는 대화 작업 유형에 따라 달라집니다. Lambda 응답의 필수 필드는 [응답의 필수 필드](lambda-response-format.md#lambda-response-required)를 참조하세요. `sessionState` 객체의 형식은 다음과 같습니다.

```
"sessionState": {
    "activeContexts": [
        {
            "name": string,
            "contextAttributes": {
                string: string
            },
            "timeToLive": {
                "timeToLiveInSeconds": number,
                "turnsToLive": number
            }
        },
        ...
    ],
    "sessionAttributes": {
        string: string,
        ...
    },
    "runtimeHints": {
        "slotHints": {
            intent name: {
                slot name: {
                    "runtimeHintValues": [
                        {
                            "phrase": string
                        },
                        ...
                    ]
                },
                ...
            },
            ...
        }
    },
    "dialogAction": {
        "slotElicitationStyle": "Default | SpellByLetter | SpellByWord",
        "slotToElicit": string,
        "type": "Close | ConfirmIntent | Delegate | ElicitIntent | ElicitSlot"
    },
    "intent": {
        // see 의도 for details about the structure
    },
    "originatingRequestId": string
}
```

필드는 아래에 설명되어 있습니다.

### activeContexts
<a name="lambda-active-contexts"></a>

사용자가 세션에서 사용 중인 컨텍스트에 대한 정보가 들어 있는 개체 목록입니다. 컨텍스트를 사용하여 의도 인식을 용이하게 하고 제어할 수 있습니다. 컨텍스트에 대한 자세한 내용은 [Lex V2 봇의 의도 컨텍스트 설정](context-mgmt-active-context.md) 섹션을 참조하세요. 각 객체의 형식은 다음과 같습니다.

```
{
    "name": string,
    "contextAttributes": {
        string: string
    },
    "timeToLive": {
        "timeToLiveInSeconds": number,
        "turnsToLive": number
    }
}
```

필드는 아래에 설명되어 있습니다.
+ **name** – 컨텍스트의 이름입니다.
+ **contextAttributes** – 컨텍스트의 속성 이름과 해당 속성이 매핑되는 값이 들어 있는 객체입니다.
+ **timeToLive** – 컨텍스트가 활성 상태로 유지되는 기간을 지정하는 객체입니다. 이 객체에는 다음 필드 중 하나 또는 둘 다를 포함할 수 있습니다.
  + **timeToLiveInSeconds** – 컨텍스트가 활성 상태로 유지되는 시간 (초) 입니다.
  + **turnsToLive** – 컨텍스트가 활성 상태로 유지되는 턴 수입니다.

### sessionAttributes
<a name="lambda-session-attributes"></a>

세션별 컨텍스트 정보를 나타내는 키/값 페어의 맵입니다. 자세한 내용은 [Lex V2 봇의 세션 특성 설정](context-mgmt-session-attribs.md) 단원을 참조하십시오. 객체의 형식은 다음과 같습니다

```
{
    string: string,
    ...
}
```

### runtimeHints
<a name="lambda-runtime-hints"></a>

오디오 인식을 개선하기 위해 고객이 슬롯에 사용할 가능성이 높은 문구에 대한 힌트를 제공합니다. 힌트에 입력한 값을 사용하면 비슷한 소리가 나는 단어보다 해당 값을 오디오로 더 잘 인식할 수 있습니다. `runtimeHints` 객체의 형식은 다음과 같습니다.

```
{
    "slotHints": {
        intent name: {
            slot name: {
                "runtimeHintValues": [
                    {
                        "phrase": string
                    },
                    ...
                ]
            },
            ...
        },
        ...
    }
}
```

`slotHints` 필드는 봇에 있는 의도의 이름을 필드로 하는 객체에 매핑됩니다. 각 의도 이름은 필드가 해당 의도의 슬롯 이름인 객체에 매핑됩니다. 각 슬롯 이름은 객체 목록인 `runtimeHintValues`라는 단일 필드가 있는 구조에 매핑됩니다. 각 객체에는 힌트에 매핑되는 `phrase` 필드가 있습니다.

### dialogAction
<a name="lambda-dialog-action"></a>

Amazon Lex V2가 수행할 다음 작업을 결정합니다. 객체의 형식은 다음과 같습니다.

```
{
    "slotElicitationStyle": "Default | SpellByLetter | SpellByWord",
    "slotToElicit": string,
    "type": "Close | ConfirmIntent | Delegate | ElicitIntent | ElicitSlot"
}
```

필드는 아래에 설명되어 있습니다.
+  **slotElicitationStyle** – `dialogAction`의 `type`이 `ElicitSlot`인 경우 Amazon Lex V2가 사용자의 오디오 입력을 해석하는 방법을 결정합니다. 자세한 내용은 [대화하는 동안 맞춤법 스타일을 사용하여 슬롯 값 캡처](spelling-styles.md) 단원을 참조하십시오. 다음과 같은 값이 가능합니다.

  `Default`– Amazon Lex V2는 오디오 입력을 기본 방식으로 해석하여 슬롯을 채웁니다.

  `SpellByLetter`– Amazon Lex V2는 슬롯 값에 대한 사용자의 맞춤법을 수신합니다.

  `SpellByWord`– Amazon Lex V2는 각 문자와 관련된 단어(예: "a as in apple")를 사용하여 슬롯 값에 대한 사용자의 철자를 수신합니다.
+  **slotToElicit** – `dialogAction`의 `type`이 `ElicitSlot`인 경우 사용자로부터 유도할 슬롯을 정의합니다.
+ **type** – 봇이 실행해야 하는 작업을 정의합니다. 다음과 같은 값이 가능합니다.

  `Delegate`– Amazon Lex V2에서 다음 단계를 결정하도록 합니다.

  `ElicitIntent`– 고객에게 의도를 표현하라는 메시지를 표시합니다.

  `ConfirmIntent`– 고객의 슬롯 값과 의도가 이행될 준비가 되었는지 확인합니다.

  `ElicitSlot`– 고객에게 의도의 슬롯 값을 제공하라는 메시지를 표시합니다.

  `Close`– 의도 이행 프로세스를 종료합니다.

### 의도
<a name="lambda-sessionstate-intent"></a>

`intent` 필드의 구조는 [의도](#lambda-intent)를 참조하세요.

### originatingRequestId
<a name="lambda-originating-request-id"></a>

요청에 대한 고유 식별자입니다. Lambda 응답의 경우 이 필드가 선택 사항입니다.

# Amazon Lex V2 봇에 대한 AWS Lambda함수 생성
<a name="lambda-attach"></a>

Amazon Lex V2 봇에 대한 Lambda 함수를 생성하려면 AWS Management ConsoleAWS Lambda에서에 액세스하고 새 함수를 생성합니다. 자세한 내용은 [AWS Lambda개발자 안내서](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)를 참조하세요AWS Lambda.

1. AWS Management Console에 로그인하고 [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) AWS Lambda콘솔을 엽니다.

1. 왼쪽 사이드바에서 **함수**를 선택합니다.

1. **함수 생성**을 선택합니다.

1. **처음부터 작성**을 선택하여 최소한의 코드로 시작하거나, **청사진 사용**을 선택하여 목록에서 일반적인 사용 사례에 대한 샘플 코드를 선택하거나, **컨테이너 이미지**를 선택하여 함수에 배포할 컨테이너 이미지를 선택할 수 있습니다. **처음부터 작성**을 선택한 경우 다음 단계를 계속 진행하세요.

   1. 함수에 의미 있는 **함수 이름**을 지정하여 함수가 수행하는 작업을 설명하세요.

   1. **런타임** 아래의 드롭다운 메뉴에서 함수를 작성할 언어를 선택합니다.

   1. 함수에 맞는 명령어 세트 **아키텍처**를 선택합니다.

   1. 기본적으로 Lambda는 기본 권한이 있는 역할을 만듭니다. 기존 역할을 사용하거나 AWS 정책 템플릿을 사용하여 역할을 생성하려면 **기본 실행 역할 변경** 메뉴를 확장하고 옵션을 선택합니다.

   1. **고급 설정** 메뉴를 확장하여 추가 옵션을 구성합니다.

1. **함수 생성**을 선택합니다.

다음 이미지는 새 함수를 처음부터 생성할 때 표시되는 내용을 보여줍니다.

![\[새 Lambda 함수.\]](http://docs.aws.amazon.com/ko_kr/lexv2/latest/dg/images/lambda/lambda-new-function.png)


Lambda 핸들러 함수는 사용하는 언어에 따라 다릅니다. 최소한 `event` JSON 객체를 인수로 사용합니다. [AWS LambdaLex V2의 입력 이벤트 형식](lambda-input-format.md)에서 Amazon Lex V2가 제공하는 `event`의 필드를 확인할 수 있습니다. 핸들러 함수를 수정하여 최종적으로 [AWS LambdaLex V2의 응답 형식](lambda-response-format.md)에서 설명한 형식과 일치하는 `response` JSON 객체를 반환하도록 합니다.
+ 함수 작성이 끝나면 **배포**를 선택하여 함수를 사용할 수 있게 합니다.

각 봇 별칭을 최대 하나의 Lambda 함수와 연결할 수 있다는 점을 기억하세요. 하지만 Lambda 코드 내에서 봇에 필요한 만큼 함수를 정의하고 Lambda 핸들러 함수에서 이러한 함수를 호출할 수 있습니다. 예를 들어 동일한 봇 별칭의 모든 의도가 동일한 Lambda 함수를 호출해야 하지만 각 의도에 대해 별도의 함수를 활성화하는 라우터 함수를 생성할 수 있습니다. 다음은 애플리케이션에 사용하거나 수정할 수 있는 샘플 라우터 함수입니다.

```
import os
import json
import boto3

# reuse client connection as global
client = boto3.client('lambda')

def router(event):
    intent_name = event['sessionState']['intent']['name']
    fn_name = os.environ.get(intent_name)
    print(f"Intent: {intent_name} -> Lambda: {fn_name}")
    if (fn_name):
        # invoke lambda and return result
        invoke_response = client.invoke(FunctionName=fn_name, Payload = json.dumps(event))
        print(invoke_response)
        payload = json.load(invoke_response['Payload'])
        return payload
    raise Exception('No environment variable for intent: ' + intent_name)

def lambda_handler(event, context):
    print(event)
    response = router(event)
    return response
```

**Amazon Lex V2 봇 대화에서 AWS Lambda함수를 사용해야 하는 경우**

사용자와의 대화에서 Lambda 함수를 사용할 수 있습니다.
+ 의도가 인식된 후 초기 응답에서. 예를 들어, 사용자가 피자를 주문하고 싶다고 말한 후입니다.
+ 사용자로부터 슬롯 값을 유도한 후. 예를 들어, 사용자가 봇에게 주문하고 싶은 피자의 크기를 알려준 후입니다.
+ 슬롯을 유도 위한 각 재시도 사이. 고객이 인식된 크기의 피자를 사용하지 않는 경우를 예로 들 수 있습니다.
+ 의도를 확인할 때 피자 주문을 확인할 때를 예로 들 수 있습니다.
+ 의도를 이행하기 위해. 피자를 주문하는 경우를 예로 들 수 있습니다.
+ 의도가 충족된 후 및 봇이 대화를 종료하기 전. 음료를 주문하기 위한 의도로 전환하는 경우를 예로 들 수 있습니다.

**Topics**
+ [콘솔을 사용하여 Amazon Lex V2 봇에 AWS Lambda함수 연결](lambda-attach-console.md)
+ [API 작업을 사용하여 Amazon Lex V2 봇에 AWS Lambda함수 연결](lambda-attach-api.md)

# 콘솔을 사용하여 Amazon Lex V2 봇에 AWS Lambda함수 연결
<a name="lambda-attach-console"></a>

Lambda 함수를 간접 호출하려면 먼저 Amazon Lex V2 봇 별칭에 Lambda 함수를 연결해야 합니다. 각 봇 별칭에는 Lambda 함수를 하나만 연결할 수 있습니다. AWS Console을 사용하여 Lambda 함수를 연결하려면 다음 단계를 수행합니다.

1. AWS Management Console에 로그인하여 [https://console.aws.amazon.com/lex/](https://console.aws.amazon.com/lex/)에서 Amazon Lex 콘솔을 엽니다.

1. 왼쪽 패널에서 **봇**을 선택하고 봇 목록에서 Lambda 함수를 연결할 봇의 이름을 선택합니다.

1. 왼쪽 패널에서**배포** 메뉴 아래의 **별칭**을 선택합니다.

1. 별칭 목록에서 Lambda 함수를 연결할 별칭의 이름을 선택합니다.

1. **언어** 패널에서 Lambda 함수에 사용할 언어를 선택합니다. 패널에 해당 언어가 없는 경우 **별칭의 언어 관리**를 선택하여 언어를 추가합니다.

1. **소스** 드롭다운 메뉴에서 연결할 Lambda 함수의 이름을 선택합니다.

1. **Lambda 함수 버전 또는 별칭** 드롭다운 메뉴에서 사용할 Lambda 함수의 버전 또는 별칭을 선택합니다. 그런 다음 **저장**을 선택합니다. 봇이 지원하는 언어의 모든 의도에 동일한 Lambda 함수가 사용됩니다.

**콘솔을 사용하여 Lambda 함수를 호출하도록 Amazon Lex V2 의도 설정**

1. 봇을 선택한 후 Lambda 함수를 호출하려는 봇의 언어 아래에 있는 왼쪽 메뉴에서 **의도**를 선택합니다.

1. Lambda 함수를 호출하여 의도 편집기를 열려는 의도를 선택합니다.

1. Lambda 코드 후크를 설정하는 데는 두 가지 옵션이 있습니다.

   1. 대화의 모든 단계 후에 Lambda 함수를 호출하려면 다음 이미지와 같이 의도 에디터 하단의 **코드 후크** 섹션으로 스크롤하여 **초기화 및 검증에 Lambda 함수 사용** 확인란을 선택합니다.  
![\[Amazon Lex V2 의도 편집기의 코드 후크 섹션.\]](http://docs.aws.amazon.com/ko_kr/lexv2/latest/dg/images/lambda/lambda-code-hooks-all.png)

   1. 또는 Lambda 함수를 호출할 대화 단계에서 **대화 코드 후크** 섹션을 사용하세요. **대화 코드 후크** 섹션은 다음과 같이 표시됩니다.  
![\[Amazon Lex V2 의도 편집기의 코드 후크 섹션.\]](http://docs.aws.amazon.com/ko_kr/lexv2/latest/dg/images/lambda/lambda-code-hook-step.png)

      Amazon Lex V2가 응답을 위해 코드 후크를 호출하는 방식을 제어하는 두 가지 방법이 있습니다.
      + **활성** 버튼을 전환하여 *활성* 또는 *비활성*으로 표시합니다. 코드 후크가 *활성화*되면 Amazon Lex V2에서 코드 후크를 호출합니다. 코드 후크가 *비활성*되면 Amazon Lex V2는 코드 후크를 실행하지 않습니다.
      + **Lambda 대화 코드 후크** 섹션을 확장하고 **Lambda 함수 호출** 확인란을 선택하여 *활성화됨* 또는 *비활성화됨*으로 표시합니다. 코드 후크가 활성으로 표시된 경우에만 활성화하거나 비활성화할 수 있습니다. *활성화됨*으로 표시되면 코드 후크가 정상적으로 실행됩니다. *비활성화*되면 코드 후크가 호출되지 않고 Amazon Lex V2는 코드 후크가 성공적으로 반환된 것처럼 작동합니다. 대화 코드 후크가 성공하거나 실패하거나 제한 시간이 초과된 후 응답을 구성하려면 **고급 옵션**을 선택합니다.

      Lambda 코드 후크는 다음 대화 단계에서 호출할 수 있습니다.
      + 함수를 **초기 응답**으로 호출하려면 **초기 응답** 섹션으로 스크롤하고 **사용자의 요청을 승인하는 응답** 옆의 화살표를 확장한 다음 **고급 옵션**을 선택합니다. 팝업 메뉴 하단에서 **대화 코드 후크** 섹션을 찾으세요.
      + **슬롯 유도** 후 함수를 호출하려면 **슬롯** 섹션으로 스크롤하여 관련 **슬롯 프롬프트** 옆에 있는 화살표를 확장한 다음 **고급 옵션**을 선택합니다. 팝업되는 메뉴 하단의 **기본값** 바로 위에 있는 **대화 코드 후크** 섹션을 찾으세요.

        각 유도 후에 함수를 호출할 수도 있습니다. 이렇게 하려면 **슬롯 프롬프트** 섹션에서 **봇 유도 정보**를 확장하고 **추가 프롬프트 옵션**을 선택한 다음 **각 유도 후 Lambda 코드 후크 호출** 옆의 확인란을 선택합니다.
      + **의도 확인**을 위해 함수를 호출하려면 **확인** 섹션으로 스크롤한 다음 **의도를 확인하는 프롬프트** 옆의 화살표를 확장한 다음 **고급 옵션**을 선택합니다. 팝업 메뉴 하단에서 **대화 코드 후크** 섹션을 찾으세요.
      + **의도 이행** 함수를 호출하려면 **이행** 섹션으로 스크롤하세요. **활성** 버튼을 토글하여 코드 후크를 *활성*으로 설정합니다. **이행 성공 시** 옆의 화살표를 확장하고 **고급 옵션**을 선택합니다. **이행 Lambda 코드 후크** 섹션에서 **이행을 위한 Lambda 함수 사용** 옆의 확인란을 선택하여 코드 후크를 *활성화됨*으로 설정합니다.

1. Lambda 함수를 호출할 대화 단계를 설정한 후에는 봇을 다시 **빌드**하여 함수를 테스트합니다.

# API 작업을 사용하여 Amazon Lex V2 봇에 AWS Lambda함수 연결
<a name="lambda-attach-api"></a>

Lambda 함수를 간접 호출하려면 먼저 Amazon Lex V2 봇 별칭에 Lambda 함수를 연결해야 합니다. 각 봇 별칭에는 Lambda 함수를 하나만 연결할 수 있습니다. API 작업을 사용하여 Lambda 함수를 연결하려면 이 단계를 수행합니다.

새 봇 별칭을 생성하는 경우 [CreateBotAlias](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_CreateBotAlias.html) 작업을 사용하여 Lambda 함수를 연결하세요. Lambda 함수를 기존 봇 별칭에 연결하려면 [UpdateBotAlias](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_UpdateBotAlias.html) 작업을 사용하세요. 올바른 설정을 포함하도록 `botAliasLocaleSettings` 필드를 수정하세요.

```
{
    "botAliasLocaleSettings" : {
        locale: {
            "codeHookSpecification": {
                "lambdaCodeHook": {
                    "codeHookInterfaceVersion": "1.0",
                    "lambdaARN": "arn:aws:lambda:region:account-id:function:function-name"
                }
            },
            "enabled": true
        },
        ...
    }
}
```

1. `botAliasLocaleSettings` 필드는 Lambda 함수를 연결하려는 로캘이 키인 객체에 매핑됩니다. 지원되는 로캘 및 유효한 키인 코드 목록은 [지원되는 언어 및 로캘](how-languages.md#supported-languages) 섹션을 참조하세요.

1. Lambda 함수`lambdaARN`의를 찾으려면 [https://console.aws.amazon.com/lambda/home](https://console.aws.amazon.com/lambda/home) AWS Lambda콘솔을 열고 왼쪽 사이드바에서 **함수**를 선택한 다음 봇 별칭과 연결할 함수를 선택합니다. **함수 개요**의 오른쪽에 있는 **함수 ARN**에서 `lambdaARN`을 찾습니다. 여기에는 리전, 계정 ID, 함수 이름이 포함되어야 합니다.

1. Amazon Lex V2에서 별칭에 대한 람다 함수를 호출할 수 있도록 하려면 `enabled` 필드를 `true`로 설정합니다.

**API 작업을 사용하여 Lambda 함수를 호출하도록 Amazon Lex V2 의도 설정**

의도 중에 Lambda 함수 호출을 설정하려면 새 의도를 생성하는 경우 [CreateIntent](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_CreateIntent.html) 작업을 사용하고, 기존 의도에서 함수를 호출하는 경우에는 [UpdateIntent](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_UpdateIntent.html) 작업을 사용하세요. 의도 작업에서 Lambda 함수 호출을 제어하는 필드는 `dialogCodeHook`, `initialResponseSetting`, `intentConfirmationSetting` 및 `fulfillmentCodeHook`입니다.

슬롯을 추출하는 동안 함수를 호출하는 경우 새 슬롯을 생성하는 경우 [CreateSlot](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_CreateSlot.html) 작업을 사용하고 기존 슬롯에서 함수를 호출하려면 [UpdateSlot](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_UpdateSlot.html) 작업을 사용하세요. 슬롯 작업에서 Lambda 함수 간접 호출을 제어하는 필드는 `valueElicitationSetting` 객체의 `slotCaptureSetting`입니다.

1. 대화가 끝날 때마다 람다 대화 상자 코드 후크가 실행되도록 설정하려면 `dialogCodeHook` 필드에 있는 다음 [DialogCodeHookSettings](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_DialogCodeHookSettings.html) 객체의 `enabled` 필드를 `true`로 설정합니다.

   ```
   "dialogCodeHook": {
       "enabled": boolean
   }
   ```

1. 또는 함수를 호출하려는 대화 단계에 해당하는 구조 내에서 `codeHook` 및/또는 `elicitationCodeHook` 필드를 수정하여 대화의 특정 지점에서만 실행되도록 Lambda 대화 코드 후크를 설정할 수도 있습니다. 의도 이행을 위해 Lambda 대화 코드 후크를 사용하려면 [CreateIntent](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_CreateIntent.html) 또는 [UpdateIntent](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_UpdateIntent.html) 작업에서 `fulfillmentCodeHook` 필드를 사용합니다. 이러한 세 가지 유형의 코드 후크의 구조와 용도는 다음과 같습니다.

## 코드후크
<a name="lambda-code-hook"></a>

이 `codeHook` 필드는 대화의 지정된 단계에서 실행할 코드 후크의 설정을 정의합니다. 이 객체는 다음과 같은 구조를 가진 [DialogCodeHookInvocationSeting](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_DialogCodeHookInvocationSetting.html) 객체입니다.

```
"codeHook": {
    "active": boolean,
    "enableCodeHookInvocation": boolean,
    "invocationLabel": string,
    "postCodeHookSpecification": [PostDialogCodeHookInvocationSpecification object](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_PostDialogCodeHookInvocationSpecification.html),
}
```
+ Amazon Lex V2가 대화의 해당 지점에서 코드 후크를 호출하도록 `active` 필드를 `true`로 변경합니다.
+ 코드 후크가 정상적으로 실행되도록 Amazon Lex V2에 대해 `enableCodeHookInvocation` 필드를 `true`로 변경합니다. `false`로 표시하면 Amazon Lex V2는 코드 후크가 성공적으로 반환된 것처럼 작동합니다.
+ `invocationLabel`은 코드 후크가 호출되는 대화 단계를 나타냅니다.
+ `postCodeHookSpecification` 필드를 사용하여 코드 후크가 성공하거나 실패하거나 제한 시간이 초과된 후에 발생하는 동작과 메시지를 지정합니다.

## elicitationCodeHook
<a name="lambda-elicitation-code-hook"></a>

이 `elicitationCodeHook` 필드는 슬롯을 다시 불러와야 하는 경우 실행할 코드 후크의 설정을 정의합니다. 이 시나리오는 슬롯 추출이 실패하거나 의도 확인이 거부된 경우 발생할 수 있습니다. `elicitationCodeHook` 필드는 다음과 같은 구조의 [ElicitationCodeHookInvocationSetting](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_ElicitationCodeHookInvocationSetting.html) 객체입니다.

```
"elicitationCodeHook": {
    "enableCodeHookInvocation": boolean,
    "invocationLabel": string
}
```
+ 코드 후크가 정상적으로 실행되도록 Amazon Lex V2에 대해 `enableCodeHookInvocation` 필드를 `true`로 변경합니다. `false`로 표시하면 Amazon Lex V2는 코드 후크가 성공적으로 반환된 것처럼 작동합니다.
+ `invocationLabel`은 코드 후크가 호출되는 대화 단계를 나타냅니다.

## fulfillmentCodeHook
<a name="lambda-fulfillment-code-hook"></a>

`fulfillmentCodeHook` 필드는 의도를 이행하기 위해 실행할 코드 후크의 설정을 정의합니다. 이는 다음과 같은 [FulfillmentCodeHookSettings](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_FulfillmentCodeHookSettings.html) 객체에 매핑됩니다.

```
"fulfillmentCodeHook": {
    "active": boolean,
    "enabled": boolean,
    "fulfillmentUpdatesSpecification": [FulfillmentUpdatesSpecification object](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_FulfillmentUpdatesSpecification.html),
    "postFulfillmentStatusSpecification": [PostFulfillmentStatusSpecification object](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_PostFulfillmentStatusSpecification.html)
}
```
+ Amazon Lex V2가 대화의 해당 지점에서 코드 후크를 호출하도록 `active` 필드를 `true`로 변경합니다.
+ 코드 후크가 정상적으로 실행되도록 Amazon Lex V2에 대해 `enabled` 필드를 `true`로 변경합니다. `false`로 표시하면 Amazon Lex V2는 코드 후크가 성공적으로 반환된 것처럼 작동합니다.
+ `fulfillmentUpdatesSpecification` 필드를 사용하여 의도를 이행하는 동안 사용자에게 업데이트하도록 표시되는 메시지와 이와 관련된 타이밍을 지정합니다.
+ `postFulfillmentStatusSpecification` 필드를 사용하여 코드 후크가 성공, 실패 또는 시간 초과된 후에 발생하는 메시지 및 작업을 지정합니다.

대화의 다음 지점에서 `active` 및 `enableCodeHookInvocation`/`enabled` 필드를 `true`로 설정하여 Lambda 코드 후크를 호출할 수 있습니다

## 초기 응답 중
<a name="lambda-hook-initial-response"></a>

의도가 인식된 후 초기 응답에서 Lambda 함수를 호출하려면 [CreateIntent](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_CreateIntent.html) 또는 [UpdateIntent](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_UpdateIntent.html) 작업의 `initialResponse` 필드에 `codeHook` 구조를 사용합니다. `initialResponse` 필드는 다음 [InitialResponseSetting](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_InitialResponseSetting.html) 객체에 매핑됩니다.

```
"initialResponse": {
    "codeHook": {
        "active": boolean,
        "enableCodeHookInvocation": boolean,
        "invocationLabel": string,
        "postCodeHookSpecification": [PostDialogCodeHookInvocationSpecification object](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_PostDialogCodeHookInvocationSpecification.html),
    },
    "initialResponse": [FulfillmentUpdatesSpecification object](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_FulfillmentUpdatesSpecification.html),
    "nextStep": [PostFulfillmentStatusSpecification object](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_PostFulfillmentStatusSpecification.html),
    "conditional": [ConditionalSpecification object](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_ConditionalSpecification.html)
}
```

## 슬롯 유도 후 또는 슬롯 재유도 중
<a name="lambda-hook-elicit-slot"></a>

슬롯 값을 유도한 후 Lambda 함수를 호출하려면 [CreateSlot](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_CreateSlot.html) 또는 [UpdateSlot](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_UpdateSlot.html) 작업의 `valueElicitation` 필드 내에 있는 `slotCaptureSetting` 필드를 사용합니다. `slotCaptureSetting` 필드는 다음 [SlotCaptureSetting](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_SlotCaptureSetting.html) 객체에 매핑됩니다.

```
"slotCaptureSetting": {
    "captureConditional": [ConditionalSpecification object](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_ConditionalSpecification.html),
    "captureNextStep": [DialogState object](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_DialogState.html),
    "captureResponse": [ResponseSpecification object](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_ResponseSpecification.html),
    "codeHook": {
        "active": true,
        "enableCodeHookInvocation": true,
        "invocationLabel": string,
        "postCodeHookSpecification": [PostDialogCodeHookInvocationSpecification object](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_PostDialogCodeHookInvocationSpecification.html),
    },
    "elicitationCodeHook": {
        "enableCodeHookInvocation": boolean,
        "invocationLabel": string
    },
    "failureConditional": [ConditionalSpecification object](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_ConditionalSpecification.html),
    "failureNextStep": [DialogState object](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_DialogState.html),
    "failureResponse": [ResponseSpecification object](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_ResponseSpecification.html)
}
```
+ 슬롯 추출이 성공한 후 Lambda 함수를 호출하려면 `codeHook` 필드를 사용하세요.
+ 슬롯 추출이 실패하고 Amazon Lex V2가 슬롯 제거를 재시도한 후 Lambda 함수를 호출하려면 `elicitationCodeHook` 필드를 사용하세요.

## 의도 확인 또는 거부 이후
<a name="lambda-hook-confirm-intent"></a>

의도를 확인할 때 람다 함수를 호출하려면 [CreateIntent](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_CreateIntent.html) 또는 [UpdateIntent](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_UpdateIntent.html) 작업의 `intentConfirmationSetting` 필드를 사용합니다. `intentConfirmation` 필드는 다음 [IntentConfirmationSetting](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_IntentConfirmationSetting.html) 객체에 매핑됩니다.

```
"intentConfirmationSetting": {
    "active": boolean,
    "codeHook": {
        "active": boolean,
        "enableCodeHookInvocation": boolean,
        "invocationLabel": string,
        "postCodeHookSpecification": [PostDialogCodeHookInvocationSpecification object](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_PostDialogCodeHookInvocationSpecification.html),
    },
    "confirmationConditional": [ConditionalSpecification object](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_ConditionalSpecification.html),
    "confirmationNextStep": [DialogState object](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_DialogState.html),
    "confirmationResponse": [ResponseSpecification object](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_DialResponseSpecificationogState.html),
    "declinationConditional": [ConditionalSpecification object](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_ConditionalSpecification.html),
    "declinationNextStep": [FulfillmentUpdatesSpecification object](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_FulfillmentUpdatesSpecification.html),
    "declinationResponse": [PostFulfillmentStatusSpecification object](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_PostFulfillmentStatusSpecification.html),
    "elicitationCodeHook": {
        "enableCodeHookInvocation": boolean,
        "invocationLabel": string,
    },
    "failureConditional": [ConditionalSpecification object](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_ConditionalSpecification.html),
    "failureNextStep": [DialogState object](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_DialogState.html),
    "failureResponse": [ResponseSpecification object](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_ResponseSpecification.html),
    "promptSpecification": [PromptSpecification object](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_PromptSpecification.html)
}
```
+ 사용자가 의도와 해당 슬롯을 확인한 후 Lambda 함수를 호출하려면 `codeHook` 필드를 사용하세요.
+ 사용자가 의도 확인을 거부하고 Amazon Lex V2가 슬롯 추출을 재시도한 후 Lambda 함수를 호출하려면 `elicitationCodeHook` 필드를 사용하세요.

## 의도 이행 중
<a name="lambda-hook-fulfill-intent"></a>

의도를 이행하기 위해 Lambda 함수를 호출하려면 [CreateIntent](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_CreateIntent.html) 또는 [UpdateIntent](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_UpdateIntent.html) 작업에서 `fulfillmentCodeHook` 필드를 사용합니다. `fulfillmentCodeHook` 필드는 다음 [FulfillmentCodeHookSettings](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_FulfillmentCodeHookSettings.html) 객체에 매핑됩니다.

```
{
    "active": boolean,
    "enabled": boolean,
    "fulfillmentUpdatesSpecification": [FulfillmentUpdatesSpecification object](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_FulfillmentUpdatesSpecification.html),
    "postFulfillmentStatusSpecification": [PostFulfillmentStatusSpecification object](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_PostFulfillmentStatusSpecification.html)
}
```

3. Lambda 함수를 호출할 대화 단계를 설정한 후에는 `BuildBotLocale` 작업을 사용하여 봇을 다시 빌드하고 함수를 테스트합니다.

# CloudWatch Logs 로그를 사용하여 Lambda 함수 디버깅
<a name="lambda-debug"></a>

[Amazon CloudWatch Logs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/WhatIsCloudWatch.html)는 Lambda 함수를 디버깅하는 데 사용할 수 있는 API 직접 호출 및 지표를 추적하는 도구입니다. 콘솔에서 또는 API 직접 호출을 사용하여 봇을 테스트할 때 CloudWatch는 대화의 각 단계를 기록합니다. Lambda 코드에서 인쇄 함수를 사용하는 경우 CloudWatch는 해당 기능도 표시합니다.

**Lambda 함수에 대한 CloudWatch 로그를 보려면**

1. AWS Management Console에 로그인하여 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)에서 CloudWatch 콘솔을 엽니다.

1. 왼쪽 사이드 바의 **로그** 메뉴에서 **로그 그룹**을 선택합니다.

1. 람다 함수 로그 그룹을 선택하면 `/aws/lambda/function-name` 형식이어야 합니다.

1. **로그 스트림** 목록에는 봇과의 각 세션에 대한 로그가 포함됩니다. 로그 스트림을 선택하여 확인합니다.

1. **로그 이벤트** 목록에서 **타임스탬프** 옆의 오른쪽 화살표를 선택하여 해당 이벤트의 세부 정보를 확장하세요. Lambda 코드에서 인쇄하는 모든 항목은 로그 이벤트로 표시됩니다. 이 정보를 사용하여 코드를 디버깅하세요.

1. 코드를 디버깅한 후에는 Lambda 함수를 **배포**하고, 콘솔을 사용하는 경우 봇의 동작을 다시 테스트하기 전에 **테스트** 창을 다시 로드해야 합니다.