

**지원 종료 공지:** 2026년 10월 30일에 Amazon Pinpoint에 대한 지원이 AWS 종료됩니다. 2026년 10월 30일 이후에는 Amazon Pinpoint 콘솔 또는 Amazon Pinpoint 리소스(엔드포인트, 세그먼트, 캠페인, 여정, 분석)에 더 이상 액세스할 수 없습니다. 자세한 내용은 [Amazon Pinpoint 지원 종료](https://docs.aws.amazon.com/console/pinpoint/migration-guide)를 참조하세요. **참고:** SMS, 음성, 모바일 푸시, OTP 및 전화번호 검증과 관련된 APIs는이 변경의 영향을 받지 않으며 AWS 최종 사용자 메시징에서 지원됩니다.

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

# Amazon Pinpoint SMS 메시징에 사용할 Lambda 함수 생성
<a name="tutorials-two-way-sms-part-3"></a>

이 섹션에서는 Amazon Pinpoint SMS 메시징과 함께 사용할 두 Lambda 함수를 생성하고 구성하는 방법을 보여줍니다. 나중에 특정 이벤트가 발생할 때 이러한 함수를 간접적으로 호출하도록 API Gateway 및 Amazon Pinpoint를 설정합니다. 이 두 함수는 지정하는 Amazon Pinpoint 프로젝트에서 엔드포인트를 생성하고 업데이트합니다. 첫 번째 함수는 전화 번호 확인 기능도 사용합니다.

## 고객 정보를 확인하고 엔드포인트를 생성하는 함수 생성
<a name="tutorials-two-way-sms-part-3-create-register-function"></a>

첫 번째 함수는 Amazon API Gateway에서 수신하는 등록 양식에서 입력을 가져옵니다. 이 함수는 이 정보를 사용하여 Amazon Pinpoint의 [전화번호 검증](https://docs.aws.amazon.com/pinpoint/latest/developerguide/validate-phone-numbers.html) 기능을 사용하여 고객의 전화번호에 대한 정보를 가져옵니다. 그런 다음 이 함수는 지정하는 Amazon Pinpoint 프로젝트에서 확인된 데이터를 사용하여 새 엔드포인트를 생성합니다. 기본적으로 이 함수가 생성하는 엔드포인트는 향후 통신에서 옵트아웃되지만 두 번째 함수에서 이 상태를 변경할 수 있습니다. 마지막으로 이 함수는 고객에게 SMS 통신을 수신할지를 확인하도록 요청하는 메시지를 전송합니다.

**Lambda 함수를 만들려면**

1. [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) AWS Lambda 콘솔을 엽니다.

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

1. **함수 생성** 아래에서 **블루프린트 사용**을 선택합니다.

1. 검색 필드에 **hello**를 입력하고 Enter를 누릅니다. 다음 이미지와 같이 결과 목록에서 `hello-world` Node.js 함수를 선택합니다.  
![\[블루프린트 사용이 선택된 함수 생성 페이지.\]](http://docs.aws.amazon.com/ko_kr/pinpoint/latest/userguide/images/SMS_Reg_Tutorial_LAM_Step1.5.png)

1. **기본 정보**에서 다음과 같이 합니다.
   + **이름**에 함수 이름을 입력합니다(예: **RegistrationForm**).
   + [**역할**]에서 [**기존 역할 선택**]을 선택합니다.
   + **기존 역할**에서 [IAM 역할 생성](tutorials-two-way-sms-part-2.md#tutorials-two-way-sms-part-2-create-role)에서 생성한 **SMSRegistrationForm** 역할을 선택합니다.

   완료했으면 **함수 생성**을 선택합니다.

1. **코드 소스**에서 코드 편집기의 샘플 함수를 삭제하고 다음 코드를 붙여 넣습니다.

   ```
   import { PinpointClient, PhoneNumberValidateCommand, UpdateEndpointCommand, SendMessagesCommand } from "@aws-sdk/client-pinpoint"; // ES Modules import
   const pinClient = new PinpointClient({region: process.env.region});  
   
   // Make sure the SMS channel is enabled for the projectId that you specify.
   // See: https://docs.aws.amazon.com/pinpoint/latest/userguide/channels-sms-setup.html
   var projectId = process.env.projectId;
   
   // You need a dedicated long code in order to use two-way SMS. 
   // See: https://docs.aws.amazon.com/pinpoint/latest/userguide/channels-voice-manage.html#channels-voice-manage-request-phone-numbers
   var originationNumber = process.env.originationNumber;
   
   // This message is spread across multiple lines for improved readability.
   var message = "ExampleCorp: Reply YES to confirm your subscription. 2 msgs per "
               + "month. No purchase req'd. Msg&data rates may apply. Terms: "
               + "example.com/terms-sms";
               
   var messageType = "TRANSACTIONAL";
   
   export const handler = async (event, context) => {
     console.log('Received event:', event);
     await validateNumber(event);
   };
   
   async function validateNumber (event) {
     var destinationNumber = event.destinationNumber;
     if (destinationNumber.length == 10) {
       destinationNumber = "+1" + destinationNumber;
     }
     var params = {
       NumberValidateRequest: {
         IsoCountryCode: 'US',
         PhoneNumber: destinationNumber
       }
     };
     try{
       const PhoneNumberValidateresponse = await pinClient.send( new  PhoneNumberValidateCommand(params));
       console.log(PhoneNumberValidateresponse);
        if (PhoneNumberValidateresponse['NumberValidateResponse']['PhoneTypeCode'] == 0) {
           await createEndpoint(PhoneNumberValidateresponse, event.firstName, event.lastName, event.source);
           
         } else {
           console.log("Received a phone number that isn't capable of receiving "
                      +"SMS messages. No endpoint created.");
         }
     }catch(err){
       console.log(err);
     }
   }
   
   async function createEndpoint(data, firstName, lastName, source) {
     var destinationNumber = data['NumberValidateResponse']['CleansedPhoneNumberE164'];
     var endpointId = data['NumberValidateResponse']['CleansedPhoneNumberE164'].substring(1);
     
     var params = {
       ApplicationId: projectId,
       // The Endpoint ID is equal to the cleansed phone number minus the leading
       // plus sign. This makes it easier to easily update the endpoint later.
       EndpointId: endpointId,
       EndpointRequest: {
         ChannelType: 'SMS',
         Address: destinationNumber,
         // OptOut is set to ALL (that is, endpoint is opted out of all messages)
         // because the recipient hasn't confirmed their subscription at this
         // point. When they confirm, a different Lambda function changes this 
         // value to NONE (not opted out).
         OptOut: 'ALL',
         Location: {
           PostalCode:data['NumberValidateResponse']['ZipCode'],
           City:data['NumberValidateResponse']['City'],
           Country:data['NumberValidateResponse']['CountryCodeIso2'],
         },
         Demographic: {
           Timezone:data['NumberValidateResponse']['Timezone']
         },
         Attributes: {
           Source: [
             source
           ]
         },
         User: {
           UserAttributes: {
             FirstName: [
               firstName
             ],
             LastName: [
               lastName
             ]
           }
         }
       }
     };
     try{
       const UpdateEndpointresponse = await pinClient.send(new UpdateEndpointCommand(params));
       console.log(UpdateEndpointresponse);
       await sendConfirmation(destinationNumber);
     }catch(err){
       console.log(err);
     }  
   }
   
   async function sendConfirmation(destinationNumber) {
     var params = {
       ApplicationId: projectId,
       MessageRequest: {
         Addresses: {
           [destinationNumber]: {
             ChannelType: 'SMS'
           }
         },
         MessageConfiguration: {
           SMSMessage: {
             Body: message,
             MessageType: messageType,
             OriginationNumber: originationNumber
           }
         }
       }
     };
     try{
       const SendMessagesCommandresponse = await pinClient.send(new SendMessagesCommand(params));
       console.log("Message sent! " 
             + SendMessagesCommandresponse['MessageResponse']['Result'][destinationNumber]['StatusMessage']);
     }catch(err){
       console.log(err);
     }
   }
   ```

1. **구성** 탭에서 **환경 변수**에 대해 **편집**을 선택한 다음, **환경 변수 추가**를 선택하고 다음을 수행합니다.
   + 첫 번째 행에서 **originationNumber** 키를 사용하여 변수를 생성합니다. 다음에는 값을 [1.2단계](tutorials-two-way-sms-part-1.md#tutorials-two-way-sms-part-1-set-up-channel)에서 수신한 전용 긴 코드의 전화 번호로 설정합니다.
**참고**  
더하기 기호(\$1)와 전화 번호의 국가 코드를 포함해야 합니다. 대시(-), 마침표(.) 또는 괄호와 같은 다른 특수 문자는 포함하지 마세요.
   + 두 번째 행에서 **projectId** 키를 사용하여 변수를 생성합니다. 다음에는 값을 [1.1단계](tutorials-two-way-sms-part-1.md#tutorials-two-way-sms-part-1-create-project)에서 생성한 프로젝트의 고유한 ID로 설정합니다.
   + 세 번째 행에서 **region** 키를 사용하여 변수를 생성합니다. 다음에는 값을 Amazon Pinpoint를 사용하는 리전으로 설정합니다(예: **us-east-1** 또는 **us-west-2**).

   완료되면 **환경 변수** 섹션은 다음 이미지에 표시된 예제와 비슷해야 합니다.  
![\[originationNumber, projectId 및 region의 환경 변수입니다.\]](http://docs.aws.amazon.com/ko_kr/pinpoint/latest/userguide/images/SMS_Reg_Tutorial_LAM_Step1.7.png)

1. 페이지 상단에서 [**Save**]를 선택합니다.

### 함수 테스트
<a name="tutorials-two-way-sms-part-3-create-register-function-test"></a>

함수를 생성한 후에는 함수를 테스트하여 함수가 올바르게 구성되었는지 확인해야 합니다. 또한 생성한 IAM 역할에 적절한 권한이 있는지 확인합니다.

**함수를 테스트하려면**

1. **테스트** 탭을 선택합니다.

1. **새 이벤트 생성**을 선택하고 다음을 수행합니다.
   + **이벤트 이름**에 테스트 이벤트의 이름을 입력합니다(예: **MyPhoneNumber**).
   + 코드 편집기에서 예제 코드를 지웁니다. 다음 코드를 붙여넣습니다.

     ```
     {
       "destinationNumber": "+12065550142",
       "firstName": "Carlos",
       "lastName": "Salazar",
       "source": "Registration form test"
     }
     ```
   + 이전 코드 예제에서 `destinationNumber`, `firstName` 및 `lastName` 속성의 값을 테스트에 사용할 값으로 바꿉니다(예: 개인 연락처 세부 정보). 이 함수를 테스트할 때 이 함수는 `destinationNumber` 속성에서 지정하는 전화 번호로 SMS 메시지를 전송합니다. 지정하는 전화 번호가 SMS 메시지를 수신할 수 있는지 확인합니다.
   + **생성(Create)**을 선택합니다.

1. **테스트**를 선택합니다.

1. **실행 결과: 성공** 아래에서 **세부 정보**를 선택합니다. **로그 출력** 섹션에서 함수의 출력을 검토합니다. 함수가 오류 없이 실행되었는지 확인합니다.

   지정한 `destinationNumber`와 연결된 디바이스를 점검하여 이 디바이스가 테스트 메시지를 수신했는지 확인합니다.

1. [https://console.aws.amazon.com/pinpoint/](https://console.aws.amazon.com/pinpoint/)에서 Amazon Pinpoint 콘솔을 엽니다.

1. **모든 프로젝트** 페이지에서 [ Amazon Pinpoint 프로젝트 생성](tutorials-two-way-sms-part-1.md#tutorials-two-way-sms-part-1-create-project)에서 생성한 프로젝트를 선택합니다.

1. 탐색 창에서 **세그먼트**를 선택합니다. **세그먼트 페이지**에서 **세그먼트 생성**을 선택합니다.

1. **세그먼트 그룹 1**의 **필터를 추가하여 세그먼트 세분화** 아래에서 **엔드포인트를 기준으로 필터링**을 선택합니다.

1. **사용자 속성 선택**에서 **FirstName**을 선택합니다. 그런 다음 **값 선택**에서 테스트 이벤트에서 지정한 이름을 선택합니다.

   다음 이미지와 같이 **세그먼트 추정치** 섹션에 사용 가능 엔드포인트 0개와 전체 엔드포인트 하나가 있다고 표시되어야 합니다. 이 결과가 예상됩니다. 함수가 엔드포인트를 생성하면 엔드포인트가 옵트아웃됩니다. Amazon Pinpoint의 세그먼트는 옵트아웃된 엔드포인트를 자동으로 제외합니다.  
![\[엔드포인트가 0인 세그먼트 그룹입니다.\]](http://docs.aws.amazon.com/ko_kr/pinpoint/latest/userguide/images/SMS_Reg_Tutorial_LAM_Step8.9.png)

## 고객을 통신에 옵트인하는 함수 생성
<a name="tutorials-two-way-sms-part-3-create-optin-function"></a>

두 번째 함수는 고객이 첫 번째 함수에서 전송된 메시지에 응답할 때만 실행됩니다. 고객 응답에 [양방향 SMS 활성화](tutorials-two-way-sms-part-1.md#tutorials-two-way-sms-part-1-set-up-channel)에서 지정한 키워드가 포함되면 이 함수는 향후 통신에 옵트인하도록 엔드포인트 레코드를 업데이트합니다. 또한 Amazon Pinpoint는 [양방향 SMS 활성화](tutorials-two-way-sms-part-1.md#tutorials-two-way-sms-part-1-set-up-channel)에서 지정한 메시지로 자동 응답합니다.

고객이 응답하지 않거나 지정된 키워드 이외의 다른 값으로 응답하면 아무것도 발생하지 않습니다. 고객의 엔드포인트는 Amazon Pinpoint에서 그대로 유지되지만 세그먼트의 대상이 될 수 없습니다.

**Lambda 함수를 만들려면**

1. [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) AWS Lambda 콘솔을 엽니다.

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

1. **함수 생성** 아래에서 **블루프린트**를 선택합니다.

1. 검색 필드에 **hello**를 입력하고 Enter를 누릅니다. 다음 이미지와 같이 결과 목록에서 `hello-world` Node.js 함수를 선택합니다. **구성**을 선택합니다.

1. **기본 정보**에서 다음과 같이 합니다.
   + **이름**에 함수 이름을 입력합니다(예: **RegistrationForm\$1OptIn**).
   + [**역할**]에서 [**기존 역할 선택**]을 선택합니다.
   + **기존 역할**에서 [IAM 역할 생성](tutorials-two-way-sms-part-2.md#tutorials-two-way-sms-part-2-create-role)에서 생성한 SMSRegistrationForm 역할을 선택합니다.

   완료했으면 **함수 생성**을 선택합니다.

1. 코드 편집기에서 예제 함수를 삭제하고 다음 코드를 붙여 넣습니다.

   ```
   import { PinpointClient, UpdateEndpointCommand } from "@aws-sdk/client-pinpoint"; // ES Modules import
   
   // Create a new Pinpoint client instance with the region specified in the environment variables
   const pinClient = new PinpointClient({ region: process.env.region });
   
   // Get the Pinpoint project ID and the confirm keyword from environment variables
   const projectId = process.env.projectId;
   const confirmKeyword = process.env.confirmKeyword.toLowerCase();
   
   // This is the main handler function that is invoked when the Lambda function is triggered
   export const handler = async (event, context) => {
       console.log('Received event:', event);
   
       try {
           // Extract the timestamp, message, and origination number from the SNS event
           const timestamp = event.Records[0].Sns.Timestamp;
           const message = JSON.parse(event.Records[0].Sns.Message);
           const originationNumber = message.originationNumber;
           const response = message.messageBody.toLowerCase();
   
           // Check if the response message contains the confirm keyword
           if (response.includes(confirmKeyword)) {
               // If the confirm keyword is found, update the endpoint's opt-in status
               await updateEndpointOptIn(originationNumber, timestamp);
           }
       }catch (error) {
           console.error('An error occurred:', error);
           throw error; // Rethrow the error to handle it upstream
       }
   };
   
   // This function updates the opt-in status of a Pinpoint endpoint
   async function updateEndpointOptIn(originationNumber, timestamp) {
       // Extract the endpoint ID from the origination number
       const endpointId = originationNumber.substring(1);
   
        // Prepare the parameters for the UpdateEndpointCommand
       const params = {
           ApplicationId: projectId,
           EndpointId: endpointId,
           EndpointRequest: {
               Address: originationNumber,
               ChannelType: 'SMS',
               OptOut: 'NONE',
               Attributes: {
                   OptInTimestamp: [timestamp]
               },
           }
       };
   
       try {
           // Send the UpdateEndpointCommand to update the endpoint's opt-in status
           const updateEndpointResponse = await pinClient.send(new UpdateEndpointCommand(params));
           console.log(updateEndpointResponse);
           console.log(`Successfully changed the opt status of endpoint ID ${endpointId}`);
       } catch (error) {
           console.error('An error occurred while updating endpoint:', error);
           throw error; // Rethrow the error to handle it upstream
       }
   }
   ```

1. **환경 변수**에서 다음을 수행합니다.
   + 첫 번째 행에서 **projectId** 키를 사용하여 변수를 생성합니다. 그런 다음 [Amazon Pinpoint 프로젝트 생성](tutorials-two-way-sms-part-1.md#tutorials-two-way-sms-part-1-create-project)에서 생성한 프로젝트의 고유 ID로 값을 설정합니다.
   + 두 번째 행에서 **region** 키를 사용하여 변수를 생성합니다. 다음에는 값을 Amazon Pinpoint를 사용하는 리전으로 설정합니다(예: **us-east-1** 또는 **us-west-2**).
   + 세 번째 행에서 **confirmKeyword** 키를 사용하여 변수를 생성합니다. 다음에는 값을 [양방향 SMS 활성화](tutorials-two-way-sms-part-1.md#tutorials-two-way-sms-part-1-set-up-channel)에서 생성한 확인 키워드로 설정합니다.
**참고**  
키워드는 대소문자를 구분하지 않습니다. 이 함수는 수신 메시지를 소문자로 변환합니다.

   완료되면 **환경 변수** 섹션은 다음 이미지에 표시된 예제와 비슷해야 합니다.  
![\[projectId, region 및 confirmKeyword에 대한 환경 변수입니다.\]](http://docs.aws.amazon.com/ko_kr/pinpoint/latest/userguide/images/SMS_Reg_Tutorial_LAM_Step2.7.png)

1. 페이지 상단에서 [**Save**]를 선택합니다.

### 함수 테스트
<a name="tutorials-two-way-sms-part-3-create-optin-function-test"></a>

함수를 생성한 후에는 함수를 테스트하여 함수가 올바르게 구성되었는지 확인해야 합니다. 또한 생성한 IAM 역할에 적절한 권한이 있는지 확인합니다.

**함수를 테스트하려면**

1. **테스트**를 선택합니다.

1. **테스트 이벤트 구성** 페이지에서 다음을 수행하세요.

   1. [**새 테스트 이벤트 생성**]을 선택하세요.

   1. **이벤트 이름**에 테스트 이벤트의 이름을 입력합니다(예: **MyResponse**).

   1. 코드 편집기에서 예제 코드를 지웁니다. 다음 코드를 붙여넣습니다.

      ```
      {
        "Records":[
          {
            "Sns":{
              "Message":"{\"originationNumber\":\"+12065550142\",\"messageBody\":\"Yes\"}",
              "Timestamp":"2019-02-20T17:47:44.147Z"
            }
          }
        ]
      }
      ```

      이전 코드 예제에서 `originationNumber` 속성의 값을 이전 Lambda 함수를 테스트할 때 사용한 전화번호로 바꿉니다. `messageBody`의 값을 [양방향 SMS 활성화](tutorials-two-way-sms-part-1.md#tutorials-two-way-sms-part-1-enable-two-way)에서 지정한 양방향 SMS 키워드로 바꿉니다. 선택적으로 `Timestamp`의 값을 현재 날짜 및 시간으로 바꿀 수 있습니다.

   1. **생성(Create)**을 선택합니다.

1. **테스트**를 다시 선택합니다.

1. **실행 결과: 성공** 아래에서 **세부 정보**를 선택합니다. **로그 출력** 섹션에서 함수의 출력을 검토합니다. 함수가 오류 없이 실행되었는지 확인합니다.

1. [https://console.aws.amazon.com/pinpoint/](https://console.aws.amazon.com/pinpoint/)에서 Amazon Pinpoint 콘솔을 엽니다.

1. **모든 프로젝트** 페이지에서 [ Amazon Pinpoint 프로젝트 생성](tutorials-two-way-sms-part-1.md#tutorials-two-way-sms-part-1-create-project)에서 생성한 프로젝트를 선택합니다.

1. 탐색 창에서 **세그먼트**를 선택합니다. **세그먼트 페이지**에서 **세그먼트 생성**을 선택합니다.

1. **세그먼트 그룹 1**의 **필터를 추가하여 세그먼트 세분화** 아래에서 **엔드포인트를 기준으로 필터링**을 선택합니다.

1. **사용자 속성 선택**에서 **FirstName**을 선택합니다. 그런 다음 **값 선택**에서 테스트 이벤트에서 지정한 이름을 선택합니다.

   **세그먼트 추정치** 섹션에 사용 가능 엔드포인트 하나와, 전체 엔드포인트 하나가 있다고 표시되어야 합니다.

**다음**: [Amazon API Gateway 설정](tutorials-two-way-sms-part-4.md)