

# Twilio에 연결
<a name="connecting-to-data-twilio"></a>

Twilio는 웹 서비스 API를 사용하여 전화 걸기와 받기, 문자 메시지 보내기와 받기, 기타 커뮤니케이션 기능을 수행할 수 있는 프로그래밍 가능한 커뮤니케이션 도구를 제공합니다. Twilio의 API는 커뮤니케이션을 위한 플랫폼을 지원합니다. 이러한 API 뒤에는 전 세계 커뮤니케이션 네트워크를 연결하고 최적화하는 소프트웨어 계층이 있어 사용자가 전 세계 누구에게나 전화를 걸고 메시지를 보낼 수 있습니다. Twilio 사용자는 Twilio 계정에 AWS Glue를 연결할 수 있습니다. 그런 다음, Twilio를 ETL 작업에서의 데이터 소스로 사용할 수 있습니다. 이러한 작업을 실행하여 Twilio 및 AWS 서비스 또는 기타 지원되는 애플리케이션 간에 데이터를 전송합니다.

**Topics**
+ [AWS Glue의 Twilio 지원](twilio-support.md)
+ [연결을 생성하고 사용하기 위한 API 작업이 포함된 정책](twilio-configuring-iam-permissions.md)
+ [Twilio 구성](twilio-configuring.md)
+ [Twilio 연결 구성](twilio-configuring-connections.md)
+ [Twilio 엔터티에서 읽기](twilio-reading-from-entities.md)
+ [Twilio 연결 옵션](twilio-connection-options.md)
+ [Twilio 커넥터의 제한 사항 및 참고 사항](twilio-connector-limitations.md)

# AWS Glue의 Twilio 지원
<a name="twilio-support"></a>

AWS Glue에서는 다음과 같이 Twilio를 지원합니다.

**소스로 지원되나요?**  
예. AWS Glue ETL 작업을 사용하여 Twilio에서 데이터를 쿼리할 수 있습니다.

**대상으로서 지원되나요?**  
아니요.

**지원되는 Twilio API 버전**  
다음 Twilio API 버전이 지원됩니다.
+ v1
+ 2010-04-01

# 연결을 생성하고 사용하기 위한 API 작업이 포함된 정책
<a name="twilio-configuring-iam-permissions"></a>

다음 샘플 정책은 연결을 생성하고 사용하는 데 필요한 AWS IAM 권한을 설명합니다. 새 역할을 생성하는 경우 다음을 포함하는 정책을 생성합니다.

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "glue:ListConnectionTypes",
        "glue:DescribeConnectionType",
        "glue:RefreshOAuth2Tokens",
        "glue:ListEntities",
        "glue:DescribeEntity"
      ],
      "Resource": "*"
    }
  ]
}
```

------

위 메서드를 사용하지 않으려는 경우 대신 다음 관리형 IAM 정책을 사용합니다.
+ [AWSGlueServiceRole](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole) – 다양한 AWS Glue 프로세스를 대신 실행하는 데 필요한 리소스에 대한 액세스 권한을 부여합니다. 이러한 리소스에는 AWS Glue, Amazon S3, IAM, CloudWatch Logs 및 Amazon EC2가 포함됩니다. 이 정책에 지정된 리소스의 이름 변환을 따르고자 한다면 AWS Glue 절차는 필요한 권한을 소유합니다. 이 정책은 크롤러, 작업 및 개발 엔드포인트를 정의할 때 지정된 역할에 일반적으로 추가됩니다.
+ [AWSGlueConsoleFullAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AWSGlueConsoleFullAccess) - 정책이 연결된 자격 증명이 AWS Management Console을 사용하는 경우 AWS Glue 리소스에 대한 전체 액세스 권한을 부여합니다. 이 정책에 지정된 리소스의 이름 변환을 따르면 사용자는 콘솔 전체 용량을 소유합니다. 이 정책은 보통 AWS Glue 콘솔의 사용자에게 해당됩니다.

# Twilio 구성
<a name="twilio-configuring"></a>

AWS Glue를 사용하여 Twilio에서 데이터를 전송하려면 먼저 다음 요구 사항을 충족해야 합니다.

## 최소 요구 사항
<a name="twilio-configuring-min-requirements"></a>

다음은 최소 요구 사항입니다.
+ 사용자 이름과 암호를 사용하는 Twilio 계정이 있습니다.
+ Twilio 계정이 API 액세스에 대해 활성화되어 있습니다.

이러한 요구 사항을 충족하면 Twilio 계정에 AWS Glue를 연결할 준비가 된 것입니다. 일반적인 연결의 경우 Twilio에서 다른 작업을 수행하지 않아도 됩니다.

# Twilio 연결 구성
<a name="twilio-configuring-connections"></a>

Twilio는 기본 인증을 위한 사용자 이름과 암호를 지원합니다. 기본 인증은 클라이언트가 보호된 리소스에 액세스하기 위해 자격 증명을 직접 제공하는 간단한 인증 방법입니다. AWS Glue는 사용자 이름(계정 SID) 및 암호(인증 토큰)를 사용하여 Twilio API를 인증합니다.

기본 권한 부여 흐름에 대한 퍼블릭 Twilio 설명서는 [Basic Authentication \$1 Twilio](https://www.twilio.com/docs/glossary/what-is-basic-authentication)를 참조하세요.

Twilio 연결을 구성하는 방법:

1. AWS Secrets Manager에서 다음 세부 정보로 보안 암호를 생성합니다.
   + 기본 인증의 경우: 보안 암호에는 **계정 SID**(사용자 이름) 및 **인증 토큰**(암호)이 있는 연결된 앱 소비자 보안 암호가 포함되어야 합니다.
**참고**  
AWS Glue에서 연결에 대한 보안 암호를 생성해야 합니다.

1. AWS Glue Glue Studio의 **데이터 연결**에서 아래 단계에 따라 연결을 생성하세요.

   1. **연결 유형**을 선택할 때 Twilio를 선택합니다.

   1. 연결하려는 Twilio 인스턴스의 `[Edge\$1Location](https://www.twilio.com/docs/global-infrastructure/edge-locations)` 항목을 제공합니다.

   1. 다음 작업에 대한 권한이 있고 AWS Glue에서 수임할 수 있는 AWS IAM 역할을 선택합니다.

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

****  

      ```
      {
        "Version":"2012-10-17",		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "secretsmanager:DescribeSecret",
              "secretsmanager:GetSecretValue",
              "secretsmanager:PutSecretValue",
              "ec2:CreateNetworkInterface",
              "ec2:DescribeNetworkInterfaces",
              "ec2:DeleteNetworkInterface"
            ],
            "Resource": "*"
          }
        ]
      }
      ```

------

   1. 토큰을 넣기 위해 AWS Glue에서 이 연결에 사용할 `secretName`을 선택합니다.

   1. 네트워크를 사용하려는 경우 네트워크 옵션을 선택합니다.

1. AWS Glue 작업 권한과 연결된 IAM 역할에 `secretName`을 읽을 수 있는 권한을 부여합니다.

# Twilio 엔터티에서 읽기
<a name="twilio-reading-from-entities"></a>

**사전 조건**

읽으려는 Twilio 객체입니다. 객체 이름(예: `SMS-Message` 또는 `SMS-CountryPricing`)이 필요합니다.

**소스에 대해 지원되는 엔터티**:


| 개체 | 인터페이스 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | --- | 
| SMS-Message | REST | 예 | 예 | 아니요 | 예 | 예 | 
| SMS-CountryPricing | REST | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Voice-Call | REST | 예 | 예 | 아니요 | 예 | 아니요 | 
| Voice-Application | REST | 예 | 예 | 아니요 | 예 | 아니요 | 
| Voice-OutgoingCallerID | REST | 예 | 예 | 아니요 | 예 | 아니요 | 
| Voice-Queue | REST | 예 | 예 | 아니요 | 예 | 아니요 | 
| Conversations-Conversation | REST | 예 | 예 | 아니요 | 예 | 아니요 | 
| Conversations-User | REST | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| Conversations-Role | REST | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| Conversations-Configuration | REST | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Conversations-AddressConfiguration | REST | 예 | 예 | 아니요 | 예 | 아니요 | 
| Conversations-WebhookConfiguration | REST | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Conversations-ParticipantConversation | REST | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Conversations-Credential | REST | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| Conversations-ConversationService | REST | 아니요 | 예 | 아니요 | 예 | 아니요 | 

**예시:**

```
twilio_read = glueContext.create_dynamic_frame.from_options(
    connection_type="twilio",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "sms-message",
        "API_VERSION": "2010-04-01",
        "Edge_Location": "sydney.us1"
    }
```

**Twilio 엔터티 및 필드 세부 정보**:

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/twilio-reading-from-entities.html)

## 분할 쿼리
<a name="twilio-reading-partitioning-queries"></a>

**분할을 지원하는 필드**:

Twilio에서 DateTime 데이터 형식 필드는 필드 기반 분할을 지원합니다.

Spark에서 동시성을 활용하려는 경우 추가 Spark 옵션(`PARTITION_FIELD`, `LOWER_BOUND`, `UPPER_BOUND`, `NUM_PARTITIONS`)을 제공할 수 있습니다. 이러한 파라미터를 사용하면 Spark 작업에서 동시에 실행할 수 있는 `NUM_PARTITIONS`개의 하위 쿼리로 원래 쿼리가 분할됩니다.
+ `PARTITION_FIELD`: 쿼리 분할에 사용할 필드의 이름입니다.
+ `LOWER_BOUND`: 선택한 파티션 필드의 하한 값(**경계 포함**).

  Datetime 필드의 경우 Spark SQL 쿼리에 사용된 Spark 타임스탬프 형식을 허용합니다.

  유효한 값의 예제:

  ```
  "2024-05-01T20:55:02.000Z"
  ```
+ `UPPER_BOUND`: 선택한 파티션 필드의 상한 값(**경계 제외**).
+ `NUM_PARTITIONS`: 파티션 수.

예시:

```
twilio_read = glueContext.create_dynamic_frame.from_options(
    connection_type="twilio",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "sms-message",
        "API_VERSION": "2010-04-01",
        "PARTITION_FIELD": "date_sent"
        "LOWER_BOUND": "2024-05-01T20:55:02.000Z"
        "UPPER_BOUND": "2024-06-01T20:55:02.000Z"
        "NUM_PARTITIONS": "10"
    }
```

# Twilio 연결 옵션
<a name="twilio-connection-options"></a>

다음은 Twilio의 연결 옵션입니다.
+ `ENTITY_NAME`(문자열) - (필수) 읽기에 사용됩니다. Twilio에서의 객체 이름입니다.
+ `EDGE_LOCATION`(문자열) - (필수) 유효한 Twilio 엣지 로케이션입니다.
+ `API_VERSION`(문자열) - (필수) 읽기에 사용됩니다. 사용할 Twilio Rest API 버전입니다. Twilio는 'v1'과 '2010-04-01'의 API 버전 두 가지를 지원합니다.
+ `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 객체에 대해 선택할 열.
+ `FILTER_PREDICATE`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.
+ `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리.
+ `PARTITION_FIELD`(문자열) - 읽기에 사용됩니다. 쿼리 분할에 사용할 필드입니다.
+ `LOWER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 하한 값(경계 포함).
+ `UPPER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 상한 값(경계 제외).
+ `NUM_PARTITIONS`(정수) - 기본값: 1. 읽기에 사용됩니다. 읽을 파티션 수.
+ `INSTANCE_URL`(문자열) - (필수) 읽기에 사용됩니다. 유효한 Twilio 인스턴스 URL입니다.

# Twilio 커넥터의 제한 사항 및 참고 사항
<a name="twilio-connector-limitations"></a>

다음은 Twilio 커넥터의 제한 사항입니다.
+ 레코드 기반 분할을 지원하지 않으며 Twilio에서 총 레코드 수를 검색하도록 프로비저닝되지 않습니다.
+ `date_sent`, `start_time` 및 `end_time` 필드는 날짜/시간 데이터 형식이지만 필터링할 때는 날짜 값만 지원합니다(시간 구성 요소는 고려되지 않음).
+ 'from' 또는 'to' 필드를 필터링하는 작업은 값에 접두사(예: 프로토콜 또는 레이블)가 포함되지 않은 경우에만 작동합니다. 접두사가 있는 경우 해당 필드에 대한 필터링이 작동하지 않습니다. 예를 들어 "to": "whatsapp:\$114xxxxxxxxxx"를 필터로 전달하면 Twilio는 응답을 반환하지 않습니다. "to": "\$114xxxxxxxx"로 전달해야 하고, 레코드가 있는 경우 반환됩니다.
+ `conversation-participant-conversation` 엔터티를 쿼리할 때 'identity' 필드 필터는 필수입니다.