

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 連線至 Asana
<a name="connecting-to-asana"></a>

Asana 是一種以雲端為基礎的團隊協作解決方案，可協助團隊組織、規劃和完成任務和專案。如果您是 Asana 使用者，您的帳戶會包含有關工作區、專案、任務、團隊等的資料。您可以將資料從 Asana 傳輸到特定 AWS 服務或其他支援的應用程式。

**Topics**
+ [AWS Glue 支援 Asana](asana-support.md)
+ [包含用於建立和使用連線的 API 操作的政策](asana-configuring-iam-permissions.md)
+ [設定 Asana](asana-configuring.md)
+ [設定 Asana 連線](asana-configuring-connections.md)
+ [從 Asana 實體中讀取](asana-reading-from-entities.md)
+ [Asana 連線選項](asana-connection-options.md)
+ [建立 Asana 帳戶](asana-create-account.md)
+ [限制](asana-connector-limitations.md)

# AWS Glue 支援 Asana
<a name="asana-support"></a>

AWS Glue 支援 Asana，如下所示：

**支援作為來源？**  
是。您可以使用 AWS Glue ETL 任務從 Asana 查詢資料。

**支援作為目標？**  
否。

**支援的 Asana API 版本**  
 1.0 

# 包含用於建立和使用連線的 API 操作的政策
<a name="asana-configuring-iam-permissions"></a>

下列範例政策說明建立和使用 連線所需的 AWS 許可。如果您要建立新角色，請建立包含下列項目的政策：

------
#### [ 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 主控台的使用者。

# 設定 Asana
<a name="asana-configuring"></a>

您必須先符合下列要求，才能使用 從 Asana AWS Glue 轉移：

## 最低需求
<a name="asana-configuring-min-requirements"></a>
+ 您擁有一個帶有電子郵件和密碼的 Asana 帳戶。如需有關建立帳戶的詳細資訊，請參閱[建立 Asana 帳戶](asana-create-account.md)。
+ 您必須使用 服務存取建立 AWS 帳戶 AWS Glue。
+ 確保您已在 Asana 帳戶中建立下列其中一個資源：
  + 支援 `OAuth 2.0` 身分驗證的開發人員應用程式。如需更多指示，請參閱 Asana 開發人員文件中的 [OAuth](https://developers.asana.com/docs/oauth)。或者，請參閱 [建立 Asana 帳戶](asana-create-account.md)。
  + 個人存取字符。如需詳細資訊，請參閱 Asana 開發人員文件中的「個人存取字符 [https://developers.asana.com/docs/personal-access-token](https://developers.asana.com/docs/personal-access-token)」。

如果您符合這些要求，就可以 AWS Glue 連線到 Adobe Analytics 帳戶。對於一般連線，不需要在 Adobe Analytics 中執行任何其他操作。

# 設定 Asana 連線
<a name="asana-configuring-connections"></a>

Asana 支援 `OAuth2` 的 `AUTHORIZATION_CODE` 授權類型。

此授權類型被視為「三條腿的」`OAuth`，因為其依賴將使用者重新導向至第三方授權伺服器來驗證使用者。使用者可以選擇在 Asana 中建立自己的連線應用程式，並在透過 AWS Glue 主控台建立連線時提供自己的用戶端 ID 和用戶端秘密。在此案例中，它們仍會重新導向至 Asana 以登入並授權 AWS Glue 存取其資源。

此授權類型會產生重新整理字符和存取字符。存取字符是短期存留的，可以使用重新整理字符自動重新整理，而無需使用者互動。

如需有關為 `AUTHORIZATION_CODE OAuth` 流程建立連線應用程式的公有 Asana 文件，請參閱 [Asana API](https://developers.asana.com/docs/oauth)。

若要設定 Asana 連線，請執行以下操作：

1. 在 AWS Secrets Manager 中，建立包含下列詳細資訊的秘密：
   + 對於客戶管理的連線應用程式，機密應包含以 `USER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET` 作為金鑰的連線應用程式消費者機密。
   + 
**注意**  
必須在 AWS Glue中建立連線機密。

1. 在 中 AWS Glue Studio，依照下列步驟在 **Data Connections** 下建立連線：

   1. 選取**連線類型**時，選取 Asana。

   1. 提供 Asana 環境。

   1. 選取 AWS Glue 可擔任的 IAM 角色，並具有下列動作的許可：

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

****  

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

------

   1. 選取要`secretName`用於此連線的 AWS Glue ，以放置字符。

   1.  如果想要使用您的網路，請選取網路選項。

1. 授予與您的 AWS Glue 任務相關聯的 IAM 角色讀取 的許可`secretName`。

# 從 Asana 實體中讀取
<a name="asana-reading-from-entities"></a>

 **先決條件** 

您想要從中讀取的 Asana 物件。請參閱以下支援的實體表格，以檢查可用實體。

 **來源的支援實體** 


| 實體 | 可以篩選 | 支援限制 | 支援排序依據 | 支援選取 \$1 | 支援分區 | 
| --- | --- | --- | --- | --- | --- | 
|  工作區  | 否 | 是 | 否 | 是 | 否 | 
| Tag | 否 | 是 | 否 | 是 | 否 | 
| 使用者 | 否 | 是 | 否 | 是 | 否 | 
|  產品組合  | 否 | 是 | 否 | 是 | 否 | 
| 團隊 | 否 | 是 | 否 | 是 | 否 | 
| 專案 | 是 | 是 | 否 | 是 | 否 | 
| 區段 | 否 | 是 | 否 | 是 | 否 | 
| 任務  | 是 | 否 | 否 | 是 | 是 | 
| 目標 | 是 | 是 | 否 | 是 | 否 | 
|  AuditLogEvent  | 是 | 是 | 否 | 是 | 否 | 
|  狀態更新  | 是 | 是 | 否 | 是 | 否 | 
|  自訂欄位  | 否 | 是 | 否 | 是 | 否 | 
|  專案簡介  | 是 | 否 | 否 | 是 | 是 | 

 **範例** 

```
read_read = glueContext.create_dynamic_frame.from_options(
    connection_type="Asana",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "task/workspace:xxxx",
        "API_VERSION": "1.0",
        "PARTITION_FIELD": "created_at",
        "LOWER_BOUND": "2024-02-05T14:09:30.115Z",
        "UPPER_BOUND": "2024-06-07T13:30:00.134Z",
        "NUM_PARTITIONS": "3"
    }
```

 **Asana 實體和欄位詳細資訊** 
+ [工作區](https://developers.asana.com/docs/workspaces)
+ [標籤](https://developers.asana.com/docs/tags)
+ [使用者](https://developers.asana.com/docs/users)
+ [產品組合](https://developers.asana.com/docs/portfolios)
+ [團隊](https://developers.asana.com/docs/teams)
+ [專案](https://developers.asana.com/docs/get-all-projects-in-a-workspace)
+ [區段](https://developers.asana.com/docs/get-sections-in-a-project)
+ [任務](https://developers.asana.com/docs/search-tasks-in-a-workspace) 
+ [目標](https://developers.asana.com/docs/get-goals)
+ [AuditLogEvent](https://developers.asana.com/docs/audit-log-api)
+ [狀態更新](https://developers.asana.com/reference/status-updates)
+ [自訂欄位](https://developers.asana.com/reference/custom-fields)
+ [專案簡介](https://developers.asana.com/reference/project-briefs)

 **分區查詢** 

如果想要在 Spark 中使用並行，可以提供其他 Spark 選項 `PARTITION_FIELD`、`LOWER_BOUND`、`UPPER_BOUND`、`NUM_PARTITIONS`。使用這些參數，原始查詢會分區為可由 Spark 任務並行執行的子查詢的 `NUM_PARTITIONS` 數目。
+ `PARTITION_FIELD`：用來分區查詢的欄位名稱。
+ `LOWER_BOUND`：所選分區欄位的包含下限值。

  對於日期，我們接受 Spark SQL 查詢中使用的 Spark 日期格式。有效值的範例：`2024-06-07T13:30:00.134Z`。
+ `UPPER_BOUND`：所選分區欄位的唯一上限值。
+ `NUM_PARTITIONS`：分區數目。

 實體分區欄位支援詳細資訊如下表所示。


| 實體名稱 | 分區欄位 | 資料類型 | 
| --- | --- | --- | 
| 任務 |  created\$1at  | DateTime | 
| 任務 |  modified\$1at  | DateTime | 

 **範例** 

```
read_read = glueContext.create_dynamic_frame.from_options(
    connection_type="Asana",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "task/workspace:xxxx",
        "API_VERSION": "1.0",
        "PARTITION_FIELD": "created_at",
        "LOWER_BOUND": "2024-02-05T14:09:30.115Z",
        "UPPER_BOUND": "2024-06-07T13:30:00.134Z",
        "NUM_PARTITIONS": "3"
    }
```

# Asana 連線選項
<a name="asana-connection-options"></a>

以下是 Asana 的連線選項：
+  `ENTITY_NAME`(String) - (必要) 用於讀取/寫入。Asana 中物件的名稱。
+  `API_VERSION`(String) - (必要) 用於讀取/寫入。您要使用的 Asana Rest API 版本。例如：1.0。
+  `SELECTED_FIELDS`(List<String>) - 預設：empty(SELECT \$1)。用於讀取。您要為物件選取的資料欄。
+  `FILTER_PREDICATE`(String) - 預設：空白。用於讀取。其應該為 Spark SQL 格式。
+  `QUERY`(String) - 預設：空白。用於讀取。完整的 Spark SQL 查詢。
+ `PARTITION_FIELD`(String) - 用於讀取。用於分區查詢的欄位。
+  `LOWER_BOUND`(String) - 用於讀取。所選分區欄位的包含下限值。
+  `UPPER_BOUND`(String) - 用於讀取。所選分區欄位的唯一上限值。
+  `NUM_PARTITIONS`(Integer) - 預設：1。用於讀取。要讀取的分區數目。

# 建立 Asana 帳戶
<a name="asana-create-account"></a>

1. 註冊 [Asana 帳戶](https://asana.com/create-account)，然後選擇**註冊**。

1. 登入後，系統會將您重新導向至[帳戶設定](https://app.asana.com/0/account_setup)頁面。請完成下列步驟：
   + 檢閱帳戶設定表單。
   + 填寫所有相關的詳細資訊以建立您的 Asana 帳戶。
   + 再次檢查資訊的準確性。

1. 選擇**建立帳戶**或**提交** (確切按鈕文字可能會有所不同) 以完成您的帳戶設定。

**在適用於 `OAuth2.0` 的 Asana 中建立應用程式**

1. 使用您的 [Asana 客戶憑證](https://app.asana.com/-/login)登入 Asana 帳戶。

1. 選擇右上角的使用者設定檔圖示，然後從下拉式功能表中選取**我的設定**。

1. 選取**應用程式**索引標籤，然後選取**管理開發人員應用程式**。

1. 選取**建立新應用程式**，然後輸入相關詳細資訊。

1. 選擇**建立應用程式**。

1. 在**我的應用程式**頁面上：

   1. 選取 **OAuth**，然後在**應用程式憑證**區段中，記下您的用戶端 ID 和用戶端機密。

   1. 在**重新導向 URL** 區段中，新增必要的重新導向 URL。
**注意**  
使用此格式輸入重新導向 URI：`https://{aws-region-code}.console.aws.amazon.com/gluestudio/oauth`。範例：對於美國東部 (維吉尼亞北部)，使用：`https://us-east-1.console.aws.amazon.com/gluestudio/oauth`

**在適用於 `PAT` 字符的 Asana 中建立應用程式**

1. 使用您的 [Asana 客戶憑證](https://app.asana.com/-/login)登入 Asana 帳戶。

1. 選擇右上角的使用者設定檔圖示，然後從下拉式功能表中選取**我的設定檔設定**。

1. 選取**應用程式**索引標籤，然後選取**服務帳戶**。

1. 選取**建立新應用程式**，然後輸入相關詳細資訊。

1. 選擇**新增服務帳戶**。

1. 下一頁會顯示您的字符、複製字符並安全地儲存字符。
**重要**  
此字符只會顯示一次。確保您複製並安全地儲存其。

# 限制
<a name="asana-connector-limitations"></a>

以下是 Asana 連接器的限制：
+ 企業網域中的服務帳戶只能存取稽核日誌 API 端點。存取這些端點需要使用服務帳戶的個人存取字符進行身分驗證。
+ 只有具有高級計畫或更新版本的使用者帳戶才能存取目標實體。
+ `Audit Log Event Entity` – 在連接器中，`start_at` 和 `end_at` 欄位會合併為單一欄位 "start\$1end\$1at"，以支援篩選和增量傳輸。
+ `Date` 欄位無法支援分區，即使其支援 greater-than-or-equal-to 運算子和 less-than-or-equal-to 運算子。案例：建立一個任務，其中 `partitionField` 為 `due_on` (資料類型：date)、`lowerBound` 為 `2019-09-14`、`upperBound` 為 `2019-09-16`、`numPartition` 為 `2`。端點 URL 的篩選條件部分建立方式如下：
  + partition1：due\$1on.before=2019-09-14&due\$1on.after=2019-09-14
  + partition2：due\$1on.before=2019-09-15&due\$1on.after=2019-09-15 輸出：
  + 在 partition1 中，我們取得 due\$1date 為 2019-09-14 和 2019-09-15 的資料
  + 在 partition2 中，我們取得與 partition1 中 due\$1date 為 2019-09-15 相同的資料以及其他資料，從而導致資料重複。
+ 由於從 SaaS 終端擲回不良請求錯誤，因此無法在相同的欄位中支援篩選和分區。
+ 任務實體在篩選條件中至少需要 1 個欄位。Asana 有一項限制，在未根據以時間為基礎的欄位排序記錄的情況下，無法識別分頁。因此，Created\$1at 欄位會與分頁搭配使用，以區分下一組記錄。Created\$1at 欄位在篩選條件中標記為必要，如果未提供，預設值為 2000-01-01T00:00:00Z。如需分頁的詳細資訊，請參閱[工作區中的任務](https://developers.asana.com/reference/searchtasksforworkspace)。