

# 连接到 Twilio
<a name="connecting-to-data-twilio"></a>

Twilio 提供可编程通信工具，用于接打电话、收发短信，以及使用其 Web 服务 API 执行其他通信功能。Twilio 的 API 为其通信平台提供支持。这些 API 背后是一个连接和优化全球通信网络的软件层，让用户能给全球范围内的任何人打电话和发送消息。若是 Twilio 用户，则可将 AWS Glue 连接到 Twilio 账户。然后，可以使用 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 管理控制台时，授予对 AWS Glue 资源的完全访问权限。如果遵循此策略中指定的资源的命名约定，则用户具有完全控制台功能。此策略通常附加到 AWS Glue 控制台的用户。

# 配置 Twilio
<a name="twilio-configuring"></a>

必须满足以下要求，才能使用 AWS Glue 从 Twilio 传输数据：

## 最低要求
<a name="twilio-configuring-min-requirements"></a>

以下是最低要求：
+ 拥有一个 Twilio 账户以及相应的用户名和密码。
+ Twilio 账户已启用 API 访问权限。

如果满足这些要求，就可以将 AWS Glue 连接到 Twilio 账户。对于常见连接，无需在 Twilio 中执行其他操作。

# 配置 Twilio 连接
<a name="twilio-configuring-connections"></a>

Twilio 支持使用用户名和密码进行基本身份验证。基本身份验证是一种简单的身份验证方法，客户端直接提供凭证即可访问受保护的资源。AWS Glue 能够使用用户名（账户 SID）和密码（Auth 令牌）对 Twilio API 进行身份验证。

有关基本身份验证流的 Twilio 公共文档，请参阅 [Basic Authentication \$1 Twilio](https://www.twilio.com/docs/glossary/what-is-basic-authentication)。

要配置 Twilio 连接，请执行以下操作：

1. 在 AWS Secrets Manager 中，创建一个包含以下详细信息的密钥：
   + 对于基本身份验证：密钥应包含关联应用程序的消费者密钥以及**账户 SID**（用户名）和 **Auth 令牌**（密码）。
**注意**  
必须在 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-消息 | REST | 支持 | 是 | 否 | 是 | 是 | 
| SMS-国家定价 | REST | 否 | 否 | 否 | 是 | 否 | 
| 语音-呼叫 | REST | 支持 | 是 | 否 | 是 | 否 | 
| 语音-应用程序 | REST | 支持 | 是 | 否 | 是 | 否 | 
| 语音-主叫方 ID | REST | 支持 | 是 | 否 | 是 | 否 | 
| 语音-队列 | REST | 支持 | 是 | 否 | 是 | 否 | 
| 对话-对话 | REST | 支持 | 是 | 否 | 是 | 否 | 
| 对话-用户 | REST | 否 | 是 | 否 | 是 | 否 | 
| 对话-角色 | REST | 否 | 是 | 否 | 是 | 否 | 
| 对话-配置 | REST | 否 | 否 | 否 | 是 | 否 | 
| 对话-地址配置 | REST | 支持 | 是 | 否 | 是 | 否 | 
| 对话-Webhook 配置 | REST | 否 | 否 | 否 | 是 | 否 | 
| 对话-参与者对话 | REST | 否 | 否 | 否 | 是 | 否 | 
| 对话-凭证 | REST | 否 | 是 | 否 | 是 | 否 | 
| 对话-对话服务 | 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/zh_cn/glue/latest/dg/twilio-reading-from-entities.html)

## 对查询进行分区
<a name="twilio-reading-partitioning-queries"></a>

**支持分区的字段**：

在 Twilio 中，“日期时间”数据类型字段支持基于字段的分区。

如果您想在 Spark 中利用并发，可以提供其他 Spark 选项：`PARTITION_FIELD`、`LOWER_BOUND`、`UPPER_BOUND` 和 `NUM_PARTITIONS`。使用这些参数，原始查询将被拆分为 `NUM_PARTITIONS` 个子查询，这些子查询可以由 Spark 任务同时执行。
+ `PARTITION_FIELD`：用于对查询进行分区的字段的名称。
+ `LOWER_BOUND`：所选分区字段的**包含**下限值。

  对于“日期时间”字段，我们接受 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 支持两个 API 版本：v1 和 2010-04-01。
+ `SELECTED_FIELDS`（列表<字符串>）–默认：empty(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` 属于“日期时间”数据类型，但在进行筛选时，这些字段仅支持日期值（不考虑时间分量）。
+ 仅当值不包含任何前缀（例如协议或标签）时，筛选“起”或“止”字段才有效。如果存在前缀，则无法筛选相应字段。例如，若将“止”：“whatsapp:\$114xxxxxxxxxx”作为筛选条件传递，Twilio 不会返回响应。需要将“止”：“\$114xxxxxxxx”作为筛选条件传递，才会返回记录（如果存在）。
+ 查询 `conversation-participant-conversation` 实体时，必须使用“身份”字段筛选条件。