

# Zoho CRM에 연결
<a name="connecting-to-data-zoho-crm"></a>

Zoho CRM은 단일 리포지토리와 같이 작동하여 영업, 마케팅 및 고객 지원 활동을 함께 수행하고 프로세스, 정책 및 인력을 하나의 플랫폼에서 간소화합니다. Zoho CRM은 모든 규모와 유형의 비즈니스가 갖고 있는 특정 요구 사항을 충족하도록 쉽게 사용자 지정할 수 있습니다.

Zoho CRM의 개발자 플랫폼에서는 비즈니스/엔터프라이즈가 작업을 자동화하고, 엔터프라이즈 스택에서 데이터를 통합하며, 웹 및 모바일을 위한 사용자 지정 솔루션을 생성할 수 있도록 로우 코드 및 프로 코드 도구를 올바르게 조합하여 제공합니다.

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

# Zoho CRM에 대한 AWS Glue의 지원
<a name="zoho-crm-support"></a>

AWS Glue에서는 다음과 같이 Zoho CRM을 지원합니다.

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

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

**지원되는 Zoho CRM API 버전**  
다음 Zoho CRM API 버전이 지원됩니다.
+ v7

# 연결을 생성하고 사용하기 위한 API 작업이 포함된 정책
<a name="zoho-crm-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 콘솔의 사용자에게 해당됩니다.

# Zoho CRM 구성
<a name="zoho-crm-configuring"></a>

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

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

다음은 최소 요구 사항입니다.
+ Zoho CRM 계정이 있습니다.
+ Zoho CRM 계정이 API 액세스에 대해 활성화되어 있습니다.
+ OAuth 자격 증명을 가져올 등록된 API 클라이언트가 API 콘솔 아래에 있습니다.

# Zoho CRM 연결 구성
<a name="zoho-crm-configuring-connections"></a>

권한 부여 유형은 AWS Glue에서 Zoho CRM과 통신하여 데이터에 대한 액세스를 요청하는 방법을 결정합니다. 선택한 항목은 연결을 생성하기 전에 충족해야 하는 요구 사항에 영향을 미칩니다. Zoho CRM에서는 OAuth 2.0에 대한 AUTHORIZATION\$1CODE 권한 부여 유형만 지원합니다.
+ 이 권한 부여 유형은 사용자를 인증하기 위해 사용자를 서드파티 권한 부여 서버로 리디렉션하는 방식에 의존하므로 '3각' OAuth로 간주됩니다. AWS Glue 콘솔을 통해 연결을 생성할 때 사용됩니다. AWS Glue 콘솔은 사용자를 Zoho CRM으로 리디렉션합니다. 사용자가 로그인하고 Zoho CRM 인스턴스에 액세스하도록 요청된 권한을 Glue에 허용해야 합니다.
+ 사용자는 AWS Glue 콘솔을 통해 연결을 생성할 때에도 Zoho CRM에서 자체 연결된 앱을 생성하고 자체 클라이언트 ID, 권한 부여 URL, 토큰 URL 및 인스턴스 URL을 제공하기로 선택할 수 있습니다. 이 시나리오에서는 여전히 Zoho CRM으로 리디렉션되어 로그인하고 리소스에 액세스할 수 있는 권한을 AWS Glue에 부여합니다.
+ 이 권한 부여 유형은 새로 고침 토큰과 액세스 토큰을 생성합니다. 액세스 토큰의 유효 기간은 1시간이며 새로 고침 토큰을 사용하여 사용자 상호 작용 없이 자동으로 새로 고칠 수 있습니다.
+ 권한 부여 코드 OAuth 흐름을 위한 연결된 앱 생성에 대한 퍼블릭 Zoho CRM 설명서는 [Authentication](https://www.zoho.com/crm/developer/docs/api/v7/oauth-overview.html)을 참조하세요.

Zoho CRM 연결을 구성하는 방법:

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

   1. **연결 유형**을 선택할 때 Zoho CRM을 선택하세요.

   1. 연결하려는 Zoho CRM 인스턴스의 `INSTANCE_URL` 항목을 제공합니다.

   1. 사용자 클라이언트 애플리케이션 클라이언트 ID를 제공합니다.

   1. 드롭다운에서 적절한 **권한 부여 URL**을 선택하세요.

   1. 드롭다운에서 적절한 **토큰 URL**을 선택하세요.

   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`을 읽을 수 있는 권한을 부여합니다.

1. AWS Glue 작업 구성에서** 추가 네트워크 연결**로 `connectionName`을 제공합니다.

# Zoho CRM 엔터티에서 읽기
<a name="zoho-crm-reading-from-entities"></a>

**사전 조건**

읽으려는 Zoho CRM 객체입니다. 객체 이름이 필요합니다.

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


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| Product | 예 | 예 | 예 | 예 | 예 | 
| Quote | 예 | 예 | 예 | 예 | 예 | 
| Purchase Order | 예 | 예 | 예 | 예 | 예 | 
| Solution | 예 | 예 | 예 | 예 | 예 | 
| Call | 예 | 예 | 예 | 예 | 예 | 
| Task | 예 | 예 | 예 | 예 | 예 | 
| Event | 예 | 예 | 예 | 예 | 예 | 
| Invoice | 예 | 예 | 예 | 예 | 예 | 
| Account | 예 | 예 | 예 | 예 | 예 | 
| Contact | 예 | 예 | 예 | 예 | 예 | 
| Vendor | 예 | 예 | 예 | 예 | 예 | 
| 캠페인 | 예 | 예 | 예 | 예 | 예 | 
| Deal | 예 | 예 | 예 | 예 | 예 | 
| Lead | 예 | 예 | 예 | 예 | 예 | 
| Custom Module | 예 | 예 | 예 | 예 | 예 | 
| Sales Order | 예 | 예 | 예 | 예 | 예 | 
| Price Books | 예 | 예 | 예 | 예 | 예 | 
| 사례 | 예 | 예 | 예 | 예 | 예 | 

**예시:**

```
zoho_read = glueContext.create_dynamic_frame.from_options(
    connection_type="ZOHO",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "entityName",
        "API_VERSION": "v7",
        "INSTANCE_URL": "https://www.zohoapis.in/"
    }
```

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


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| Product | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Quote | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Purchase Order | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Solution | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Call | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Task | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Event | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Invoice | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Account | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Contact | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Vendor | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| 캠페인 | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Deal | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Lead | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Custom Module | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Sales Order | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Price Books | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| 사례 | 예 | 아니요 | 아니요 | 예 | 아니요 | 

**예시:**

```
zoho_read = glueContext.create_dynamic_frame.from_options(
    connection_type="ZOHO",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "entityName",
        "API_VERSION": "v7",
        "INSTANCE_URL": "https://www.zohoapis.in/",
        "TRANSFER_MODE": "ASYNC"
    }
```

**Zoho CRM 필드 세부 정보**:

Zoho CRM에서는 지원되는 엔터티에 대해 메타데이터를 동적으로 가져오도록 엔드포인트를 제공합니다. 따라서 운영자 지원은 데이터 유형 수준에서 캡처됩니다.

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

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

파티셔닝은 비동기 모드에서 지원되지 않습니다.

**필터 기반 파티셔닝(동기 모드)**:

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

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

  유효한 값의 예제:

  ```
  "2024-09-30T01:01:01.000Z"
  ```
+ `UPPER_BOUND`: 선택한 파티션 필드의 상한 값(**경계 제외**).
+ `NUM_PARTITIONS`: 파티션 수.

예시:

```
zoho_read = glueContext.create_dynamic_frame.from_options(
    connection_type="zohocrm",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "entityName",
        "API_VERSION": "v7",
        "PARTITION_FIELD": "Created_Time"
        "LOWER_BOUND": "2022-01-01T01:01:01.000Z"
        "UPPER_BOUND": "2024-01-01T01:01:01.000Z"
        "NUM_PARTITIONS": "10"
    }
```

# Zoho CRM 연결 옵션
<a name="zoho-crm-connection-options"></a>

다음은 Zoho CRM에 대한 연결 옵션입니다.
+ `ENTITY_NAME`(문자열) - (필수) 읽기에 사용됩니다. Zoho CRM에서의 객체 이름.
+ `API_VERSION`(문자열) - (필수) 읽기에 사용됩니다. 사용할 CRM Rest 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`(문자열) - (필수) 읽기에 사용됩니다. 유효한 Zoho CRM 인스턴스 URL.
+ `TRANSFER_MODE`(문자열) - 쿼리를 비동기 모드에서 실행해야 하는지 여부를 나타내는 데 사용됩니다.

# Zoho CRM 커넥터에 대한 제한 사항 및 참고 사항
<a name="zoho-crm-connector-limitations"></a>

다음은 Zoho CRM 커넥터에 대한 제한 사항입니다.
+ API 버전 v7에서는 최대 100,000개의 레코드를 가져올 수 있습니다. [Zoho 설명서](https://www.zoho.com/crm/developer/docs/api/v7/get-records.html)를 참조하세요.
+ 이벤트 엔터티의 경우 [Zoho 설명서](https://www.zoho.com/crm/developer/docs/api/v7/modules-api.html)에 언급된 대로 "Meeting" 레이블이 표시됩니다.
+ 모두 선택 기능의 경우:
  + GET 및 POST 직접 호출 모두에 대해 SaaS에서 최대 50개의 필드를 가져올 수 있습니다.
  + 처음 50개 필드에 속하지 않는 일부 특정 필드의 데이터를 가져오려면 선택한 필드 목록을 수동으로 제공해야 합니다.
  + 50개가 넘는 필드를 선택하면 50개 필드를 초과하는 모든 필드가 잘리고 Amazon S3에 null 데이터가 포함됩니다.
  + 필터 표현식의 경우 사용자가 제공한 50개 필드 목록에 "id" 및 "Created\$1Time"이 포함되지 않은 경우 사용자에게 이러한 필드를 포함하라는 사용자 지정 예외가 발생합니다.
+ 필터 연산자는 데이터 유형이 동일하더라도 필드마다 다를 수 있습니다. 따라서 SaaS 플랫폼에서 오류를 트리거하는 모든 필드에 대해 다른 연산자를 수동으로 지정해야 합니다.
+ 정렬 기준 기능의 경우:
  + 필터 표현식을 사용하지 않으면 단일 필드를 기준으로만 데이터를 정렬할 수 있지만 필터 표현식이 적용되는 경우 여러 필드로 기준으로 데이터를 정렬할 수 있습니다.
  + 선택한 필드에 대해 정렬 순서가 지정되지 않은 경우 데이터는 기본적으로 오름차순으로 검색됩니다.
+ Zoho CRM 커넥터에 대해 지원되는 리전은 미국, 유럽, 인도, 호주 및 일본입니다.
+ 비동기 읽기 기능 [제한 사항:](https://www.zoho.com/crm/developer/docs/api/v7/bulk-read/limitations.html)
  + 비동기 모드에서는 제한 순서 기준 및 파티셔닝이 지원되지 않습니다.
  + 비동기 모드에서는 페이지당 레코드가 200,000개인 최대 500페이지의 데이터를 전송할 수 있습니다.
  + 1분 간격의 경우 10개의 요청만 다운로드할 수 있습니다. 다운로드 한도를 초과하면 HTTP 429 오류가 반환되고 모든 다운로드 요청이 1분 동안 일시 중지된 후 처리가 재개됩니다.
  + 대량 작업을 완료한 후 1일 동안만 다운로드 가능한 파일에 액세스할 수 있습니다. 그런 다음 엔드포인트를 통해 파일에 액세스할 수 없습니다.
  + 엔드포인트를 통해 최대 200개의 선택 필드를 제공할 수 있습니다. 엔드포인트에 200개 이상의 선택 필드를 지정하면 시스템에서 해당 모듈에 사용 가능한 모든 필드를 자동으로 내보냅니다.
  + 모든 모듈에서 생성된 외부 필드는 대량 읽기 API에서 지원되지 않습니다.
  + 정렬 및 `Group_by` 절은 이 API 엔드포인트를 통해 지원되지 않습니다.
  + 규정 준수 설정에서 **API를 통한 데이터 액세스 제한** 옵션이 **비활성화**된 경우에만 민감한 상태 데이터가 있는 필드의 값이 검색됩니다. 이 옵션이 활성화되면 결과에서 값이 **비어** 있게 됩니다.
  + 필터링/기준 제한
    + 쿼리에 사용할 수 있는 최대 기준 수는 25개입니다.
    + 여러 줄 텍스트 필드의 필터링/기준은 지원되지 않습니다.