

# AWS Glue 연결 추가
<a name="console-connections"></a>

 Spark에 대한 AWS Glue를 프로그래밍 방식으로 데이터 소스에 연결할 수 있습니다. 자세한 내용은 [AWS Glue for Spark에서 ETL에 대한 연결 유형 및 옵션](aws-glue-programming-etl-connect.md) 섹션을 참조하세요.

AWS Glue 콘솔을 사용하여 연결을 추가, 편집, 삭제 및 테스트할 수도 있습니다. AWS Glue 연결에 대한 자세한 내용은 [데이터에 연결](glue-connections.md) 단원을 참조하십시오.

**Topics**
+ [Adobe Analytics에 연결](connecting-to-adobe-analytics.md)
+ [Adobe Marketo Engage에 연결](connecting-to-data-adobe-marketo-engage.md)
+ [AWS Glue Studio에서 Amazon Redshift에 연결](connecting-to-data-redshift.md)
+ [Asana에 연결](connecting-to-asana.md)
+ [AWS Glue Studio에서 Azure Cosmos DB에 연결](connecting-to-data-azurecosmos.md)
+ [AWS Glue Studio에서 Azure SQL에 연결](connecting-to-data-azuresql.md)
+ [Blackbaud Raiser's Edge NXT에 연결](connecting-to-data-blackbaud.md)
+ [CircleCI에 연결](connecting-to-data-circleci.md)
+ [Datadog에 연결](connecting-to-datadog.md)
+ [Docusign Monitor에 연결](connecting-to-data-docusign-monitor.md)
+ [Domo에 연결](connecting-to-data-domo.md)
+ [Dynatrace에 연결](connecting-to-data-dynatrace.md)
+ [Facebook Ads에 연결](connecting-to-data-facebook-ads.md)
+ [Facebook Page Insights에 연결](connecting-to-data-facebook-page-insights.md)
+ [Freshdesk에 연결](connecting-to-data-freshdesk.md)
+ [Freshsales에 연결](connecting-to-data-freshsales.md)
+ [Google Ads에 연결](connecting-to-googleads.md)
+ [Google Analytics 4에 연결](connecting-to-googleanalytics.md)
+ [AWS Glue Studio에서 Google BigQuery에 연결](connecting-to-data-bigquery.md)
+ [Google Search Console에 연결](connecting-to-data-google-search-console.md)
+ [Google Sheets에 연결](connecting-to-googlesheets.md)
+ [HubSpot에 연결](connecting-to-data-hubspot.md)
+ [Instagram Ads에 연결](connecting-to-data-instagram-ads.md)
+ [AWS Glue Studio에서 Intercom에 연결](connecting-to-data-intercom.md)
+ [Jira Cloud에 연결](connecting-to-data-jira-cloud.md)
+ [Kustomer에 연결](connecting-to-data-kustomer.md)
+ [LinkedIn에 연결](connecting-to-linkedin.md)
+ [Mailchimp에 연결](connecting-to-mailchimp.md)
+ [Microsoft Dynamics 365 CRM에 연결](connecting-to-microsoft-dynamics-365.md)
+ [Microsoft Teams에 연결](connecting-to-microsoft-teams.md)
+ [Mixpanel에 연결](connecting-to-mixpanel.md)
+ [Monday에 연결](connecting-to-monday.md)
+ [AWS Glue Studio에서 MongoDB에 연결](connecting-to-data-mongodb.md)
+ [Oracle NetSuite에 연결](connecting-to-data-oracle-netsuite.md)
+ [AWS Glue Studio에서 OpenSearch Service에 연결](connecting-to-data-opensearch.md)
+ [Okta에 연결](connecting-to-okta.md)
+ [PayPal에 연결](connecting-to-data-paypal.md)
+ [Pendo에 연결](connecting-to-pendo.md)
+ [Pipedrive에 연결](connecting-to-pipedrive.md)
+ [Productboard에 연결](connecting-to-productboard.md)
+ [QuickBooks에 연결](connecting-to-data-quickbooks.md)
+ [REST API에 연결](connecting-to-data-rest-api.md)
+ [Salesforce에 연결](connecting-to-data-salesforce.md)
+ [Salesforce Marketing Cloud에 연결](connecting-to-data-salesforce-marketing-cloud.md)
+ [Salesforce Commerce Cloud에 연결](connecting-to-salesforce-commerce-cloud.md)
+ [Salesforce Marketing Cloud Account Engagement에 연결](connecting-to-data-salesforce-marketing-cloud-account-engagement.md)
+ [AWS Glue Studio에서 SAP HANA에 연결](connecting-to-data-saphana.md)
+ [SAP OData에 연결](connecting-to-data-sap-odata.md)
+ [SendGrid에 연결](connecting-to-data-sendgrid.md)
+ [ServiceNow에 연결](connecting-to-data-servicenow.md)
+ [AWS Glue Studio에서 Slack에 연결](connecting-to-data-slack.md)
+ [Smartsheet에 연결](connecting-to-smartsheet.md)
+ [AWS Glue Studio에서 Snapchat Ads에 연결](connecting-to-data-snapchat-ads.md)
+ [AWS Glue Studio에서 Snowflake에 연결](connecting-to-data-snowflake.md)
+ [AWS Glue Studio에서 Stripe에 연결](connecting-to-data-stripe.md)
+ [AWS Glue Studio의 Teradata 밴티지에 연결](connecting-to-data-teradata.md)
+ [Twilio에 연결](connecting-to-data-twilio.md)
+ [AWS Glue Studio의 Vertica 입력에 연결](connecting-to-data-vertica.md)
+ [WooCommerce에 연결](connecting-to-data-woocommerce.md)
+ [Zendesk에 연결](connecting-to-data-zendesk.md)
+ [Zoho CRM에 연결](connecting-to-data-zoho-crm.md)
+ [Zoom Meetings에 연결](connecting-to-data-zoom-meetings.md)
+ [자체 JDBC 드라이버를 사용하여 JDBC 연결 추가](console-connections-jdbc-drivers.md)

# Adobe Analytics에 연결
<a name="connecting-to-adobe-analytics"></a>

Adobe Analytics는 고객 여정을 지원하는 다중 채널 디지털 경험에서 데이터를 수집하고 데이터 분석을 위한 도구를 제공하는 강력한 데이터 분석 플랫폼입니다. 일반적으로 마케터와 비즈니스 분석가가 비즈니스 분석 목적으로 사용하는 플랫폼입니다. Adobe Analytics 사용자인 경우 Adobe Analytics 계정에 AWS Glue를 연결할 수 있습니다. 그런 다음, Adobe Analytics을 ETL 작업에서의 데이터 소스로 사용할 수 있습니다. 이러한 작업을 실행하여 Adobe Analytics 및 AWS 서비스 또는 기타 지원되는 애플리케이션 간에 데이터를 전송합니다.

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

# AWS Glue의 Adobe Analytics 지원
<a name="adobe-analytics-support"></a>

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

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

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

**지원되는 Adobe Analytics API 버전**  
 v2.0 

# 연결을 생성하고 사용하기 위한 API 작업이 포함된 정책
<a name="adobeanalytics-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 Management 콘솔을 사용하는 경우 AWS Glue 리소스에 대한 전체 액세스 권한을 부여합니다. 이 정책에 지정된 리소스의 이름 변환을 따르면 사용자는 콘솔 전체 용량을 소유합니다. 이 정책은 보통 AWS Glue 콘솔의 사용자에게 해당됩니다.

# Adobe Analytics 구성
<a name="adobeanalytics-configuring"></a>

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

## 최소 요구 사항
<a name="adobeanalytics-configuring-min-requirements"></a>
+ 이메일과 암호를 사용하는 Adobe Analytics 계정이 있습니다. 계정 생성에 대한 자세한 내용은 [Adobe Analytics 계정 생성](adobeanalytics-create-account.md)을 참조하세요.
+  Adobe Analytics 계정이 API 액세스에 대해 활성화되어 있습니다. API 액세스는 Select, Prime 및 Ultimate 에디션에서 기본적으로 활성화되어 있습니다.

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

# Adobe Analytics 연결 구성
<a name="adobeanalytics-configuring-connections"></a>

 Adobe Analytics는 `OAuth2`에 대한 `AUTHORIZATION_CODE` 권한 부여 유형을 지원합니다.

이 권한 부여 유형은 사용자를 인증하기 위해 사용자를 서드파티 권한 부여 서버로 리디렉션하는 방식에 의존하므로 '3각' `OAuth`로 간주됩니다. 사용자는 AWS Glue 콘솔을 통해 연결을 생성할 때에도 Adobe Analytics에서 자체 연결된 앱을 생성하고 자체 클라이언트 ID와 클라이언트 보안 암호를 제공하기로 선택할 수 있습니다. 이 시나리오에서는 여전히 Adobe Analytics로 리디렉션되어 로그인하고 리소스에 액세스할 수 있는 권한을 AWS Glue에 부여합니다.

이 권한 부여 유형은 새로 고침 토큰과 액세스 토큰을 생성합니다. 액세스 토큰은 수명이 짧으며 새로 고침 토큰을 사용하여 사용자 상호 작용 없이 자동으로 새로 고칠 수 있습니다.

 AUTHORIZATION\$1CODE OAuth 흐름용 연결 앱을 생성하는 방법에 대한 퍼블릭 Adobe Analytics 설명서는 [Adobe Analytics API](https://adobedocs.github.io/analytics-2.0-apis/)를 참조하세요.

Adobe Analytics 연결을 구성하는 방법:

1. AWS Secrets Manager에서 다음 세부 정보로 보안 암호를 생성합니다.

   고객 관리형 연결된 앱의 경우 - 보안 암호는 키 역할을 하는 `USER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET`과 함께 연결된 앱 소비자 보안 암호를 포함해야 합니다.
**참고**  
AWS Glue에서 연결당 보안 암호를 생성해야 합니다.

1. AWS Glue Studio의 **데이터 연결**에서 아래 단계에 따라 연결을 생성합니다.

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

   1. 연결하려는 Adobe Analytics의 `x_api_key, instanceUrl`을 제공합니다.

   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. 토큰을 넣기 위해 AWS Glue에서 이 연결에 사용할 `secretName`을 선택합니다.

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

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

# Adobe Analytics 엔터티에서 읽기
<a name="adobeanalytics-reading-from-entities"></a>

 **사전 조건** 

읽으려는 Adobe Analytics 객체입니다. 사용 가능한 엔터티를 확인하려면 아래 지원되는 엔터티 테이블을 참조하세요.

 **지원되는 엔터티** 


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| Annotation | 예 | 예 | 예 | 예 | 아니요 | 
| Calculated Metrics | 예 | 예 | 예 | 예 | 아니요 | 
| Calculated Metrics Function | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Component Metadata Shares | 예 | 예 | 아니요 | 예 | 아니요 | 
| Date Ranges | 예 | 예 | 아니요 | 예 | 아니요 | 
| 측정 기준 | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Metrics | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Projects | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Reports Top Item | 예 | 예 | 아니요 | 예 | 아니요 | 
| Segments | 예 | 예 | 예 | 예 | 아니요 | 
| Usage Logs | 예 | 예 | 아니요 | 예 | 아니요 | 

 **예제** 

```
adobeAnalytics_read = glueContext.create_dynamic_frame.from_options( 
     connection_type="adobeanalytics", 
     connection_options={ 
        "connectionName": "connectionName", 
        "ENTITY_NAME": "annotation/ex*****", 
        "API_VERSION": "v2.0" 
 })
```

 **Adobe Analytics 엔터티 및 필드 세부 정보** 
+ [Annotations](https://adobedocs.github.io/analytics-2.0-apis/#/Annotations)
+ [Calculated Metrics](https://adobedocs.github.io/analytics-2.0-apis/#/Calculated%20Metrics)
+ [Component Meta Data](https://adobedocs.github.io/analytics-2.0-apis/#/Component%20Meta%20Data)
+ [Date Ranges](https://adobedocs.github.io/analytics-2.0-apis/#/Date%20Ranges)
+ [Dimensions](https://adobedocs.github.io/analytics-2.0-apis/#/Dimensions)
+ [Metrics](https://adobedocs.github.io/analytics-2.0-apis/#/Metrics)
+ [Projects](https://adobedocs.github.io/analytics-2.0-apis/#/Projects)
+ [Reports](https://adobedocs.github.io/analytics-2.0-apis/#/Reports)
+ [Segments](https://adobedocs.github.io/analytics-2.0-apis/#/Segments)
+ [Users](https://adobedocs.github.io/analytics-2.0-apis/#/Users)
+ [Usage Logs](https://adobedocs.github.io/analytics-2.0-apis/#/Usage%20Logs)

# Adobe Analytics 연결 옵션
<a name="adobeanalytics-connection-options"></a>

다음은 Adobe Analytics의 연결 옵션입니다.
+  `ENTITY_NAME`(문자열) - (필수) 읽기/쓰기에 사용됩니다. Adobe Analytics에서의 객체 이름입니다.
+  `API_VERSION`(문자열) - (필수) 읽기/쓰기에 사용됩니다. 사용하려는 Adobe Analytics Rest API 버전입니다. 예: v2.0.
+  `X_API_KEY`(문자열) - (필수) 읽기/쓰기에 사용됩니다. API를 요청하는 개발자 또는 애플리케이션을 인증해야 합니다.
+  `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 객체에 대해 선택할 열.
+  `FILTER_PREDICATE`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.
+  `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리.

# Adobe Analytics 계정 생성
<a name="adobeanalytics-create-account"></a>

1. [Adobe 파트너 프로그램](https://partners.adobe.com/exchangeprogram/creativecloud.html)에 액세스하여 교환 파트너 프로그램에 등록합니다.

1. **교환 프로그램 가입**을 선택합니다.

1. 회사 이메일 주소를 사용하여 계정을 등록하거나 생성합니다.

1. 제안 상자에서 Adobe Analytics 제품 구독이 있는 적절한 회사를 선택합니다.

1. 계정이 활성 Adobe Analytics 구독이 있는 유효한 조직(사용 가능한 목록에서)에 등록되었는지 확인합니다.

1. 회사 관리자가 승인한 후 승인 이메일의 링크를 클릭하여 계정을 활성화합니다.

**생성한 계정이 Adobe Analytics 서비스에 액세스할 수 있는지 확인**

1. [Adobe Admin Console](https://adminconsole.adobe.com/)에 로그인합니다.

1. 페이지 오른쪽 상단에 있는 조직 이름을 확인하여 올바른 회사에 로그인했는지 확인합니다.

1. **제품**을 선택하고 Adobe Analytics를 사용할 수 있는지 확인합니다.
**참고**  
사용할 수 있는 조직이 없거나 Adobe Analytics 제품이 회색으로 표시되거나 사용할 수 없는 경우 계정이 조직과 연결되지 않았거나 활성 Adobe Analytics 구독이 없는 것일 수 있습니다. 시스템 관리자에게 문의하여 이 서비스에 대한 액세스를 요청하세요.

**프로젝트 및 `OAuth2.0` 자격 증명 생성**

1. [OAuth 2.0 앱](https://developer.adobe.com/developer-console/docs/guides/services/services-add-api-oauth/)을 생성할 Adobe Analytics 계정에 로그인합니다.

1. **프로젝트**를 선택한 다음 **새 프로젝트 생성**을 선택합니다.

1. 프로젝트를 추가하려면 **프로젝트에 추가**를 선택한 다음 **API**를 선택합니다.

1. **Adobe Analytics API**를 선택합니다.

1. 사용자 인증으로 **OAUTH**를 선택합니다.

1. **웹**을 `OAUTH`로 선택하고 리디렉션 URI를 제공합니다.

   리디렉션 URI 및 패턴은 다음을 참조하세요.
   + `OAuth 2.0` 기본 리디렉션 URI - 기본 리디렉션 URI는 인증 프로세스 중에 Adobe가 액세스할 페이지의 URL입니다. 예: `https://ap-southeast-2.console.aws.amazon.com/appflow/oauth` 
   + OAuth 2.0 리디렉션 URI 패턴 - 리디렉션 URI 패턴은 로그인 흐름이 완료될 때 Adobe가 리디렉션(요청된 경우)할 수 있는 URI 경로(또는 쉼표로 구분된 경로 목록)입니다. 예: `https://ap-southeast-2\\.console\\.aws\\.amazon\\.com`

1. 다음 법위를 추가합니다.
   + `openid`
   + `read_organizations`
   + `additional_info.projectedProductContext`
   + `additional_info.job_function`

1. **자격 증명 저장**을 선택합니다.

1. 앱을 생성한 후 `Client ID` 및 `Client Secret` 값을 텍스트 파일에 복사합니다.

# 제한 사항
<a name="adobeanalytics-connector-limitations"></a>

다음은 Adobe Analytics 커넥터의 제한 사항입니다.
+ Adobe Analytics는 필드 기반 분할과 레코드 기반 분할을 지원하지 않습니다. 분할하는 필드를 쿼리할 수 없으므로 필드 기반 분할은 지원되지 않습니다. 페이지 매김을 위해 '오프셋'을 가져오는 프로비저닝이 없으므로 레코드 기반 분할을 지원할 수 없습니다.
+ `Report Top Item` 엔터티에서 `startDate` 및 `endDate` 쿼리 파라미터가 예상대로 작동하지 않습니다. 응답은 이 파라미터들을 기준으로 필터링되지 않으므로 이 엔터티의 필터 및 증분 흐름에 문제가 발생합니다.
+ `Annotation`, `Calculated Metrics`, `Calculated Metrics Function`, `Date Ranges`, `Dimension`, `Metric`, `Project`, `Report Top Items` 및 `Segment` 엔터티의 경우 `locale` 쿼리 파라미터는 응답의 현지화된 섹션에 사용할 언어를 지정하며 레코드를 필터링하지 않습니다. 예를 들어 `locale="ja_JP"`는 일본어로 데이터를 표시합니다.
+ `Report Top Item` 엔터티 - `dateRange` 및 `lookupNoneValues` 필드의 필터가 현재 작동하지 않습니다.
+ `Segment` 엔터티: 필터 값이 `includeType=“templates”`인 경우 다른 필드의 필터가 작동하지 않습니다.
+ `Date Range` 엔터티 - `curatedRsid` 필드의 필터가 작동하지 않습니다.
+ `Metric entity` 엔터티 - “false” 값을 사용하여 세그먼트화 가능한 필드를 필터링하면 true 값과 false 값이 모두 표시됩니다.

# Adobe Marketo Engage에 연결
<a name="connecting-to-data-adobe-marketo-engage"></a>

Adobe Marketo Engage는 마케팅 담당자가 잠재 고객과 고객에게 맞춤형 다중 채널 프로그램과 캠페인을 관리할 수 있는 마케팅 자동화 플랫폼입니다.

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

# Adobe Marketo Engage의 AWS Glue 지원
<a name="adobe-marketo-engage-support"></a>

AWS Glue는 다음과 같이 Adobe Marketo Engage를 지원합니다.

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

**대상으로서 지원되나요?**  
예. AWS Glue ETL 작업을 사용하여 Adobe Marketo에 데이터를 쓸 수 있습니다.

**지원되는 Adobe Marketo Engage API 버전**  
다음 Adobe Marketo Engage API 버전이 지원됩니다.
+ v1

버전별 엔터티 지원은 소스에 대해 지원되는 엔터티를 참조하세요.

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

# Adobe Marketo Engage 구성
<a name="adobe-marketo-engage-configuring"></a>

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

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

다음은 최소 요구 사항입니다.
+ 클라이언트 자격 증명이 있는 Adobe Marketo Engage 계정이 있습니다.
+ Adobe Marketo Engage 계정에 유효한 라이선스가 있는 API 액세스 권한이 있습니다.

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

## OAuth 2.0 자격 증명 가져오기
<a name="adobe-marketo-engage-configuring-creating-adobe-marketo-engage-oauth2-credentials"></a>

인스턴스에 대해 인증된 직접 호출을 수행할 수 있도록 API 자격 증명을 확보하려면 [Adobe Marketo Rest API](https://experienceleague.adobe.com/en/docs/marketo-developer/marketo/rest/rest-api)를 참조하세요.

# Adobe Marketo Engage 연결 구성
<a name="adobe-marketo-engage-configuring-connections"></a>

Adobe Marketo Engage는 OAuth2에 대한 CLIENT CREDENTIALS 권한 부여 유형을 지원합니다.
+ 이 권한 부여 유형은 클라이언트가 사용자의 컨텍스트 외부에서 액세스 토큰을 얻는 데 사용하므로 2각 OAuth 2.0으로 간주됩니다. AWS Glue는 클라이언트 ID와 클라이언트 암호를 사용하여 사용자가 정의한 사용자 지정 서비스에서 제공하는 Adobe Marketo Engage API를 인증할 수 있습니다.
+ 각 사용자 지정 서비스는 API 전용 사용자가 소유하며, API 전용 사용자는 서비스에 특정 작업을 수행하도록 권한을 부여하는 역할 및 권한 집합을 가집니다. 액세스 토큰은 단일 사용자 지정 서비스와 연결됩니다.
+ 이 권한 부여 유형은 수명이 짧은 액세스 토큰을 생성하며 ID 엔드포인트를 호출하여 갱신할 수 있습니다.
+ 클라이언트 자격 증명이 포함된 OAuth 2.0용 퍼블릭 Adobe Marketo Engage 설명서는 Adobe Marketo Engage 개발자 안내서의 [Authentication](https://developers.adobe-marketo-engage.com/rest-api/authentication/)을 참조하세요.

Adobe Marketo Engage 연결을 구성하는 방법:

1. AWS Secrets Manager에서 다음 세부 정보로 보안 암호를 생성합니다.

   1. 고객 관리형 연결된 앱의 경우 보안 암호는 키 역할을 하는 `USER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET`과 함께 연결된 앱 소비자 보안 암호를 포함해야 합니다.

   1. 참고: AWS Glue에서 연결당 시크릿을 생성해야 합니다.

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

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

   1. 연결하려는 Adobe Marketo Engage 인스턴스의 `INSTANCE_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`을 읽을 수 있는 권한을 부여합니다.

# Adobe Marketo Engage 엔터티에서 읽기
<a name="adobe-marketo-engage-reading-from-entities"></a>

**사전 조건**

읽으려는 Adobe Marketo Engage 객체. 객체 이름(리드, 활동 또는 사용자 지정 객체)이 필요합니다. 다음 표에는 지원되는 엔터티가 나와 있습니다.

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


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| 리드 | 예 | 예 | 아니요 | 예 | 아니요 | 
| 활동 | 예 | 예 | 아니요 | 예 | 아니요 | 
| 사용자 지정 객체 | 예 | 예 | 아니요 | 예 | 아니요 | 

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


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| 리드 | 예 | 아니요 | 아니요 | 예 | 예 | 
| 활동 | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| 사용자 지정 객체 | 예 | 아니요 | 아니요 | 예 | 예 | 

**예시:**

```
adobe-marketo-engage_read = glueContext.create_dynamic_frame.from_options(
    connection_type="adobe-marketo-engage",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "leads",
        "API_VERSION": "v2",
        "INSTANCE_URL": "https://539-t**-6**.mktorest.com"
    }
```

**Adobe Marketo Engage 엔터티 및 필드 세부 정보**:

**정적 메타데이터를 포함하는 엔터티**: 

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

**동적 메타데이터를 포함하는 엔터티**:

다음 엔터티에 대해 Adobe Marketo Engage에서는 메타데이터를 동적으로 가져오도록 엔드포인트를 제공하므로 운영자 지원은 각 엔터티의 데이터 유형 수준에서 캡처됩니다.

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

## 쿼리 파티셔닝
<a name="adobe-marketo-engage-reading-partitioning-queries"></a>

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

  DateTime 필드의 경우 ISO 형식의 값이 허용됩니다.

  유효한 값의 예제:

  ```
  "2024-07-01T00:00:00.000Z"
  ```
+ `UPPER_BOUND`: 선택한 파티션 필드의 상한 값(**경계 제외**).
+ `NUM_PARTITIONS`: 파티션 수.

다음 표에서는 엔터티 분할 필드 지원 세부 정보를 설명합니다.

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

예시:

```
adobe-marketo-engage_read = glueContext.create_dynamic_frame.from_options(
    connection_type="adobe-marketo-engage",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "leads",
        "API_VERSION": "v1",
        "PARTITION_FIELD": "createdAt"
        "LOWER_BOUND": "2024-07-01T00:00:00.000Z"
        "UPPER_BOUND": "2024-07-02T00:00:00.000Z"
        "NUM_PARTITIONS": "10"
    }
```

# Adobe Marketo Engage 개체에 쓰기
<a name="adobe-marketo-engage-writing-to-entities"></a>

**사전 조건 **
+ 쓰기 대상 Adobe Marketo 객체입니다. 객체 이름(예: `leads` 또는 `customobjects`)이 필요합니다.
+ Adobe Marketo 커넥터는 세 가지 쓰기 작업을 지원합니다.
  + INSERT
  + UPSERT
  + UPDATE
+ `UPSERT` 및 `UPDATE` 쓰기 작업의 경우 레코드의 ID 필드를 지정하는 `ID_FIELD_NAMES` 옵션을 제공해야 합니다. `leads` 엔터티로 작업할 때는 `UPSERT` 작업에 `email`을 `ID_FIELD_NAMES`로 사용하고 `UPDATE` 작업에 `id`를 사용합니다. `customobjects` 엔터티의 경우 `UPDATE` 및 `UPSERT` 작업 모두에 `marketoGUID`를 `ID_FIELD_NAMES`로 사용합니다.

**대상에 지원되는 엔터티(동기식)**


| 엔터티 이름 | 대상 커넥터로 지원됩니다. | 삽입 가능 | 업데이트 가능 | 업서트 가능 | 
| --- | --- | --- | --- | --- | 
| 리드 | 예 | 예(대량) | 예(대량) | 예(대량) | 
| 사용자 지정 객체 | 예 | 예(대량) | 예(대량) | 예(대량) | 

**예시:**

**INSERT 작업:**

```
marketo_write = glueContext.write_dynamic_frame.from_options(
    frame=frameToWrite,
    connection_type="marketo",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "leads",
        "API_VERSION": "v1",
        "WRITE_OPERATION": "INSERT"
    }
```

**UPDATE 작업:**

```
marketo_write = glueContext.write_dynamic_frame.from_options(
    frame=frameToWrite,
    connection_type="marketo",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "leads",
        "API_VERSION": "v1",
        "WRITE_OPERATION": "UPDATE",
        "ID_FIELD_NAMES": "id"
    }
```

**참고**  
`leads` 및 `customobjects` 엔터티의 경우 Adobe Marketo는 메타데이터를 동적으로 가져오는 엔드포인트를 제공하므로 Marketo API 응답에서 쓰기 가능한 필드를 식별할 수 있습니다.

# Adobe Marketo Engage 연결 옵션
<a name="adobe-marketo-engage-connection-options"></a>

다음은 Adobe Marketo Engage의 연결 옵션입니다.
+ `ENTITY_NAME`(문자열) - (필수) 읽기에 사용됩니다. Adobe Marketo Engage의 객체 이름입니다.
+ `API_VERSION`(문자열) - (필수) 읽기에 사용됩니다. 사용할 Adobe Marketo Engage Rest API 버전입니다. 예: v1.
+ `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 객체에 대해 선택할 열.
+ `FILTER_PREDICATE`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.
+ `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리.
+ `PARTITION_FIELD`(문자열) - 읽기에 사용됩니다. 쿼리 분할에 사용할 필드입니다.
+ `LOWER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 하한 값(경계 포함).
+ `UPPER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 상한 값(경계 제외).
+ `NUM_PARTITIONS`(정수) - 기본값: 1. 읽기에 사용됩니다. 읽을 파티션 수.
+ `TRANSFER_MODE`(문자열) - 기본값: SYNC. 비동기 읽기에 사용됩니다.
+ `WRITE_OPERATION`(문자열) - 기본값: INSERT. 쓰기에 사용됩니다. 값은 INSERT, UPDATE, UPSERT여야 합니다.
+ `ID_FIELD_NAMES`(문자열) - 기본값: null. UPDATE 및 UPSERT에 필요합니다.

# Adobe Marketo Engage 커넥터에 대한 제한 사항 및 참고 사항
<a name="adobe-marketo-engage-connector-limitations"></a>

다음은 Adobe Marketo Engage 커넥터의 제한 사항 또는 참고 사항입니다.
+ 'sinceDatetime' 및 'activityTypeId'는 동기화 활동 엔터티의 필수 필터 파라미터입니다.
+ 구독에는 하루에 50,000개의 API 직접 호출이 할당됩니다(오전 12:00 CST에 매일 재설정됨). Adobe Marketo Engage 구독의 일부로 추가 일일 용량을 구매할 수 있습니다. 자세한 내용은 [Adobe Marketo Rest API](https://experienceleague.adobe.com/en/docs/marketo-developer/marketo/rest/rest-api)를 참조하세요.
+ 날짜 범위 필터(`createdAt` 또는 `updatedAt`)의 최대 기간은 31일입니다. 자세한 내용은 [대량 추출 - Marketo 개발자](https://experienceleague.adobe.com/en/docs/marketo-developer/marketo/rest/bulk-extract/bulk-extract)를 참조하세요.
+ 구독에는 언제든지 대기열에 최대 10개의 대량 추출 작업이 할당됩니다. 자세한 내용은 [대량 추출 - Marketo 개발자](https://experienceleague.adobe.com/en/docs/marketo-developer/marketo/rest/bulk-extract/bulk-extract)를 참조하세요.
+ 기본적으로 추출 작업은 하루에 500MB로 제한됩니다(오전 12:00 CST에 매일 재설정됨). Adobe Marketo Engage 구독의 일부로 추가 일일 용량을 구매할 수 있습니다. 자세한 내용은 [대량 추출 - Marketo 개발자](https://experienceleague.adobe.com/en/docs/marketo-developer/marketo/rest/bulk-extract/bulk-extract)를 참조하세요.
+ 동시 내보내기 최대 작업 수는 2입니다. 자세한 내용은 [대량 추출 - Marketo 개발자](https://experienceleague.adobe.com/en/docs/marketo-developer/marketo/rest/bulk-extract/bulk-extract)를 참조하세요.
+ 대기열에 있는 내보내기 작업의 최대 수(현재 내보내는 작업 포함)는 10개입니다. 자세한 내용은 [대량 추출 - Marketo 개발자](https://experienceleague.adobe.com/en/docs/marketo-developer/marketo/rest/bulk-extract/bulk-extract)를 참조하세요.
+ 허용되는 최대 파일 크기는 대량 작업에서 추출할 수 있는 1GB입니다.
+ 비동기 작업이 생성되면 파일 보존 기간은 만료 7일 전입니다. 자세한 내용은 [대량 추출 - Marketo 개발자](https://experienceleague.adobe.com/en/docs/marketo-developer/marketo/rest/bulk-extract/bulk-extract)를 참조하세요.
+ `createdAt` 또는 `updatedAt`은 Async Leads 엔터티의 필수 필터 파라미터입니다.
+ `createdAt`은 비동기 활동 엔터티의 필수 필터 파라미터입니다.
+ `updatedAt`은 비동기 사용자 지정 객체 엔터티의 필수 필터 파라미터입니다.
+ AWS Glue SaaS 커넥터를 사용할 때 사용자는 부분 장애 발생 시 대상 SaaS 플랫폼에 쓰기 작업 중에 어떤 특정 레코드가 실패했는지 식별할 수 없습니다.
+ 동기화 쓰기 작업을 사용하는 경우 입력 파일에 null 값이 있는 모든 필드는 자동으로 삭제되고 SaaS 플랫폼으로 전송되지 않습니다.
+ 동기화 쓰기를 위해 배치에서 최대 300개의 레코드를 생성하거나 업데이트할 수 있습니다.

자세한 내용은 [Adobe Marketo Engage 통합 모범 사례](https://experienceleague.adobe.com/en/docs/marketo-developer/marketo/rest/marketo-integration-best-practices) 및 [대량 추출](https://https://experienceleague.adobe.com/en/docs/marketo-developer/marketo/rest/bulk-extract/bulk-activity-extract)을 참조하세요.

# AWS Glue Studio에서 Amazon Redshift에 연결
<a name="connecting-to-data-redshift"></a>

**참고**  
 AWS Glue for Spark를 사용하여 AWS Glue Studio 외부에 있는 Amazon Redshift 데이터베이스의 테이블에서 읽고 쓸 수 있습니다. 프로그래밍 방식으로 AWS Glue 작업을 통해 Amazon Redshift을(를) 구성하려면 [Redshift 연결](aws-glue-programming-etl-connect-redshift-home.md)을(를) 참조하세요.

 AWS Glue에서는 Amazon Redshift에 대한 기본 제공 지원을 제공합니다. AWS Glue Studio에서는 Amazon Redshift에 연결하고, 데이터 통합 작업을 작성하며, AWS Glue Studio 서버리스 Spark 런타임에서 실행할 수 있는 시각적 인터페이스를 제공합니다.

**Topics**
+ [Amazon Redshift 연결 생성](creating-redshift-connection.md)
+ [Amazon Redshift 소스 노드 생성](creating-redshift-source-node.md)
+ [Amazon Redshift 대상 노드 생성](creating-redshift-target-node.md)
+ [고급 옵션](creating-redshift-connection-advanced-options.md)

# Amazon Redshift 연결 생성
<a name="creating-redshift-connection"></a>

## 필요한 권한
<a name="creating-redshift-connection-permissions"></a>

 Amazon Redshift 클러스터와 Amazon Redshift 서버리스 환경을 사용하려면 추가 권한이 필요합니다. ETL 작업에 권한을 추가하는 방법에 대한 자세한 내용은 [ETL 작업에 필요한 IAM 권한 검토](https://docs.aws.amazon.com/glue/latest/ug/setting-up.html#getting-started-min-privs-job)를 참조하세요.
+  redshift:DescribeClusters 
+  redshift-serverless:ListWorkgroups 
+  redshift-serverless:ListNamespaces 

## 개요
<a name="w2aac25c27c13c11b5"></a>

 Amazon Redshift 연결을 추가할 때 AWS Glue Studio에서 **데이터 소스 - Redshift** 노드를 추가하면 기존 Amazon Redshift 연결을 선택하거나 새 연결을 생성할 수 있습니다.

 AWS Glue에서는 Amazon Redshift 클러스터와 Amazon Redshift 서버리스 환경을 모두 지원합니다. 연결을 생성할 때 Amazon Redshift 서버리스 환경은 연결 옵션 옆에 **서버리스** 레이블을 표시합니다.

 Amazon Redshift 연결을 생성하는 방법에 대한 자세한 내용은 [Amazon Redshift 간 데이터 이동](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-redshift.html#aws-glue-programming-etl-redshift-using)을 참조하세요.

# Amazon Redshift 소스 노드 생성
<a name="creating-redshift-source-node"></a>

## 필요한 권한
<a name="creating-redshift-source-node-permissions"></a>

 Amazon Redshift 데이터 소스를 사용하는 AWS Glue Studio 작업에는 추가 권한이 필요합니다. ETL 작업에 권한을 추가하는 방법에 대한 자세한 내용은 [ETL 작업에 필요한 IAM 권한 검토](https://docs.aws.amazon.com/glue/latest/ug/setting-up.html#getting-started-min-privs-job)를 참조하세요.

 Amazon Redshift 연결을 사용하려면 다음 권한이 필요합니다.
+  redshift-data:ListSchemas 
+  redshift-data:ListTables 
+  redshift-data:DescribeTable 
+  redshift-data:ExecuteStatement 
+  redshift-data:DescribeStatement 
+  redshift-data:GetStatementResult 

## Amazon Redshift 데이터 소스 추가
<a name="creating-redshift-source-node-add"></a>

****데이터 소스 - Amazon Redshift** 노드를 추가하려면:**

1.  Amazon Redshift 액세스 유형을 선택합니다.
   +  직접 데이터 연결(권장) - Amazon Redshift 데이터에 직접 액세스하려면 이 옵션을 선택합니다. 이 옵션은 권장 옵션이며 기본값이기도 합니다.
   +  Data Catalog tables - 사용하려는 데이터 카탈로그 테이블이 있는 경우 이 옵션을 선택합니다.

1.  직접 데이터 연결을 선택하는 경우 Amazon Redshift 데이터 소스의 연결을 선택합니다. 이 경우 연결이 이미 존재하며 기존 연결 중에서 선택할 수 있다고 가정합니다. 연결을 생성해야 하는 경우 **Redshift 연결 생성**을 선택합니다. 자세한 내용은 [커넥터 및 연결 사용 개요](https://docs.aws.amazon.com/glue/latest/ug/connectors-chapter.html#using-connectors-overview)를 참조하세요.

    연결을 선택한 후에는 **속성 보기**를 클릭하여 연결 속성을 볼 수 있습니다. URL, 보안 그룹, 서브넷, 가용 영역, 설명, 생성 날짜(UTC) 및 최종 업데이트(UTC) 타임스탬프를 비롯한 연결 정보가 표시됩니다.

1.  다음과 같은 Amazon Redshift 소스 옵션을 선택합니다.
   +  **단일 테이블 선택** - 단일 Amazon Redshift 테이블에서 액세스하려는 데이터가 들어 있는 테이블입니다.
   +  **사용자 지정 쿼리 입력** - 사용자 지정 쿼리를 기반으로 여러 Amazon Redshift 테이블의 데이터 세트에 액세스할 수 있습니다.

1.  단일 테이블을 선택한 경우 Amazon Redshift 스키마를 선택합니다. 선택할 수 있는 스키마 목록은 선택한 테이블에 따라 결정됩니다.

    또는 **사용자 지정 쿼리 입력**을 선택합니다. 여러 Amazon Redshift 테이블에서 사용자 지정 데이터 세트에 액세스하려면 이 옵션을 선택합니다. 이 옵션을 선택하는 경우 Amazon Redshift 쿼리를 입력합니다.

    Amazon Redshift 서버리스 환경에 연결할 때 사용자 지정 쿼리에 다음 권한을 추가합니다.

   ```
               GRANT SELECT ON ALL TABLES IN <schema> TO PUBLIC
   ```

    **스키마 추론**을 선택하여 입력한 쿼리를 기반으로 스키마를 읽을 수 있습니다. **Redshift 쿼리 편집기 열기**를 선택하여 Amazon Redshift 쿼리를 입력할 수도 있습니다. 자세한 내용은 [쿼리 편집기를 사용하여 데이터베이스 쿼리](https://docs.aws.amazon.com/redshift/latest/mgmt/query-editor.html)을 참조하세요.

1.  **성능 및 보안**에서 Amazon S3 스테이징 디렉터리와 IAM 역할을 선택합니다.
   +  **Amazon S3 스테이징 디렉터리** - 데이터를 임시로 스테이징할 Amazon S3 위치를 선택합니다.
   +  **IAM 역할** - 선택한 Amazon S3 위치에 기록할 수 있는 IAM 역할을 선택합니다.

1.  **사용자 지정 Redshift 파라미터 - 선택 사항**에서 파라미터와 값을 입력합니다.

# Amazon Redshift 대상 노드 생성
<a name="creating-redshift-target-node"></a>

## 필요한 권한
<a name="creating-redshift-target-node-permissions"></a>

 Amazon Redshift 데이터 대상을 사용하는 AWS Glue Studio 작업에는 추가 권한이 필요합니다. ETL 작업에 권한을 추가하는 방법에 대한 자세한 내용은 [ETL 작업에 필요한 IAM 권한 검토](https://docs.aws.amazon.com/glue/latest/ug/setting-up.html#getting-started-min-privs-job)를 참조하세요.

 Amazon Redshift 연결을 사용하려면 다음 권한이 필요합니다.
+  redshift-data:ListSchemas 
+  redshift-data:ListTables 

## Amazon Redshift 대상 노드 추가
<a name="w2aac25c27c13c15b5"></a>

**Amazon Redshift 대상 노드를 생성하려면:**

1.  기존 Amazon Redshift 테이블을 대상으로 선택하거나 새 테이블 이름을 입력합니다.

1.  **데이터 대상 - Redshift** 대상 노드를 사용하는 경우 다음 옵션 중에서 선택할 수 있습니다.
   +  **추가** - 테이블이 이미 있는 경우 모든 새 데이터를 테이블에 삽입으로 덤프합니다. 테이블이 없으면 새로 생성한 후 새 데이터를 모두 삽입합니다.

      또한 대상 테이블의 기존 레코드를 업데이트(업서트)하려면 상자를 선택합니다. 테이블이 먼저 있어야 합니다. 그렇지 않으면 작업에 실패합니다.
   +  **병합** - AWS Glue는 사용자가 지정한 조건에 따라 대상 테이블에 데이터를 추가하거나 업데이트합니다.
**참고**  
 AWS Glue에서 병합 작업을 사용하려면 Amazon Redshift 병합 기능을 활성화해야 합니다. Amazon Redshift 인스턴스에 대해 병합을 활성화하는 방법에 대한 지침은 [MERGE(평가판)](https://docs.aws.amazon.com/redshift/latest/dg/r_MERGE.html)를 참조하세요.

      다음과 같은 옵션을 선택합니다.
     + **키 및 간단한 작업 선택** - 소스 데이터와 대상 데이터 세트 사이에서 일치하는 키로 사용할 열을 선택합니다.

       일치하는 경우 다음 옵션을 지정합니다.
       + 대상 데이터 세트의 레코드를 소스의 데이터로 업데이트합니다.
       + 대상 데이터 세트에서 레코드를 삭제합니다.

       일치하지 않는 경우 다음 옵션을 지정합니다.
       + 소스 데이터를 대상 데이터 세트에 새 행으로 삽입합니다.
       + 아무 작업 안 함.
     + **사용자 지정 MERGE 명령문 입력** - 그런 다음 **병합 명령문 검증**을 선택하여 명령문이 유효한지 여부를 검증할 수 있습니다.
   +  **잘라내기** - 테이블이 이미 있는 경우 먼저 대상 테이블의 콘텐츠를 지워서 테이블 데이터를 잘라냅니다. 잘라내기에 성공하면 모든 데이터를 삽입합니다. 테이블이 없는 경우 테이블을 생성하고 모든 데이터를 삽입합니다. 잘라내기에 실패하면 작업에 실패합니다.
   +  **삭제** - 테이블이 이미 있는 경우 테이블 메타데이터와 데이터를 삭제합니다. 삭제에 성공하면 모든 데이터를 삽입합니다. 테이블이 없는 경우 테이블을 생성하고 모든 데이터를 삽입합니다. 삭제에 실패하면 작업에 실패합니다.
   +  **생성** - 기본 이름을 사용하여 새 테이블을 생성합니다. 테이블 이름이 이미 있는 경우 고유성을 유지하기 위해 이름에 `job_datetime`의 이름 접미사를 사용하는 새 테이블을 생성합니다. 그러면 모든 데이터가 새 테이블에 삽입됩니다. 테이블이 있는 경우 최종 테이블 이름에는 접미사가 추가됩니다. 테이블이 없는 경우 테이블이 생성됩니다. 어느 경우든 새 테이블이 생성됩니다.

# 고급 옵션
<a name="creating-redshift-connection-advanced-options"></a>

 [Using the Amazon Redshift Spark connector on AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-redshift.html#aws-glue-programming-etl-redshift-using)를 참조하세요.

# 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 Management 콘솔을 사용하는 경우 AWS Glue 리소스에 대한 전체 액세스 권한을 부여합니다. 이 정책에 지정된 리소스의 이름 변환을 따르면 사용자는 콘솔 전체 용량을 소유합니다. 이 정책은 보통 AWS Glue 콘솔의 사용자에게 해당됩니다.

# Asana 구성
<a name="asana-configuring"></a>

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

## 최소 요구 사항
<a name="asana-configuring-min-requirements"></a>
+ 이메일과 암호가 있는 Asana 계정이 있습니다. 계정 생성에 대한 자세한 내용은 [Asana 계정 생성](asana-create-account.md)을 참조하세요.
+ AWS Glue에 대한 서비스 액세스 권한으로 AWS 계정을 생성해야 합니다.
+ 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)을 참조하세요.

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

# Asana 연결 구성
<a name="asana-configuring-connections"></a>

Asana는 `OAuth2`에 대한 `AUTHORIZATION_CODE` 권한 부여 유형을 지원합니다.

이 권한 부여 유형은 사용자를 인증하기 위해 사용자를 서드파티 권한 부여 서버로 리디렉션하는 방식에 의존하므로 '3각' `OAuth`로 간주됩니다. 사용자는 AWS Glue 콘솔을 통해 연결을 생성할 때에도 Asana에서 자체 연결된 앱을 생성하고 자체 클라이언트 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의 **데이터 연결**에서 아래 단계에 따라 연결을 생성합니다.

   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. 토큰을 넣기 위해 AWS Glue에서 이 연결에 사용할 `secretName`을 선택합니다.

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

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

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

 **사전 조건** 

읽으려는 Asana 객체입니다. 사용 가능한 엔터티를 확인하려면 아래 지원되는 엔터티 테이블을 참조하세요.

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


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
|  워크스페이스  | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| 태그 | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| User | 아니요 | 예 | 아니요 | 예 | 아니요 | 
|  Portfolio  | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| Team | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| Project | 예 | 예 | 아니요 | 예 | 아니요 | 
| Section | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| Task  | 예 | 아니요 | 아니요 | 예 | 예 | 
| Goal | 예 | 예 | 아니요 | 예 | 아니요 | 
|  AuditLogEvent  | 예 | 예 | 아니요 | 예 | 아니요 | 
|  Status Update  | 예 | 예 | 아니요 | 예 | 아니요 | 
|  Custom Field  | 아니요 | 예 | 아니요 | 예 | 아니요 | 
|  Project Brief  | 예 | 아니요 | 아니요 | 예 | 예 | 

 **예제** 

```
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 엔터티 및 필드 세부 정보** 
+ [Workspace](https://developers.asana.com/docs/workspaces)
+ [태그](https://developers.asana.com/docs/tags)
+ [User](https://developers.asana.com/docs/users)
+ [Portfolio](https://developers.asana.com/docs/portfolios)
+ [Team](https://developers.asana.com/docs/teams)
+ [Project](https://developers.asana.com/docs/get-all-projects-in-a-workspace)
+ [Section](https://developers.asana.com/docs/get-sections-in-a-project)
+ [Task](https://developers.asana.com/docs/search-tasks-in-a-workspace) 
+ [Goal](https://developers.asana.com/docs/get-goals)
+ [AuditLogEvent](https://developers.asana.com/docs/audit-log-api)
+ [Status Update](https://developers.asana.com/reference/status-updates)
+ [Custom Field](https://developers.asana.com/reference/custom-fields)
+ [Project Brief](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`: 파티션 수.

 엔터티 수준의 분할 필드 지원 세부 정보는 다음 표에 캡처되어 있습니다.


| 엔터티 이름 | 분할 필드 | 데이터 형식 | 
| --- | --- | --- | 
| Task |  created\$1at  | DateTime | 
| Task |  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`(문자열) - (필수) 읽기/쓰기에 사용됩니다. Asana에서의 객체 이름입니다.
+  `API_VERSION`(문자열) - (필수) 읽기/쓰기에 사용됩니다. 사용할 Asana Rest API 버전입니다. 예: 1.0.
+  `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 객체에 대해 선택할 열.
+  `FILTER_PREDICATE`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.
+  `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리.
+ `PARTITION_FIELD`(문자열) - 읽기에 사용됩니다. 쿼리 분할에 사용할 필드입니다.
+  `LOWER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 하한 값(경계 포함).
+  `UPPER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 상한 값(경계 제외).
+  `NUM_PARTITIONS`(정수) - 기본값: 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을 추가합니다.
**참고**  
`https://{aws-region-code}.console.aws.amazon.com/gluestudio/oauth`의 이 형식을 사용하여 리디렉션 URI를 입력합니다. 예시: 미국 동부(버지니아 북부)의 경우 `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 엔드포인트에만 액세스할 수 있습니다. 이러한 엔드포인트에 액세스하려면 서비스 계정의 개인 액세스 토큰으로 인증해야 합니다.
+ Goal 엔터티는 프리미엄 요금제 이상이 있는 사용자 계정에서만 액세스할 수 있습니다.
+ `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`(데이터 유형: 날짜)으로, `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 Output:
  + partition1에서는 due\$1date가 2019-09-14 및 2019-09-15인 데이터를 가져옵니다.
  + partition2에서는 다른 데이터와 함께 due\$1date가 2019-09-15(partition1에서 가져온 데이터)인 동일한 데이터를 가져와 데이터 중복을 일으킵니다.
+ SaaS 끝에서 잘못된 요청 오류가 발생하므로 동일한 필드에서 필터링 및 분할을 지원할 수 없습니다.
+ 작업 엔터티에는 필터 기준에 최소 1개의 필드가 필요합니다. Asana에는 시간 기반 필드를 기반으로 레코드를 정렬하지 않고서는 페이지 매김이 식별되지 않는 제한이 있습니다. 따라서 Created\$1at 필드는 페이지 매김과 함께 다음 레코드 세트를 구분하는 데 사용됩니다. Created\$1at 필드는 필터에서 필수로 표시되며, 제공되지 않은 경우 기본값은 2000-01-01T00:00:00Z입니다. 페이지 매김에 대한 자세한 내용은 [작업 영역의 작업](https://developers.asana.com/reference/searchtasksforworkspace)을 참조하세요.

# AWS Glue Studio에서 Azure Cosmos DB에 연결
<a name="connecting-to-data-azurecosmos"></a>

 AWS Glue에서는 Azure Cosmos DB를 기본으로 지원합니다. AWS Glue Studio에서는 NoSQL의 Azure Cosmos DB에 연결하고, 데이터 통합 작업을 작성하며, AWS Glue Studio 서버리스 Spark 런타임에서 실행할 수 있는 시각적 인터페이스를 제공합니다.

**Topics**
+ [Azure Cosmos DB 연결 생성](creating-azurecosmos-connection.md)
+ [Azure Cosmos DB 소스 노드 생성](creating-azurecosmos-source-node.md)
+ [Azure Cosmos DB 대상 노드 생성](creating-azurecosmos-target-node.md)
+ [고급 옵션](#creating-azurecosmos-connection-advanced-options)

# Azure Cosmos DB 연결 생성
<a name="creating-azurecosmos-connection"></a>

**사전 조건** 
+ Azure에서는, AWS Glue, `cosmosKey`에서 사용할 Azure Cosmos DB 키를 식별하거나 생성해야 합니다. 자세한 내용은 Azure 설명서의 [Azure Cosmos DB의 데이터에 대한 보안 액세스](https://learn.microsoft.com/en-us/azure/cosmos-db/secure-access-to-data?tabs=using-primary-key)를 참조하십시오.

**Azure Cosmos DB에 대한 연결 구성 방법:**

1. AWS Secrets Manager에서 Azure Cosmos DB 키를 사용하여 보안 암호를 생성합니다. Secrets Manager에서 보안 암호를 생성하려면 AWS Secrets Manager 설명서의 [Create an AWS Secrets Manager secret](https://docs.aws.amazon.com//secretsmanager/latest/userguide/create_secret.html)에서 제공하는 자습서를 따릅니다. 보안 암호를 생성한 후에는 다음 단계를 위해 보안 암호 이름, *secretName*을 유지합니다.
   + **키/값 페어**를 선택하면 값 *cosmosKey*가 포함된 키 `spark.cosmos.accountKey`에 대한 페어를 생성합니다.

1. AWS Glue 콘솔에서 [AWS Glue 연결 추가](console-connections.md)의 단계에 따라 연결을 생성합니다. 연결을 생성한 후에는 AWS Glue에서 이용하기 위해 연결 이름 *connectionName*을 유지합니다.
   + **연결 유형**을 선택할 때는 Azure Cosmos DB를 선택합니다.
   + **AWS 보안 암호**를 선택할 때 *secretName*을 입력합니다.

# Azure Cosmos DB 소스 노드 생성
<a name="creating-azurecosmos-source-node"></a>

## 필수 전제 조건
<a name="creating-azurecosmos-source-node-prerequisites"></a>
+ 이전 섹션 [Azure Cosmos DB 연결 생성](creating-azurecosmos-connection.md)에서 설명한 대로 AWS Secrets Manager 암호로 구성된 AWS Glue Azure Cosmos DB 연결입니다
+ 연결에 사용되는 보안 암호를 읽을 작업에 대한 적절한 권한.
+ 읽으려는 NoSQL 컨테이너용 Azure Cosmos 데이터베이스. 컨테이너의 식별 정보가 필요합니다.

  NoSQL용 Azure Cosmos 컨테이너는 해당 데이터베이스 및 컨테이너로 식별됩니다. NoSQL API용 Azure Cosmos에 연결할 때 데이터베이스, *cosmosDBName*, 및 컨테이너너, *cosmosContainerName*, 이름을 제공해야 합니다.

## Azure Cosmos DB 데이터 소스 추가
<a name="creating-azurecosmos-source-node-add"></a>

****데이터 소스 - Azure Cosmos DB** 노드 추가하는 방법:**

1.  Azure Cosmos DB 데이터 소스의 연결을 선택합니다. 생성했으므로 드롭다운에서 사용할 수 있을 것입니다. 연결을 생성해야 하는 경우 **Azure Cosmos DB 연결 생성**을 선택합니다. 자세한 내용은 이전[Azure Cosmos DB 연결 생성](creating-azurecosmos-connection.md) 섹션을 참조하세요.

    연결을 선택한 후에는 **속성 보기**를 클릭하여 연결 속성을 볼 수 있습니다.

1. **Cosmos DB 데이터베이스 이름** 선택 - 읽으려는 *데이터베이스의 이름인 cosmosDBName*을 입력합니다.

1. **Azure Cosmos DB 컨테이너** 선택 - 읽으려는 컨테이너의 이름인 *cosmosContainerName*을 입력합니다.

1. 선택적으로 **Azure Cosmos DB 사용자 지정 쿼리**를 선택합니다. Azure Cosmos DB에서 특정 정보를 검색할 수 있는 SQL SELECT 쿼리를 제공합니다.

1.  **사용자 지정 Azure Cosmos 속성**(선택 사항)에서 필요한 경우 파라미터와 값을 입력합니다.

# Azure Cosmos DB 대상 노드 생성
<a name="creating-azurecosmos-target-node"></a>

## 필수 전제 조건
<a name="creating-azurecosmos-target-node-prerequisites"></a>
+ 이전 섹션 [Azure Cosmos DB 연결 생성](creating-azurecosmos-connection.md)에서 설명한 대로 AWS Secrets Manager 암호로 구성된 AWS Glue Azure Cosmos DB 연결입니다
+ 연결에 사용되는 보안 암호를 읽을 작업에 대한 적절한 권한.
+ 쓰려는 Azure Cosmos DB 테이블. 컨테이너의 식별 정보가 필요합니다. **연결 방법을 호출하기 전에 컨테이너를 만들어야 합니다.**

  NoSQL용 Azure Cosmos 컨테이너는 해당 데이터베이스 및 컨테이너로 식별됩니다. NoSQL API용 Azure Cosmos에 연결할 때 데이터베이스, *cosmosDBName*, 및 컨테이너너, *cosmosContainerName*, 이름을 제공해야 합니다.

## Azure Cosmos DB 데이터 대상 추가
<a name="creating-azurecosmos-target-node-add"></a>

****데이터 대상 - Azure Cosmos DB** 노드 추가 방법:**

1.  Azure Cosmos DB 데이터 소스의 연결을 선택합니다. 생성했으므로 드롭다운에서 사용할 수 있을 것입니다. 연결을 생성해야 하는 경우 **Azure Cosmos DB 연결 생성**을 선택합니다. 자세한 내용은 이전[Azure Cosmos DB 연결 생성](creating-azurecosmos-connection.md) 섹션을 참조하세요.

    연결을 선택한 후에는 **속성 보기**를 클릭하여 연결 속성을 볼 수 있습니다.

1. **Cosmos DB 데이터베이스 이름** 선택 - 읽으려는 *데이터베이스의 이름인 cosmosDBName*을 입력합니다.

1. **Azure Cosmos DB 컨테이너** 선택 - 읽으려는 컨테이너의 이름인 *cosmosContainerName*을 입력합니다.

1.  **사용자 지정 Azure Cosmos 속성**(선택 사항)에서 필요한 경우 파라미터와 값을 입력합니다.

## 고급 옵션
<a name="creating-azurecosmos-connection-advanced-options"></a>

Azure Cosmos DB 노드를 생성할 때 고급 옵션을 제공할 수 있습니다. 이 옵션은 Spark 스크립트에 대한 AWS Glue를 프로그래밍할 때 사용할 수 있는 옵션과 동일합니다.

[Azure Cosmos DB 연결](aws-glue-programming-etl-connect-azurecosmos-home.md)를 참조하세요.

# AWS Glue Studio에서 Azure SQL에 연결
<a name="connecting-to-data-azuresql"></a>

 AWS Glue에서는 Azure SQL을 기본으로 지원합니다. AWS Glue Studio에서는 Azure SQL에 연결하고, 데이터 통합 작업을 작성하며, AWS Glue Studio 서버리스 Spark 런타임에서 실행할 수 있는 시각적 인터페이스를 제공합니다.

**Topics**
+ [Azure SQL 연결 만들기](creating-azuresql-connection.md)
+ [Azure SQL 소스 노드 생성](creating-azuresql-source-node.md)
+ [Azure SQL 대상 노드 생성](creating-azuresql-target-node.md)
+ [고급 옵션](#creating-azuresql-connection-advanced-options)

# Azure SQL 연결 만들기
<a name="creating-azuresql-connection"></a>

AWS Glue에서 Azure SQL에 연결하려면 Azure SQL 보안 인증 정보를 만들어 AWS Secrets Manager 암호에 저장한 다음 해당 암호를 Azure SQL AWS Glue 연결에 연결해야 합니다.

**Azure SQL에 대한 연결을 구성하는 방법:**

1. AWS Secrets Manager에서 Azure SQL 보안 인증을 사용하여 보안 암호를 생성합니다. Secrets Manager에서 보안 암호를 생성하려면 AWS Secrets Manager 설명서의 [Create an AWS Secrets Manager secret](https://docs.aws.amazon.com//secretsmanager/latest/userguide/create_secret.html)에서 제공하는 자습서를 따릅니다. 보안 암호를 생성한 후에는 다음 단계를 위해 보안 암호 이름, *secretName*을 유지합니다.
   + **키/값 페어**를 선택하면 값 *azuresqlUsername*이 포함된 키 `user`에 대한 페어를 생성합니다.
   + **키/값 페어**를 선택하면 값 *azuresqlPassword*가 포함된 키 `password`에 대한 페어를 생성합니다.

1. AWS Glue 콘솔에서 [AWS Glue 연결 추가](console-connections.md)의 단계에 따라 연결을 생성합니다. 연결을 생성한 후에는 AWS Glue에서 이용하기 위해 연결 이름 *connectionName*을 유지합니다.
   + **연결 유형**을 선택할 때 Azure SQL를 선택합니다.
   + **Azure SQL URL을** 제공할 때는 JDBC 엔드포인트 URL을 제공하십시오.

      목록은 `jdbc:sqlserver://databaseServerName:databasePort;databaseName=azuresqlDBname;` 형식이어야 합니다.

     AWS Glue는 다음 URL 속성이 필요합니다.
     + `databaseName` - 연결할 Azure SQL의 기본 데이터베이스입니다.

     Azure SQL 관리형 인스턴스용 JDBC URL에 대한 자세한 내용은 [Microsoft 설명서](https://learn.microsoft.com/en-us/sql/connect/jdbc/building-the-connection-url?view=azuresqldb-mi-current)를 참조하십시오.
   + **AWS 보안 암호**를 선택할 때 *secretName*을 입력합니다.

# Azure SQL 소스 노드 생성
<a name="creating-azuresql-source-node"></a>

## 필수 전제 조건
<a name="creating-azuresql-source-node-prerequisites"></a>
+ 이전 섹션 [Azure SQL 연결 만들기](creating-azuresql-connection.md)에서 설명한 대로 AWS Secrets Manager 암호로 구성된 AWS Glue Azure SQL 연결입니다.
+ 연결에 사용되는 보안 암호를 읽을 작업에 대한 적절한 권한.
+ 읽으려는 Azure SQL 테이블. *tableName*.

  Azure SQL 테이블은 데이터베이스, 스키마 및 테이블 이름으로 식별됩니다. Azure SQL에 연결할 때 데이터베이스 이름과 테이블 이름을 제공해야 합니다. 스키마가 기본값인 "public"이 아닌 경우에도 스키마를 제공해야 합니다. 데이터베이스는 *connectionName*의 URL 속성을, `dbtable`을 통해 스키마 및 테이블 이름을 제공 받습니다.

## Azure SQL 데이터 소스 추가
<a name="creating-azuresql-source-node-add"></a>

****데이터 소스 - Azure SQL** 노드 추가 방법:**

1.  Azure SQL 데이터 소스의 연결을 선택합니다. 생성했으므로 드롭다운에서 사용할 수 있을 것입니다. 연결을 생성해야 하는 경우 **Azure SQL 연결 생성**을 선택합니다. 자세한 내용은 이전[Azure SQL 연결 만들기](creating-azuresql-connection.md) 섹션을 참조하세요.

    연결을 선택한 후에는 **속성 보기**를 클릭하여 연결 속성을 볼 수 있습니다.

1.  **Azure SQL 소스** 옵션을 선택합니다.
   +  **단일 테이블 선택** - 단일 테이블에서 모든 데이터에 액세스할 수 있습니다.
   +  **사용자 지정 쿼리 입력** - 사용자 지정 쿼리를 기반으로 여러 테이블의 데이터 세트에 액세스할 수 있습니다.

1.  단일 테이블을 선택한 경우 *tableName*을 입력합니다.

    **사용자 지정 쿼리 입력**을 선택한 경우 TransactSQL SELECT 쿼리를 입력합니다.

1.  **사용자 지정 Azure SQL 속성**에서 필요한 경우 파라미터와 값을 입력합니다.

# Azure SQL 대상 노드 생성
<a name="creating-azuresql-target-node"></a>

## 필수 전제 조건
<a name="creating-azuresql-target-node-prerequisites"></a>
+ 이전 섹션 [Azure SQL 연결 만들기](creating-azuresql-connection.md)에서 설명한 대로 AWS Secrets Manager 암호로 구성된 AWS Glue Azure SQL 연결입니다.
+ 연결에 사용되는 보안 암호를 읽을 작업에 대한 적절한 권한.
+ 쓰려는 Azure SQL 테이블, *tableName*.

  Azure SQL 테이블은 데이터베이스, 스키마 및 테이블 이름으로 식별됩니다. Azure SQL에 연결할 때 데이터베이스 이름과 테이블 이름을 제공해야 합니다. 스키마가 기본값인 "public"이 아닌 경우에도 스키마를 제공해야 합니다. 데이터베이스는 *connectionName*의 URL 속성을, `dbtable`을 통해 스키마 및 테이블 이름을 제공 받습니다.

## Azure SQL 데이터 대상 추가
<a name="creating-azuresql-target-node-add"></a>

****데이터 대상 - Azure SQL 노드** 추가 방법:**

1.  Azure SQL 데이터 소스의 연결을 선택합니다. 생성했으므로 드롭다운에서 사용할 수 있을 것입니다. 연결을 생성해야 하는 경우 **Azure SQL 연결 생성**을 선택합니다. 자세한 내용은 이전[Azure SQL 연결 만들기](creating-azuresql-connection.md) 섹션을 참조하세요.

    연결을 선택한 후에는 **속성 보기**를 클릭하여 연결 속성을 볼 수 있습니다.

1. *tableName*을 제공하여 **테이블 이름**을 구성합니다.

1.  **사용자 지정 Azure SQL 속성**에서 필요한 경우 파라미터와 값을 입력합니다.

## 고급 옵션
<a name="creating-azuresql-connection-advanced-options"></a>

Azure SQL 노드를 생성할 때 고급 옵션을 제공할 수 있습니다. 이 옵션은 Spark 스크립트에 대한 AWS Glue를 프로그래밍할 때 사용할 수 있는 옵션과 동일합니다.

[Azure SQL 연결](aws-glue-programming-etl-connect-azuresql-home.md)를 참조하세요.

# Blackbaud Raiser's Edge NXT에 연결
<a name="connecting-to-data-blackbaud"></a>

Blackbaud Raiser’s Edge NXT는 비영리 단체와 사회적 선행 커뮤니티를 위해 특별히 구축된 포괄적인 클라우드 기반 기부금 모금 및 기부자 관리 소프트웨어 솔루션입니다. 이 커넥터는 Blackbaud Raiser’s Edge NXT의 SKY API를 기반으로 구축되었으며, Raisers Edge NXT 내 엔터티를 관리하는 데 도움이 되는 작업을 제공합니다.

**Topics**
+ [AWS Glue의 Blackbaud Raiser's Edge NXT 지원](blackbaud-support.md)
+ [연결을 생성하고 사용하기 위한 API 작업이 포함된 정책](blackbaud-configuring-iam-permissions.md)
+ [Blackbaud Raiser’s Edge NXT 구성](blackbaud-configuring.md)
+ [Blackbaud Raiser’s Edge NXT 연결 구성](blackbaud-configuring-connections.md)
+ [Blackbaud Raiser’s Edge NXT 엔터티에서 읽기](blackbaud-reading-from-entities.md)
+ [Blackbaud Raiser’s Edge NXT 연결 옵션](blackbaud-connection-options.md)
+ [Blackbaud Raiser’s Edge NXT 제한 사항](blackbaud-connection-limitations.md)

# AWS Glue의 Blackbaud Raiser's Edge NXT 지원
<a name="blackbaud-support"></a>

AWS Glue는 다음과 같이 Blackbaud Raiser's Edge NXT를 지원합니다.

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

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

**지원되는 Blackbaud Raiser’s Edge NXT API 버전**  
다음 Blackbaud Raiser’s Edge NXT API 버전이 지원됩니다.
+ v1

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

# Blackbaud Raiser’s Edge NXT 구성
<a name="blackbaud-configuring"></a>

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

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

다음은 최소 요구 사항입니다.
+ Blackbaud Raiser’s Edge NXT 계정이 있습니다.
+ API에 액세스하기 위해 적절한 읽기/쓰기 범위가 할당된 Blackbaud Raiser’s Edge NXT 계정에서 액세스 토큰을 생성했습니다. 자세한 내용은 [Authorization](https://developer.blackbaud.com/skyapi/docs/authorization)을 참조하세요.

이러한 요구 사항을 충족하면 Blackbaud Raiser’s Edge NXT 계정에 AWS Glue를 연결할 준비가 된 것입니다.

# Blackbaud Raiser’s Edge NXT 연결 구성
<a name="blackbaud-configuring-connections"></a>

Blackbaud Raiser’s Edge NXT는 OAuth2에 대한 AUTHORIZATION\$1CODE 권한 부여 유형을 지원합니다.
+ 이 권한 부여 유형은 사용자를 인증하기 위해 사용자를 서드파티 권한 부여 서버로 리디렉션하는 방식에 의존하므로 '3각' OAuth로 간주됩니다. AWS Glue 콘솔을 통해 연결을 생성할 때 사용됩니다. AWS Glue 콘솔은 사용자를 Blackbaud Raiser’s Edge NXT로 리디렉션합니다. 사용자가 로그인하고 Blackbaud Raiser’s Edge NXT 인스턴스에 액세스하도록 요청된 권한을 AWS Glue에 허용해야 합니다.
+ 사용자는 AWS Glue 콘솔을 통해 연결을 생성할 때에도 Blackbaud Raiser’s Edge NXT에서 자체 연결된 앱을 생성하고 자체 클라이언트 ID, 구독 키 및 인스턴스 URL을 제공하기로 선택할 수 있습니다. 이 시나리오에서는 여전히 Blackbaud Raiser’s Edge NXT로 리디렉션되어 로그인하고 리소스에 액세스할 수 있는 권한을 AWS Glue에 부여합니다.
+ 이 권한 부여 유형은 새로 고침 토큰과 액세스 토큰을 생성합니다. 액세스 토큰은 수명이 짧으며 새로 고침 토큰을 사용하여 사용자 상호 작용 없이 자동으로 새로 고칠 수 있습니다.
+ 권한 부여 코드 OAuth 흐름을 위한 연결된 앱 생성에 대한 공개 Blackbaud Raiser’s Edge NXT 설명서는 [Authorization](https://developer.blackbaud.com/skyapi/docs/authorization)을 참조하세요.

다음 단계를 따라 Blackbaud Raiser’s Edge NXT 연결을 구성합니다.

1. AWS Secrets Manager에서 다음 세부 정보로 보안 암호를 생성합니다.

   1. 고객 관리형 연결된 앱의 경우 보안 암호는 키 역할을 하는 `USER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET`과 함께 연결된 앱 API를 포함해야 합니다.

   1. 참고: AWS Glue에서 연결의 보안 암호를 생성해야 합니다.

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

   1. **데이터 소스**를 선택할 때 Blackbaud Raiser’s Edge NXT를 선택합니다.

   1. 연결하려는 Blackbaud Raiser’s Edge NXT 계정의 `INSTANCE_URL`을 제공합니다.

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

   1. 계정과 연결된 구독 키를 입력합니다.

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

# Blackbaud Raiser’s Edge NXT 엔터티에서 읽기
<a name="blackbaud-reading-from-entities"></a>

**사전 조건**

읽으려는 Blackbaud Raiser’s Edge NXT 객체. 객체 이름이 필요합니다.

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


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| Constituent Address | 예 | 예 | 아니요 | 예 | 예 | 
| Constituent Education | 예 | 예 | 아니요 | 예 | 예 | 
| Constituent Email address | 예 | 예 | 아니요 | 예 | 예 | 
| Constituent Phone | 예 | 예 | 아니요 | 예 | 예 | 
| Constituent Note | 예 | 예 | 아니요 | 예 | 예 | 
| Constituent Relationship | 예 | 예 | 아니요 | 예 | 예 | 
| Constituent Online presence | 예 | 예 | 아니요 | 예 | 예 | 
| 기회 | 예 | 예 | 아니요 | 예 | 예 | 
| Appeal | 예 | 예 | 아니요 | 예 | 예 | 
| 캠페인 | 예 | 예 | 아니요 | 예 | 예 | 
| Fund | 예 | 예 | 아니요 | 예 | 예 | 
| Package | 예 | 예 | 아니요 | 예 | 예 | 
| Gift Batch | 예 | 예 | 아니요 | 예 | 아니요 | 
| Event Participant | 예 | 예 | 예 | 예 | 예 | 
| Constituent Fundraiser Assignment | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Gift | 예 | 예 | 예 | 예 | 예 | 
| 멤버십 | 예 | 예 | 아니요 | 예 | 예 | 
| 작업 | 예 | 예 | 아니요 | 예 | 아니요 | 
| Constituent | 예 | 예 | 예 | 예 | 예 | 
| Constituent Goods | 예 | 예 | 아니요 | 예 | 예 | 
| Event | 예 | 예 | 예 | 예 | 예 | 
| Gift custom field | 예 | 예 | 아니요 | 예 | 예 | 

**예시:**

```
blackbaud_read = glueContext.create_dynamic_frame.from_options(
    connection_type="BLACKBAUD",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "entityName",
        "API_VERSION": "v1",
        "SUBSCRIPTION_KEY": <Subscription key associated with one's developer account>
    }
```

## Blackbaud Raiser’s Edge NXT 엔터티 및 필드 세부 정보
<a name="blackbaud-reading-entity-field-details"></a>

엔터티 및 필드 세부 정보에 대한 자세한 내용은 다음을 참조하세요.
+ [작업](https://developer.blackbaud.com/skyapi/renxt/constituent/entities#Action)
+ [Constituent](https://developer.blackbaud.com/skyapi/renxt/constituent/entities#Constituent)
+ [Constituent Address](https://developer.blackbaud.com/skyapi/renxt/constituent/entities#Address)
+ [Constituent Membership](https://developer.blackbaud.com/skyapi/renxt/constituent/entities#Membership)
+ [Constituent Fundraiser Assignment](https://developer.blackbaud.com/skyapi/renxt/constituent/entities#FundraiserAssignment)
+ [Constituent Education](https://developer.blackbaud.com/skyapi/renxt/constituent/entities#Education)
+ [Constituent Email Address](https://developer.blackbaud.com/skyapi/renxt/constituent/entities#EmailAddress)
+ [Constituent Phone](https://developer.blackbaud.com/skyapi/renxt/constituent/entities#Phone)
+ [Constituent Note](https://developer.blackbaud.com/skyapi/renxt/constituent/entities#Note)
+ [Constituent Online Presence](https://developer.blackbaud.com/skyapi/renxt/constituent/entities#OnlinePresence)
+ [Constituent Relationship](https://developer.blackbaud.com/skyapi/renxt/constituent/entities#Relationship)
+ [Event](https://developer.blackbaud.com/skyapi/renxt/event/entities#Event)
+ [Event Participant](https://developer.blackbaud.com/skyapi/renxt/event/entities#Participant)
+ [Appeal](https://developer.blackbaud.com/skyapi/renxt/fundraising/entities#Appeal)
+ [캠페인](https://developer.blackbaud.com/skyapi/renxt/fundraising/entities#Campaign)
+ [Fund](https://developer.blackbaud.com/skyapi/renxt/fundraising/entities#Fund)
+ [Package](https://developer.blackbaud.com/skyapi/renxt/fundraising/entities#Package)
+ [Gift](https://developer.blackbaud.com/skyapi/renxt/gift/entities#Gift)
+ [Gift Custom Field](https://developer.blackbaud.com/skyapi/renxt/gift/entities#CustomField)
+ [Gift Batch](https://developer.blackbaud.com/skyapi/renxt/gift-batch/entities#GiftBatch)
+ [Opportunity](https://developer.blackbaud.com/skyapi/renxt/opportunity/entities#Opportunity)
+ [Constituent Codes](https://developer.sky.blackbaud.com/api#api=56b76470069a0509c8f1c5b3)

**참고**  
커넥터의 응답에서 Struct 및 List 데이터 유형은 String 데이터 유형으로 변환되며, DateTime 데이터 유형은 타임스탬프로 변환됩니다.

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

**필드 기반 분할**:

Blackbaud Raiser’s Edge NXT는 필드 기반 또는 레코드 기반 분할을 지원하지 않습니다.

**레코드 기반 분할**:

Spark에서 동시성을 활용하려는 경우 추가 Spark 옵션(`NUM_PARTITIONS`)을 제공할 수 있습니다. 이 파라미터를 사용하면 Spark 태스크에서 동시에 실행할 수 있는 `NUM_PARTITIONS`개의 하위 쿼리로 원본 쿼리가 분할됩니다.

레코드 기반 분할에서는 존재하는 총 레코드 수를 Blackbaud Raiser’s Edge NXT API에서 쿼리하고 제공된 `NUM_PARTITIONS` 수로 나눕니다. 그런 다음, 결과 레코드 수를 각 하위 쿼리에서 동시에 가져옵니다.
+ `NUM_PARTITIONS`: 파티션 수.

예시:

```
blackbaud_read = glueContext.create_dynamic_frame.from_options(
    connection_type="BLACKBAUD",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "entityName",
        "API_VERSION": "v1",
        "NUM_PARTITIONS": "2",
        "SUBSCRIPTION_KEY": <Subscription key associated with one's developer account>
    }
```

# Blackbaud Raiser’s Edge NXT 연결 옵션
<a name="blackbaud-connection-options"></a>

다음은 Blackbaud Raiser’s Edge NXT에 대한 연결 옵션입니다.
+ `ENTITY_NAME`(문자열) - (필수) 읽기에 사용됩니다. Blackbaud Raiser’s Edge NXT에서의 객체 이름.
+ `API_VERSION`(문자열) - (필수) 읽기에 사용됩니다. 사용하려는 Blackbaud Raiser’s Edge NXT Rest API 버전.
+ `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 객체에 대해 선택할 열.
+ `FILTER_PREDICATE`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.
+ `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리.
+ `NUM_PARTITIONS`(정수) - 기본값: 1. 읽기에 사용됩니다. 읽을 파티션 수. 예시 값: 10.
+ `SUBSCRIPTION_KEY`(문자열) - (필수) 기본값: 비어 있음. 읽기에 사용됩니다. 개발자 계정과 연결된 구독 키.

# Blackbaud Raiser’s Edge NXT 제한 사항
<a name="blackbaud-connection-limitations"></a>

다음은 Blackbaud Raiser’s Edge NXT에 대한 제한 사항 또는 참고 사항입니다.
+ SaaS는 지정된 날짜 또는 그 이후에 생성되거나 수정된 결과를 반환하는 `EQUAL_TO` 연산자만 지원합니다. 추가로 ‘id’ 필드는 문자열 데이터 유형입니다. 또한 null이 허용된 필드를 식별할 수 없습니다. 따라서 필드 기반 분할이 지원되지 않습니다.
+ 증분 풀은 일별, 월별 및 주별 빈도가 있는 `Event` 엔터티에서만 지원됩니다.
+ Constituent Fundraiser Assignment 엔터티는 최대 20개의 레코드를 반환합니다.
+ 레코드 기반 분할:
  + `Action`, `Constituent Fundraiser Assignment` 또는 `Gift Batch` 엔터티에서는 지원되지 않습니다.
  + 필터 조건자를 사용한 레코드 기반 분할은 `Event` 및 `Event Participant` 엔터티에서만 지원됩니다. 필터 조건자를 다른 레코드 기반 지원 엔터티에 사용하는 경우 예외가 발생합니다.
+ `Gift Custom Field` 엔터티에서 ‘value’ 필드는 ‘category’ 필드와 함께 사용해야 합니다. 그러지 않으면 필터링되지 않은 응답이 발생합니다. 따라서 사용자가 ‘value’ 필드로 필터링하는 동안 ‘category’ 필드를 연결하도록 강제하기 위해 앞서 언급한 요구 사항을 따르지 않은 경우 예외가 발생합니다.
+ 적용 가능한 모든 엔터티의 `date_added` 및 `last_modified` 필드는 비교 연산자를 지원하지 않습니다. 같음 연산자만 지원합니다. 또한 앞서 언급한 필드와 페어링하여 레코드 범위를 제공할 수 있는 필드가 없습니다. 따라서 이러한 필드는 쿼리만 가능하고 증분 전송을 지원할 수 없습니다.
+ `Gift Batch` 엔터티의 `added_by` 필드는 올바른 결과를 내보내지 못할 수 있으므로 필터링 가능한 것으로 간주되지 않습니다.
+ `Gift` 엔터티에 데이터를 삽입할 때 `/GET Gift List` 엔드포인트를 통해 레코드를 검색하는 데 약 30분의 지연 시간이 있습니다.
+ 데이터 소스의 종단에서 제한으로 인해 Gift 엔터티에 대한 증분 전송 지원이 중단되었습니다.
+ Opportunity 엔터티의 status 필드에는 10분의 지연 시간이 있습니다.
+ `Fundraiser Assignment` 엔터티에는 종속 엔터티로 `Constituent`가 있습니다. 커넥터는 응답 크기가 최대 허용 페이로드 크기를 초과하지 않도록 선택할 ID를 최대 5,000개까지 로드합니다.

# CircleCI에 연결
<a name="connecting-to-data-circleci"></a>

CircleCI는 지속적 통합 및 지속적 전달 플랫폼입니다. CircleCI 계정에는 프로젝트, 파이프라인, 워크플로 등에 대한 데이터가 포함되어 있습니다. CircleCI 사용자인 경우 CircleCI 계정에 AWS Glue를 연결할 수 있습니다. 그런 다음, CircleCI를 ETL 작업에서의 데이터 소스로 사용할 수 있습니다. 이러한 작업을 실행하여 CircleCI 및 AWS 서비스 또는 기타 지원되는 애플리케이션 간에 데이터를 전송합니다.

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

# AWS Glue의 CircleCI 지원
<a name="circleci-support"></a>

AWS Glue는 다음과 같이 CircleCI를 지원합니다.

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

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

**지원되는 CircleCI API 버전**  
다음 CircleCI API 버전이 지원됩니다.
+ v2

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

# CircleCI 구성
<a name="circleci-configuring"></a>

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

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

다음은 최소 요구 사항입니다.
+ 전송하려는 데이터가 포함된 CircleCI 계정이 있습니다.
+ 계정의 사용자 설정에서 개인 API 토큰을 생성했습니다. 자세한 내용은 [Creating a personal API token](https://circleci.com/docs/managing-api-tokens/#creating-a-personal-api-token)을 참조하세요.
+ 연결을 생성하는 동안 AWS Glue에 개인 API 토큰을 제공합니다.

이러한 요구 사항을 충족하면 CircleCI 계정에 AWS Glue를 연결할 준비가 된 것입니다.

# CircleCI 연결 구성
<a name="circleci-configuring-connections"></a>

CircleCI는 사용자 지정 인증을 지원합니다.

다음 단계를 따라 CircleCI 연결을 구성합니다.

1. AWS Secrets Manager에서 다음 세부 정보로 보안 암호를 생성합니다.

   1. 고객 관리형 연결된 앱의 경우 보안 암호는 키 역할을 하는 `Circle-Token`과 함께 연결된 앱 API를 포함해야 합니다.

   1. 참고: AWS Glue에서 연결의 보안 암호를 생성해야 합니다.

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

   1. **데이터 소스**를 선택할 때 CircleCI를 선택합니다.

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

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

**사전 조건**

읽으려는 CircleCI 객체. 객체 이름이 필요합니다.

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


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| 컨텍스트 | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Organization Summary Metric | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| 파이프라인 | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| 파이프라인 워크플로 | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Project Branch | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Project Flaky Test | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Project Summary Metric | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| 일정 | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Workflow Job Timeseries | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Workflow Metric And Trend | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Workflow Recent Run | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Workflow Summary Metric | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Workflow Test Metric | 예 | 아니요 | 아니요 | 예 | 아니요 | 

**예시:**

```
circleci_read = glueContext.create_dynamic_frame.from_options(
    connection_type="circleci",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "context/e7ea2945-dccb-4205-b673-8391fe1b3a4c",
        "API_VERSION": "v2"
    }
```

## CircleCI 엔터티 및 필드 세부 정보
<a name="circleci-reading-from-entities-field-details"></a>

엔터티 및 필드 세부 정보에 대한 자세한 내용은 다음을 참조하세요.
+ [Contexts](https://circleci.com/docs/api/v2/#operation/listContexts)
+ [Project Summary Metrics](https://circleci.com/docs/api/v2/#operation/getProjectWorkflowsPageData)
+ [Workflow Job Timeseries](https://circleci.com/docs/api/v2/#operation/getJobTimeseries)
+ [Organization Summary Metrics](https://circleci.com/docs/api/v2/#operation/getOrgSummaryData)
+ [Project Branches](https://circleci.com/docs/api/v2/#operation/getAllInsightsBranches)
+ [Project Flaky Tests](https://circleci.com/docs/api/v2/#operation/getFlakyTests)
+ [Workflow Recent Runs](https://circleci.com/docs/api/v2/#operation/getProjectWorkflowRuns)
+ [Workflow Summary Metrics](https://circleci.com/docs/api/v2/#operation/getProjectWorkflowMetrics)
+ [Workflow Metrics and Trends](https://circleci.com/docs/api/v2/#operation/getWorkflowSummary)
+ [Workflow Test Metrics](https://circleci.com/docs/api/v2/#operation/getProjectWorkflowTestMetrics)
+ [Pipelines](https://circleci.com/docs/api/v2/#operation/listPipelinesForProject)
+ [Pipeline Workflows](https://circleci.com/docs/api/v2/#operation/listWorkflowsByPipelineId)
+ [Schedules](https://circleci.com/docs/api/v2/#operation/listSchedulesForProject)

정적 메타데이터를 포함하는 엔터티:

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

**참고**  
구조체 및 목록 데이터 유형은 커넥터의 응답에서 문자열 데이터 유형으로 변환됩니다.

**분할 쿼리**

CircleCI는 필드 기반 또는 레코드 기반 분할을 지원하지 않습니다.

# CircleCI 연결 옵션
<a name="circleci-connection-options"></a>

다음은 CircleCI의 연결 옵션입니다.
+ `ENTITY_NAME`(문자열) - (필수) 읽기에 사용됩니다. CircleCI에서의 객체 이름.
+ `API_VERSION`(문자열) - (필수) 읽기에 사용됩니다. 사용하려는 CircleCI Rest API 버전.
+ `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 객체에 대해 선택할 열.
+ `FILTER_PREDICATE`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.
+ `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리.

# CircleCI 제한 사항
<a name="circleci-connection-limitations"></a>

다음은 CircleCI의 제한 사항 또는 참고 사항입니다.
+ CircleCI는 필드 기반 또는 레코드 기반 분할을 지원하지 않습니다.
+ ‘-’(하이픈)이 포함된 필터 필드는 백틱 내에 래핑된 경우에만 작동합니다. 예: `workflow-name` = “abc”
+ GitLab VCS 엔터티 경로에 필요한 ‘Project ID’를 검색할 프로그래밍 방법이 없으므로 GitLab VCS 유형을 지원할 수 없습니다.

# Datadog에 연결
<a name="connecting-to-datadog"></a>

Datadog은 인프라, 애플리케이션, 서비스, 도구 등 클라우드 규모의 애플리케이션을 위한 모니터링 및 분석 플랫폼입니다.

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

# AWS Glue의 Datadog 지원
<a name="datadog-support"></a>

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

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

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

**지원되는 Datadog API 버전**  
 
+ v1
+ v2

# 연결을 생성하고 사용하기 위한 API 작업이 포함된 정책
<a name="datadog-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 Management 콘솔을 사용하는 경우 AWS Glue 리소스에 대한 전체 액세스 권한을 부여합니다. 이 정책에 지정된 리소스의 이름 변환을 따르면 사용자는 콘솔 전체 용량을 소유합니다. 이 정책은 보통 AWS Glue 콘솔의 사용자에게 해당됩니다.

# Datadog 구성
<a name="datadog-configuring"></a>

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

## 최소 요구 사항
<a name="datadog-configuring-min-requirements"></a>
+ DD-API-KEY 및 DD-APPLICATION-KEY가 있는 Datadog 계정이 있습니다. 계정 생성에 대한 자세한 내용은 [Datadog 계정 생성](datadog-create-account.md)을 참조하세요.
+  Datadog 계정에 유효한 라이선스가 있는 API 액세스 권한이 있습니다.

   

Datadog은 다음 6개의 URL을 지원합니다. 모든 Datadog API 클라이언트는 기본적으로 Datadog US1 사이트 API를 사용하도록 구성됩니다. Datadog EU 사이트에 있는 경우 API에 액세스하려면 Datadog EU 사이트의 `DD-API-KEY` 및 `DD-APPLICATION-KEY`가 있는 https://api.datadoghq.eu URL을 선택해야 합니다. 마찬가지로 다른 사이트의 경우 해당 사이트의 `DD-API-KEY and DD-APPLICATION-KEY`를 사용하여 해당 URL을 선택해야 합니다.
+ US1 API URL - [https://api.datadoghq.com](https://api.datadoghq.com)https://api.datadoghq.com
+ EU API URL - [https://api.datadoghq.eu ](https://api.datadoghq.eu)
+ US3 API URL - [https://api.us3.datadoghq.com](https://api.us3.datadoghq.com) 
+ US5 API URL - [https://api.us5.datadoghq.com](https://api.us5.datadoghq.com)
+ S1-FED API URL - [https://api.ddog-gov.com](https://api.ddog-gov.com)
+ 일본 API URL - [https://api.ap1.datadoghq.com](https://api.ap1.datadoghq.com)

이러한 요구 사항을 충족하면 Datadog 계정에 AWS Glue를 연결할 준비가 된 것입니다.

# Datadog 연결 구성
<a name="datadog-configuring-connections"></a>

Datadog은 사용자 지정 인증을 지원합니다. 다음은 Datadog 연결을 구성하는 단계입니다.

Datadog 연결을 구성하는 방법:

1. AWS Secrets Manager에서 다음 세부 정보로 보안 암호를 생성합니다.

   고객 관리형 연결된 앱의 경우 - 보안 암호는 키 역할을 하는 `API_KEY` 및 `APPLICATION_KEY`와 함께 연결된 앱 소비자 보안 암호를 포함해야 합니다.
**참고**  
AWS Glue에서 연결당 보안 암호를 생성해야 합니다.

1. AWS Glue Studio의 **데이터 연결**에서 아래 단계에 따라 연결을 생성합니다.

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

   1. 연결하려는 Datadog의 `Instance_Url`을 제공합니다.

   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. 토큰을 넣기 위해 AWS Glue에서 이 연결에 사용할 `secretName`을 선택합니다.

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

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

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

 **사전 조건** 

읽으려는 Datadog 객체입니다. 사용 가능한 엔터티를 확인하려면 아래 지원되는 엔터티 테이블을 참조하세요.

 **지원되는 엔터티** 


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
|  Metrics Timeseries  | 예 | 아니요 | 아니요 | 예 | 아니요 | 
|  Log Queries  | 예 | 예 | 예 | 예 | 아니요 | 

 **예제** 

```
Datadog_read = glueContext.create_dynamic_frame.from_options(
    connection_type="datadog",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "log-queries",
        "API_VERSION": "v2",
        "INSTANCE_URL": "https://api.datadoghq.com",
        "FILTER_PREDICATE": "from = `2023-10-03T09:00:26Z`"
    }
```

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

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

# Datadog 연결 옵션
<a name="datadog-connection-options"></a>

다음은 Datadog의 연결 옵션입니다.
+  `ENTITY_NAME`(문자열) - (필수) 읽기/쓰기에 사용됩니다. Datadog에서의 객체 이름입니다.
+  `API_VERSION`(문자열) - (필수) 읽기/쓰기에 사용됩니다. 사용하려는 Datadog Rest API 버전입니다. `v1` 버전은 `metrics-timeseries` 엔터티를 지원하는 반면 `v2` 버전은 `log-queries` 엔터티를 지원합니다.
+  `INSTANCE_URL`(문자열) - (필수) 읽기에 사용됩니다. Datadog 인스턴스 URL입니다. Datadog 인스턴스 URL은 리전마다 다릅니다.
+  `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 객체에 대해 선택할 열.
+  `FILTER_PREDICATE`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.
+  `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리.

# Datadog 계정 생성
<a name="datadog-create-account"></a>

1. [https://www.datadoghq.com/](https://api.datadoghq.com)으로 이동합니다.

1. **무료로 시작**을 선택합니다.

1. 필요한 정보를 입력하고 가입합니다.

1. 제안대로 **Datadog 에이전트 설치 프로그램**을 설치합니다.

1. 계정이 활성 Datadog 구독이 있는 유효한 조직(사용 가능한 목록에서)에 등록되었는지 확인합니다.

1. Datadog 계정에 로그인한 후 오른쪽 상단 모서리의 사용자 이름 위로 마우스를 가져가 **키** 세부 정보를 확인합니다.

   1. API 키를 가져오려면 **API 키**를 선택합니다.

   1. 애플리케이션 키를 가져오려면 **애플리케이션 키**를 선택합니다.

# 제한 사항
<a name="datadog-connector-limitations"></a>

다음은 Datadog 커넥터의 제한 사항입니다.
+ Datadog은 필드 기반 또는 레코드 기반 분할을 지원하지 않습니다.
+ `from`은 `Log Queries` 엔터티의 필수 필터 파라미터입니다.
+ `from_to_date` 및 `query`는 `Metrics Timeseries` 엔터티를 위한 필수 필터 파라미터입니다.

# Docusign Monitor에 연결
<a name="connecting-to-data-docusign-monitor"></a>

Docusign Monitor는 24시간 활동 추적을 통해 조직이 계약을 보호하는 데 도움을 줍니다. Monitor API는 이 활동 추적 정보를 기존 보안 스택 또는 데이터 시각화 도구에 직접 제공하고, 팀은 이를 활용하여 무단 활동을 감지하고, 인시던트를 조사하고, 확인된 위협에 신속하게 대응할 수 있습니다. 또한 보안 팀은 특정 비즈니스 요구 사항에 맞게 대시보드와 알림을 유연하게 사용자 지정할 수 있습니다.

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

# AWS Glue의 Docusign Monitor 지원
<a name="docusign-monitor-support"></a>

AWS Glue는 다음과 같이 Docusign Monitor를 지원합니다.

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

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

**지원되는 Docusign Monitor API 버전**  
다음 Docusign Monitor API 버전이 지원됩니다.
+ v2.0

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

# Docusign Monitor 구성
<a name="docusign-monitor-configuring"></a>

AWS Glue를 사용하여 Docusign Monitor에서 지원되는 대상으로 데이터를 전송하려면 먼저 다음 요구 사항을 충족해야 합니다.

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

다음은 최소 요구 사항입니다.
+ Docusign Monitor에서 Docusign Software 제품을 사용하는 Docusign 계정이 있습니다.
+ Docusign 계정의 개발자 콘솔에서 AWS Glue용 OAuth 2.0 통합 앱을 생성했습니다.

  이 앱에서는 계정에 대해 인증된 직접 호출을 수행하는 경우 AWS Glue에서 데이터에 안전하게 액세스하는 데 사용하는 클라이언트 자격 증명을 제공합니다. 자세한 내용은 Docusign Monitor 설명서의 [OAuth 2.0](https://developers.docusign.com/platform/webhooks/connect/validation-and-security/oauth-connect/)을 참조하세요.

이러한 요구 사항을 충족하면 Docusign Monitor 계정에 AWS Glue를 연결할 준비가 된 것입니다.

# Docusign Monitor 연결 구성
<a name="docusign-monitor-configuring-connections"></a>

Docusign Monitor는 AUTHORIZATION\$1CODE 권한 부여 유형을 지원합니다.
+ 이 권한 부여 유형은 사용자를 인증하기 위해 사용자를 서드파티 권한 부여 서버로 리디렉션하는 방식에 의존하므로 3각 OAuth로 간주됩니다. AWS Glue 콘솔을 통해 연결을 생성할 때 사용됩니다.
+ 사용자는 AWS Glue 콘솔을 통해 연결을 생성할 때에도 Docusign Monitor에서 자체 연결된 앱을 생성하고 자체 클라이언트 ID와 클라이언트 보안 암호를 제공하기로 선택할 수 있습니다. 이 시나리오에서는 여전히 Docusign Monitor로 리디렉션되어 로그인하고 리소스에 액세스할 수 있는 권한을 AWS Glue에 부여합니다.
+ 이 권한 부여 유형은 새로 고침 토큰과 액세스 토큰을 생성합니다. 액세스 토큰은 수명이 짧으며 새로 고침 토큰을 사용하여 사용자 상호 작용 없이 자동으로 새로 고칠 수 있습니다.
+ 권한 부여 코드 OAuth 흐름을 위한 연결된 앱 생성에 대한 공개 Docusign Monitor 설명서는 [OAuth for Docusign Connect](https://developers.docusign.com/platform/webhooks/connect/validation-and-security/oauth-connect/)를 참조하세요.

다음 단계를 따라 Docusign Monitor 연결을 구성합니다.

1. AWS Secrets Manager에서 다음 세부 정보로 보안 암호를 생성합니다.

   1. 고객 관리형 연결된 앱의 경우 보안 암호는 키 역할을 하는 `USER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET`과 함께 연결된 앱 API를 포함해야 합니다.

   1. 참고: AWS Glue에서 연결의 보안 암호를 생성해야 합니다.

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

   1. **연결**에서 **연결 생성**을 선택합니다.

   1. **데이터 소스**를 선택할 때 Docusign Monitor를 선택합니다.

   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. Docusign Monitor 앱의 **사용자 관리형 클라이언트 애플리케이션 ClientId**를 입력합니다.

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

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

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

# Docusign Monitor 엔터티에서 읽기
<a name="docusign-monitor-reading-from-entities"></a>

**사전 조건**

읽으려는 Docusign Monitor 객체.

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


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| 데이터 모니터링 | 예 | 예 | 아니요 | 예 | 아니요 | 

**예시:**

```
docusignmonitor_read = glueContext.create_dynamic_frame.from_options(
    connection_type="docusign_monitor",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "monitoring-data",
        "API_VERSION": "v2.0"
    }
```

## Docusign Monitor 엔터티 및 필드 세부 정보
<a name="docusign-monitor-reading-from-entities-field-details"></a>

정적 메타데이터를 포함하는 엔터티:

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

**분할 쿼리**

Docusign Monitor는 필드 기반 또는 레코드 기반 분할을 지원하지 않습니다.

# Docusign Monitor 연결 옵션
<a name="docusign-monitor-connection-options"></a>

다음은 Docusign Monitor의 연결 옵션입니다.
+ `ENTITY_NAME`(문자열) - (필수) 읽기에 사용됩니다. Docusign Monitor에서의 객체 이름.
+ `API_VERSION`(문자열) - (필수) 읽기에 사용됩니다. 사용하려는 Docusign Monitor Rest API 버전.
+ `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 객체에 대해 선택할 열.
+ `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리.
+ `FILTER_PREDICATE`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.

# Docusign Monitor 제한 사항
<a name="docusign-monitor-connection-limitations"></a>

다음은 Docusign Monitor의 제한 사항 또는 참고 사항입니다.
+ `cursor` 필드를 사용하여 필터가 적용되면 API는 지정된 날짜부터 시작하여 다음 7일 동안의 레코드를 검색합니다.
+ 필터가 제공되지 않으면 API는 API 요청의 현재 날짜로부터 이전 7일 동안의 레코드를 검색합니다.
+ Docusign Monitor는 필드 기반 또는 레코드 기반 분할을 지원하지 않습니다.
+ Docusign Monitor는 순서 기준 특성을 지원하지 않습니다.

# Domo에 연결
<a name="connecting-to-data-domo"></a>

Domo는 클라우드 기반 대시보딩 도구입니다. Domo의 엔터프라이즈 애플리케이션 플랫폼을 사용하면 Domo를 확장하는 데 필요한 기반이 마련되므로 사용자 지정 솔루션을 더욱 빠르게 구축할 수 있습니다.

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

# AWS Glue의 Domo 지원
<a name="domo-support"></a>

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

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

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

**지원되는 Domo API 버전**  
다음 Domo API 버전이 지원됩니다.
+ v1

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

# Domo 구성
<a name="domo-configuring"></a>

AWS Glue를 사용하여 Domo에서 지원되는 대상으로 데이터를 전송하려면 먼저 다음 요구 사항을 충족해야 합니다.

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

다음은 최소 요구 사항입니다.
+ Domo 계정에서 API 액세스가 활성화되어 있습니다.
+ 계정에 대해 인증된 직접 호출을 수행하는 경우 AWS Glue에서 데이터에 안전하게 액세스하기 위해 사용하는 클라이언트 자격 증명을 제공하는 앱이 Domo 개발자 계정 아래에 있습니다. 자세한 내용은 [Domo 개발자 앱 생성](#domo-configuring-creating-developer-app) 섹션을 참조하세요.

이러한 요구 사항을 충족하면 Domo 계정에 AWS Glue를 연결할 준비가 된 것입니다.

## Domo 개발자 앱 생성
<a name="domo-configuring-creating-developer-app"></a>

클라이언트 ID 및 클라이언트 보안 암호를 가져오려면 개발자 계정을 생성합니다.

1. [Domo 개발자 로그인 페이지](https://developer.domo.com/manage-clients)로 이동합니다.

1. **로그인**을 선택합니다.

1. 도메인 이름을 입력하고 **Continue**를 클릭합니다.

1. **My Account**로 마우스를 가리킨 다음 **New Client**를 선택합니다.

1. 이름 및 설명을 입력하고 범위(‘data’)를 선택한 다음 **Create**를 선택합니다.

1. 생성된 새 클라이언트에서 생성된 **클라이언트 ID**와 **클라이언트 보안 암호**를 가져옵니다.

# Domo 연결 구성
<a name="domo-configuring-connections"></a>

Domo는 OAuth2에 대한 CLIENT CREDENTIALS 권한 부여 유형을 지원합니다.
+ 이 권한 부여 유형은 클라이언트 애플리케이션만 서버에 인증하고, 사용자는 관여하지 않으므로 2각 OAuth로 간주됩니다.
+ 사용자는 AWS Glue 콘솔을 통해 연결을 생성할 때에도 Domo에서 자체 연결된 앱을 생성하고 자체 클라이언트 ID와 클라이언트 보안 암호를 제공하기로 선택할 수 있습니다.
+ 권한 부여 코드 OAuth 흐름을 위한 연결된 앱 생성에 대한 공개 Domo 설명서는 [OAuth Authentication](https://developer.domo.com/portal/1845fc11bbe5d-api-authentication)을 참조하세요.

다음 단계를 따라 Domo 연결을 구성합니다.

1. AWS Secrets Manager에서 다음 세부 정보로 보안 암호를 생성합니다.

   1. 고객 관리형 연결된 앱의 경우 보안 암호는 앱 액세스 토큰, `client_id` 및 `client_secret`을 포함해야 합니다.

   1. 참고: AWS Glue에서 연결의 보안 암호를 생성해야 합니다.

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

   1. **연결**에서 **연결 생성**을 선택합니다.

   1. **데이터 소스**를 선택할 때 Domo를 선택합니다.

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

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

**사전 조건**

읽으려는 Domo 객체. 객체 이름(예: Data Set 또는 Data Permission Policies)이 필요합니다. 다음 표에는 지원되는 엔터티가 나와 있습니다.

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


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| 데이터 세트 | 예 | 예 | 예 | 예 | 예 | 
| Data Permission Policies | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 

**예시:**

```
Domo_read = glueContext.create_dynamic_frame.from_options(
    connection_type="domo",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "dataset",
        "API_VERSION": "v1"
    }
```

## Domo 엔터티 및 필드 세부 정보
<a name="domo-reading-from-entities-field-details"></a>

정적 메타데이터를 포함하는 엔터티:

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

다음 엔터티에 대해 Domo에서는 메타데이터를 동적으로 가져도록 엔드포인트를 제공하므로 운영자 지원이 엔터티의 데이터 유형 수준에서 캡처됩니다.

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

## 분할 쿼리
<a name="domo-reading-from-partitioning"></a>

**필드 기반 분할**

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

  DateTime 필드의 경우 ISO 형식의 값이 허용됩니다.

  유효한 값의 예제:

  ```
  "2023-01-15T11:18:39.205Z"
  ```

  Date 필드의 경우 ISO 형식의 값이 허용됩니다.

  유효한 값의 예제:

  ```
  "2023-01-15"
  ```
+ `UPPER_BOUND`: 선택한 파티션 필드의 상한 값(**경계 제외**).

  유효한 값의 예제:

  ```
  "2023-02-15T11:18:39.205Z"
  ```
+ `NUM_PARTITIONS`: 파티션 수.

엔터티 수준 분할 필드 지원 세부 정보는 다음 표에 나와 있습니다.

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

예시:

```
Domo_read = glueContext.create_dynamic_frame.from_options(
    connection_type="domo",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "dataset",
        "API_VERSION": "v1",
        "PARTITION_FIELD": "permissionTime"
        "LOWER_BOUND": "2023-01-15T11:18:39.205Z"
        "UPPER_BOUND": "2023-02-15T11:18:39.205Z"
        "NUM_PARTITIONS": "2"
    }
```

**레코드 기반 분할**

Spark에서 동시성을 활용하려는 경우 추가 Spark 옵션(`NUM_PARTITIONS`)을 제공할 수 있습니다. 이 파라미터를 사용하면 Spark 태스크에서 동시에 실행할 수 있는 `NUM_PARTITIONS`개의 하위 쿼리로 원본 쿼리가 분할됩니다.

레코드 기반 분할에서는 존재하는 총 레코드 수를 Domo에서 쿼리하고 제공된 `NUM_PARTITIONS` 수로 나눕니다. 그런 다음, 결과 레코드 수를 각 하위 쿼리에서 동시에 가져옵니다.

예시:

```
Domo_read = glueContext.create_dynamic_frame.from_options(
    connection_type="domo",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "dataset",
        "API_VERSION": "v1",
        "NUM_PARTITIONS": "2"
    }
```

# Domo 연결 옵션
<a name="domo-connection-options"></a>

다음은 Domo의 연결 옵션입니다.
+ `ENTITY_NAME`(문자열) - (필수) 읽기에 사용됩니다. Domo에서의 객체 이름.
+ `API_VERSION`(문자열) - (필수) 읽기에 사용됩니다. 사용하려는 Domo Rest API 버전.
+ `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 객체에 대해 선택할 열.
+ `FILTER_PREDICATE`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.
+ `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리.
+ `PARTITION_FIELD`(문자열) - 읽기에 사용됩니다. 쿼리 분할에 사용할 필드입니다.
+ `LOWER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 하한 값(경계 포함).
+ `UPPER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 상한 값(경계 제외).
+ `NUM_PARTITIONS`(정수) - 기본값: 1. 읽기에 사용됩니다. 읽을 파티션 수.

# Domo 제한 사항
<a name="domo-connection-limitations"></a>

다음은 Domo의 제한 사항 또는 참고 사항입니다.
+ SDK 제한으로 인해 ‘\$1’로 시작하는 쿼리 가능한 필드(예: \$1BATCH\$1ID )에 대해 필터링이 예상대로 작동하지 않습니다.
+ API 제한으로 인해 입력한 날짜 이전의 날짜에 필터링이 작동합니다. 이는 증분 풀에도 영향을 미칩니다. 이 제한을 해결하려면 UTC 시간대에 따라 날짜를 선택하여 필요한 날짜에 대한 데이터를 가져옵니다.

# Dynatrace에 연결
<a name="connecting-to-data-dynatrace"></a>

Dynatrace는 포괄적인 관찰성과 보안을 위한 분석 및 자동화를 제공하는 플랫폼입니다. 애플리케이션 성능, 인프라 및 사용자 경험을 모니터링 및 최적화하는 데 특화되어 있습니다.

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

# AWS Glue의 Dynatrace 지원
<a name="dynatrace-support"></a>

AWS Glue는 다음과 같이 Dynatrace를 지원합니다.

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

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

**지원되는 Dynatrace API 버전**  
다음 Dynatrace API 버전이 지원됩니다.
+ v2

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

# Dynatrace 구성
<a name="dynatrace-configuring"></a>

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

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

다음은 최소 요구 사항입니다.
+ Dynatrace 계정이 있습니다.
+ API에 액세스하기 위해 적절한 읽기/쓰기 범위가 할당된 Dynatrace 계정에서 액세스 토큰을 생성했습니다. 자세한 내용은 [키 생성](https://docs.dynatrace.com/docs/discover-dynatrace/references/dynatrace-api/basics/dynatrace-api-authentication#create-token)을 참조하세요.

이러한 요구 사항을 충족하면 Dynatrace 계정에 AWS Glue를 연결할 준비가 된 것입니다.

# Dynatrace 연결 구성
<a name="dynatrace-configuring-connections"></a>

Dynatrace는 사용자 지정 인증을 지원합니다.

다음 단계를 따라 Dynatrace 연결을 구성합니다.

1. AWS Secrets Manager에서 다음 세부 정보로 보안 암호를 생성합니다.

   1. 고객 관리형 연결된 앱의 경우 보안 암호는 키 역할을 하는 `apiToken`과 함께 연결된 앱 API를 포함해야 합니다.

   1. 참고: AWS Glue에서 연결의 보안 암호를 생성해야 합니다.

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

   1. **데이터 소스**를 선택할 때 Dynatrace를 선택합니다.

   1. 연결하려는 Dynatrace 계정의 `INSTANCE_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`을 읽을 수 있는 권한을 부여합니다.

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

**사전 조건**

읽으려는 Dynatrace 객체. 객체 이름(예: ‘problem’)이 필요합니다.

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


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| 문제 | 예 | 예 | 예 | 예 | 아니요 | 

**예시:**

```
Dynatrace_read = glueContext.create_dynamic_frame.from_options(
    connection_type="Dynatrace",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "problem",
        "API_VERSION": "v2",
        "INSTANCE_URL": "https://[instanceName].live.dynatrace.com"
    }
```

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

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

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

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

Dynatrace는 필드 기반 또는 레코드 기반 분할을 지원하지 않습니다.

# Dynatrace 연결 옵션
<a name="dynatrace-connection-options"></a>

다음은 Dynatrace의 연결 옵션입니다.
+ `ENTITY_NAME`(문자열) - (필수) 읽기에 사용됩니다. Dynatrace에서의 객체 이름.
+ `API_VERSION`(문자열) - (필수) 읽기에 사용됩니다. 사용하려는 Dynatrace Rest API 버전.
+ `INSTANCE_URL`(문자열) - 읽기에 사용됩니다. 유효한 Dynatrace 인스턴스 URL.
+ `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 객체에 대해 선택할 열.
+ `FILTER_PREDICATE`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.
+ `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리.

# Dynatrace 제한 사항
<a name="dynatrace-connection-limitations"></a>

다음은 Dynatrace의 제한 사항 또는 참고 사항입니다.
+ Dynatrace는 필드 기반 또는 레코드 기반 분할을 지원하지 않습니다.
+ Select All 특성의 경우 필터에 ‘field’를 입력하면 페이지당 레코드가 10개를 초과할 수 없습니다.
+ 지원되는 최대 페이지 크기는 500입니다. 흐름을 생성하는 동안 [`evidenceDetails, impactAnalysis, recentComments`] 필드 중 하나를 선택하면 페이지당 레코드는 기본적으로 10으로 설정됩니다.

# Facebook Ads에 연결
<a name="connecting-to-data-facebook-ads"></a>

Facebook Ads는 모든 규모의 비즈니스에서 대상 고객에게 도달하고 다양한 마케팅 목표를 달성하기 위해 사용하는 강력한 디지털 광고 플랫폼입니다. 이 플랫폼을 통해 광고주는 Facebook 및 메신저를 포함한 Facebook의 앱 및 서비스 제품군에 표시할 수 있는 맞춤형 광고를 생성할 수 있습니다. Facebook Ads는 고급 타겟팅 기능을 통해 비즈니스가 특정 인구 통계, 관심사, 행동 및 위치에 도달할 수 있도록 지원합니다.

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

# Facebook Ads에 대한 AWS Glue의 지원
<a name="facebook-ads-support"></a>

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

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

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

**지원되는 Facebook Ads API 버전**  
다음 Facebook Ads API 버전이 지원됩니다.
+ v17.0
+ v18.0
+ v19.0
+ v20.0

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

# Facebook Ads 구성
<a name="facebook-ads-configuring"></a>

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

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

다음은 최소 요구 사항입니다.
+ Facebook Standard 계정에는 Facebook을 통해 직접 액세스됩니다.
+ 액세스 토큰을 생성하려면 사용자 인증이 필요합니다.
+ Facebook Ads SDK 커넥터는 *사용자 액세스 토큰 OAuth* 흐름을 구현합니다.
+ OAuth2.0을 사용하여 Facebook Ads에 대한 API 요청을 인증합니다. 이 웹 기반 인증은 2FA의 상위 세트인 다중 인증(MFA) 아키텍처에 속합니다.
+ 사용자에게 엔드포인트에 액세스할 수 있는 권한을 부여해야 합니다. 사용자의 데이터에 액세스하기 위해 엔드포인트 권한 부여는 [권한](https://developers.facebook.com/docs/permissions) 및 [기능](https://developers.facebook.com/docs/features-reference)을 통해 처리됩니다.

## OAuth 2.0 자격 증명 가져오기
<a name="facebook-ads-configuring-creating-facebook-ads-oauth2-credentials"></a>

인스턴스에 대해 인증된 직접 호출을 수행할 수 있도록 API 자격 증명을 확보하려면 Facebook Ads 개발자 안내서의 [REST API](https://developers.facebook-ads.com/rest-api/)를 참조하세요.

# Facebook Ads 연결 구성
<a name="facebook-ads-configuring-connections"></a>

Facebook Ads에서는 OAuth2에 대한 AUTHORIZATION\$1CODE 권한 부여 유형을 지원합니다.
+ 이 권한 부여 유형은 사용자를 인증하기 위해 사용자를 서드파티 권한 부여 서버로 리디렉션하는 방식에 의존하므로 3각 OAuth로 간주됩니다. AWS Glue 콘솔을 통해 연결을 생성할 때 사용됩니다.
+ 사용자는 AWS Glue 콘솔을 통해 연결을 생성할 때에도 Facebook Ads에서 자체 연결된 앱을 생성하고 자체 클라이언트 ID와 클라이언트 보안 암호를 제공하기로 선택할 수 있습니다. 이 시나리오에서는 여전히 Facebook Ads로 리디렉션되어 로그인하고 리소스에 액세스할 수 있는 권한을 AWS Glue에 부여합니다.
+ 이 권한 부여 유형은 액세스 토큰을 생성합니다. 만료되는 시스템 사용자 토큰은 생성 날짜 또는 새로 고친 날짜로부터 60일 동안 유효합니다. 연속성을 생성하려면 개발자가 60일 이내에 액세스 토큰을 새로 고쳐야 합니다. 그렇지 않으면 액세스 토큰이 몰수되고 개발자가 API 액세스 권한을 다시 획득하기 위해 새 토큰을 확보해야 합니다. [액세스 토큰 새로 고침](https://developers.facebook.com/docs/marketing-api/system-users/install-apps-and-generate-tokens/)을 참조하세요.
+ 권한 부여 코드 OAuth 흐름을 위한 연결된 앱 생성에 대한 퍼블릭 Facebook Ads 설명서는 Google for Developers 안내서의 [Using OAuth 2.0 to Access Google APIs](https://developers.google.com/identity/protocols/oauth2)를 참조하세요.

Facebook Ads 연결을 구성하는 방법:

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

   1. **연결 유형**을 선택할 때 Facebook Ads를 선택하세요.

   1. 연결하려는 Facebook Ads 인스턴스의 `INSTANCE_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`을 읽을 수 있는 권한을 부여합니다.

# Facebook Ads 엔터티에서 읽기
<a name="facebook-ads-reading-from-entities"></a>

**사전 조건**

읽으려는 Facebook Ads 객체. 객체 이름이 필요합니다. 다음 표에는 지원되는 엔터티가 나와 있습니다.

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


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| 캠페인 | 예 | 예 | 아니요 | 예 | 예 | 
| 광고 세트 | 예 | 예 | 아니요 | 예 | 예 | 
| 광고 | 예 | 예 | 아니요 | 예 | 예 | 
| 광고 크리에이티브 | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| 인사이트 - 계정 | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| Adaccounts | 예 | 예 | 아니요 | 예 | 아니요 | 
| 인사이트 - 광고 | 예 | 예 | 아니요 | 예 | 예 | 
| 인사이트 - 광고 세트 | 예 | 예 | 아니요 | 예 | 예 | 
| 인사이트 - 캠페인 | 예 | 예 | 아니요 | 예 | 예 | 

**예시:**

```
FacebookAds_read = glueContext.create_dynamic_frame.from_options(
    connection_type="FacebookAds",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "entityName",
        "API_VERSION": "v20.0"
    }
```

## Facebook Ads 엔터티 및 필드 세부 정보
<a name="facebook-ads-reading-entity-and-field-details"></a>

엔터티 및 필드 세부 정보에 대한 자세한 내용은 다음을 참조하세요.
+ [광고 계정](https://developers.facebook.com/docs/marketing-api/reference/ad-account)
+ [캠페인](https://developers.facebook.com/docs/marketing-api/reference/ad-campaign-group)
+ [광고 세트](https://developers.facebook.com/docs/marketing-api/reference/ad-campaign)
+ [광고](https://developers.facebook.com/docs/marketing-api/reference/adgroup)
+ [광고 크리에이티브](https://developers.facebook.com/docs/marketing-api/reference/ad-creative)
+ [인사이트 광고 계정](https://developers.facebook.com/docs/marketing-api/reference/ad-account/insights)
+ [인사이트 광고](https://developers.facebook.com/docs/marketing-api/reference/adgroup/insights/)
+ [인사이트 광고 세트](https://developers.facebook.com/docs/marketing-api/reference/ad-campaign/insights)
+ [인사이트 캠페인](https://developers.facebook.com/docs/marketing-api/reference/ad-campaign-group/insights)

자세한 내용은 [마케팅 API](https://developers.facebook.com/docs/marketing-api/reference/v21.0)를 참조하세요.

**참고**  
구조체 및 목록 데이터 유형은 커넥터의 응답에서 문자열 데이터 유형으로 변환됩니다.

## 쿼리 파티셔닝
<a name="facebook-ads-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 타임스탬프 형식을 허용합니다.

  유효한 값의 예제:

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

예시:

```
FacebookADs_read = glueContext.create_dynamic_frame.from_options(
    connection_type="FacebookAds",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "entityName",
        "API_VERSION": "v20.0",
        "PARTITION_FIELD": "created_time"
        "LOWER_BOUND": "2022-01-01"
        "UPPER_BOUND": "2024-01-02"
        "NUM_PARTITIONS": "10"
    }
```

# Facebook Ads 연결 옵션
<a name="facebook-ads-connection-options"></a>

다음은 Facebook Ads에 대한 연결 옵션입니다.
+ `ENTITY_NAME`(문자열) - (필수) 읽기에 사용됩니다. Facebook Ads에서의 객체 이름.
+ `API_VERSION`(문자열) - (필수) 읽기에 사용됩니다. 사용할 Facebook Ads Rest API 버전. 예: v1.
+ `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 객체에 대해 선택할 열.
+ `FILTER_PREDICATE`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.
+ `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리.
+ `PARTITION_FIELD`(문자열) - 읽기에 사용됩니다. 쿼리 분할에 사용할 필드입니다.
+ `LOWER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 하한 값(경계 포함).
+ `UPPER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 상한 값(경계 제외).
+ `NUM_PARTITIONS`(정수) - 기본값: 1. 읽기에 사용됩니다. 읽을 파티션 수.
+ `TRANSFER_MODE`(문자열) - 기본값: SYNC. 비동기 읽기에 사용됩니다.

# Facebook Ads 커넥터에 대한 제한 사항 및 참고 사항
<a name="facebook-ads-connector-limitations"></a>

다음은 Facebook Ads 커넥터에 대한 제한 사항 또는 참고 사항입니다.
+ Facebook Ads는 동적 메타데이터를 지원하므로 모든 필드를 쿼리할 수 있습니다. 모든 필드는 필터링을 지원하며 데이터를 사용할 수 있는 경우 레코드를 가져옵니다. 그렇지 않으면 Facebook에서 적절한 오류 메시지와 함께 잘못된 요청(400) 응답을 반환합니다.
+ 앱의 직접 호출 수는 롤링 1시간 기간에 사용자가 수행할 수 있는 직접 호출 수(200에 사용자 수를 곱한 값). 요금 제한에 대한 자세한 내용은 [사용 제한](https://developers.facebook.com/docs/graph-api/overview/rate-limiting/) 및 [비즈니스 사용 사례 사용 제한](https://developers.facebook.com/docs/graph-api/overview/rate-limiting/#buc-rate-limits)을 참조하세요.

# Facebook Page Insights에 연결
<a name="connecting-to-data-facebook-page-insights"></a>

Facebook Pages를 사용하면 회사 및 기타 관심 그룹이 Facebook.com 소셜 네트워크에 대한 페이지를 생성할 수 있습니다. 기업은 이러한 페이지를 사용하여 온라인에서 영업 시간을 공유하고, 공지를 하며, 고객과 소통합니다. Facebook Page Insights 사용자인 경우 Facebook Page Insights 계정에 AWS Glue를 연결할 수 있습니다. Facebook Page Insights를 ETL 작업에서의 데이터 소스로 사용할 수 있습니다. 이러한 작업을 실행하여 Facebook Page Insights에서 AWS 서비스 또는 기타 지원되는 애플리케이션으로 데이터를 전송합니다.

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

# AWS Glue의 Facebook Page Insights 지원
<a name="facebook-page-insights-support"></a>

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

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

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

**지원되는 Facebook Page Insights API 버전**  
다음 Facebook Page Insights API 버전이 지원됩니다.
+ v17
+ v18
+ v19
+ v20
+ v21

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

# Facebook Page Insights 구성
<a name="facebook-page-insights-configuring"></a>

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

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

다음은 최소 요구 사항입니다.
+ Facebook Standard 계정에는 Facebook을 통해 직접 액세스됩니다.
+ 액세스 토큰을 생성하려면 사용자 인증이 필요합니다.
+ Facebook Page Insights 커넥터는 사용자 액세스 토큰 OAuth 흐름을 구현합니다.
+ 커넥터는 OAuth2.0을 사용하여 Facebook Page Insights에 대한 API 요청을 인증합니다. 이는 2FA의 상위 세트인 다중 인증(MFA) 아키텍처에 속합니다. 웹 기반 인증입니다.
+ 사용자에게 엔드포인트에 액세스할 수 있는 권한을 부여해야 합니다. 사용자의 데이터에 액세스하기 위해 엔드포인트 권한 부여는 권한 및 기능을 통해 처리됩니다.

# Facebook Page Insights 연결 구성
<a name="facebook-page-insights-configuring-connections"></a>

Facebook Ads 연결을 구성하는 방법:

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

   1. **연결 유형**을 선택할 때 Facebook Page Insights를 선택하세요.

   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. 권한 부여 코드 URL을 선택합니다.

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

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

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

# Facebook Page Insights 엔터티에서 읽기
<a name="facebook-page-insights-reading-from-entities"></a>

**사전 조건**

읽으려는 Facebook Ads 객체입니다. 객체 이름이 필요합니다.

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


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| Page Content | 예 | 아니요 | 예 | 예 | 예 | 
| Page CTA Clicks | 예 | 아니요 | 아니요 | 예 | 예 | 
| Page Engagement | 예 | 아니요 | 아니요 | 예 | 예 | 
| Page Impressions | 예 | 아니요 | 아니요 | 예 | 예 | 
| Page Posts | 예 | 아니요 | 아니요 | 예 | 예 | 
| Page Post Engagement | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Page Post Reactions | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Page Reactions | 예 | 아니요 | 아니요 | 예 | 예 | 
| Stories | 예 | 아니요 | 아니요 | 예 | 예 | 
| Page User Demographics | 예 | 아니요 | 아니요 | 예 | 예 | 
| Page Video Views | 예 | 아니요 | 아니요 | 예 | 예 | 
| Page Views | 예 | 아니요 | 아니요 | 예 | 예 | 
| Page Video Posts | 예 | 아니요 | 아니요 | 예 | 예 | 
| Pages | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| Feeds | 예 | 예 | 아니요 | 예 | 예 | 

**예시:**

```
facebookPageInsights_read = glueContext.create_dynamic_frame. from options(
    connection_type="facebookpageinsights",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "entityName",
        "API_VERSION": "v21"
   }
```

**Facebook Page Insights 필드 세부 정보**:

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

## 분할 쿼리
<a name="facebook-page-insights-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`: 파티션 수.

예시:

```
facebookPageInsights_read = glueContext.create_dynamic_frame.from_options(
     connection_type="facebookpageinsights",
     connection_options={
         "connectionName": "connectionName",
         "ENTITY_NAME": "entityName",
         "API_VERSION": "v21",
         "PARTITION_FIELD": "created_Time"
         "LOWER_BOUND": "2024-10-27T07:00:00+0000"
         "UPPER_BOUND": "2024-10-27T07:00:00+0000"
         "NUM_PARTITIONS": "10"
     }
```

# Facebook Page Insights 연결 옵션
<a name="facebook-page-insights-connection-options"></a>

다음은 Facebook Page Insights의 연결 옵션입니다.
+ `ENTITY_NAME`(문자열) - (필수) 읽기에 사용됩니다. Facebook Page Insights에서의 객체 이름입니다.
+ `API_VERSION`(문자열) - (필수) 읽기에 사용됩니다. 사용할 Facebook Page Insights 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`(문자열) - (필수) 읽기에 사용됩니다. 유효한 Facebook Page Insights 인스턴스 URL입니다.

# Facebook Page Insights 커넥터에 대한 제한 사항 및 참고 사항
<a name="facebook-page-insights-connector-limitations"></a>

다음은 Facebook Ads 커넥터의 제한 사항 또는 참고 사항입니다.
+ 대부분의 지표는 24시간마다 한 번씩 업데이트됩니다.
+ 최근 2년간의 인사이트 데이터만 사용할 수 있습니다.
+ `since` 및 `until` 파라미터를 사용할 때는 한 번에 90일의 인사이트만 볼 수 있습니다.

# Freshdesk에 연결
<a name="connecting-to-data-freshdesk"></a>

Freshdesk는 기능이 다양하고 사용하기 쉬운 클라우드 기반 고객 지원 소프트웨어입니다. 라이브 채팅, 이메일, 전화 및 소셜 미디어를 포함한 여러 지원 채널을 사용하면 고객이 선호하는 커뮤니케이션 방법을 통해 고객을 지원할 수 있습니다. Freshdesk 사용자인 경우 Freshdesk 계정에 AWS Glue를 연결할 수 있습니다. Freshdesk를 ETL 작업에서의 데이터 소스로 사용할 수 있습니다. 이러한 작업을 실행하여 Freshdesk에서 AWS 서비스 또는 기타 지원되는 애플리케이션으로 데이터를 전송합니다.

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

# AWS Glue의 Freshdesk 지원
<a name="freshdesk-support"></a>

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

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

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

**지원되는 Freshdesk API 버전**  
다음 Freshdesk API 버전이 지원됩니다.
+ v2

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

# Freshdesk 구성
<a name="freshdesk-configuring"></a>

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

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

다음은 최소 요구 사항입니다.
+ Freshdesk 계정이 있어야 합니다. Free, Growth, Pro 또는 Enterprise 에디션 중에서 선택할 수 있습니다.
+ Freshdesk 사용자의 API 키가 있어야 합니다.

# Freshdesk 연결 구성
<a name="freshdesk-configuring-connections"></a>

Freshdesk는 사용자 지정 인증을 지원합니다.

사용자 지정 인증에 필요한 API 키 생성에 대한 퍼블릭 Freshdesk 설명서는 [Freshdesk 인증](https://developer.freshdesk.com/api/#authentication)을 참조하세요.

다음은 Freshdesk 연결을 구성하는 단계입니다.
+ AWS Secrets Manager에서 다음 세부 정보로 보안 암호를 생성합니다.
  + 고객 관리형의 연결된 앱의 경우 보안 암호는 키 역할을 하는 `apiKey`와 함께 연결된 앱 API를 포함해야 합니다. AWS Glue에서 연결당 보안 암호를 생성해야 합니다.
+ AWS Glue Studio의 **데이터 연결**에서 아래 단계에 따라 연결을 생성합니다.
  + **데이터 소스**를 선택할 때 Freshdesk를 선택합니다.
  + 연결하려는 Freshdesk 인스턴스의 `INSTANCE_URL`을 제공합니다.
  + 다음 작업에 대한 권한이 있고 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": "*"
        }
      ]
    }
    ```

------
  + 토큰을 넣기 위해 AWS Glue에서 이 연결에 사용할 `secretName`을 선택합니다.
  + 네트워크를 사용하려는 경우 네트워크 옵션을 선택합니다.
+ AWS Glue 작업 권한과 연결된 IAM 역할에 `secretName`을 읽을 수 있는 권한을 부여합니다.
+ AWS Glue 작업 구성에서** 추가 네트워크 연결**로 `connectionName`을 제공합니다.

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

**사전 조건**

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

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


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| Agents | 예 | 예 | 아니요 | 예 | 예 | 
| Business Hours | 아니요 | 예 | 아니요 | 예 | 예 | 
| Company | 예 | 예 | 아니요 | 예 | 예 | 
| Contacts | 예 | 예 | 아니요 | 예 | 예 | 
| Conversations | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| Email Configs | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| Email Inboxes | 예 | 예 | 예 | 예 | 아니요 | 
| Forum Categories | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| Forums | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| Groups | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| Products | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| Roles | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| Satisfaction Ratings | 예 | 예 | 아니요 | 예 | 아니요 | 
| Skills | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| Solutions | 예 | 예 | 아니요 | 예 | 아니요 | 
| Surveys | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| Tickets | 예 | 예 | 예 | 예 | 예 | 
| Time Entries | 예 | 예 | 아니요 | 예 | 아니요 | 
| 주제 | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| Topic Comments | 아니요 | 예 | 아니요 | 예 | 아니요 | 

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


| 개체 | API 버전 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | --- | 
| Companies | v2 | 아니요 | 아니요 | 아니요 | 아니요 | 아니요 | 
| Contacts | v2 | 아니요 | 아니요 | 아니요 | 아니요 | 아니요 | 

**예시:**

```
freshdesk_read = glueContext.create_dynamic_frame.from_options(
    connection_type="freshdesk",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "entityName",
        "API_VERSION": "v2"
    }
```

**Freshdesk 엔터티 및 필드 세부 정보**


| 개체 | 필드 | 
| --- | --- | 
| Agents | https://developers.freshdesk.com/api/\$1list\$1all\$1agents | 
| Business-hours | https://developers.freshdesk.com/api/\$1list\$1all\$1business\$1hours | 
| 설명 | https://developers.freshdesk.com/api/\$1comment\$1attributess | 
| Company | https://developers.freshdesk.com/api/\$1companies | 
| Contacts | https://developers.freshdesk.com/api/\$1list\$1all\$1contacts | 
| Conversations | https://developers.freshdesk.com/api/\$1list\$1all\$1ticket\$1notes | 
| Email-configs | https://developers.freshdesk.com/api/\$1list\$1all\$1email\$1configs | 
| Email-inboxes | https://developers.freshdesk.com/api/\$1list\$1all\$1email\$1mailboxes | 
| Forum-categories | https://developers.freshdesk.com/api/\$1category\$1attributes | 
| Forums | https://developers.freshdesk.com/api/\$1forum\$1attributes | 
| Groups | https://developers.freshdesk.com/api/\$1list\$1all\$1groups | 
| Products | https://developers.freshdesk.com/api/\$1list\$1all\$1products | 
| Roles | https://developers.freshdesk.com/api/\$1list\$1all\$1roles | 
| Satisfaction-rating | https://developers.freshdesk.com/api/\$1view\$1all\$1satisfaction\$1ratingss | 
| Skills | https://developers.freshdesk.com/api/\$1list\$1all\$1skills | 
| Solutions | https://developers.freshdesk.com/api/\$1solution\$1content | 
| Surveys | https://developers.freshdesk.com/api/\$1list\$1all\$1survey | 
| Tickets | https://developers.freshdesk.com/api/\$1list\$1all\$1tickets | 
| Time-entries | https://developers.freshdesk.com/api/\$1list\$1all\$1time\$1entries | 
| 주제 | https://developers.freshdesk.com/api/\$1topic\$1attributes | 

## 분할 쿼리
<a name="freshdesk-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`: 파티션 수.

예시:

```
freshDesk_read = glueContext.create_dynamic_frame.from_options(
     connection_type="freshdesk",
     connection_options={
         "connectionName": "connectionName",
         "ENTITY_NAME": "entityName",
         "API_VERSION": "v2",
         "PARTITION_FIELD": "Created_Time"
         "LOWER_BOUND": " 2024-10-27T23:16:08Z“
         "UPPER_BOUND": " 2024-10-27T23:16:08Z"
         "NUM_PARTITIONS": "10"
     }
```

# Freshdesk 연결 옵션
<a name="freshdesk-connection-options"></a>

다음은 Freshdesk의 연결 옵션입니다.
+ `ENTITY_NAME`(문자열) - (필수) 읽기에 사용됩니다. Freshdesk에서의 객체 이름입니다.
+ `API_VERSION`(문자열) - (필수) 읽기에 사용됩니다. 사용할 Freshdesk 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`(문자열) - (필수) 읽기에 사용됩니다. 유효한 Freshdesk 인스턴스 URL입니다.
+ `TRANSFER_MODE`(문자열) - `SYNC` 또는 `ASYNC` 등의 처리 유형이 기본적으로 `SYNC`로 설정되어 있는지 여부를 나타내는 데 사용됩니다. (선택 사항)

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

다음은 Freshdesk 커넥터의 제한 사항입니다.
+ 필터링이 있는 `Company`, `Contacts` 및 `Tickets` 엔터티에는 페이지 매김 제한이 있습니다. 페이지당 30개의 레코드만 반환하며 페이지 값은 최대 10개(최대 300개의 레코드 가져오기)로 설정할 수 있습니다.
+ `Tickets` 엔터티는 30일보다 오래된 레코드를 가져오지 않습니다.
+ `Company`, `Contacts` 및 `Tickets`엔터티는 필터링에서 '날짜' 데이터 유형을 지원합니다. 이 세 엔터티에 대해 '일일' 이후 트리거 빈도를 선택해야 합니다. '분' 또는 '시간당'을 선택하면 데이터가 중복될 수 있습니다. 또한 필터링을 위해 이러한 필드를 선택하는 동안 선택한 타임스탬프의 날짜 부분만 고려하므로 날짜 값만 선택해야 합니다.
+ 분당 API 직접 호출 수는 해당 계획을 기반으로 합니다. 이 제한은 호출에 사용된 에이전트 수 또는 IP 주소와 같은 요인에 관계없이 계정 전체에 적용됩니다. 모든 평가판 사용자의 경우 기본 API 제한은 분당 50회 호출입니다. 자세한 내용은 [Freshdesk](https://developer.freshdesk.com/api/#ratelimit)를 참조하세요.
+ 엔터티의 경우 한 번에 하나의 내보내기/비동기 작업만 처리됩니다. 새 작업은 기존 작업이 성공적으로 완료되거나 실패한 후에만 처리됩니다. 자세한 내용은 [Freshdesk](https://developers.freshdesk.com/api/#export_contact)를 참조하세요.
+ 다음 필드는 동기화 API 직접 호출에 지원되지만 비동기 API 요청 본문에서 전달이 지원되지 않거나 허용되지 않습니다.
  + id
  + created\$1at
  + updated\$1at
  + updated\$1since
  + 활성화
  + company\$1id
  + other\$1companies
  + avatar
  + view\$1all\$1tickets
  + deleted
  + other\$1emails
  + state
  + 태그
  + tags

# Freshsales에 연결
<a name="connecting-to-data-freshsales"></a>

Freshsales는 영업 담당자가 영업에서 추측을 배제할 수 있도록 도와주는 직관적인 CRM입니다. 전화와 이메일, 작업, 약속, 메모가 기본으로 제공되므로 영업 담당자는 잠재 고객에 대한 후속 조치를 위해 여러 탭을 전환할 필요가 없습니다. 파이프라인 보기를 통해 거래를 더 잘 관리하고 더 많은 거래를 성사시킬 수 있습니다. Freshsales 사용자인 경우 Freshsales 계정에 AWS Glue를 연결할 수 있습니다. Freshsales를 ETL 작업에서의 데이터 소스로 사용할 수 있습니다. 이러한 작업을 실행하여 Freshsales에서 AWS 서비스 또는 기타 지원되는 애플리케이션으로 데이터를 전송합니다.

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

# AWS Glue의 Freshsales 지원
<a name="freshsales-support"></a>

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

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

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

**지원되는 Freshsales API 버전**  
다음 Freshsales API 버전이 지원됩니다.
+ v1.0

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

# Freshsales 구성
<a name="freshsales-configuring"></a>

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

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

다음은 최소 요구 사항입니다.
+ Freshsales 계정이 있습니다.
+ 사용자 API 키가 있습니다.

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

# Freshsales 연결 구성
<a name="freshsales-configuring-connections"></a>

Freshsales는 사용자 지정 인증을 지원합니다.

사용자 지정 인증에 필요한 API 키 생성에 대한 퍼블릭 Freshsales 설명서는 [Authentication](https://developer.freshsales.io/api/#authentication)을 참조하세요.

Freshsales 연결을 구성하는 방법:

1. AWS Secrets Manager에서 다음 세부 정보로 보안 암호를 생성합니다.

   1. 고객 관리형 연결된 앱의 경우 보안 암호는 키 역할을 하는 `apiSecretKey`과 함께 연결된 앱 API를 포함해야 합니다. 또한 보안 암호에는 `apiKey`을 키로 사용하고 `token`을 값으로 사용하는 다른 키-값 쌍이 포함되어야 합니다.

   1. 참고: AWS Glue에서 연결의 보안 암호를 생성해야 합니다.

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

   1. **데이터 소스**를 선택할 때 Freshsales를 선택합니다.

   1. 연결하려는 Freshsales 계정의 `INSTANCE_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`을 읽을 수 있는 권한을 부여합니다.

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

**사전 조건**

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

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


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| Accounts | 예 | 예 | 예 | 예 | 예 | 
| Contacts | 예 | 예 | 예 | 예 | 예 | 

**예시:**

```
freshSales_read = glueContext.create_dynamic_frame.from_options(
     connection_type="freshsales",
     connection_options={
         "connectionName": "connectionName",
         "ENTITY_NAME": "entityName",
         "API_VERSION": "v1.0"
     }
```

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

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

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

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

**필터 기반 분할**:

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

  Datetime 필드의 경우 ISO 형식의 값이 허용됩니다.

  유효한 값의 예제:

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

예시:

```
freshSales_read = glueContext.create_dynamic_frame.from_options(
     connection_type="freshsales",
     connection_options={
         "connectionName": "connectionName",
         "ENTITY_NAME": "entityName",
         "API_VERSION": "v1",
         "PARTITION_FIELD": "Created_Time"
         "LOWER_BOUND": " 2024-10-15T21:16:25Z"
         "UPPER_BOUND": " 2024-10-20T21:25:50Z"
         "NUM_PARTITIONS": "10"
     }
```

# Freshsales 연결 옵션
<a name="freshsales-connection-options"></a>

다음은 Freshsales의 연결 옵션입니다.
+ `ENTITY_NAME`(문자열) - (필수) 읽기에 사용됩니다. Freshsales에서의 객체 이름입니다.
+ `API_VERSION`(문자열) - (필수) 읽기에 사용됩니다. 사용하려는 Freshsales 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`(문자열) - 읽기에 사용됩니다. 유효한 Freshsales 인스턴스 URL입니다.

# Freshsales 제한 사항
<a name="freshsales-connection-limitations"></a>

다음은 Freshsales의 제한 사항 또는 참고 사항입니다.
+ Freshsales에서 API 속도 제한은 계정당 시간당 1,000개의 API 요청으로 설정되어 있습니다([오류](https://developer.freshsales.io/api/#error) 참조). 단, 이 제한은 엔터프라이즈 구독 요금제로 확장할 수 있습니다([플랜 비교](https://www.freshworks.com/crm/pricing-compare/) 참조).

# Google Ads에 연결
<a name="connecting-to-googleads"></a>

 Google Ads API는 대규모 또는 복잡한 Google Ads 계정 및 캠페인을 관리하는 데 사용되는 Google Ads에 대한 프로그래밍 방식 인터페이스입니다. Google Ads 사용자인 경우 Google Ads 계정에 AWS Glue를 연결할 수 있습니다. 그런 다음, Google Ads를 ETL 작업에서의 데이터 소스로 사용할 수 있습니다. 이러한 작업을 실행하여 Google Ads 및 AWS 서비스 또는 기타 지원되는 애플리케이션 간에 데이터를 전송합니다.

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

# Google Ads의 AWS Glue 지원
<a name="googleads-support"></a>

AWS Glue는 다음과 같이 Google Ads를 지원합니다.

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

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

**지원되는 Google Ads API 버전**  
v18

# 연결을 생성하고 사용하기 위한 API 작업이 포함된 정책
<a name="googleads-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 Management Console을 사용하는 경우 AWS Glue 리소스에 대한 전체 액세스 권한을 부여합니다. 이 정책에 지정된 리소스의 이름 변환을 따르면 사용자는 콘솔 전체 용량을 소유합니다. 이 정책은 보통 AWS Glue 콘솔의 사용자에게 해당됩니다.

# Google Ads 구성
<a name="googleads-configuring"></a>

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

## 최소 요구 사항
<a name="googleads-configuring-min-requirements"></a>
+  이메일 및 암호가 설정된 Google Ads 계정이 있습니다. 계정 생성에 대한 자세한 내용은 [Google Ads 계정 생성](googleads-create-account.md)을 참조하세요.
+  API 액세스에 대해 Google Ads 계정이 활성화되어 있습니다. Google Ads API는 모두 추가 비용 없이 사용 가능합니다.
+  Google Ads 계정을 사용하면 연결된 앱을 설치할 수 있습니다. 이 기능에 대한 액세스 권한이 없는 경우 Google Ads 관리자에게 문의하세요.

 이러한 요구 사항을 충족하면 Google Ads 계정에 AWS Glue를 연결할 준비가 된 것입니다.

# Google Ads 연결 구성
<a name="googleads-configuring-connections"></a>

 Google Ads는 OAuth2에 대한 `AUTHORIZATION_CODE` 권한 부여 유형을 지원합니다.

 이 권한 부여 유형은 사용자를 인증하기 위해 사용자를 서드파티 권한 부여 서버로 리디렉션하는 방식에 의존하므로 '3각' OAuth로 간주됩니다. AWS Glue 콘솔을 통해 연결을 생성할 때 사용됩니다. AWS Glue 콘솔은 사용자를 Google Ads로 리디렉션합니다. 사용자가 로그인하고 Google Ads 인스턴스에 액세스하도록 요청된 권한을 AWS Glue에 허용해야 합니다.

 사용자는 AWS Glue 콘솔을 통해 연결을 생성할 때에도 Google Ads에서 자체 연결된 앱을 생성하고 자체 클라이언트 ID와 클라이언트 보안 암호를 제공하기로 선택할 수 있습니다. 이 시나리오에서는 여전히 Google Ads로 리디렉션되어 로그인하고 리소스에 액세스할 수 있는 권한을 AWS Glue에 부여합니다.

 이 권한 부여 유형은 새로 고침 토큰과 액세스 토큰을 생성합니다. 액세스 토큰은 수명이 짧으며 새로 고침 토큰을 사용하여 사용자 상호 작용 없이 자동으로 새로 고칠 수 있습니다.

 자세한 내용은 [권한 부여 코드 OAuth 흐름을 위한 연결된 앱 생성의 퍼블릭 Google Ads 설명서](https://developers.google.com/workspace/guides/create-credentials)를 참조하세요.

Google Ads 연결을 구성하는 방법:

1.  AWS Secrets Manager에서 다음 세부 정보로 보안 암호를 생성하세요. AWS Glue에서 각 연결에 대한 보안 암호를 생성해야 합니다.

   1.  AuthorizationCode 권한 부여 유형의 경우: 
      +  고객 관리형 연결된 앱의 경우 - 보안 암호는 키 역할을 하는 `USER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET`과 함께 연결된 앱 소비자 보안 암호를 포함해야 합니다.

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

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

   1. 연결하려는 Facebook Ads의 `developer token`을 제공합니다.

   1. 관리자로 로그인하려는 경우 Google Ads의 `MANAGER ID`를 제공합니다.

   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.  토큰을 넣기 위해 AWS Glue에서 이 연결에 사용할 `secretName`을 선택합니다.

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

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

# Google Ads 엔터티에서 읽기
<a name="googleads-reading-from-entities"></a>

 **사전 조건** 
+  읽으려는 Google Ads 객체. 사용 가능한 엔터티를 확인하려면 아래 지원되는 엔터티 테이블을 참조하세요.

 **지원되는 엔터티** 


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| 광고 그룹 광고 | 예 | 예 | 예 | 아니요 | 예 | 
| 광고 그룹 | 예 | 예 | 예 | 아니요 | 예 | 
| 캠페인 예산 | 예 | 예 | 예 | 예 | 예 | 
| 계정 예산 | 예 | 아니요 | 예 | 예 | 아니요 | 
| 캠페인 | 예 | 예 | 예 | 예 | 예 | 
| Account | 예 | 아니요 | 예 | 아니요 | 아니요 | 

 **예제** 

```
googleAds_read = glueContext.create_dynamic_frame.from_options(
    connection_type="googleads",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "campaign-3467***",
        "API_VERSION": "v16"
    }
```

 **Google Ads 엔터티 및 필드 세부 정보** 


| 개체 | 필드 | 데이터 형식 | 지원되는 연산자 | 
| --- | --- | --- | --- | 
| Account | resourceName | String | \$1=, = | 
| Account | callReportingEnabled | 불 | \$1=, = | 
| Account | callConversionReportingEnabled | 불 | \$1=, = | 
| Account | callConversionAction | String | \$1=, = | 
| Account | conversionTrackingId | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| Account | crossAccountConversionTrackingId | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| Account | payPerConversionEligibilityFailureReasons | 나열 |  | 
| Account | id | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| Account | currencyCode | String | \$1=, =, LIKE | 
| Account | timeZone | String | \$1=, =, LIKE | 
| Account | autoTaggingEnabled | 불 | \$1=, = | 
| Account | hasPartnersBadge | 불 | \$1=, = | 
| Account | manager | 불 | \$1=, = | 
| Account | testAccount | 불 | \$1=, = | 
| Account | date | 날짜 | BETWEEN, =, <, >, <=, >= | 
| Account | costMicros | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| Account | acceptedCustomerDataTerms | 불 |  | 
| Account | conversionTrackingStatus | String | \$1=, =, LIKE | 
| Account | enhancedConversionsForLeadsEnabled | 불 |  | 
| Account | googleAdsConversionCustomer | String |  | 
| Account | status | String | \$1=, = | 
| Account | allConversionsByConversionDate | 배정밀도 실수 | \$1=, =, <, > | 
| Account | allConversionsValueByConversionDate | 배정밀도 실수 | \$1=, =, <, > | 
| Account | conversionsByConversionDate | 배정밀도 실수 | \$1=, =, <, > | 
| Account | conversionsValueByConversionDate | 배정밀도 실수 | \$1=, =, <, > | 
| Account | valuePerAllConversionsByConversionDate | 배정밀도 실수 | \$1=, =, <, > | 
| Account | videoViews | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| Account | clicks | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| Account | invalidClicks | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| Account | costPerAllConversions | 배정밀도 실수 | \$1=, =, <, > | 
| Account | costPerConversion | 배정밀도 실수 | \$1=, =, <, > | 
| Account | conversions | 배정밀도 실수 | \$1=, =, <, > | 
| Account | absoluteTopImpressionPercentage | 배정밀도 실수 | \$1=, =, <, > | 
| Account | impressions | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| Account | topImpressionPercentage | 배정밀도 실수 | \$1=, =, <, > | 
| Account | averageCpc | 배정밀도 실수 | \$1=, =, <, > | 
| Account | activeViewMeasurableCostMicros | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| Account | averageCost | 배정밀도 실수 | \$1=, =, <, > | 
| Account | ctr | 배정밀도 실수 | \$1=, =, <, > | 
| Account | activeViewCtr | 배정밀도 실수 | \$1=, =, <, > | 
| Account | searchImpressionShare | 배정밀도 실수 | \$1=, =, <, > | 
| Account | conversionAction | String | \$1=, = | 
| Account | conversionActionCategory | String | \$1=, = | 
| Account | conversionActionName | String | \$1=, =, LIKE | 
| 계정 예산 | resourceName | String | \$1=, = | 
| 계정 예산 | status | String | \$1=, = | 
| 계정 예산 | proposedEndTimeType | String | \$1=, = | 
| 계정 예산 | approvedEndTimeType | String | \$1=, = | 
| 계정 예산 | id | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| 계정 예산 | billingSetup | String | \$1=, = | 
| 계정 예산 | name | String | \$1=, =, LIKE | 
| 계정 예산 | approvedStartDateTime |  DateTime | BETWEEN, =, <, >, <=, >= | 
| 계정 예산 | proposedSpendingLimitMicros | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| 계정 예산 | approvedSpendingLimitMicros | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| 계정 예산 | adjustedSpendingLimitMicros | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| 계정 예산 | amountServedMicros | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| 광고 그룹 | resourceName | String | \$1=, =, LIKE | 
| 광고 그룹 | status | String | \$1=, =, LIKE | 
| 광고 그룹 | type | String | \$1=, =, LIKE | 
| 광고 그룹 | id | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| 광고 그룹 | name | String | \$1=, =, LIKE | 
| 광고 그룹 | campaign | String | \$1=, = | 
| 광고 그룹 | cpcBidMicros | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| 광고 그룹 | targetCpaMicros | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| 광고 그룹 | cpmBidMicros | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| 광고 그룹 | cpvBidMicros | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| 광고 그룹 | targetCpmMicros | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| 광고 그룹 | effectiveTargetCpaMicros | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| 광고 그룹 | date | 날짜 | BETWEEN, =, <, >, <=, >= | 
| 광고 그룹 | costMicros | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| 광고 그룹 | useAudienceGrouped | 불 | \$1=, = | 
| 광고 그룹 | effectiveCpcBidMicros | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| 광고 그룹 | allConversionsByConversionDate | 배정밀도 실수 | \$1=, =, <, > | 
| 광고 그룹 | allConversionsValueByConversionDate | 배정밀도 실수 | \$1=, =, <, > | 
| 광고 그룹 | conversionsByConversionDate | 배정밀도 실수 | \$1=, =, <, > | 
| 광고 그룹 | conversionsValueByConversionDate | 배정밀도 실수 | \$1=, =, <, > | 
| 광고 그룹 | valuePerAllConversionsByConversionDate | 배정밀도 실수 | \$1=, =, <, > | 
| 광고 그룹 | valuePerConversionsByConversionDate | 배정밀도 실수 | \$1=, =, <, > | 
| 광고 그룹 | averageCost | 배정밀도 실수 | \$1=, =, <, > | 
| 광고 그룹 | costPerAllConversions | 배정밀도 실수 | \$1=, =, <, > | 
| 광고 그룹 | costPerConversion | 배정밀도 실수 | \$1=, =, <, > | 
| 광고 그룹 | averagePageViews | 배정밀도 실수 | \$1=, =, <, > | 
| 광고 그룹 | videoViews | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| 광고 그룹 | clicks | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| 광고 그룹 | allConversions | 배정밀도 실수 | \$1=, =, <, > | 
| 광고 그룹 | averageCpc | 배정밀도 실수 | \$1=, =, <, > | 
| 광고 그룹 | absoluteTopImpressionPercentage | 배정밀도 실수 | \$1=, =, <, > | 
| 광고 그룹 | impressions | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| 광고 그룹 | topImpressionPercentage | 배정밀도 실수 | \$1=, =, <, > | 
| 광고 그룹 | activeViewCtr | 배정밀도 실수 | \$1=, =, <, > | 
| 광고 그룹 | ctr | 배정밀도 실수 | \$1=, =, <, > | 
| 광고 그룹 | searchTopImpressionShare | 배정밀도 실수 | \$1=, =, <, > | 
| 광고 그룹 | searchImpressionShare | 배정밀도 실수 | \$1=, =, <, > | 
| 광고 그룹 | searchAbsoluteTopImpressionShare | 배정밀도 실수 | \$1=, =, <, > | 
| 광고 그룹 | relativeCtr | 배정밀도 실수 | \$1=, =, <, > | 
| 광고 그룹 | conversionAction | String | \$1=, = | 
| 광고 그룹 | conversionActionCategory | String | \$1=, = | 
| 광고 그룹 | conversionActionName | String | \$1=, =, LIKE | 
| 광고 그룹 | updateMask | String |  | 
| 광고 그룹 | 생성 | Struct |  | 
| 광고 그룹 | 업데이트 | Struct |  | 
| 광고 그룹 | primaryStatus | String | \$1=, = | 
| 광고 그룹 | primaryStatusReasons | 나열 |  | 
| 광고 그룹 광고 | resourceName | String | \$1=, = | 
| 광고 그룹 광고 | id | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| 광고 그룹 광고 | status | String | \$1=, = | 
| 광고 그룹 광고 | labels | 나열 |  | 
| 광고 그룹 광고 | adGroup | String | \$1=, = | 
| 광고 그룹 광고 | costMicros | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| 광고 그룹 광고 | approvalStatus | String | \$1=, = | 
| 광고 그룹 광고 | reviewStatus | String | \$1=, = | 
| 광고 그룹 광고 | adStrength | String | \$1=, = | 
| 광고 그룹 광고 | type | String | \$1=, = | 
| 광고 그룹 광고 | businessName | String | \$1=, =, LIKE | 
| 광고 그룹 광고 | date | 날짜 | BETWEEN, =, <, >, <=, >= | 
| 광고 그룹 광고 | allConversionsByConversionDate | 배정밀도 실수 | \$1=, =, <, > | 
| 광고 그룹 광고 | allConversionsValueByConversionDate | 배정밀도 실수 | \$1=, =, <, > | 
| 광고 그룹 광고 | conversionsByConversionDate | 배정밀도 실수 | \$1=, =, <, > | 
| 광고 그룹 광고 | conversionsValueByConversionDate | 배정밀도 실수 | \$1=, =, <, > | 
| 광고 그룹 광고 | valuePerAllConversionsByConversionDate | 배정밀도 실수 | \$1=, =, <, > | 
| 광고 그룹 광고 | valuePerConversionsByConversionDate | 배정밀도 실수 | \$1=, =, <, > | 
| 광고 그룹 광고 | activeViewMeasurableCostMicros | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| 광고 그룹 광고 | averageCost | 배정밀도 실수 | \$1=, =, <, > | 
| 광고 그룹 광고 | costPerAllConversions | 배정밀도 실수 | \$1=, =, <, > | 
| 광고 그룹 광고 | costPerConversion | 배정밀도 실수 | \$1=, =, <, > | 
| 광고 그룹 광고 | clicks | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| 광고 그룹 광고 | averagePageViews | 배정밀도 실수 | \$1=, =, <, > | 
| 광고 그룹 광고 | videoViews | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| 광고 그룹 광고 | allConversions | 배정밀도 실수 | \$1=, =, <, > | 
| 광고 그룹 광고 | averageCpc | 배정밀도 실수 | \$1=, =, <, > | 
| 광고 그룹 광고 | topImpressionPercentage | 배정밀도 실수 | \$1=, =, <, > | 
| 광고 그룹 광고 | impressions | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| 광고 그룹 광고 | absoluteTopImpressionPercentage | 배정밀도 실수 | \$1=, =, <, > | 
| 광고 그룹 광고 | activeViewCtr | 배정밀도 실수 | \$1=, =, <, > | 
| 광고 그룹 광고 | ctr | 배정밀도 실수 | \$1=, =, <, > | 
| 광고 그룹 광고 | conversionAction | String | \$1=, = | 
| 광고 그룹 광고 | conversionActionCategory | String | \$1=, = | 
| 광고 그룹 광고 | conversionActionName | String | \$1=, =, LIKE | 
| 광고 그룹 광고 | updateMask | String |  | 
| 광고 그룹 광고 | 생성 | Struct |  | 
| 광고 그룹 광고 | 업데이트 | Struct |  | 
| 광고 그룹 광고 | policyValidationParameter | Struct |  | 
| 광고 그룹 광고 | primaryStatus | String | \$1=, = | 
| 광고 그룹 광고 | primaryStatusReasons | 나열 |  | 
| 캠페인 | resourceName | String | \$1=, = | 
| 캠페인 | status | String | \$1=, = | 
| 캠페인 | baseCampaign | String | \$1=, = | 
| 캠페인 | name | String | \$1=, =, LIKE | 
| 캠페인 | id | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| 캠페인 | campaignBudget | String | \$1=, =, LIKE | 
| 캠페인 | startDate | 날짜 | BETWEEN, =, <, >, <=, >= | 
| 캠페인 | endDate | 날짜 | BETWEEN, =, <, >, <=, >= | 
| 캠페인 | adServingOptimizationStatus | String | \$1=, = | 
| 캠페인 | advertisingChannelType | String | \$1=, = | 
| 캠페인 | advertisingChannelSubType | String | \$1=, = | 
| 캠페인 | experimentType | String | \$1=, = | 
| 캠페인 | servingStatus | String | \$1=, = | 
| 캠페인 | biddingStrategyType | String | \$1=, = | 
| 캠페인 | domainName | String | \$1=, =, LIKE | 
| 캠페인 | languageCode | String | \$1=, =, LIKE | 
| 캠페인 | useSuppliedUrlsOnly | 불 | \$1=, = | 
| 캠페인 | positiveGeoTargetType | String | \$1=, = | 
| 캠페인 | negativeGeoTargetType | String | \$1=, = | 
| 캠페인 | paymentMode | String | \$1=, = | 
| 캠페인 | optimizationGoalTypes | 나열 |  | 
| 캠페인 | date | 날짜 | BETWEEN, =, <, >, <=, >= | 
| 캠페인 | averageCost | 배정밀도 실수 |  | 
| 캠페인 | clicks | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| 캠페인 | costMicros | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| 캠페인 | impressions | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| 캠페인 | useAudienceGrouped | 불 | \$1=, = | 
| 캠페인 | activeViewMeasurableCostMicros | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| 캠페인 | costPerAllConversions | 배정밀도 실수 | \$1=, =, <, > | 
| 캠페인 | costPerConversion | 배정밀도 실수 | \$1=, =, <, > | 
| 캠페인 | invalidClicks | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| 캠페인 | publisherPurchasedClicks | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| 캠페인 | averagePageViews | 배정밀도 실수 | \$1=, =, <, > | 
| 캠페인 | videoViews | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| 캠페인 | allConversionsByConversionDate | 배정밀도 실수 | \$1=, =, <, > | 
| 캠페인 | allConversionsValueByConversionDate | 배정밀도 실수 | \$1=, =, <, > | 
| 캠페인 | conversionsByConversionDate | 배정밀도 실수 | \$1=, =, <, > | 
| 캠페인 | conversionsValueByConversionDate | 배정밀도 실수 | \$1=, =, <, > | 
| 캠페인 | valuePerAllConversionsByConversionDate | 배정밀도 실수 | \$1=, =, <, > | 
| 캠페인 | valuePerConversionsByConversionDate | 배정밀도 실수 | \$1=, =, <, > | 
| 캠페인 | allConversions | 배정밀도 실수 | \$1=, =, <, > | 
| 캠페인 | absoluteTopImpressionPercentage | 배정밀도 실수 | \$1=, =, <, > | 
| 캠페인 | searchAbsoluteTopImpressionShare | 배정밀도 실수 | \$1=, =, <, > | 
| 캠페인 | averageCpc | 배정밀도 실수 | \$1=, =, <, > | 
| 캠페인 | searchImpressionShare | 배정밀도 실수 | \$1=, =, <, > | 
| 캠페인 | searchTopImpressionShare | 배정밀도 실수 | \$1=, =, <, > | 
| 캠페인 | activeViewCtr | 배정밀도 실수 | \$1=, =, <, > | 
| 캠페인 | ctr | 배정밀도 실수 | \$1=, =, <, > | 
| 캠페인 | relativeCtr | 배정밀도 실수 | \$1=, =, <, > | 
| 캠페인 | updateMask | String |  | 
| 캠페인 | 생성 | Struct |  | 
| 캠페인 | 업데이트 | Struct |  | 
| 캠페인 예산 | resourceName | String | \$1=, = | 
| 캠페인 예산 | id | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| 캠페인 예산 | status | String | \$1=, = | 
| 캠페인 예산 | deliveryMethod | String | \$1=, = | 
| 캠페인 예산 | 기간 | String | \$1=, = | 
| 캠페인 예산 | type | String | \$1=, = | 
| 캠페인 예산 | name | String | \$1=, =, LIKE | 
| 캠페인 예산 | amountMicros | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| 캠페인 예산 | explicitlyShared | 불 | \$1=, = | 
| 캠페인 예산 | referenceCount | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| 캠페인 예산 | hasRecommendedBudget | 불 | \$1=, = | 
| 캠페인 예산 | date | 날짜 | BETWEEN, =, <, >, <=, >= | 
| 캠페인 예산 | costMicros | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| 캠페인 예산 | startDate | 날짜 | BETWEEN, =, <, >, <=, >= | 
| 캠페인 예산 | endDate | 날짜 | BETWEEN, =, <, >, <=, >= | 
| 캠페인 예산 | maximizeConversionValueTargetRoas | 배정밀도 실수 | \$1=, =, <, > | 
| 캠페인 예산 | maximizeConversionsTargetCpaMicros | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| 캠페인 예산 | selectiveOptimizationConversionActions | String |  | 
| 캠페인 예산 | averageCost | 배정밀도 실수 | \$1=, =, <, > | 
| 캠페인 예산 | costPerAllConversions | 배정밀도 실수 | \$1=, =, <, > | 
| 캠페인 예산 | costPerConversion | 배정밀도 실수 | \$1=, =, <, > | 
| 캠페인 예산 | videoViews | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| 캠페인 예산 | clicks | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| 캠페인 예산 | allConversions | 배정밀도 실수 | \$1=, =, <, > | 
| 캠페인 예산 | valuePerAllConversions | 배정밀도 실수 | \$1=, =, <, > | 
| 캠페인 예산 | averageCpc | 배정밀도 실수 | \$1=, =, <, > | 
| 캠페인 예산 | impressions | BigInteger | BETWEEN, =, \$1=, <, >, <=, >= | 
| 캠페인 예산 | ctr | 배정밀도 실수 | \$1=, =, <, > | 
| 캠페인 예산 | updateMask | String |  | 
| 캠페인 예산 | 생성 | Struct |  | 
| 캠페인 예산 | 업데이트 | Struct |  | 

 **분할 쿼리** 

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

   날짜의 경우 Spark SQL 쿼리에 사용된 Spark 날짜 형식을 허용합니다. 유효한 값의 예제: `"2024-02-06"`.
+  `UPPER_BOUND`: 선택한 파티션 필드의 상한 값(경계 제외).
+  `NUM_PARTITIONS`: 파티션 수.

 엔터티 수준의 분할 필드 지원 세부 정보는 다음 표에 캡처되어 있습니다.


| Entity Name | 분할 필드 | 데이터 형식 | 
| --- | --- | --- | 
| 광고 그룹 광고 | date | 날짜 | 
| 광고 그룹 | date | 날짜 | 
| 캠페인 | date | 날짜 | 
| 캠페인 예산 | date | 날짜 | 

 **예제** 

```
googleads_read = glueContext.create_dynamic_frame.from_options(
    connection_type="googleads",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "campaign-3467***",
        "API_VERSION": "v16",
        "PARTITION_FIELD": "date"
        "LOWER_BOUND": "2024-01-01"
        "UPPER_BOUND": "2024-06-05"
        "NUM_PARTITIONS": "10"
    }
)
```

# Google Ads 연결 옵션
<a name="googleads-connection-options"></a>

다음은 Google Ads의 연결 옵션입니다.
+  `ENTITY_NAME`(문자열) - (필수) 읽기/쓰기에 사용됩니다. Google Ads에서의 객체 이름입니다.
+  `API_VERSION`(문자열) - (필수) 읽기/쓰기에 사용됩니다. 사용할 Snapchat Ads Rest API 버전입니다. 예: v16.
+  `DEVELOPER_TOKEN`(문자열) - (필수) 읽기/쓰기에 사용됩니다. API에 요청하는 개발자 또는 애플리케이션을 인증하는 데 필요합니다.
+  `MANAGER_ID`(문자열) - 읽기/쓰기에 사용됩니다. 여러 Google Ads 계정을 관리할 수 있는 고유 ID입니다. 권한 있는 관리자의 고객 ID입니다. 관리자 계정을 통해 고객 계정에 액세스하는 경우 `MANAGER_ID`가 필요합니다. 자세한 내용은 [login-customer-id](https://developers.google.com/google-ads/api/docs/concepts/call-structure#cid)를 참조하세요.
+  `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 객체에 대해 선택할 열.
+  `FILTER_PREDICATE`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.
+  `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리.
+  `PARTITION_FIELD`(문자열) - 읽기에 사용됩니다. 쿼리 분할에 사용할 필드입니다.
+  `LOWER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 하한 값(경계 포함).
+  `UPPER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 상한 값(경계 제외).
+  `NUM_PARTITIONS`(정수) - 기본값: 1. 읽기에 사용됩니다. 읽을 파티션 수.

# Google Ads 계정 생성
<a name="googleads-create-account"></a>

1.  사용자 자격 증명을 사용하여 [Google Ads 개발자 계정](https://console.cloud.google.com)으로 로그인하고 \$1MyProject로 이동하세요.  
![\[스크린샷은 Google Ads 개발자 계정에 로그인하는 시작 화면을 보여줍니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/google-ads-log-in-developer-account.png)

1.  **New Project**를 선택하고 등록된 애플리케이션이 없는 경우 Google 프로젝트를 생성하는 데 필요한 정보를 제공하세요.  
![\[스크린샷은 프로젝트 선택 페이지를 보여줍니다. 오른쪽 상단에서 새 프로젝트를 선택하세요.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/google-ads-new-project.png)  
![\[스크린샷은 프로젝트 이름을 입력하고 위치를 선택하는 새 프로젝트 창을 보여줍니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/google-ads-new-project-name-location.png)

1.  **Navigation Tab**, **API and Setting**, **Create Client Id** 및 **Create ClientSecret**을 차례로 선택하세요. 그러면 AWS Glue 및 GoogleAds 간 연결을 생성하는 데 추가 구성이 필요합니다. 자세한 내용은 [API credentials](https://console.cloud.google.com/apis/credentials)를 참조하세요.  
![\[스크린샷은 API 및 서비스 구성 페이지를 보여줍니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/google-ads-apis-and-services.png)

1.  **CREATE CREDENTIALS**를 선택하고 **OAuth client ID**를 선택하세요.  
![\[스크린샷은 자격 증명 생성 드롭다운과 Oauth 클라이언트 ID 옵션이 강조 표시된 API 및 서비스 구성 페이지를 보여줍니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/google-ads-create-credentials.png)

1.  **Application type**을 **Web application**으로 선택하세요.  
![\[스크린샷은 OAuth 클라이언트 ID 생성 페이지 및 웹 애플리케이션에 해당하는 애플리케이션 유형을 보여줍니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/google-ads-oauth-client-id-application-type.png)

1.  **Authorised redirect URIs**에서 OAuth 리디렉션 URI를 추가하고 **Create**를 선택하세요. 필요한 경우 여러 리디렉션 URI를 추가할 수 있습니다.  
![\[스크린샷은 Create OAuth client ID 페이지와 Authorised redirect URIs 섹션을 보여줍니다. 여기에서 URI를 추가하고, 필요한 경우 ADD URI를 선택합니다. 완료되면 CREATE를 선택합니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/google-ads-oauth-redirect-uris.png)

1.  AWS Glue 및 Google Ads 간 연결을 생성할 때 **Client Id** 및 **Client Secret**이 생성됩니다.  
![\[스크린샷은 Create OAuth client ID 페이지와 Authorised redirect URIs 섹션을 보여줍니다. 여기에서 URI를 추가하고, 필요한 경우 ADD URI를 선택합니다. 완료되면 CREATE를 선택합니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/google-ads-oauth-client-created.png)

1.  애플리케이션 요구 사항에 따라 범위를 추가하고 **OAuth consent screen**을 선택한 다음 필요한 정보를 제공하고 요구 사항에 따라 범위를 추가하세요.  
![\[스크린샷은 선택한 범위 업데이트 페이지를 보여줍니다. 필요에 따라 범위를 선택하세요.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/google-ads-selected-scopes.png)

# 제한 사항
<a name="googleads-connector-limitations"></a>

다음은 Google Ads 커넥터의 제한 사항입니다.
+ `MANAGER_ID`는 연결을 생성하는 경우 선택적 입력입니다. 그러나 특정 관리자의 기반이 되는 고객에게 액세스하려는 경우 `MANAGER_ID`는 필수 입력입니다. 아래 표에서는 연결에서 `MANAGER_ID`의 포함 여부에 따른 액세스 제한 사항을 설명합니다.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/googleads-connector-limitations.html)
+ 관리자 계정을 객체로 선택하면 `Account`만 하위 객체로 표시됩니다. Google Ads 커넥터에서 캠페인, 광고 등과 같은 엔터티는 관리자 계정이 아닌 개별 클라이언트 계정을 기반으로 검색됩니다.
+ 관리자 계정에 대한 지표는 검색할 수 없습니다. 대신 개별 클라이언트 계정에 대한 지표를 검색할 수 있습니다.
+  각 계정에는 활성 캠페인과 일시 중지된 캠페인을 모두 포함하여 최대 10,000개의 캠페인이 있을 수 있습니다. 자세한 내용은 [Campaign per account](https://support.google.com/google-ads/answer/6372658)를 참조하세요.
+  보고서를 생성할 때 표시할 특정 지표를 선택하는 경우 선택한 지표가 모두 0인 행은 반환되지 않습니다. 자세한 내용은 [Zero Metrics](https://developers.google.com/google-ads/api/docs/reporting/zero-metrics?hl=en#exclude_zero_metrics_by_segmenting)를 참조하세요.
+  다음 필드의 경우 전체 매핑 흐름은 계정, 광고 그룹 및 광고 그룹 광고 엔터티, 특히 conversionAction, conversionActionCategory, conversionActionName에 대해서는 작동하지 않습니다. 자세한 내용은 [Segment and Metrics](https://developers.google.com/google-ads/api/docs/reporting/segmentation?hl=en#selectability_between_segments_and_metrics)를 참조하세요.
+ `segments.date` 필드를 선택하면 날짜 범위 필터가 필수입니다.

# Google Analytics 4에 연결
<a name="connecting-to-googleanalytics"></a>

 Google Analytics 4는 앱 및 웹사이트에서 방문자 상호 작용에 대한 지표를 추적 및 보고하는 분석 서비스입니다. 이러한 지표에는 페이지 조회, 활성 사용자 및 이벤트가 포함됩니다. Google Analytics 4 사용자인 경우 Google Analytics 4 계정에 AWS Glue를 연결할 수 있습니다. Google Analytics 4를 ETL 작업에서의 데이터 소스로 사용할 수 있습니다. 이러한 작업을 실행하여 Google Analytics 4에서 AWS 서비스 또는 기타 지원되는 애플리케이션으로 데이터를 전송합니다.

**Topics**
+ [Google Analytics 4에 대한 AWS Glue 지원](googleanalytics-support.md)
+ [연결을 생성하고 사용하기 위한 API 작업이 포함된 정책](googleanalytics-configuring-iam-permissions.md)
+ [Google Analytics 4 구성](googleanalytics-configuring.md)
+ [Google Analytics 4 연결 구성](googleanalytics-configuring-connections.md)
+ [Google Analytics 4 엔터티에서 읽기](googleanalytics-reading-from-entities.md)
+ [Google Analytics 4 연결 옵션](googleanalytics-connection-options.md)
+ [Google Analytics 4 계정 생성](googleanalytics-create-account.md)
+ [클라이언트 앱 및 OAuth 2.0 자격 증명을 생성하는 단계](googleanalytics-client-app-oauth-credentials.md)
+ [제한 사항 및 고려 사항](googleanalytics-connector-limitations.md)

# Google Analytics 4에 대한 AWS Glue 지원
<a name="googleanalytics-support"></a>

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

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

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

**지원되는 Google Analytics4 API 버전**  
 v1 베타.

# 연결을 생성하고 사용하기 위한 API 작업이 포함된 정책
<a name="googleanalytics-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 Management Console을 사용하는 경우 AWS Glue 리소스에 대한 전체 액세스 권한을 부여합니다. 이 정책에 지정된 리소스의 이름 변환을 따르면 사용자는 콘솔 전체 용량을 소유합니다. 이 정책은 보통 AWS Glue 콘솔의 사용자에게 해당됩니다.

# Google Analytics 4 구성
<a name="googleanalytics-configuring"></a>

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

## 최소 요구 사항
<a name="googleanalytics-configuring-min-requirements"></a>
+  전송하려는 데이터를 수집하는 데이터 스트림을 하나 이상 포함하는 Google Analytics 계정이 있습니다.
+  Google Cloud Platform 관리자 계정을 만들고 Google Cloud 프로젝트를 생성했습니다.
+  Google Cloud 프로젝트에서 다음 API를 활성화했습니다.
  +  Google Analytics API 
  +  Google Analytics 관리 API 
  +  Google Analytics 데이터 API 
+  Google Cloud 프로젝트에서 외부 사용자를 위한 OAuth 동의 화면을 구성했습니다. OAuth 동의 화면에 대한 자세한 내용은 Google Cloud Platform Console Help의 [Setting up your OAuth consent screen](https://support.google.com/cloud/answer/10311615#)을 참조하세요.
+  Google Cloud 프로젝트에서 OAuth 2.0 클라이언트 ID를 구성했습니다. 자세한 내용은 [Setting up OAuth 2.0](https://support.google.com/cloud/answer/6158849?hl=en#zippy=)을 참조하세요.

 이러한 요구 사항을 충족하면 Google Analytics 4 계정에 AWS Glue를 연결할 준비가 된 것입니다.

# Google Analytics 4 연결 구성
<a name="googleanalytics-configuring-connections"></a>

Google Sheet 연결을 구성하는 방법:

1.  AWS Secrets Manager에서 다음 세부 정보로 보안 암호를 생성하세요. AWS Glue에서 각 연결에 대한 보안 암호를 생성해야 합니다.

   1.  AuthorizationCode 권한 부여 유형의 경우: 
      +  고객 관리형 연결된 앱의 경우 - 보안 암호는 키 역할을 하는 `USER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET`과 함께 연결된 앱 소비자 보안 암호를 포함해야 합니다.

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

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

   1. 연결하려는 Google Analytics 4의 `INSTANCE_URL`을 제공합니다.

   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.  토큰을 넣기 위해 AWS Glue에서 이 연결에 사용할 `secretName`을 선택합니다.

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

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

 `AUTHORIZATION_CODE` 권한 부여 유형입니다.

 이 권한 부여 유형은 사용자를 인증하기 위해 사용자를 서드파티 권한 부여 서버로 리디렉션하는 방식에 의존하므로 '3각' OAuth로 간주됩니다. AWS Glue 콘솔을 통해 연결을 생성할 때 사용됩니다. AWS Glue 콘솔은 사용자를 Google Analytics 4로 리디렉션합니다. 사용자가 로그인하고 Google Analytics 4 인스턴스에 액세스하도록 요청된 권한을 AWS Glue에 허용해야 합니다.

 사용자는 여전히 AWS Glue 콘솔을 통해 연결을 생성할 때에도 Google Analytics 4에서 자체 연결된 앱을 생성하고 자체 클라이언트 ID와 클라이언트 보안 암호를 제공하기로 선택할 수 있습니다. 이 시나리오에서는 여전히 Google Analytics 4로 리디렉션되어 로그인하고 리소스에 액세스할 수 있는 권한을 AWS Glue에 부여합니다.

 이 권한 부여 유형은 새로 고침 토큰과 액세스 토큰을 생성합니다. 액세스 토큰은 수명이 짧으며 새로 고침 토큰을 사용하여 사용자 상호 작용 없이 자동으로 새로 고칠 수 있습니다.

 자세한 내용은 [Using Auth 2.0 to Access Google APIs](https://developers.google.com/identity/protocols/oauth2) 섹션을 참조하세요.

# Google Analytics 4 엔터티에서 읽기
<a name="googleanalytics-reading-from-entities"></a>

 **사전 조건** 
+  읽으려는 Google Analytics 4 객체. 사용 가능한 엔터티를 확인하려면 아래 지원되는 엔터티 테이블을 참조하세요.

 **지원되는 엔터티** 


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| 실시간 보고서 | 예 | 예 | 예 | 예 | 아니요 | 
| 코어 보고서 | 예 | 예 | 예 | 예 | 예 | 

 **예제** 

```
googleAnalytics4_read = glueContext.create_dynamic_frame.from_options(
    connection_type="GoogleAnalytics4",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "entityName",
        "API_VERSION": "v1beta"
    }
```

 **Google Analytics 4 엔터티 및 필드 세부 정보** 


| 개체 | 필드 | 데이터 형식 | 지원되는 연산자 | 
| --- | --- | --- | --- | 
| 코어 보고서 | 동적 필드 |  |  | 
| 코어 보고서 | 차원 필드 | String | LIKE, = | 
| 코어 보고서 | 차원 필드 | 날짜 | LIKE, = | 
| 코어 보고서 | 지표 필드 | String | >, <, >=, <=, = BETWEEN | 
| 코어 보고서 | 사용자 지정 차원 및 사용자 지정 지표 필드 | String | NA | 
| 실시간 보고서 | appVersion | String | LIKE, = | 
| 실시간 보고서 | audienceId | String | LIKE, = | 
| 실시간 보고서 | audienceName | String | LIKE, = | 
| 실시간 보고서 | city | String | LIKE, = | 
| 실시간 보고서 | cityId | String | LIKE, = | 
| 실시간 보고서 | country | String | LIKE, = | 
| 실시간 보고서 | countryId | String | LIKE, = | 
| 실시간 보고서 | deviceCategory | String | LIKE, = | 
| 실시간 보고서 | eventName | String | LIKE, = | 
| 실시간 보고서 | minutesAgo | String | LIKE, = | 
| 실시간 보고서 | platform | String | LIKE, = | 
| 실시간 보고서 | streamId | String | LIKE, = | 
| 실시간 보고서 | streamName | String | LIKE, = | 
| 실시간 보고서 | unifiedScreenName | String | LIKE, = | 
| 실시간 보고서 | activeUsers | String | >, <, >=, <=, = BETWEEN | 
| 실시간 보고서 | conversions | String | >, <, >=, <=, = BETWEEN | 
| 실시간 보고서 | eventCount | String | >, <, >=, <=, = BETWEEN | 
| 실시간 보고서 | screenPageViews | String | >, <, >=, <=, = BETWEEN | 

 **분할 쿼리** 

1.  **필터 기반 분할** 

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

      날짜의 경우 Spark SQL 쿼리에 사용된 Spark 날짜 형식을 허용합니다. 유효한 값의 예제: `"2024-02-06"`.
   +  `UPPER_BOUND`: 선택한 파티션 필드의 상한 값(경계 제외).
   +  `NUM_PARTITIONS`: 파티션 수.

    **예제** 

   ```
   googleAnalytics4_read = glueContext.create_dynamic_frame.from_options(
       connection_type="GoogleAnalytics4",
       connection_options={
           "connectionName": "connectionName",
           "ENTITY_NAME": "entityName",
           "API_VERSION": "v1beta",
           "PARTITION_FIELD": "date"
           "LOWER_BOUND": "2022-01-01"
           "UPPER_BOUND": "2024-01-02"
           "NUM_PARTITIONS": "10"
       }
   ```

1.  **레코드 기반 분할** 

    Spark에서 동시성을 활용하려는 경우 추가 Spark 옵션(`NUM_PARTITIONS`)을 제공할 수 있습니다. 이러한 파라미터를 사용하면 Spark 태스크에서 동시에 실행할 수 있는 `NUM_PARTITIONS`개의 하위 쿼리로 원본 쿼리가 분할됩니다.
   +  `NUM_PARTITIONS`: 파티션 수.

    **예제** 

   ```
   googleAnalytics4_read = glueContext.create_dynamic_frame.from_options(
       connection_type="GoogleAnalytics4",
       connection_options={
           "connectionName": "connectionName",
           "ENTITY_NAME": "entityName",
           "API_VERSION": "v1beta",
           "NUM_PARTITIONS": "10"
       }
   ```

# Google Analytics 4 연결 옵션
<a name="googleanalytics-connection-options"></a>

다음은 Google Analytics 4의 연결 옵션입니다.
+  `ENTITY_NAME`(문자열) - (필수) 읽기에 사용됩니다. Google Analytics 4에서 객체 이름.
+  `API_VERSION`(문자열) - (필수) 읽기에 사용됩니다. 사용하려는 Analytics 4 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`(정수) - 읽기에 사용됩니다. (선택 사항) 

# Google Analytics 4 계정 생성
<a name="googleanalytics-create-account"></a>

 단계에 따라 Google Analytics 4 계정을 생성합니다. [https://support.google.com/analytics/answer/9304153?hl=en](https://support.google.com/analytics/answer/9304153?hl=en) 

# 클라이언트 앱 및 OAuth 2.0 자격 증명을 생성하는 단계
<a name="googleanalytics-client-app-oauth-credentials"></a>

 자세한 내용은 [Google Analytics4 API 설명서](https://developers.google.com/analytics/devguides/reporting/data/v1)를 참조하세요.

1.  사용자 자격 증명으로 [Google Analytics 계정](https://analytics.google.com/)에 로그인하여 계정을 생성하고 설정하세요. 그런 다음 **Admin** > **Create Account**로 이동하세요.

1.  **Create Property**를 선택하여 생성한 계정의 속성을 생성하세요. 필수 세부 정보로 속성을 설정하세요. 제공된 모든 세부 정보가 생성되면 해당 속성 ID가 생성됩니다.

1.  드롭다운에서 **Data Streams** > **Add Stream** > **Web**을 선택하여 생성된 속성에 대한 데이터 스트림을 추가하세요. URL 및 기타 필수 필드와 같은 웹 사이트 세부 정보를 제공하세요. 모든 세부 정보를 제공하면 해당 **stream ID** 및 **measurement ID**가 생성됩니다.

1.  측정 ID를 복사하여 웹 사이트에서 Google Analytics를 설정하고 웹 사이트의 구성에 추가하세요.

1.  **Reports**로 이동하고 필요한 보고서를 생성하여 Google Analytics에서 보고서를 생성하세요.

1.  [console.cloud.google.com]( https://console.cloud.google.com)으로 이동하여 앱을 승인하고 Google Analytics 데이터 API를 검색한 다음 API를 활성화하세요.

   1.  API 및 서비스 페이지로 이동하여 **Credentials** > **setup OAuth 2.0 Client IDs**를 선택하세요.

   1.  AWS Glue 리디렉션 URL을 추가하여 리디렉션 URL을 제공하세요.

1.  연결을 생성하는 데 추가로 필요한 클라이언트 ID 및 클라이언트 보안 암호를 복사하세요.

# 제한 사항 및 고려 사항
<a name="googleanalytics-connector-limitations"></a>

다음은 Google Analytics 4 커넥터의 제한 사항입니다.
+  코어 보고서 엔터티의 경우 9개의 차원 필드 및 10개의 지표 필드만 요청에서 전송할 수 있습니다. 허용된 필드 수를 초과하면 요청이 실패하고 커넥터에서 오류 메시지를 표시하니다.
+  실시간 보고서 엔터티의 경우 4개의 차원 필드만 요청에서 전송할 수 있습니다. 허용된 필드 수를 초과하면 요청이 실패하고 커넥터에서 오류 메시지를 표시하니다.
+  Google Analytics 4는 베타 버전 무료 도구이므로 새 기능, 엔터티 개선 사항, 새 필드 추가 및 기존 필드 사용 중단에 대한 정기적인 업데이트가 제공됩니다.
+  코어 보고서 필드는 동적으로 채워지므로 필드의 추가, 사용 중단 및 이름 변경이 존재하며 언제든지 필드에 새로운 제한을 적용할 수 있습니다.
+  기본 시작 날짜는 30일이고 종료 날짜는 어제(현재 날짜의 하루 전)이며, 사용자가 값을 설정했거나 흐름이 증분에 기반한 경우 필터 표현식 코드에서 이러한 날짜가 재정의됩니다.
+  설명서에 따라 실시간 보고서 엔터티는 요청에서 한도를 전달하지 않으면 10,000개의 레코드를 반환합니다. 그렇지 않으면 요청한 수에 관계없이 API는 요청당 최대 250,000개의 행을 반환합니다. 자세한 내용은 Google Analytics 설명서의 [Method: properties.runRealtimeReport](https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/properties/runRealtimeReport)를 참조하세요.
+  실시간 보고서 엔터티는 페이지 매김을 지원하지 않으므로 레코드 기반 파티션을 지원하지 않습니다. 또한 정의된 기준을 충족하는 필드가 없으므로 필드 기반 파티션을 지원하지 않습니다.
+  요청에서 전달할 수 있는 필드 수의 제한 사항 때문에 지정된 한도 내에서 기본 차원 및 지표 필드를 설정합니다. 'select all'을 선택하면 미리 결정된 필드의 데이터만 검색됩니다.
  +  코어 보고서 
    +  SAAS의 제한 사항에 따르는 경우 - 요청에서는 최대 9개의 차원과 최대 10개의 지표만 허용됩니다. 즉, 요청은 최대 19개의 필드(지표 \$1 차원)를 포함할 수 있습니다.
    +  구현에 따르는 경우 - 사용자가 SELECT\$1ALL을 사용하거나 25개를 초과하는 선택한 필드를 사용하는 경우 요청에서 기본 필드가 전달됩니다.
    +  다음 필드는 코어 보고서의 기본 필드로 고려됩니다. 'country', 'city', 'eventName', 'cityId', 'browser', 'date', 'currencyCode', 'deviceCategory', 'transactionId', active1DayUsers', 'active28DayUsers', 'active7DayUsers', 'activeUsers', 'averagePurchaseRevenue', 'averageRevenuePerUser', 'averageSessionDuration', 'engagedSessions', 'eventCount', 'engagementRate'.
  +  실시간 보고서 
    +  SAAS의 제한 사항에 따라 요청에서는 최대 4개의 차원이 허용됩니다.
    +  사용자가 SELECT\$1ALL을 전달하거나 15개를 초과하는 선택한 필드를 전달하는 경우 요청에서 기본 필드가 전달됩니다.
    +  다음 필드는 실시간 보고서의 기본 필드로 고려됩니다. 'country', 'deviceCategory', 'city', 'cityId', 'activeUsers', 'conversions', 'eventCount', 'screenPageViews'.
+  코어 보고서 엔터티에서 startDate의 필터 및 날짜 필드의 파티션이 동시에 존재하는 경우 dateRange 값이 startDate 필터 값으로 재정의됩니다. 하지만 파티션이 항상 우선적으로 고려되므로 날짜 필드의 파티션이 이미 있는 경우 startDate 필터를 무시합니다.
+  현재 cohortSpecs는 core-report 요청 본문의 일부이기도 하므로 cohortSpec 속성에 대한 지원을 포함하도록 현재 core-report 엔터티를 개선했습니다. cohortSpecs 요청 본문에서는 거의 모든 필드에 사용자 입력이 필요합니다. 이를 해결하기 위해 이러한 속성/필드에 대한 기본값을 설정하고 필요한 경우 사용자가 이러한 값을 재정의하도록 프로비저닝을 제공합니다.    
<a name="google-analytics-connector-limitations-table"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/googleanalytics-connector-limitations.html)
+  이러한 모든 필터를 한 번에 함께 전달하거나 다른 필터와 함께 전달할 수도 있습니다.
  +  예제 1 - filterPredicate: startDate between "2023-05-09" and "2023-05-10" AND startOffset=1 AND endOffset=2 AND granularity="WEEKLY"
  +  예제 2 - filterPredicate: city=“xyz” AND startOffset=1 AND endOffset=2 AND granularity="WEEKLY"
+  코호트 요청에서: 
  +  요청에서 'cohortNthMonth'가 전달되면 내부적으로 세분화 값은 'MONTHLY'로 설정됩니다.
  +  마찬가지로 'cohortNthWeek'가 전달되면 세분화 값은 'WEEKLY'로 설정됩니다.
  +  또한 'cohortNthDay'의 경우 세분화 값은 'DAILY'로 설정됩니다. 자세한 내용은 다음을 참조하세요.
    +  [ https://developers.google.com/analytics/devguides/reporting/data/v1/advanced ](https://developers.google.com/analytics/devguides/reporting/data/v1/advanced) 
    +  [ https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/CohortSpec ](https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/CohortSpec) 
  +  사용자가 dateRange 및 세분화 기본값을 재정의하도록 프로비저닝이 제공됩니다. 위의 테이블을 참조하세요.

# AWS Glue Studio에서 Google BigQuery에 연결
<a name="connecting-to-data-bigquery"></a>

**참고**  
  AWS Glue for Spark를 사용하여 AWS Glue 4.0 이상 버전에 있는 Google BigQuery의 테이블에서 읽고 쓸 수 있습니다. 프로그래밍 방식으로 AWS Glue 작업을 통해 Google BigQuery를 구성하려면 [BigQuery 연결](aws-glue-programming-etl-connect-bigquery-home.md)을(를) 참조하세요.  

 AWS Glue Studio에는 BigQuery에 연결하고, 데이터 통합 작업을 작성하며, AWS Glue Studio 서버리스 Spark 런타임에서 실행할 수 있는 시각적 인터페이스가 있습니다.

 AWS Glue Studio에서 Google BigQuery에 대한 연결을 생성할 때 통합 연결이 생성됩니다. 자세한 내용은 [고려 사항](using-connectors-unified-connections.md#using-connectors-unified-connections-considerations) 섹션을 참조하세요.

 특정 형식의 자격 증명인 `{"credentials": "base64 encoded JSON"}`로 보안 암호를 만드는 대신 이제 Google BigQuery에 대한 통합 연결을 통해 Goolge BigQuery의 JSON을 직접 포함하는 보안 암호를 생성할 수 있습니다(`{"type": "service-account", ...}`).

**Topics**
+ [BigQuery 연결 생성](creating-bigquery-connection.md)
+ [BigQuery 소스 노드 생성](creating-bigquery-source-node.md)
+ [BigQuery 대상 노드 생성](creating-bigquery-target-node.md)
+ [고급 옵션](#creating-bigquery-connection-advanced-options)

# BigQuery 연결 생성
<a name="creating-bigquery-connection"></a>

AWS Glue에서 Google BigQuery에 연결하려면 AWS Secrets Manager 보안 암호에서 Google Cloud Platform 보안 인증 정보를 생성하고 저장한 다음 해당 보안 암호를 Google AWS Glue BigQuery 연결에 연결해야 합니다.

**BigQuery에 대한 연결 구성하기:**

1. Google Cloud Platform에서 관련 리소스를 생성하고 식별합니다.
   + 연결하려는 BigQuery 테이블이 포함된 GCP 프로젝트를 생성하거나 식별합니다.
   + BigQuery API를 활성화합니다. 자세한 내용은 [BigQuery Storage Read API를 사용하여 테이블 데이터 읽기](https://cloud.google.com/bigquery/docs/reference/storage/#enabling_the_api)를 참조하세요.

1. Google Cloud Platform에서 서비스 계정 보안 인증 정보를 생성하고 내보냅니다.

   BigQuery 보안 인증 마법사를 사용하여 [보안 인증 정보 생성하기](https://console.cloud.google.com/apis/credentials/wizard?api=bigquery.googleapis.com) 단계를 신속하게 처리할 수 있습니다.

   GCP에서 서비스 계정을 생성하려면 [서비스 계정 생성하기](https://cloud.google.com/iam/docs/service-accounts-create)에서 제공되는 튜토리얼을 따르세요.
   + **프로젝트**를 선택할 때 BigQuery 테이블이 포함된 프로젝트를 선택합니다.
   + 서비스 계정의 GCP IAM 역할을 선택할 때 BigQuery 작업을 실행하여 BigQuery 테이블을 읽고, 쓰고, 생성할 수 있는 적절한 권한을 부여하는 역할을 추가하거나 생성하세요.

   서비스 계정의 보안 인증 정보를 생성하려면 [서비스 계정 키 생성하기](https://cloud.google.com/iam/docs/keys-create-delete#creating)에서 제공되는 튜토리얼을 따르세요.
   + 키 유형을 선택할 때 **JSON**을 선택합니다.

   이제 서비스 계정의 보안 인증 정보가 포함된 JSON 파일을 다운로드했어야 합니다. 예를 들면 다음과 같아야 합니다.

   ```
   {
     "type": "service_account",
     "project_id": "*****",
     "private_key_id": "*****",
     "private_key": "*****",
     "client_email": "*****",
     "client_id": "*****",
     "auth_uri": "https://accounts.google.com/o/oauth2/auth",
     "token_uri": "https://oauth2.googleapis.com/token",
     "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
     "client_x509_cert_url": "*****",
     "universe_domain": "googleapis.com"
   }
   ```

1. AWS Secrets Manager에서, 다운로드한 자격 증명 파일을 사용하여 보안 암호를 생성합니다. **일반 텍스트** 탭을 선택하고 JSON 형식 파일 콘텐츠를 붙여넣을 수 있습니다. Secrets Manager에서 보안 암호를 생성하려면 AWS Secrets Manager 설명서의 [Create an AWS Secrets Manager secret](https://docs.aws.amazon.com//secretsmanager/latest/userguide/create_secret.html)에서 제공하는 자습서를 따릅니다. 보안 암호를 생성한 후에는 다음 단계를 위해 보안 암호 이름, *secretName*을 유지합니다.

1. AWS Glue 데이터 카탈로그에서 [https://docs.aws.amazon.com/glue/latest/dg/console-connections.html](https://docs.aws.amazon.com/glue/latest/dg/console-connections.html)의 단계에 따라 연결을 생성합니다. 연결을 생성한 후에는 다음 단계를 위해 연결 이름, *connectionName*을 유지합니다.
   + **연결 유형**을 선택할 때 Google BigQuery를 선택합니다.
   + **AWS 보안 암호**를 선택할 때 *secretName*을 입력합니다.

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

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

# BigQuery 소스 노드 생성
<a name="creating-bigquery-source-node"></a>

## 필수 전제 조건
<a name="creating-bigquery-source-node-prerequisites"></a>
+ BigQuery 유형 AWS Glue 데이터 카탈로그 연결
+ 연결에 사용되는 Google BigQuery 자격 증명의 AWS Secrets Manager 보안 암호.
+ 연결에 사용되는 보안 암호를 읽을 작업에 대한 적절한 권한.
+ 읽으려는 테이블 및 해당 Google Cloud 프로젝트의 이름 및 데이터세트.

## BigQuery 데이터 소스 추가
<a name="creating-bigquery-source-node-add"></a>

****데이터 소스 - BigQuery** 노드 추가하기:**

1.  BigQuery 데이터 소스의 연결을 선택합니다. 생성했으므로 드롭다운에서 사용할 수 있을 것입니다. 연결을 생성해야 하는 경우 **BigQuery 연결 생성**을 선택합니다. 자세한 내용은 [커넥터 및 연결 사용 개요](https://docs.aws.amazon.com/glue/latest/ug/connectors-chapter.html#using-connectors-overview)를 참조하세요.

    연결을 선택한 후에는 **속성 보기**를 클릭하여 연결 속성을 볼 수 있습니다.

1. 읽으려는 BigQuery 데이터를 식별한 다음 **BigQuery 소스** 옵션을 선택합니다
   + 단일 테이블 선택 — 테이블에서 모든 데이터를 가져올 수 있습니다.
   + 사용자 지정 쿼리 입력 — 쿼리를 제공하여 검색할 데이터를 사용자 지정할 수 있습니다.

1.  읽고 싶은 데이터를 설명하세요

   **(필수 사항)** **상위 프로젝트를** 테이블이 포함된 프로젝트로 설정하거나 해당하는 경우 청구 대상 상위 프로젝트로 설정합니다.

   단일 테이블을 선택한 경우 **테이블**을 `[dataset].[table]` 형식의 Google BigQuery 테이블 이름으로 설정합니다 

   쿼리를 선택한 경우 **쿼리**에 제공합니다. 쿼리에서 `[project].[dataset].[tableName]` 형식으로 정규화된 테이블 이름이 있는 테이블을 참조하세요.

1.  BigQuery 속성을 제공합니다 

   단일 테이블을 선택한 경우 추가 속성을 제공하지 않아도 됩니다.

   쿼리를 선택한 경우 다음 **사용자 지정 Google BigQuery 속성**을 제공해야 합니다.
   + `viewsEnabled`를 true로 설정합니다.
   + `materializationDataset`을(를) 데이터세트에 설정합니다. AWS Glue 연결을 통해 제공된 보안 인증 정보로 인증된 GCP 주체는 이 데이터 세트에 테이블을 생성할 수 있어야 합니다.

# BigQuery 대상 노드 생성
<a name="creating-bigquery-target-node"></a>

## 필수 전제 조건
<a name="creating-bigquery-target-node-prerequisites"></a>
+ BigQuery 유형 AWS Glue 데이터 카탈로그 연결
+ 연결에 사용되는 Google BigQuery 자격 증명의 AWS Secrets Manager 보안 암호.
+ 연결에 사용되는 보안 암호를 읽을 작업에 대한 적절한 권한.
+ 쓰려는 테이블 및 해당 Google Cloud 프로젝트의 이름 및 데이터세트.

## BigQuery 데이터 대상 추가
<a name="creating-bigquery-target-node-add"></a>

****데이터 대상 - BigQuery** 노드 추가하기:**

1.  BigQuery 데이터 대상의 연결을 선택합니다. 생성했으므로 드롭다운에서 사용할 수 있을 것입니다. 연결을 생성해야 하는 경우 **BigQuery 연결 생성**을 선택합니다. 자세한 내용은 [커넥터 및 연결 사용 개요](https://docs.aws.amazon.com/glue/latest/ug/connectors-chapter.html#using-connectors-overview)를 참조하세요.

    연결을 선택한 후에는 **속성 보기**를 클릭하여 연결 속성을 볼 수 있습니다.

1. 쓰려는 BigQuery 테이블을 식별한 다음 **쓰기 방법**을 선택합니다.
   + 직접 — BigQuery Storage 쓰기 API를 사용하여 BigQuery에 직접 글을 씁니다.
   + 간접 — Google Cloud Storage에 쓴 다음 BigQuery에 복사합니다.

   간접적으로 쓰려는 경우 **임시 GCS 버킷**과 함께 대상 GCS 위치를 제공하세요. AWS Glue 연결에 추가 구성을 제공해야 합니다. 자세한 내용은 [Google BigQuery를 통한 간접 쓰기 사용을](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-connect-bigquery-home.html#aws-glue-programming-etl-connect-bigquery-indirect-write) 참조하세요.

1.  읽고 싶은 데이터를 설명하세요

   **(필수 사항)** **상위 프로젝트를** 테이블이 포함된 프로젝트로 설정하거나 해당하는 경우 청구 대상 상위 프로젝트로 설정합니다.

   단일 테이블을 선택한 경우 **테이블**을 `[dataset].[table]` 형식의 Google BigQuery 테이블 이름으로 설정합니다 

## 고급 옵션
<a name="creating-bigquery-connection-advanced-options"></a>

BigQuery 노드를 생성할 때 고급 옵션을 제공할 수 있습니다. 이 옵션은 Spark 스크립트에 대한 AWS Glue을(를) 프로그래밍할 때 사용할 수 있는 옵션과 동일합니다.

AWS Glue 개발자 설명서의 [BigQuery 연결 옵션 참조](https://docs.aws.amazon.com//glue/latest/dg/aws-glue-programming-etl-connect-bigquery-home.html)를 참조하세요.

# Google Search Console에 연결
<a name="connecting-to-data-google-search-console"></a>

Google Search Console은 웹사이트 소유자가 Google이 사이트를 어떻게 보는지 모니터링하고 유기적 존재감을 최적화하기 위해 사용할 수 있는 무료 플랫폼입니다. 여기에는 참조 도메인, 모바일 사이트 성능, 검색 결과, 트래픽이 가장 많은 쿼리 및 페이지 보기가 포함됩니다. Google Search Console 사용자인 경우 Google Search Console 계정에 AWS Glue를 연결할 수 있습니다. Google Search Console을 ETL 작업에서의 데이터 소스로 사용할 수 있습니다. 이러한 작업을 실행하여 Google Search Console에서 AWS 서비스 또는 기타 지원되는 애플리케이션으로 데이터를 전송합니다.

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

# AWS Glue의 Google Search Console 지원
<a name="google-search-console-support"></a>

AWS Glue에서는 다음과 같이 Google Search Console을 지원합니다.

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

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

**지원되는 Google Search Console API 버전**  
다음 Google Search Console API 버전이 지원됩니다.
+ v3

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

# Google Search Console 구성
<a name="google-search-console-configuring"></a>

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

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

다음은 최소 요구 사항입니다.
+ Google Search Console 계정이 있습니다.
+ Google Cloud Platform 관리자 계정을 만들고 Google Cloud 프로젝트를 생성했습니다.
+ Google Cloud 프로젝트에서 Google Search Console API를 활성화했습니다.
+ Google Cloud 프로젝트에서 외부 사용자를 위한 OAuth 동의 화면을 구성했습니다. 자세한 내용은 Google Cloud Platform Console 도움말의 [Setting up your OAuth consent screen](https://support.google.com/cloud/answer/10311615)을 참조하세요.
+ Google Cloud 프로젝트에서 OAuth 2.0 클라이언트 ID를 구성했습니다. AWS Glue가 계정에 인증된 직접 호출을 할 때 데이터에 안전하게 액세스하는 데 사용하는 클라이언트 자격 증명은 [OAuth 2.0 설정](https://support.google.com/cloud/answer/6158849)을 참조하세요.

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

# Google Search Console 연결 구성
<a name="google-search-console-configuring-connections"></a>

Google Search Console에서는 OAuth2에 대한 AUTHORIZATION\$1CODE 권한 부여 유형을 지원합니다. 권한 부여 유형은 AWS Glue에서 Google Search Console과 통신하여 데이터에 대한 액세스를 요청하는 방법을 결정합니다.
+ 이 권한 부여 유형은 사용자를 인증하기 위해 사용자를 서드파티 권한 부여 서버로 리디렉션하는 방식에 의존하므로 '3각' OAuth로 간주됩니다. AWS Glue 콘솔을 통해 연결을 생성할 때 사용됩니다.
+ 사용자는 여전히 AWS Glue 콘솔을 통해 연결을 생성할 때에도 Google Search Console에서 자체 연결된 앱을 생성하고 자체 클라이언트 ID와 클라이언트 보안 암호를 제공하기로 선택할 수 있습니다. 이 시나리오에서는 여전히 Google Search Console로 리디렉션되어 로그인하고 리소스에 액세스할 수 있는 권한을 AWS Glue에 부여합니다.
+ 이 권한 부여 유형은 새로 고침 토큰과 액세스 토큰을 생성합니다. 액세스 토큰은 수명이 짧으며 새로 고침 토큰을 사용하여 사용자 상호 작용 없이 자동으로 새로 고칠 수 있습니다.
+ 권한 부여 코드 OAuth 흐름을 위한 연결된 앱 생성에 대한 퍼블릭 Google Search Console 설명서는 [Using OAuth 2.0 to Access Google APIs](https://developers.google.com/identity/protocols/oauth2)를 참조하세요.

Google Search Console 연결을 구성하는 방법:

1. AWS Secrets Manager에서 다음 세부 정보로 보안 암호를 생성합니다.

   1. 고객 관리형 연결된 앱의 경우 보안 암호는 키 역할을 하는 `USER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET`과 함께 연결된 앱 소비자 보안 암호를 포함해야 합니다.

   1. 참고: AWS Glue에서 연결의 보안 암호를 생성해야 합니다.

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

   1. **연결 유형**을 선택할 때 Google Search Console을 선택합니다.

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

# Google Search Console 엔터티에서 읽기
<a name="google-search-console-reading-from-entities"></a>

**사전 조건**

읽으려는 Google Ads 객체입니다. 객체 이름이 필요합니다.

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


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| Search Analytics | 예 | 예 | 아니요 | 예 | 아니요 | 
| Sites | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Sitemaps | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 

**예시:**

```
googleSearchConsole_read = glueContext.create_dynamic_frame.from_options(
    connection_type="googlesearchconsole",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "entityName",
        "API_VERSION": "v3"
    }
```

**Google Search Console 엔터티 및 필드 세부 정보**:

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

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

**참고**  
필터에 대한 유효한 값의 업데이트된 목록은 [Google Search Console](https://developers.google.com/webmaster-tools/v1/searchanalytics/query) API 문서를 참조하세요.  
`start_end_date` 필드는 `start_date` 및 `end_date`의 조합입니다.

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

필터 기반 분할 및 레코드 기반 분할은 지원되지 않습니다.

# Google Search Console 연결 옵션
<a name="google-search-console-connection-options"></a>

다음은 Google Search Console의 연결 옵션입니다.
+ `ENTITY_NAME`(문자열) - (필수) 읽기에 사용됩니다. Google Search Console에서의 객체 이름입니다.
+ `API_VERSION`(문자열) - (필수) 읽기에 사용됩니다. 사용하려는 Google Search Console Rest API 버전입니다.
+ `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 객체에 대해 선택할 열.
+ `FILTER_PREDICATE`(문자열) - 기본값: 'start\$1end\$1date <현재 날짜로부터 30일 전>과 <어제: 즉, 현재 날짜로부터 1일 전> 사이'. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.
+ `QUERY`(문자열) - 기본값: 'start\$1end\$1date <현재 날짜로부터 30일 전>과 <어제: 즉, 현재 날짜로부터 1일 전> 사이' 읽기에 사용됩니다. 전체 Spark SQL 쿼리.
+ `INSTANCE_URL`(문자열) - 읽기에 사용됩니다. 유효한 Google Search Console 인스턴스 URL입니다.

# Google Search Console 제한 사항
<a name="google-search-console-limitations"></a>

다음은 Google Search Console의 제한 사항 또는 참고 사항입니다.
+ Google Search Console은 API에 사용량 한도를 적용합니다. 자세한 내용은 [사용 제한](https://developers.google.com/webmaster-tools/limits)을 참조하세요.
+ `Search Analytics` 엔터티에 대한 필터가 전달되지 않으면 API는 지정된 기본 날짜 범위 내에 전체 사이트의 모든 클릭, 노출, CTR 및 기타 데이터를 합산하여 단일 레코드로 표시합니다.
+ 데이터를 더 작은 세그먼트로 분류하려면 쿼리에 차원을 도입해야 합니다. 차원은 API에 데이터를 분할하는 방법을 알려줍니다.
  + 예를 들어, `filterPredicate: dimensions="country"`를 추가하면 지정된 기간 동안 사이트가 트래픽을 수신한 각 국가에 대해 하나의 레코드를 가져옵니다.
  + 여러 차원을 전달하는 예: `filterPredicate: dimensions="country" AND dimensions="device" AND dimensions="page"`. 이 경우 이러한 세 가지 차원의 고유한 조합마다 응답에 행이 하나씩 표시됩니다.
+ 기본값은 `start_end_date` 및 `dataState` 필드에 설정됩니다.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/google-search-console-limitations.html)

# Google Sheets에 연결
<a name="connecting-to-googlesheets"></a>

 Google Sheets는 대량의 데이터를 구성하고, 사용자 지정 보고서를 생성하고, 계산을 자동화하고, 다른 사용자와 협업할 수 있는 온라인 스프레드시트 소프트웨어입니다. Google Sheets 사용자의 경우 Google Sheets 계정에 AWS Glue를 연결할 수 있습니다. 그런 다음, Google Sheets를 ETL 작업에서의 데이터 소스로 사용할 수 있습니다. 이러한 작업을 실행하여 Google Sheets 및 AWS 서비스 또는 기타 지원되는 애플리케이션 간에 데이터를 전송합니다.

**Topics**
+ [Google Sheets에 대한 AWS Glue 지원](googlesheets-support.md)
+ [연결을 생성하고 사용하기 위한 API 작업이 포함된 정책](googlesheets-configuring-iam-permissions.md)
+ [Google Sheets 구성](googlesheets-configuring.md)
+ [Google Sheets 연결 구성](googlesheets-configuring-connections.md)
+ [Google Sheets 엔터티에서 읽기](googlesheets-reading-from-entities.md)
+ [Google Sheets 연결 옵션](googlesheets-connection-options.md)
+ [Google Sheets에 대한 권한 부여 코드 OAuth 흐름 설정](googlesheets-oauth-authorization.md)
+ [Google Sheets 커넥터의 제한 사항](googlesheets-connector-limitations.md)

# Google Sheets에 대한 AWS Glue 지원
<a name="googlesheets-support"></a>

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

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

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

**지원되는 Google Sheets API 버전**  
 Google Sheets API v4 및 Google Drive API v3 

# 연결을 생성하고 사용하기 위한 API 작업이 포함된 정책
<a name="googlesheets-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 Management Console을 사용하는 경우 AWS Glue 리소스에 대한 전체 액세스 권한을 부여합니다. 이 정책에 지정된 리소스의 이름 변환을 따르면 사용자는 콘솔 전체 용량을 소유합니다. 이 정책은 보통 AWS Glue 콘솔의 사용자에게 해당됩니다.

# Google Sheets 구성
<a name="googlesheets-configuring"></a>

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

## 최소 요구 사항
<a name="googlesheets-configuring-min-requirements"></a>
+ 이메일 및 암호가 설정된 Google Sheets 계정이 있습니다.
+  API 액세스에 대해 Google Sheets 계정이 활성화되어 있습니다. Google Sheets API는 모두 추가 비용 없이 사용 가능합니다.
+  Google Sheets 계정을 사용하면 연결된 앱을 설치할 수 있습니다. 이 기능에 대한 액세스 권한이 없는 경우 Google Sheets 관리자에게 문의하세요.

 이러한 요구 사항을 충족하면 Google Sheets 계정에 AWS Glue를 연결할 준비가 된 것입니다.

# Google Sheets 연결 구성
<a name="googlesheets-configuring-connections"></a>

Google Sheet 연결을 구성하는 방법:

1. AWS Secrets Manager에서 다음 세부 정보로 보안 암호를 생성합니다.

   1.  AuthorizationCode 권한 부여 유형의 경우: 
      +  고객 관리형 연결된 앱의 경우 - 보안 암호는 키 역할을 하는 `USER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET`과 함께 연결된 앱 소비자 보안 암호를 포함해야 합니다.

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

   1. **데이터 소스**를 선택할 때 Google Sheets를 선택합니다.

   1. Google Sheets 환경을 제공합니다.

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

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

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

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

****  

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

------

 **AUTHORIZATION\$1CODE 권한 부여 유형** 

 이 권한 부여 유형은 사용자를 인증하기 위해 사용자를 서드파티 권한 부여 서버로 리디렉션하는 방식에 의존하므로 '3각' OAuth로 간주됩니다. AWS Glue 콘솔을 통해 연결을 생성할 때 사용됩니다. AWS Glue 콘솔은 사용자를 Google Sheets로 리디렉션합니다. 사용자가 로그인하고 Google Sheets 인스턴스에 액세스하도록 요청된 권한을 AWS Glue에 허용해야 합니다.

 사용자는 AWS Glue 콘솔을 통해 연결을 생성할 때에도 Google Sheets에서 자체 연결된 앱을 생성하고 자체 클라이언트 ID와 클라이언트 보안 암호를 제공하기로 선택할 수 있습니다. 이 시나리오에서는 여전히 Google Sheets로 리디렉션되어 로그인하고 리소스에 액세스할 수 있는 권한을 AWS Glue에 부여합니다.

 이 권한 부여 유형은 새로 고침 토큰과 액세스 토큰을 생성합니다. 액세스 토큰은 수명이 짧으며 새로 고침 토큰을 사용하여 사용자 상호 작용 없이 자동으로 새로 고칠 수 있습니다.

 자세한 내용은 [권한 부여 코드 OAuth 흐름을 위한 연결된 앱 생성의 퍼블릭 Google Sheets 설명서](https://developers.google.com/workspace/guides/create-credentials)를 참조하세요.

# Google Sheets 엔터티에서 읽기
<a name="googlesheets-reading-from-entities"></a>

 **사전 조건** 
+  읽으려는 Google SpreadSheet입니다. 스프레드시트의 SpreadSheet ID 및 tabName이 필요합니다.

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


| 개체 | 데이터 형식 | 지원되는 연산자 | 
| --- | --- | --- | 
| 스프레드시트 | String | N/A(필터링이 지원되지 않음) | 

 **예제** 

```
googleSheets_read = glueContext.create_dynamic_frame.from_options(
    connection_type="googlesheets",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "{SpreadSheetID}#{SheetTabName}",
        "API_VERSION": "v4"
    }
```

 **분할 쿼리** 

 레코드 기반 분할에 한해 Spark에서 동시성을 활용하려는 경우 추가 Spark 옵션으로 `NUM_PARTITIONS`를 제공할 수 있습니다. 이 파라미터를 사용하면 Spark 태스크에서 동시에 실행할 수 있는 `NUM_PARTITIONS`개의 하위 쿼리로 원본 쿼리가 분할됩니다.

 **`NUM_PARTITIONS`를 사용한 예** 

```
googlesheets_read = glueContext.create_dynamic_frame.from_options(
    connection_type="googlesheets",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "{SpreadSheetID}#{SheetTabName}",
        "API_VERSION": "v4",
        "NUM_PARTITIONS": "10"
    }
```

# Google Sheets 연결 옵션
<a name="googlesheets-connection-options"></a>

다음은 Google Sheets의 연결 옵션입니다.
+  `ENTITY_NAME`(문자열) - (필수) 읽기에 사용됩니다. Google Sheets의 `SpreadSheet ID` 및 `sheetTabName`. 예시: `{SpreadSheetID}#{SheetTabName}`.
+  `API_VERSION`(문자열) - (필수) 읽기에 사용됩니다. 사용하려는 Google Sheets Rest API 버전.
+  `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 객체에 대해 선택할 열.
+  `FILTER_PREDICATE`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.
+  `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리.
+  `NUM_PARTITIONS`(정수) - 기본값: 1. 읽기에 사용됩니다. 읽을 파티션 수.

# Google Sheets에 대한 권한 부여 코드 OAuth 흐름 설정
<a name="googlesheets-oauth-authorization"></a>

 **사전 조건** 
+  Google Sheets 앱을 사용하기 위해 로그인할 수 있는 Google 계정. Google 계정에서 Google Sheets에는 전송하려는 데이터가 포함되어 있습니다.
+  Google Cloud Platform 관리자 계정 및 Google Cloud 프로젝트. 자세한 내용은 [Create Google Cloud Project](https://developers.google.com/workspace/guides/create-project)를 참조하세요.

**Google 계정을 설정하고 OAuth 2.0 자격 증명을 가져오는 방법:**

1.  Google Cloud 프로젝트가 설정되면 프로젝트에서 Google Sheets API 및 Google Drive API를 활성화하세요. 이를 활성화하는 단계는 Google Cloud Platform용 API Console Help의 [Enable and disable APIs](https://support.google.com/googleapi/answer/6158841)를 참조하세요.

1.  그런 다음 외부 사용자에 대한 OAuth 동의 화면을 구성하세요. OAuth 동의 화면에 대한 자세한 내용은 Google Cloud Platform Console Help의 [Setting up your OAuth consent screen](https://support.google.com/cloud/answer/10311615#)을 참조하세요.

1.  OAuth 동의 화면에서 다음 범위를 추가하세요.
   +  [ Google Sheets API 읽기 전용 범위 ](https://www.googleapis.com/auth/spreadsheets.readonly) 
   +  [ Google Drive API 읽기 전용 범위 ](ttps://www.googleapis.com/auth/drive.readonly) 

    이러한 범위에 대한 자세한 내용은 Google Identity 설명서의 [OAuth 2.0 Scopes for Google APIs](https://developers.google.com/identity/protocols/oauth2/scopes)를 참조하세요.

1.  OAuth 2.0 클라이언트 ID 및 보안 암호를 생성하세요. 이 클라이언트 ID를 생성하는 단계는 Google Cloud Platform Console Help의 [Setting up OAuth 2.0](https://support.google.com/cloud/answer/6158849?hl=en#zippy=)을 참조하세요.

    OAuth 2.0 클라이언트 ID에는 하나 이상의 승인된 리디렉션 URL이 포함되어야 합니다.

    리디렉션 URL 형식은 다음과 같습니다.
   + https://<aws-region>.console.aws.amazon.com/gluestudio/oauth 

1.  OAuth 2.0 클라이언트 ID의 설정에서 클라이언트 ID 및 클라이언트 보안 암호를 기록하세요.

# Google Sheets 커넥터의 제한 사항
<a name="googlesheets-connector-limitations"></a>

다음은 Google Sheets 커넥터의 제한 사항입니다.
+  Google Sheets 커넥터는 필터를 지원하지 않습니다. 따라서 필터 기반 분할은 지원되지 않습니다.
+  레코드 기반 분할에는 SAAS별로 정확한 레코드 수를 반환하는 조항이 없습니다. 결과적으로 빈 레코드가 있는 파일이 생성되는 시나리오가 발생할 수 있습니다.
+  Google Sheets 커넥터는 필터 기반 분할을 지원하지 않으므로 `partitionField`, `lowerbound` 및 `upperbound`는 유효한 연결 옵션이 아닙니다. 이러한 옵션이 제공되면 AWS Glue 작업이 실패할 것으로 예상됩니다.
+  데이터 처리 문제를 방지하려면 시트의 첫 번째 행을 헤더 행으로 지정하는 것이 중요합니다.
  +  헤더 행을 제공하지 않으면 시트에 첫 번째 행이 비어 있는 데이터가 포함된 경우 헤더 행이 `Unnamed:1`, `Unnamed:2`, `Unnamed:3` 등으로 바뀝니다.
  +  헤더 행을 제공하면 빈 열 이름이 `Unnamed:<number of column>`으로 바뀝니다. 예를 들어 헤더 행이 `['ColumnName1', 'ColumnName2', '', '', 'ColumnName5', 'ColumnName6']`이면 `['ColumnName1', 'ColumnName2', 'Unnamed:3', 'Unnamed:4', 'ColumnName5', 'ColumnName6'].`으로 됩니다.
+  Google Sheets 커넥터는 증분 전송을 지원하지 않습니다.
+  Google Sheets 커넥터는 문자열 데이터 유형만 지원합니다.
+  시트의 중복 헤더는 숫자 접미사를 사용하여 반복적으로 이름이 바뀝니다. 중복 헤더의 이름을 바꾸는 동안 사용자가 제공한 헤더 이름이 우선합니다. 예를 들어 헤더 행이 ["Name", "", "Name", null, "Unnamed:6", ""]인 경우 ["Name", "Unnamed:2", "Name1", "Unnamed:4", "Unnamed:6", "Unnamed:61"]로 변경됩니다.
+  Google Sheets 커넥터는 tabName에 공백을 지원하지 않습니다.
+  폴더 이름에는 다음과 같은 특수 문자를 사용할 수 없습니다.
  + \$1
  + /

# HubSpot에 연결
<a name="connecting-to-data-hubspot"></a>

HubSpot의 CRM 플랫폼에는 마케팅, 영업, 콘텐츠 관리 및 고객 서비스에 필요한 모든 도구가 통합되어 있습니다.
+ Marketing Hub - 트래픽을 늘리고, 더 많은 방문자를 전환하고, 대규모로 전체 인바운드 마케팅 캠페인을 실행하는 데 도움이 되는 마케팅 소프트웨어입니다.
+ Sales Hub - 잠재 고객에 대한 심층적인 인사이트를 얻고, 보유 중인 작업을 자동화하고, 더 많은 거래를 더 빠르게 성사시키는 데 도움이 되는 영업 CRM 소프트웨어입니다.
+ Service Hub - 고객과 연결하고, 기대치를 초과 달성하며, 비즈니스의 성장 요소로 전환하는 데 도움이 되는 고객 서비스 소프트웨어입니다.
+ Operations Hub - 앱을 동기화하고, 고객 데이터를 정리 및 생성하고, 프로세스를 자동화하는 운영 소프트웨어로 모든 시스템과 팀의 협업을 개선할 수 있습니다.

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

# HubSpot의 AWS Glue 지원
<a name="hubspot-support"></a>

AWS Glue는 다음과 같이 HubSpot을 지원합니다.

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

**대상으로서 지원되나요?**  
예. AWS Glue ETL 작업을 사용하여 HubSpot에 데이터를 쓸 수 있습니다.

**지원되는 HubSpot API 버전**  
다음 HubSpot API 버전이 지원됩니다.
+ v1
+ v2
+ v3
+ v4

버전별 엔터티 지원은 [동기화 소스에 대해 지원되는 엔터티](hubspot-reading-from-entities.md#sync-table) 및 [비동기 소스에 대해 지원되는 엔터티:](hubspot-reading-from-entities.md#async-table) 섹션을 참조하세요.

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

# HubSpot 구성
<a name="hubspot-configuring"></a>

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

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

다음은 최소 요구 사항입니다.
+ HubSpot 계정이 있습니다. 자세한 내용은 [HubSpot 계정 생성](#hubspot-configuring-creating-hubspot-account) 섹션을 참조하세요.
+ HubSpot 계정이 API 액세스에 대해 활성화되어 있습니다.
+ 계정에 대해 인증된 직접 호출을 수행하는 경우 AWS Glue에서 데이터에 안전하게 액세스하기 위해 사용하는 클라이언트 자격 증명을 제공하는 앱이 HubSpot 개발자 계정 아래에 있어야 합니다. 자세한 내용은 [HubSpot 개발자 앱 생성](#hubspot-configuring-creating-hubspot-developer-app) 섹션을 참조하세요.

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

## HubSpot 계정 생성
<a name="hubspot-configuring-creating-hubspot-account"></a>

HubSpot 계정을 생성하려면 다음을 수행합니다.

1. [HubSpot CRM SignUp URL](https://app.hubspot.com/login)로 이동합니다.

1. 이메일 주소를 입력하고 **이메일 확인**을 선택합니다(또는 Google, Microsoft 또는 Apple 계정으로 가입하도록 선택할 수 있음).

1. 받은 편지함에서 HubSpot의 확인 코드를 확인합니다.

1. 6자리 확인 코드를 입력하고 **다음**을 클릭합니다.

1. 암호를 입력하고 **다음**을 클릭합니다.

1. 이름과 성을 입력하고 **다음**을 클릭하거나 **Google로 가입** 링크를 사용하여 가입합니다.

1. 업종을 입력하고 **다음**을 클릭합니다.

1. 직무 역할을 입력하고 **다음**을 클릭합니다.

1. 회사 이름을 입력하고 **다음**을 클릭합니다.

1. 회사 규모(회사에서 근무하는 직원 수)를 선택하고 **다음**을 클릭합니다.

1. 회사 웹 사이트를 입력하고 **다음**을 클릭합니다.

1. 데이터를 호스팅할 위치(미국 또는 유럽)를 선택하고 **계정 생성**을 클릭합니다.

1. 계정 생성 목적을 선택하고 **다음**을 클릭합니다.

1. **Google 계정 연결**을 선택하거나 연락처를 직접 추가하여 연락처를 HubSpot 계정에 연결하도록 선택합니다.

1. **Google 계정 연결** 옵션을 선택하여 연락처를 연결하고 HubSpot 계정 사용을 시작한 경우 Google 계정에 로그인합니다.

## HubSpot 개발자 앱 생성
<a name="hubspot-configuring-creating-hubspot-developer-app"></a>

앱 개발자 계정은 앱, 통합 및 개발자 테스트 계정을 생성하고 관리하기 위한 것입니다. 또한 App Marketplace 목록을 생성하고 관리할 수 있습니다. 그러나 앱 개발자 계정 및 관련 테스트 계정은 표준 HubSpot 계정에 연결되지 않습니다. 다른 HubSpot 계정과 데이터 또는 자산을 동기화할 수 없습니다. 클라이언트 ID 및 클라이언트 보안 암호를 가져오려면 개발자 계정을 생성합니다.

1. https://developers.hubspot.com/으로 이동합니다.

1. **개발자 계정 생성**을 선택하고 아래로 스크롤합니다.

1. 앱 개발자 계정, 프라이빗 앱 계정 또는 CMS 개발자 샌드박스 계정을 생성할지 묻는 메시지가 표시됩니다. **앱 개발자 계정 생성**을 선택합니다.

1. 이미 HubSpot으로 계정을 생성했으므로 **이 사용자로 계속**을 선택할 수 있습니다.

1. **가입 시작**을 클릭합니다.

1. 직무 역할을 입력하고 **다음**을 클릭합니다.

1. 개발자 계정의 이름을 지정하고 **다음**을 클릭한 다음, **건너뛰기**를 클릭합니다.

1. **앱 생성**을 선택합니다.

1. 앱이 생성되면 **인증**을 선택합니다.

1. 인증에서 클라이언트 ID 및 클라이언트 암호를 메모합니다.

1. 리전별 **리디렉션 URL**을 https:*//<aws-region>*.console.aws.amazon.com/gluestudio/oauth로 추가합니다. 예를 들어 us-east-1 리전에 https://us-east-1.console.aws.amazon.com/gluestudio/oauth를 추가합니다.

1. 아래로 스크롤하여 범위를 찾습니다. ‘CRM’ 및 ‘Standard’ 제목에서 두 가지 종류의 범위를 선택해야 합니다.

1. 다음 범위를 추가합니다.

   ```
   content
   automation
   oauth
   crm.objects.owners.read
   forms
   tickets
   crm.objects.contacts.write
   e-commerce
   crm.schemas.custom.read
   crm.objects.custom.read
   sales-email-read
   crm.objects.custom.write
   crm.objects.companies.write
   crm.lists.write
   crm.objects.companies.read
   crm.lists.read
   crm.objects.deals.read
   crm.objects.deals.write
   crm.objects.contacts.read
   ```

1. **저장**을 클릭하면 이제 개발 계정을 사용할 준비가 됩니다.

1. 위로 스크롤하여 **클라이언트 ID**를 찾습니다.

1. 동일한 페이지에서 **표시**를 클릭하여 **클라이언트 암호**를 가져옵니다.

## HubSpot 개발자 테스트 계정 생성
<a name="hubspot-configuring-creating-hubspot-developer-test-account"></a>

앱 개발자 계정 내에서 개발자 테스트 계정을 생성하여 실제 HubSpot 데이터에 영향을 주지 않고 앱 및 통합을 테스트할 수 있습니다. 개발자 테스트 계정은 프로덕션 계정을 미러링하지 않고 Marketing, Sales, CMS 및 Operations Hub의 엔터프라이즈 버전 90일 평가판에 액세스하여 대부분의 HubSpot 도구 및 API를 테스트할 수 있습니다.

1. **홈**을 클릭하세요.

1. **테스트 계정 생성**을 클릭합니다.

1. **앱 테스트 계정 생성**을 클릭합니다.

1. 새 창이 나타납니다. 앱 테스트 계정 이름을 입력하고 **생성**을 클릭합니다.

   이제 앱 테스트 계정이 생성됩니다.

**참고**  
개발자 계정은 API 통합과 같은 개발 활동과 관련이 있으며, 앱 테스트 계정은 개발자 계정에서 생성 또는 가져오는 데이터를 보는 데 사용됩니다.

# HubSpot 연결 구성
<a name="hubspot-configuring-connections"></a>

HubSpot에서는 OAuth2에 대한 AUTHORIZATION\$1CODE 권한 부여 유형을 지원합니다.
+ 이 권한 부여 유형은 사용자를 인증하기 위해 사용자를 서드파티 권한 부여 서버로 리디렉션하는 방식에 의존하므로 '3각' OAuth로 간주됩니다. AWS Glue 콘솔을 통해 연결을 생성할 때 사용됩니다. 연결을 생성하는 사용자는 HubSpot 클라이언트 애플리케이션에 대한 클라이언트 ID 및 클라이언트 보안 암호와 같은 OAuth 관련 정보를 제공해야 합니다. AWS Glue 콘솔은 사용자를 HubSpot으로 리디렉션합니다. 사용자가 로그인하고 HubSpot 인스턴스에 액세스하도록 요청된 권한을 AWS Glue에 허용해야 합니다.
+ 사용자는 여전히 AWS Glue 콘솔을 통해 연결을 생성할 때에도 HubSpot에서 자체 연결된 앱을 생성하고 자체 클라이언트 ID와 클라이언트 보안 암호를 제공하기로 선택할 수 있습니다. 이 시나리오에서는 여전히 HubSpot으로 리디렉션되어 로그인하고 리소스에 액세스할 수 있는 권한을 AWS Glue에 부여합니다.
+ 이 권한 부여 유형은 새로 고침 토큰과 액세스 토큰을 생성합니다. 액세스 토큰은 수명이 짧으며 새로 고침 토큰을 사용하여 사용자 상호 작용 없이 자동으로 새로 고칠 수 있습니다.
+ 권한 부여 코드 OAuth 흐름을 위한 연결된 앱 생성에 대한 퍼블릭 HubSpot 설명서는 [Public apps](https://developers.hubspot.com/docs/api/creating-an-app)을 참조하세요.

HubSpot 연결을 구성하는 방법:

1. AWS Secrets Manager에서 다음 세부 정보로 보안 암호를 생성합니다.

   1. 고객 관리형 연결된 앱의 경우 보안 암호는 키 역할을 하는 `USER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET`과 함께 연결된 앱 소비자 보안 암호를 포함해야 합니다.

   1. 참고: AWS Glue에서 연결의 보안 암호를 생성해야 합니다.

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

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

   1. HubSpot 환경을 제공합니다.

   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`을 제공합니다.

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

**사전 조건**

읽으려는 HubSpot 객체. 객체 이름(예: 연락처 또는 태스크)이 필요합니다. 다음 표에는 동기화 소스에 대해 지원되는 엔터티가 나와 있습니다.

## 동기화 소스에 대해 지원되는 엔터티
<a name="sync-table"></a>


| 개체 | API 버전 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | --- | 
| Campaigns | v1 | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| 회사 | v3 | 예 | 예 | 예 | 예 | 예 | 
| Contacts | v3 | 예 | 예 | 예 | 예 | 예 | 
| 연락처 목록 | v1 | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| 거래 | v3 | 예 | 예 | 예 | 예 | 예 | 
| CRM 파이프라인(거래 파이프라인) | v1 | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| 이메일 이벤트 | v1 | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| 호출 | v3 | 예 | 예 | 예 | 예 | 예 | 
| Notes | v3 | 예 | 예 | 예 | 예 | 예 | 
| 이메일 | v3 | 예 | 예 | 예 | 예 | 예 | 
| 회의 | v3 | 예 | 예 | 예 | 예 | 예 | 
| 업무 | v3 | 예 | 예 | 예 | 예 | 예 | 
| 우편 | v3 | 예 | 예 | 예 | 예 | 예 | 
| 사용자 지정 객체 | v3 | 예 | 예 | 예 | 예 | 예 | 
| 양식 | v2 | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| 소유자 | v3 | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| Products | v3 | 예 | 예 | 예 | 예 | 예 | 
| 티켓 | v3 | 예 | 예 | 예 | 예 | 예 | 
| 워크플로 | v3 | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Associations | v4 | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| 연결 레이블 | v4 | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 

**예시:**

```
hubspot_read = glueContext.create_dynamic_frame.from_options(
    connection_type="hubspot",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "contact",
        "API_VERSION": "v3"
    }
```

## 비동기 소스에 대해 지원되는 엔터티:
<a name="async-table"></a>


| 개체 | API 버전 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | --- | 
| Companies | v3 | 예 | 아니요 | 예 | 예 | 아니요 | 
| Contacts | v3 | 예 | 아니요 | 예 | 예 | 아니요 | 
| 거래 | v3 | 예 | 아니요 | 예 | 예 | 아니요 | 
| 호출 | v3 | 예 | 아니요 | 예 | 예 | 아니요 | 
| Notes | v3 | 예 | 아니요 | 예 | 예 | 아니요 | 
| Emails | v3 | 예 | 아니요 | 예 | 예 | 아니요 | 
| 회의 | v3 | 예 | 아니요 | 예 | 예 | 아니요 | 
| 업무 | v3 | 예 | 아니요 | 예 | 예 | 아니요 | 
| 우편 | v3 | 예 | 아니요 | 예 | 예 | 아니요 | 
| 사용자 지정 객체 | v3 | 예 | 아니요 | 예 | 예 | 아니요 | 
| Products | v3 | 예 | 아니요 | 예 | 예 | 아니요 | 
| Tickets | v3 | 예 | 아니요 | 예 | 예 | 아니요 | 

**예시:**

```
hubspot_read = glueContext.create_dynamic_frame.from_options(
    connection_type="hubspot",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "contact",
        "API_VERSION": "v3",
        "TRANSFER_MODE": "ASYNC"
    }
```

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

**HubSpot API v4**: 

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

**참고**  
`Associations` 객체의 경우 두 객체 사이의 연결을 가져오려면 AWS Glue 작업을 생성하는 동안 필수 필터를 통해 'from Id'(첫 번째 객체의 ID)를 제공해야 합니다. 이 경우 여러 ID에 대한 연결을 가져오려면 `where` 절에서 여러 ID를 제공해야 합니다. 예: 연락처 ID '1' 및 '151'에 대한 `Associations`를 가져오는 경우 필터를 `where id=1 AND id=151`로 제공해야 합니다.

**HubSpot API v3**:

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

다음 엔터티에 대해 HubSpot에서는 메타데이터를 동적으로 가져도록 엔드포인트를 제공하므로 운영자 지원이 각 엔터티의 데이터 유형 수준에서 캡처됩니다.

**참고**  
`DML_STATUS`는 동기화 모드에서 런타임 시 모든 레코드에 추가된 가상 필드로, 해당 상태를 결정합니다(CREATED/UPDATED). `CONTAINS/LIKE` 연산자는 비동기 모드에서 지원되지 않습니다.

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

**HubSpot API v2**:

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

**HubSpot API v1**:

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

## 쿼리 파티셔닝
<a name="hubspot-reading-partitioning-queries"></a>

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

  DateTime 필드의 경우 ISO 형식의 값이 허용됩니다.

  유효한 값의 예제:

  ```
  “2024-01-01T10:00:00.115Z" 
  ```
+ `UPPER_BOUND`: 선택한 파티션 필드의 상한 값(**경계 제외**).
+ `NUM_PARTITIONS`: 파티션 수.

다음 표에서는 엔터티 분할 필드 지원 세부 정보를 설명합니다.

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

예시:

```
hubspot_read = glueContext.create_dynamic_frame.from_options(
    connection_type="hubspot",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "company",
        "API_VERSION": "v3",
        "PARTITION_FIELD": "hs_object_id"
        "LOWER_BOUND": "50"
        "UPPER_BOUND": "16726619290"
        "NUM_PARTITIONS": "10"
    }
```

# HubSpot 엔터티에 쓰기
<a name="hubspot-writing-to-entities"></a>

## 사전 조건
<a name="hubspot-writing-prerequisites"></a>
+ 데이터를 쓰려는 HubSpot 객체. 객체 이름(예: 연락처 또는 티켓)이 필요합니다.
+ HubSpot 커넥터는 다음 쓰기 작업을 지원합니다.
  + INSERT
  + UPDATE
+ `UPDATE` 쓰기 작업을 사용하는 경우 `ID_FIELD_NAMES` 옵션을 제공하여 레코드의 ID 필드를 지정해야 합니다.

## 동기화 대상에 지원되는 엔터티
<a name="hubspot-supported-entities"></a>


| 개체 | API 버전 | 대상 커넥터로 지원됩니다. | 삽입 가능 | 업데이트 가능 | 
| --- | --- | --- | --- | --- | 
| Companies | v3 | 예 | 예(단일, 대량) | 예(단일, 대량) | 
| Contacts | v3 | 예 | 예(단일, 대량) | 예(단일, 대량) | 
| 거래 | v3 | 예 | 예(단일, 대량) | 예(단일, 대량) | 
| Products | v3 | 예 | 예(단일, 대량) | 예(단일, 대량) | 
| 호출 | v3 | 예 | 예(단일, 대량) | 예(단일, 대량) | 
| 회의 | v3 | 예 | 예(단일, 대량) | 예(단일, 대량) | 
| Notes | v3 | 예 | 예(단일, 대량) | 예(단일, 대량) | 
| Emails | v3 | 예 | 예(단일, 대량) | 예(단일, 대량) | 
| 업무 | v3 | 예 | 예(단일, 대량) | 예(단일, 대량) | 
| 우편 | v3 | 예 | 예(단일, 대량) | 예(단일, 대량) | 
| 사용자 지정 객체 | v3 | 예 | 예(단일, 대량) | 예(단일, 대량) | 
| Tickets | v3 | 예 | 예(단일, 대량) | 예(단일, 대량) | 
| 연결 | v4 | 예 | 예(단일, 대량) | 아니요 | 
| 연결 레이블 | v4 | 예 | 예(단일, 대량) | 예(단일, 대량) | 

**예**:

**INSERT 작업**

```
hubspot_write = glueContext.write_dynamic_frame.from_options(
    frame=frameToWrite,
    connection_type="hubspot",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "contact",
        "API_VERSION": "v3",
        "WRITE_OPERATION": "INSERT"
    }
)
```

**UPDATE 작업**

```
hubspot_write = glueContext.write_dynamic_frame.from_options(
    frame=frameToWrite,
    connection_type="hubspot",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "deal",
        "API_VERSION": "v3",
        "WRITE_OPERATION": "UPDATE",
        "ID_FIELD_NAMES": "hs_object_id"
    }
)
```

# HubSpot 연결 옵션
<a name="hubspot-connection-options"></a>

다음은 HubSpot의 연결 옵션입니다.
+ `ENTITY_NAME`(문자열) - (필수) 읽기에 사용됩니다. HubSpot에서의 객체 이름입니다.
+ `API_VERSION`(문자열) - (필수) 읽기에 사용됩니다. 사용할 HubSpot Rest API 버전입니다. 예: v1,v2,v3,v4.
+ `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 객체에 대해 선택할 열.
+ `FILTER_PREDICATE`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.
+ `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리.
+ `PARTITION_FIELD`(문자열) - 읽기에 사용됩니다. 쿼리 분할에 사용할 필드입니다.
+ `LOWER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 하한 값(경계 포함).
+ `UPPER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 상한 값(경계 제외).
+ `NUM_PARTITIONS`(정수) - 기본값: 1. 읽기에 사용됩니다. 읽을 파티션 수.
+ `TRANSFER_MODE`(문자열) - 쿼리를 비동기 모드에서 실행해야 하는지 여부를 나타내는 데 사용됩니다.
+ `WRITE_OPERATION`(문자열) - 기본값: INSERT. 쓰기에 사용됩니다. 값은 INSERT 또는 UPDATE여야 합니다.
+ `ID_FIELD_NAMES`(문자열) - 기본값: null. UPDATE에 필수입니다.

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

다음은 HubSpot 커넥터의 제한 사항입니다.
+ 검색 엔드포인트는 지정된 쿼리에 대해 총 10,000개의 결과로 제한됩니다. 레코드가 10,000개를 초과하는 파티션은 400 오류가 발생합니다.
+ 커넥터에 대한 기타 중요한 제한 사항은 [제한 사항](https://developers.hubspot.com/docs/api/crm/search#limitations)에 설명되어 있습니다.
+ HubSpot은 최대 3개의 필터링 문을 허용합니다.
+ 현재 HubSpot은 표준 HubSpot 객체(예: 연락처, 회사, 거래 또는 티켓)와 사용자 지정 객체 간의 연결을 지원합니다.
  + 무료 계정의 경우: 각 객체 페어링(예: 연락처 및 회사) 간에 최대 10개의 연결 유형만 생성할 수 있습니다.
  + 슈퍼 관리자 계정의 경우: 각 객체 페어링 간에 최대 50개의 연결 유형만 생성할 수 있습니다.
  + 자세한 내용은 [연결 v4](https://developers.hubspot.com/docs/api/crm/) 및 [연결 레이블 생성과 사용](https://knowledge.hubspot.com/object-settings/create-and-use-association-labels)을 참조하세요.
+ 'Quote' 및 'Communications' 객체는 현재 커넥터에서 지원되지 않으므로 연결에 없습니다.
+ 비동기의 경우 SaaS는 값을 오름차순으로만 정렬합니다.
+ `Ticket` 엔터티의 경우 SaaS는 비동기 모드에서 `hs_object_id` 필드를 반환하지 않습니다.

# Instagram Ads에 연결
<a name="connecting-to-data-instagram-ads"></a>

Instagram은 브랜드, 유명 인사, 사고 방식의 리더, 친구, 가족 등과 연결할 수 있는 인기 있는 사진 공유 앱입니다. 이는 사진 공유 및 소셜 네트워킹 서비스입니다. 사용자는 사진이나 짧은 동영상을 찍어 팔로워와 공유할 수 있습니다. Instagram Ads는 Instagram 사용자에게 제공하기 위해 비즈니스에서 비용을 지불할 수 있는 게시물입니다.

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

# Instagram Ads에 대한 AWS Glue의 지원
<a name="instagram-ads-support"></a>

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

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

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

**지원되는 Instagram Ads API 버전**  
다음 Instagram Ads API 버전이 지원됩니다.
+ v17.0
+ v18.0
+ v19.0
+ v20.0

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

# Instagram Ads 구성
<a name="instagram-ads-configuring"></a>

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

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

다음은 최소 요구 사항입니다.
+ Instagram Standard 계정에는 Facebook을 통해 간접적으로 액세스됩니다.
+ 액세스 토큰을 생성하려면 사용자 인증이 필요합니다.
+ Instagram Ads SDK 커넥터는 *사용자 액세스 토큰 OAuth* 흐름을 구현합니다.
+ OAuth2.0을 사용하여 Instagram Ads에 대한 API 요청을 인증합니다. 이 웹 기반 인증은 2FA의 상위 세트인 다중 인증(MFA) 아키텍처에 속합니다.
+ 사용자에게 엔드포인트에 액세스할 수 있는 권한을 부여해야 합니다. 사용자의 데이터에 액세스하기 위해 엔드포인트 권한 부여는 [권한](https://developers.facebook.com/docs/permissions) 및 [기능](https://developers.facebook.com/docs/features-reference)을 통해 처리됩니다.

## OAuth 2.0 자격 증명 가져오기
<a name="instagram-ads-configuring-creating-instagram-ads-oauth2-credentials"></a>

인스턴스에 대해 인증된 직접 호출을 수행할 수 있도록 API 자격 증명을 확보하려면 [그래프 API](https://developers.facebook.com/docs/graph-api/)를 참조하세요.

# Instagram Ads 연결 구성
<a name="instagram-ads-configuring-connections"></a>

Instagram Ads에서는 OAuth2에 대한 AUTHORIZATION\$1CODE 권한 부여 유형을 지원합니다.
+ 이 권한 부여 유형은 사용자를 인증하기 위해 사용자를 서드파티 권한 부여 서버로 리디렉션하는 방식에 의존하므로 3각 OAuth로 간주됩니다. AWS Glue 콘솔을 통해 연결을 생성할 때 사용됩니다.
+ 사용자는 AWS Glue 콘솔을 통해 연결을 생성할 때에도 Instagram Ads에서 자체 연결된 앱을 생성하고 자체 클라이언트 ID와 클라이언트 보안 암호를 제공하기로 선택할 수 있습니다. 이 시나리오에서는 여전히 Instagram Ads로 리디렉션되어 로그인하고 리소스에 액세스할 수 있는 권한을 AWS Glue에 부여합니다.
+ 이 권한 부여 유형은 액세스 토큰을 생성합니다. 만료되는 시스템 사용자 토큰은 생성 날짜 또는 새로 고친 날짜로부터 60일 동안 유효합니다. 연속성을 생성하려면 개발자가 60일 이내에 액세스 토큰을 새로 고쳐야 합니다. 그렇지 않으면 액세스 토큰이 몰수되고 개발자가 API 액세스 권한을 다시 획득하기 위해 새 토큰을 확보해야 합니다. [액세스 토큰 새로 고침](https://developers.facebook.com/docs/marketing-api/system-users/install-apps-and-generate-tokens/)을 참조하세요.

Instagram Ads 연결을 구성하는 방법:

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

   1. **연결 유형**을 선택할 때 Instagram Ads를 선택하세요.

   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. 사용자 관리형 클라이언트 애플리케이션 클라이언트 ID를 제공합니다.

   1. 토큰을 넣기 위해 AWS Glue에서 이 연결에 사용할 `secretName`을 선택합니다. 선택한 보안 암호에는 값이 연결된 앱의 클라이언트 보안 암호인 `USER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET` 키가 있어야 합니다.

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

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

# Instagram Ads 엔터티에서 읽기
<a name="instagram-ads-reading-from-entities"></a>

**사전 조건**

읽으려는 Instagram Ads 객체. 객체 이름이 필요합니다. 다음 표에는 지원되는 엔터티가 나와 있습니다.

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


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| 캠페인 | 예 | 예 | 아니요 | 예 | 예 | 
| 광고 세트 | 예 | 예 | 아니요 | 예 | 예 | 
| 광고 | 예 | 예 | 아니요 | 예 | 예 | 
| 광고 크리에이티브 | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| 인사이트 - 계정 | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| 광고 이미지 | 예 | 예 | 아니요 | 예 | 아니요 | 
| 인사이트 - 광고 | 예 | 예 | 아니요 | 예 | 예 | 
| 인사이트 - 광고 세트 | 예 | 예 | 아니요 | 예 | 예 | 
| 인사이트 - 캠페인 | 예 | 예 | 아니요 | 예 | 예 | 

**예시:**

```
instagramAds_read = glueContext.create_dynamic_frame.from_options(
    connection_type="instagramads",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "entityName",
        "API_VERSION": "v20.0"
    }
```

## Instagram Ads 엔터티 및 필드 세부 정보
<a name="instagram-ads-reading-entity-and-field-details"></a>

엔터티 및 필드 세부 정보에 대한 자세한 내용은 다음을 참조하세요.
+ [캠페인](https://developers.facebook.com/docs/marketing-api/reference/ad-campaign-group)
+ [광고 세트](https://developers.facebook.com/docs/marketing-api/reference/ad-campaign)
+ [광고](https://developers.facebook.com/docs/marketing-api/reference/adgroup)
+ [광고 크리에이티브](https://developers.facebook.com/docs/marketing-api/reference/ad-creative)
+ [광고 계정 인사이트](https://developers.facebook.com/docs/marketing-api/reference/ad-account/insights)
+ [광고 이미지](https://developers.facebook.com/docs/marketing-api/reference/ad-image)
+ [광고 인사이트](https://developers.facebook.com/docs/marketing-api/reference/adgroup/insights/)
+ [광고 세트 인사이트](https://developers.facebook.com/docs/marketing-api/reference/ad-campaign/insights)
+ [캠페인 인사이트](https://developers.facebook.com/docs/marketing-api/reference/ad-campaign-group/insights)

자세한 내용은 [마케팅 API](https://developers.facebook.com/docs/marketing-api/reference/v21.0)를 참조하세요.

**참고**  
구조체 및 목록 데이터 유형은 커넥터의 응답에서 문자열 데이터 유형으로 변환됩니다.

## 쿼리 파티셔닝
<a name="instagram-ads-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 타임스탬프 형식을 허용합니다.

  유효한 값의 예제:

  ```
  "2022-01-01T00:00:00.000Z"
  ```
+ `UPPER_BOUND`: 선택한 파티션 필드의 상한 값(**경계 제외**).

  유효한 값의 예제:

  ```
  "2024-01-02T00:00:00.000Z"
  ```
+ `NUM_PARTITIONS`: 파티션 수.

예시:

```
instagramADs_read = glueContext.create_dynamic_frame.from_options(
    connection_type="instagramads",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "entityName",
        "API_VERSION": "v20.0",
        "PARTITION_FIELD": "created_time"
        "LOWER_BOUND": "2022-01-01T00:00:00.000Z"
        "UPPER_BOUND": "2024-01-02T00:00:00.000Z"
        "NUM_PARTITIONS": "10"
    }
```

# Instagram Ads 연결 옵션
<a name="instagram-ads-connection-options"></a>

다음은 Instagram Ads에 대한 연결 옵션입니다.
+ `ENTITY_NAME`(문자열) - (필수) 읽기에 사용됩니다. Instagram Ads에서의 객체 이름.
+ `API_VERSION`(문자열) - (필수) 읽기에 사용됩니다. 사용할 Instagram Ads 그래프 API 버전. 예: v21.
+ `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 객체에 대해 선택할 열.
+ `FILTER_PREDICATE`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.
+ `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리.
+ `PARTITION_FIELD`(문자열) - 읽기에 사용됩니다. 쿼리 분할에 사용할 필드입니다.
+ `LOWER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 하한 값(경계 포함).
+ `UPPER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 상한 값(경계 제외).
+ `NUM_PARTITIONS`(정수) - 기본값: 1. 읽기에 사용됩니다. 읽을 파티션 수.

# Instagram Ads 커넥터에 대한 제한 사항 및 참고 사항
<a name="instagram-ads-connector-limitations"></a>

다음은 Instagram Ads 커넥터에 대한 제한 사항 또는 참고 사항입니다.
+ 앱의 직접 호출 수는 롤링 1시간 기간에 사용자가 수행할 수 있는 직접 호출 수(200에 사용자 수를 곱한 값). 요금 제한에 대한 자세한 내용은 [사용 제한](https://developers.facebook.com/docs/graph-api/overview/rate-limiting/) 및 [비즈니스 사용 사례 사용 제한](https://developers.facebook.com/docs/graph-api/overview/rate-limiting/#buc-rate-limits)을 참조하세요.

# AWS Glue Studio에서 Intercom에 연결
<a name="connecting-to-data-intercom"></a>

 Intercom은 제품, 현재, 고객 측면에서 비즈니스와 고객 간의 열린 채널을 제공하는 참여 OS로, 고객 여정 전반에 걸쳐 모든 참여를 최대한 활용할 수 있는 지속적인 대화를 생성합니다.

**Topics**
+ [Intercom에 대한 AWS Glue의 지원](intercom-support.md)
+ [연결을 생성하고 사용하기 위한 API 작업이 포함된 정책](intercom-configuring-iam-permissions.md)
+ [Intercom 구성](intercom-configuring.md)
+ [Intercom 연결 구성](intercom-configuring-connections.md)
+ [Intercom 엔터티에서 읽기](intercom-reading-from-entities.md)
+ [Intercom 연결 옵션](intercom-connection-options.md)
+ [제한 사항](intercom-limitations.md)
+ [새 Intercom 계정 생성 및 클라이언트 앱 구성](intercom-new-account-creation.md)

# Intercom에 대한 AWS Glue의 지원
<a name="intercom-support"></a>

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

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

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

**지원되는 Intercom API 버전**  
 v2.5. 버전별 엔터티 지원은 [Intercom 엔터티에서 읽기](intercom-reading-from-entities.md) 섹션을 참조하세요.

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

 다음 샘플 정책은 연결을 생성하고 사용하는 데 필요한 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, Amazon 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 콘솔의 사용자에게 해당됩니다.

# Intercom 구성
<a name="intercom-configuring"></a>

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

## 최소 요구 사항
<a name="intercom-configuring-min-requirements"></a>
+  Intercom 계정이 있습니다. 자세한 내용은 [새 Intercom 계정 생성 및 클라이언트 앱 구성](intercom-new-account-creation.md) 섹션을 참조하세요.
+  Intercom 계정이 API 액세스에 대해 활성화되어 있습니다.
+  계정에 대해 인증된 직접 호출을 수행하는 경우 AWS Glue에서 데이터에 안전하게 액세스하기 위해 사용하는 클라이언트 자격 증명을 제공하는 앱이 Intercom 개발자 계정 아래에 있어야 합니다. 자세한 내용은 새 Intercom 계정 생성 및 클라이언트 앱 생성 단계를 참조하세요.

 이러한 요구 사항을 충족하면 Intercom 계정에 AWS Glue를 연결할 준비가 된 것입니다.

# Intercom 연결 구성
<a name="intercom-configuring-connections"></a>

 Intercom에서는 OAuth 2에 대한 `AUTHORIZATION_CODE` 권한 부여 유형을 지원합니다.

 이 권한 부여 유형은 사용자를 인증하기 위해 사용자를 서드파티 권한 부여 서버로 리디렉션하는 방식에 의존하므로 '3각' OAuth로 간주됩니다. AWS Glue 콘솔을 통해 연결을 생성할 때 사용됩니다. AWS Glue 콘솔은 사용자를 Google Ads로 리디렉션합니다. 사용자가 로그인하고 Intercom 인스턴스에 액세스하도록 요청된 권한을 AWS Glue에 허용해야 합니다.

 사용자는 AWS Glue 콘솔을 통해 연결을 생성할 때 고유한 클라이언트 ID 및 클라이언트 보안 암호를 제공해야 합니다. 이 시나리오에서는 여전히 Intercom으로 리디렉션되어 로그인하고 리소스에 액세스할 수 있는 권한을 AWS Glue에 부여합니다.

 이 권한 부여 유형은 새로 고침 토큰과 액세스 토큰을 생성합니다. 액세스 토큰은 수명이 짧으며 새로 고침 토큰을 사용하여 사용자 상호 작용 없이 자동으로 새로 고칠 수 있습니다.

 권한 부여 코드 OAuth 흐름을 위한 연결된 앱 생성에 대한 자세한 내용은 [Ads API](https://developers.intercom.com/building-apps/docs/setting-up-oauth)를 참조하세요.

Intercom 연결을 구성하는 방법:

1.  AWS Secrets Manager에서 다음 세부 정보로 보안 암호를 생성하세요. AWS Glue에서 각 연결에 대한 보안 암호를 생성해야 합니다.

   1.  고객 관리형 연결 앱의 경우 - 보안 암호에는 연결된 앱 액세스 토큰, 새로 고침 토큰, client\$1id 및 client\$1secret이 포함되어야 합니다.

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

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

   1. Intercom 환경을 제공합니다.

   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.  토큰을 넣기 위해 AWS Glue에서 이 연결에 사용할 `secretName`을 선택합니다.

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

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

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

 **사전 조건** 
+  읽으려는 Intercom 객체. 사용 가능한 엔터티를 확인하려면 아래 지원되는 엔터티 테이블을 참조하세요.

 **지원되는 엔터티** 


| 개체 | API\$1Version | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | --- | 
| Admins | v2.5 | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| 회사 | v2.5 | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| Conversations | v2.5 | 예 | 예 | 예 | 예 | 예 | 
| 데이터 속성 | v2.5 | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Contacts | v2.5 | 예 | 예 | 예 | 예 | 예 | 
| Segments | v2.5 | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Tags | v2.5 | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| 팀 | v2.5 | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 

 **예제** 

```
Intercom_read = glueContext.create_dynamic_frame.from_options(
    connection_type="Intercom",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "company",
        "API_VERSION": "V2.5"
    }
)
```

 **Intercom 엔터티 및 필드 세부 정보** 


| 개체 | 필드 | 데이터 형식 | 지원되는 연산자 | 
| --- | --- | --- | --- | 
| Admins | type | String | NA | 
| Admins | id | String | NA | 
| Admins | avatar | Struct | NA | 
| Admins | name | String | NA | 
| Admins | 이메일 | String | NA | 
| Admins | away\$1mode\$1enabled | 불 | NA | 
| Admins | away\$1mode\$1reassign | 불 | NA | 
| Admins | has\$1inbox\$1seat | 불 | NA | 
| Admins | teams\$1ids | 나열 | NA | 
| Admins | job\$1title | String | NA | 
| 회사 | type | String | NA | 
| 회사 | id | String | NA | 
| 회사 | app\$1id | String | NA | 
| 회사 | created\$1at | DateTime | NA | 
| 회사 | remote\$1created\$1at | DateTime | NA | 
| 회사 | updated\$1at | DateTime | NA | 
| 회사 | last\$1request\$1at | DateTime | NA | 
| 회사 | 계획 | Struct | NA | 
| 회사 | company\$1id | String | NA | 
| 회사 | name | String | NA | 
| 회사 | custom\$1attributes | Struct | NA | 
| 회사 | session\$1count | Integer | NA | 
| 회사 | monthly\$1spend | Integer | NA | 
| 회사 | user\$1count | Integer | NA | 
| 회사 | industry | String | NA | 
| 회사 | size | Integer | NA | 
| 회사 | 웹 사이트 | String | NA | 
| 회사 | tags | Struct | NA | 
| 회사 | segments | Struct | NA | 
| Contacts | id | String | EQUAL\$1TO.NOT\$1EQUAL\$1TO | 
| Contacts | type | String | NA | 
| Contacts | workspace\$1id | String | NA | 
| Contacts | external\$1id | String | CONTAINS, EQUAL\$1TO, NOT\$1EQUAL\$1TO | 
| Contacts | role | String | EQUAL\$1TO.NOT\$1EQUAL\$1TO | 
| Contacts | 이메일 | String | CONTAINS, EQUAL\$1TO, NOT\$1EQUAL\$1TO | 
| Contacts | phone | String | CONTAINS, EQUAL\$1TO, NOT\$1EQUAL\$1TO | 
| Contacts | name | String | CONTAINS, EQUAL\$1TO, NOT\$1EQUAL\$1TO | 
| Contacts | avatar | String | NA | 
| Contacts | owner\$1id | Integer | EQUAL\$1TO, NOT\$1EQUAL\$1TO, GREATER\$1THAN, LESS\$1THAN | 
| Contacts | social\$1profiles | Struct | NA | 
| Contacts | has\$1hard\$1bounced | 불 | EQUAL\$1TO | 
| Contacts | marked\$1email\$1as\$1spam | 불 | EQUAL\$1TO | 
| Contacts | unsubscribed\$1from\$1emails | 불 | EQUAL\$1TO | 
| Contacts | created\$1at | DateTime | EQUAL\$1TO, GREATER\$1THAN, LESS\$1THAN | 
| Contacts | updated\$1at | DateTime | EQUAL\$1TO, GREATER\$1THAN, LESS\$1THAN | 
| Contacts | signed\$1up\$1at | DateTime | EQUAL\$1TO, GREATER\$1THAN, LESS\$1THAN | 
| Contacts | last\$1seen\$1at | DateTime | EQUAL\$1TO, GREATER\$1THAN, LESS\$1THAN | 
| Contacts | last\$1replied\$1at | DateTime | EQUAL\$1TO, GREATER\$1THAN, LESS\$1THAN | 
| Contacts | last\$1contacted\$1at | DateTime | EQUAL\$1TO, GREATER\$1THAN, LESS\$1THAN | 
| Contacts | last\$1email\$1opened\$1at | DateTime | EQUAL\$1TO, GREATER\$1THAN, LESS\$1THAN | 
| Contacts | last\$1email\$1clicked\$1at | DateTime | EQUAL\$1TO, GREATER\$1THAN, LESS\$1THAN | 
| Contacts | language\$1override | String | CONTAINS, EQUAL\$1TO, NOT\$1EQUAL\$1TO | 
| Contacts | 브라우저 | String | CONTAINS, EQUAL\$1TO, NOT\$1EQUAL\$1TO | 
| Contacts | browser\$1version | String | CONTAINS, EQUAL\$1TO, NOT\$1EQUAL\$1TO | 
| Contacts | browser\$1language | String | CONTAINS, EQUAL\$1TO, NOT\$1EQUAL\$1TO | 
| Contacts | os | String | CONTAINS, EQUAL\$1TO, NOT\$1EQUAL\$1TO | 
| Contacts | location | Struct | NA | 
| Contacts | location\$1country | String | CONTAINS, EQUAL\$1TO, NOT\$1EQUAL\$1TO | 
| Contacts | location\$1region | String | CONTAINS, EQUAL\$1TO, NOT\$1EQUAL\$1TO | 
| Contacts | location\$1city | String | CONTAINS, EQUAL\$1TO, NOT\$1EQUAL\$1TO | 
| Contacts | android\$1app\$1name | String | CONTAINS, EQUAL\$1TO, NOT\$1EQUAL\$1TO | 
| Contacts | android\$1app\$1version | String | NA | 
| Contacts | android\$1device | String | NA | 
| Contacts | android\$1os\$1version | String | NA | 
| Contacts | android\$1sdk\$1version | String | CONTAINS, EQUAL\$1TO, NOT\$1EQUAL\$1TO | 
| Contacts | android\$1last\$1seen\$1at | 날짜 | NA | 
| Contacts | ios\$1app\$1name | String | CONTAINS, EQUAL\$1TO, NOT\$1EQUAL\$1TO | 
| Contacts | ios\$1app\$1version | String | NA | 
| Contacts | ios\$1device | String | NA | 
| Contacts | ios\$1os\$1version | String | CONTAINS, EQUAL\$1TO, NOT\$1EQUAL\$1TO | 
| Contacts | ios\$1sdk\$1version | String | CONTAINS, EQUAL\$1TO, NOT\$1EQUAL\$1TO | 
| Contacts | ios\$1last\$1seen\$1at | DateTime | NA | 
| Contacts | custom\$1attributes | Struct | NA | 
| Contacts | tags | Struct | NA | 
| Contacts | notes | Struct | NA | 
| Contacts | companies | Struct | NA | 
| Contacts | unsubscribed\$1from\$1sms | 불 | NA | 
| Contacts | sms\$1consent | 불 | NA | 
| Contacts | opted\$1out\$1subscription\$1types | Struct | NA | 
| Contacts | referrer | String | NA | 
| Contacts | utm\$1campaign | String | NA | 
| Contacts | utm\$1content | String | NA | 
| Contacts | utm\$1medium | String | NA | 
| Contacts | utm\$1source | String | NA | 
| Contacts | utm\$1term | String | NA | 
| Conversations | type | String | NA | 
| Conversations | id | Integer | EQUAL\$1TO, NOT\$1EQUAL\$1TO, GREATER\$1THAN, LESS\$1THAN | 
| Conversations | created\$1at | DateTime | EQUAL\$1TO, NOT\$1EQUAL\$1TO, GREATER\$1THAN, LESS\$1THAN | 
| Conversations | updated\$1at | DateTime | EQUAL\$1TO, NOT\$1EQUAL\$1TO, GREATER\$1THAN, LESS\$1THAN | 
| Conversations | source | Struct | NA | 
| Conversations | source\$1id | String | EQUAL\$1TO, NOT\$1EQUAL\$1TO | 
| Conversations | source\$1type | String | EQUAL\$1TO, NOT\$1EQUAL\$1TO, | 
| Conversations | source\$1delivered\$1as | String | EQUAL\$1TO, NOT\$1EQUAL\$1TO, | 
| Conversations | source\$1subject | String | CONTAINS, EQUAL\$1TO, NOT\$1EQUAL\$1TO | 
| Conversations | source\$1body | String | CONTAINS, EQUAL\$1TO, NOT\$1EQUAL\$1TO | 
| Conversations | source\$1author\$1id | String | CONTAINS, EQUAL\$1TO, NOT\$1EQUAL\$1TO | 
| Conversations | source\$1author\$1type | String | CONTAINS, EQUAL\$1TO, NOT\$1EQUAL\$1TO | 
| Conversations | source\$1author\$1name | String | CONTAINS, EQUAL\$1TO, NOT\$1EQUAL\$1TO | 
| Conversations | source\$1author\$1email | String | CONTAINS, EQUAL\$1TO, NOT\$1EQUAL\$1TO | 
| Conversations | source\$1url | String | CONTAINS, EQUAL\$1TO, NOT\$1EQUAL\$1TO | 
| Conversations | contacts | Struct | NA | 
| Conversations | teammates | Struct | NA | 
| Conversations | 제목 | String | NA | 
| Conversations | admin\$1assignee\$1id | Integer | EQUAL\$1TO, NOT\$1EQUAL\$1TO, GREATER\$1THAN, LESS\$1THAN | 
| Conversations | team\$1assignee\$1id | Integer | CONTAINS, EQUAL\$1TO, NOT\$1EQUAL\$1TO | 
| Conversations | custom\$1attributes | Struct | NA | 
| Conversations | open | 불 | EQUAL\$1TO | 
| Conversations | state | String | CONTAINS, EQUAL\$1TO, NOT\$1EQUAL\$1TO | 
| Conversations | 읽기 | 불 | EQUAL\$1TO | 
| Conversations | waiting\$1since | DateTime | EQUAL\$1TO, NOT\$1EQUAL\$1TO, GREATER\$1THAN, LESS\$1THAN | 
| Conversations | snoozed\$1until | DateTime | EQUAL\$1TO, NOT\$1EQUAL\$1TO, GREATER\$1THAN, LESS\$1THAN | 
| Conversations | tags | Struct | NA | 
| Conversations | 첫 번째\$1연락처\$1회신 | Struct | NA | 
| Conversations | priority | String | EQUAL\$1TO, NOT\$1EQUAL\$1TO | 
| Conversations | topics | Struct | NA | 
| Conversations | sla\$1applied | Struct | NA | 
| Conversations | conversation\$1rating | Struct | NA | 
| Conversations | conversation\$1rating\$1requested\$1at | DateTime | EQUAL\$1TO, NOT\$1EQUAL\$1TO, GREATER\$1THAN, LESS\$1THAN | 
| Conversations | conversation\$1rating\$1replied\$1at | DateTime | EQUAL\$1TO, NOT\$1EQUAL\$1TO, GREATER\$1THAN, LESS\$1THAN | 
| Conversations | conversation\$1rating\$1score | Integer | EQUAL\$1TO, NOT\$1EQUAL\$1TO, GREATER\$1THAN, LESS\$1THAN | 
| Conversations | conversation\$1rating\$1remark | String | CONTAINS, EQUAL\$1TO, NOT\$1EQUAL\$1TO | 
| Conversations | conversation\$1rating\$1contact\$1id | String | CONTAINS, EQUAL\$1TO, NOT\$1EQUAL\$1TO | 
| Conversations | conversation\$1rating\$1admin\$1id | String | CONTAINS, EQUAL\$1TO, NOT\$1EQUAL\$1TO | 
| Conversations | 통계 | Struct | NA | 
| Conversations | statistics\$1time\$1to\$1assignment | Integer | EQUAL\$1TO, NOT\$1EQUAL\$1TO, GREATER\$1THAN, LESS\$1THAN | 
| Conversations | statistics\$1time\$1to\$1admin\$1reply | Integer | EQUAL\$1TO, NOT\$1EQUAL\$1TO, GREATER\$1THAN, LESS\$1THAN | 
| Conversations | statistics\$1time\$1to\$1first\$1close | Integer | EQUAL\$1TO, NOT\$1EQUAL\$1TO, GREATER\$1THAN, LESS\$1THAN | 
| Conversations | statistics\$1time\$1to\$1last\$1close | Integer | EQUAL\$1TO, NOT\$1EQUAL\$1TO, GREATER\$1THAN, LESS\$1THAN | 
| Conversations | statistics\$1median\$1time\$1to\$1reply | Integer | EQUAL\$1TO, NOT\$1EQUAL\$1TO, GREATER\$1THAN, LESS\$1THAN | 
| Conversations | statistics\$1first\$1contact\$1reply\$1at | DateTime | EQUAL\$1TO, NOT\$1EQUAL\$1TO, GREATER\$1THAN, LESS\$1THAN | 
| Conversations | statistics\$1first\$1assignment\$1at | DateTime | EQUAL\$1TO, NOT\$1EQUAL\$1TO, GREATER\$1THAN, LESS\$1THAN | 
| Conversations | statistics\$1first\$1admin\$1reply\$1at | DateTime | EQUAL\$1TO, NOT\$1EQUAL\$1TO, GREATER\$1THAN, LESS\$1THAN | 
| Conversations | statistics\$1first\$1close\$1at | DateTime | EQUAL\$1TO, NOT\$1EQUAL\$1TO, GREATER\$1THAN, LESS\$1THAN | 
| Conversations | statistics\$1last\$1assignment\$1at | DateTime | EQUAL\$1TO, NOT\$1EQUAL\$1TO, GREATER\$1THAN, LESS\$1THAN | 
| Conversations | statistics\$1last\$1assignment\$1admin\$1reply\$1at | DateTime | EQUAL\$1TO, NOT\$1EQUAL\$1TO, GREATER\$1THAN, LESS\$1THAN | 
| Conversations | statistics\$1last\$1contact\$1reply\$1at | DateTime | EQUAL\$1TO, NOT\$1EQUAL\$1TO, GREATER\$1THAN, LESS\$1THAN | 
| Conversations | statistics\$1last\$1admin\$1reply\$1at | DateTime | EQUAL\$1TO, NOT\$1EQUAL\$1TO, GREATER\$1THAN, LESS\$1THAN | 
| Conversations | statistics\$1last\$1close\$1at | DateTime | EQUAL\$1TO, NOT\$1EQUAL\$1TO, GREATER\$1THAN, LESS\$1THAN | 
| Conversations | statistics\$1last\$1closed\$1by\$1id | String | CONTAINS, EQUAL\$1TO, NOT\$1EQUAL\$1TO | 
| Conversations | statistics\$1count\$1reopens | Integer | EQUAL\$1TO, NOT\$1EQUAL\$1TO, GREATER\$1THAN, LESS\$1THAN | 
| Conversations | statistics\$1count\$1assignments | Integer | EQUAL\$1TO, NOT\$1EQUAL\$1TO, GREATER\$1THAN, LESS\$1THAN | 
| Conversations | statistics\$1count\$1conversation\$1parts | Integer | EQUAL\$1TO, NOT\$1EQUAL\$1TO, GREATER\$1THAN, LESS\$1THAN | 
| Conversations | conversation\$1parts | 나열 | NA | 
| 데이터 속성 | id | Integer | NA | 
| 데이터 속성 | type | String | NA | 
| 데이터 속성 | 모델 | String | NA | 
| 데이터 속성 | name | String | NA | 
| 데이터 속성 | full\$1name | String | NA | 
| 데이터 속성 | 레이블 | String | NA | 
| 데이터 속성 | 설명 | String | NA | 
| 데이터 속성 | data\$1type | String | NA | 
| 데이터 속성 | 옵션 | 나열 | NA | 
| 데이터 속성 | api\$1writable | 불 | NA | 
| 데이터 속성 | ui\$1writable | 불 | NA | 
| 데이터 속성 | 사용자 지정 | 불 | NA | 
| 데이터 속성 | archived | 불 | NA | 
| 데이터 속성 | created\$1at | 불 | NA | 
| 데이터 속성 | updated\$1at | DateTime | NA | 
| 데이터 속성 | admin\$1id | String | NA | 
| Segments | type | String | NA | 
| Segments | id | String | NA | 
| Segments | name | String | NA | 
| Segments | created\$1at | DateTime | NA | 
| Segments | updated\$1at | DateTime | NA | 
| Segments | person\$1type | String | NA | 
| Segments | count | Integer | NA | 
| Tags | type | String | NA | 
| Tags | id | String | NA | 
| Tags | name | String | NA | 
| 팀 | type | String | NA | 
| 팀 | id | String | NA | 
| 팀 | name | String | NA | 
| 팀 | admin\$1ids | 나열 | NA | 

 **분할 쿼리** 

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

   날짜의 경우 Spark SQL 쿼리에 사용된 Spark 날짜 형식을 허용합니다. 유효한 값의 예제: `"2024-02-06"`.
+  `UPPER_BOUND`: 선택한 파티션 필드의 상한 값(경계 제외).
+  `NUM_PARTITIONS`: 파티션 수.

 엔터티 수준의 분할 필드 지원 세부 정보는 다음 표에 캡처되어 있습니다.


| Entity Name | 분할 필드 | 데이터 형식 | 
| --- | --- | --- | 
| Contacts | created\$1at, updated\$1at,last\$1seen\$1at | DateTime | 
| Conversations | id | Integer | 
| Conversations | created\$1at, updated\$1at | DateTime | 

 **예제** 

```
Intercom_read = glueContext.create_dynamic_frame.from_options(
    connection_type="Intercom",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "conversation",
        "API_VERSION": "V2.5",
        "PARTITION_FIELD": "created_at"
        "LOWER_BOUND": "2022-07-13T07:55:27.065Z"
        "UPPER_BOUND": "2022-08-12T07:55:27.065Z"
        "NUM_PARTITIONS": "2"
    }
)
```

# Intercom 연결 옵션
<a name="intercom-connection-options"></a>

다음은 Intercom에 대한 연결 옵션입니다.
+  `ENTITY_NAME`(문자열) - (필수) 읽기에 사용됩니다. Intercom에서의 객체 이름.
+  `API_VERSION`(문자열) - (필수) 읽기에 사용됩니다. 사용할 Intercom Rest API 버전. 예: v2.5.
+  `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 객체에 대해 선택할 열.
+  `FILTER_PREDICATE`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.
+  `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리.
+  `PARTITION_FIELD`(문자열) - 읽기에 사용됩니다. 쿼리 분할에 사용할 필드입니다.
+  `LOWER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 하한 값(경계 포함).
+  `UPPER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 상한 값(경계 제외).
+  `NUM_PARTITIONS`(정수) - 기본값: 1. 읽기에 사용됩니다. 읽을 파티션 수.
+  `INSTANCE_URL`(문자열) - 사용자가 작업을 실행하려는 인스턴스의 URL. 예: [https://api.intercom.io](https://api.intercom.io).

# 제한 사항
<a name="intercom-limitations"></a>

다음은 Intercom 커넥터에 대한 제한 사항입니다.
+  회사 엔터티를 사용하는 경우 반환할 수 있는 회사 수는 10,000곳으로 제한됩니다. 자세한 내용은 [List all companies API](https://developers.intercom.com/docs/references/2.5/rest-api/companies/list-companies)를 참조하세요.
+  정렬 기준을 적용하는 동안 필터는 **연락** 엔터티와 **대화** 엔터티 모두에 필수입니다.
+  MCA는 SaaS 제공업체에서 지원합니다. 그러나 설명서에 언급된 API 사용 제한에 따라 AWS Glue에 MCA를 호스팅하지 않습니다. 이 경우 다른 워크로드에 영향을 미치고 리소스 경합으로 인해 잠재적으로 성능 문제가 발생할 수 있기 때문입니다.

# 새 Intercom 계정 생성 및 클라이언트 앱 구성
<a name="intercom-new-account-creation"></a>

**Intercom 계정 생성**

1. [Intercom URL](https://app.intercom.com/)을 선택하고 페이지 오른쪽 상단에서 **Start my free trial**을 선택하세요.

1. 페이지 오른쪽 상단에 있는 **Try for free** 버튼을 선택하세요.

1. 필요한 비즈니스 유형을 선택하세요.

1. 페이지에서 요청된 정보를 입력하세요.

1. 모든 정보를 입력한 후 **Register**를 선택하세요.



**Intercom 개발자 앱 생성**

**클라이언트 ID** 및 **클라이언트 보안 암호**를 가져오려면 개발자 계정을 생성합니다.

1. [https://app.intercom.com/](https://app.intercom.com/)으로 이동하세요.

1. 이메일 ID 및 암호를 입력하거나 Sign In Using Google을 선택하고 로그인하세요.

1. 왼쪽 하단에서 **사용자 프로파일**을 선택하고 설정을 선택하세요.

1. **Apps & Integration**을 선택하세요.

1. **Apps & Integration** 아래 **Developer Hub** 탭을 선택하세요.

1. **New app**을 선택하고 여기에서 앱을 생성하세요.

1. 앱 이름을 입력하고 **Create** 앱을 선택하세요.

1. 앱 내에서 **Authentication** 섹션으로 이동하세요.

1. **Edit**을 선택하고 리디렉션 URI를 추가하세요. 리전별 리디렉션 URL을 `https://<aws-region>.console.aws.amazon.com/gluestudio/oauth`로 추가하세요. 예를 들어 `https://us-east-1.console.aws.amazon.com/gluestudio/oauth for the us-east-1 region`을 추가하세요.

1. Basic Information 섹션에서 생성된 **클라이언트 ID** 및 **클라이언트 보안 암호**를 가져오세요.

# Jira Cloud에 연결
<a name="connecting-to-data-jira-cloud"></a>

Jira Cloud는 Atlassian에서 개발한 플랫폼입니다. 플랫폼에는 팀이 애자일 프로젝트를 계획 및 추적하는 데 도움이 되는 문제 추적 제품이 포함되어 있습니다. Jira Cloud 사용자 계정에는 문제, 워크플로 및 이벤트와 같은 프로젝트에 대한 데이터가 포함됩니다. AWS Glue를 사용하여 Jira Cloud 데이터를 특정 AWS 서비스 또는 기타 지원되는 애플리케이션으로 전송할 수 있습니다.

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

# Jira Cloud에 대한 AWS Glue 지원
<a name="jira-cloud-support"></a>

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

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

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

**지원되는 Jira Cloud API 버전**  
다음 Jira Cloud API 버전이 지원됩니다.
+ v3

버전별 엔터티 지원은 [Jira Cloud 엔터티에서 읽기](jira-cloud-reading-from-entities.md) 섹션을 참조하세요.

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

# Jira Cloud 구성
<a name="jira-cloud-configuring"></a>

AWS Glue를 사용하여 Jira Cloud에서 지원되는 대상으로 데이터를 전송하려면 먼저 다음 요구 사항을 충족해야 합니다.

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

다음은 최소 요구 사항입니다.
+ Jira Cloud에서 Jira 소프트웨어 제품을 사용하는 Atlassian 계정이 있습니다. 자세한 내용은 [Jira Cloud 계정 생성](#jira-cloud-configuring-creating-jira-cloud-account) 섹션을 참조하세요.
+ AWS Glue에 대한 서비스 액세스 권한을 포함하는 AWS 계정을 생성해야 합니다.
+ 이 앱에서는 계정에 대해 인증된 직접 호출을 수행하는 경우 AWS Glue에서 데이터에 안전하게 액세스하는 데 사용하는 클라이언트 자격 증명을 제공합니다. 자세한 내용은 Atlassian Developer 설명서의 [Enabling OAuth 2.0 (3LO)](https://developer.atlassian.com/cloud/jira/platform/oauth-2-3lo-apps/#enabling-oauth-2-0--3lo-)을 참조하세요.

이러한 요구 사항을 충족하면 Jira Cloud 계정에 AWS Glue를 연결할 준비가 된 것입니다.

## Jira Cloud 계정 생성
<a name="jira-cloud-configuring-creating-jira-cloud-account"></a>

Jira Cloud 계정을 생성하는 방법:

1. [Atlassian sign up URL](https://id.atlassian.com/signup)로 이동하세요.

1. 회사 이메일과 이름을 입력하고 **Agree**를 선택하세요. 확인 이메일을 수신합니다.

1. 이메일을 확인한 후 암호를 생성하고 **Sign up**을 선택할 수 있습니다.

1. 사용자 이름과 암호를 입력하고 **Sign up**을 선택하세요.

1. 사이트에 입장하는 데 필요한 페이지로 리디렉션됩니다. 사이트 이름을 입력하고 **Agree**를 선택하세요.

Atlassian Cloud 사이트가 시작되면 프로젝트 유형 기본 설정에 따라 몇 가지 질문에 답하며 Jira를 설정할 수 있습니다.

기존 계정으로 로그인하는 방법:

1. [Atlassian login URL](https://id.atlassian.com/login)로 이동하여 자격 증명을 입력하세요.

1. 이메일과 암호를 입력하고 **Log in**을 클릭하세요. Jira 대시보드로 리디렉션됩니다.

## Jira 클라우드에서 앱 생성
<a name="jira-cloud-configuring-creating-jira-cloud-app"></a>

Jira Cloud에서 앱을 생성하고 관리형 클라이언트 앱에서 클라이언트 ID 및 클라이언트 보안 암호를 가져오는 방법:

1. [Jira Cloud URL](https://id.atlassian.com/login)로 이동하여 자격 증명을 입력하세요.

1. **Create**를 선택하고 **OAuth 2.0 integration** 옵션을 선택하세요.

1. 앱 이름을 입력하고 **T&C**를 확인한 다음 **Create**를 선택하세요.

1. 왼쪽 메뉴의 **Distribution** 섹션으로 이동하고 **Edit**를 선택하세요.

1. **Edit distribution controls** 섹션에서 다음을 수행하세요.

   1. **DISTRIBUTION STATUS**를 **Sharing**으로 선택하세요.

   1. 공급업체 이름을 입력하세요.

   1. **Privacy policy**의 URL을 입력하세요. 예: https://docs.aws.amazon.com/glue/latest/dg/security-iam-awsmanpol.html

   1. **Terms of service**의 URL을 입력하세요(선택 사항).

   1. **Customer support contact**의 URL을 입력하세요(선택 사항).

   1. **PERSONAL DATA DECLARATION**에서 예/아니요를 선택하고 **Save changes**를 선택하세요.

1. 해당 앱의 왼쪽 메뉴에서 **Permissions**로 이동하세요.

1. **Jira API**에서 **Add**를 선택하세요. 추가되면 **Configuration** 옵션을 선택하세요.

1. **Classic scopes** > **Jira platform REST API** 섹션에서 **Edit Scopes**를 선택하고 모든 범위를 확인하세요. **저장**을 클릭합니다.

1. **Granular Scopes**에서 **Edit Scopes**를 선택하고 다음 범위를 선택하세요.

1. 아래로 스크롤하여 범위를 찾습니다. ‘CRM’ 및 ‘Standard’ 제목에서 두 가지 종류의 범위를 선택해야 합니다.

1. 다음 범위를 추가합니다.

   ```
   read:application-role:jira
   read:audit-log:jira
   read:avatar:jira
   read:field:jira
   read:group:jira
   read:instance-configuration:jira
   read:issue-details:jira
   read:issue-event:jira
   read:issue-link-type:jira
   read:issue-meta:jira
   read:issue-security-level:jira
   read:issue-security-scheme:jira
   read:issue-type-scheme:jira
   read:issue-type-screen-scheme:jira
   read:issue-type:jira
   read:issue.time-tracking:jira
   read:label:jira
   read:notification-scheme:jira
   read:permission:jira
   read:priority:jira
   read:project:jira
   read:project-category:jira
   read:project-role:jira
   read:project-type:jira
   read:project-version:jira
   read:project.component:jir
   read:project.property:jira
   read:resolution:jira
   read:screen:jira
   read:status:jira
   read:user:jira
   read:workflow-scheme:jira
   read:workflow:jira
   read:field-configuration:jira
   read:issue-type-hierarchy:jira
   read:webhook:jira
   ```

1. 왼쪽 메뉴에서 **Authentication**으로 이동하여 **Add**를 선택하세요.

1. **Callback URL**(예: https://us-east-1.console.aws.amazon.com/gluestudio/oauth)을 입력하세요.

1. 왼쪽 메뉴의 **Settings**로 이동하고 아래로 스크롤하여 **Authentication** 세부 정보를 확인하세요. 클라이언트 ID 및 보안 암호를 기록하세요.

# Jira Cloud 연결 구성
<a name="jira-cloud-configuring-connections"></a>

Jira Cloud에서는 OAuth2에 대한 AUTHORIZATION\$1CODE 권한 부여 유형을 지원합니다.
+ 이 권한 부여 유형은 사용자를 인증하기 위해 사용자를 서드파티 권한 부여 서버로 리디렉션하는 방식에 의존하므로 '3각' OAuth로 간주됩니다. AWS Glue 콘솔을 통해 연결을 생성할 때 사용됩니다. AWS Glue 콘솔은 사용자를 Jira Cloud로 리디렉션합니다. 사용자가 로그인하고 Jira Cloud 인스턴스에 액세스하도록 요청된 권한을 AWS Glue에 허용해야 합니다.
+ 사용자는 여전히 AWS Glue 콘솔을 통해 연결을 생성할 때에도 Jira Cloud에서 자체 연결된 앱을 생성하고 자체 클라이언트 ID와 클라이언트 보안 암호를 제공하기로 선택할 수 있습니다. 이 시나리오에서는 여전히 Jira Cloud로 리디렉션되어 로그인하고 리소스에 액세스할 수 있는 권한을 AWS Glue에 부여합니다.
+ 이 권한 부여 유형은 새로 고침 토큰과 액세스 토큰을 생성합니다. 액세스 토큰은 수명이 짧으며 새로 고침 토큰을 사용하여 사용자 상호 작용 없이 자동으로 새로 고칠 수 있습니다.
+ 권한 부여 코드 OAuth 흐름을 위한 연결된 앱 생성에 대한 퍼블릭 Jira Cloud 설명서는 [Enabling OAuth 2.0(3LO)](https://developer.atlassian.com/cloud/jira/platform/oauth-2-3lo-apps/#enabling-oauth-2-0--3lo-)을 참조하세요.

Jira Cloud 연결을 구성하는 방법:

1. AWS Secrets Manager에서 다음 세부 정보로 보안 암호를 생성합니다.

   1. 고객 관리형 연결된 앱의 경우 보안 암호는 키 역할을 하는 `USER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET`과 함께 연결된 앱 소비자 보안 암호를 포함해야 합니다.

   1. 참고: AWS Glue에서 연결의 보안 암호를 생성해야 합니다.

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

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

   1. Jira Cloud 환경을 제공합니다.

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

# Jira Cloud 엔터티에서 읽기
<a name="jira-cloud-reading-from-entities"></a>

**사전 조건**: 

읽으려는 Jira Cloud 객체. 객체 이름(예: 감사 레코드 또는 문제)이 필요합니다. 다음 표에는 지원되는 엔터티가 나와 있습니다.

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


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| 감사 레코드 | 예 | 예 | 아니요 | 예 | 예 | 
| 문제 | 예 | 예 | 아니요 | 예 | 예 | 
| 문제 필드 | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| 문제 필드 구성 | 예 | 예 | 아니요 | 예 | 예 | 
| 문제 링크 유형 | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| 문제 알림 체계 | 예 | 예 | 아니요 | 예 | 예 | 
| 문제 보안 체계 | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| 문제 유형 체계 | 예 | 예 | 예 | 예 | 예 | 
| 문제 유형 화면 체계 | 예 | 예 | 예 | 예 | 예 | 
| 문제 유형 | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Jira 설정 | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Jira 설정 고급 | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Jira 설정 전역 | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| 레이블 | 아니요 | 아니요 | 아니요 | 예 | 예 | 
| 사용자 본인 | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| 권한 | 아니요 | 아니요 | 아니요 | 예 | 아니요. | 
| Project | 예 | 예 | 예 | 예 | 예 | 
| 프로젝트 카테고리 | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| 프로젝트 유형 | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| 서버 정보 | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Users | 아니요 | 아니요 | 아니요. | 예 | 아니요 | 
| 워크플로 | 예 | 예 | 예 | 예 | 예 | 
| 워크플로 체계 | 아니요 | 예 | 아니요 | 예 | 예 | 
| 워크플로 체계 프로젝트 연결 | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| 워크플로 상태 | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| 워크플로 상태 카테고리 | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 

**예시**:

```
jiracloud_read = glueContext.create_dynamic_frame.from_options(
    connection_type="JiraCloud",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "audit-record",
        "API_VERSION": "v3"
    }
```

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

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

## 쿼리 파티셔닝
<a name="jira-cloud-reading-partitioning-queries"></a>

Spark에서 동시성을 활용하려는 경우 추가 Spark 옵션(`NUM_PARTITIONS`)을 제공할 수 있습니다. 이 파라미터를 사용하면 Spark 태스크에서 동시에 실행할 수 있는 `NUM_PARTITIONS`개의 하위 쿼리로 원본 쿼리가 분할됩니다.
+ `NUM_PARTITIONS`: 파티션 수.

예시:

```
jiraCloud_read = glueContext.create_dynamic_frame.from_options(
    connection_type="JiraCloud",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "issue",
        "API_VERSION": "v3",
        "NUM_PARTITIONS": "10"
    }
```

# Jira Cloud 연결 옵션
<a name="jira-cloud-connection-options"></a>

다음은 Jira Cloud의 연결 옵션입니다.
+ `ENTITY_NAME`(문자열) - (필수) 읽기에 사용됩니다. Jira Cloud에서 객체 이름.
+ `API_VERSION`(문자열) - (필수) 읽기에 사용됩니다. 사용하려는 Jira Cloud Rest API 버전. 예: v3.
+ `DOMAIN_URL`(문자열) - (필수) 사용하려는 Jira Cloud ID.
+ `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 객체에 대해 선택할 열.
+ `FILTER_PREDICATE`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.
+ `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리.
+ `NUM_PARTITIONS`(정수) - 기본값: 1. 읽기에 사용됩니다. 읽을 파티션 수.

# Jira Cloud 커넥터의 제한 사항 및 참고 사항
<a name="jira-cloud-connector-limitations"></a>

다음은 Jira Cloud 커넥터의 제한 사항입니다.
+  `Contains` 연산자는 `String` 데이터 유형인 `resourceName` 필드에서 작동하지 않습니다.
+  기본적으로 적용된 명시적 필터가 없으면 지난 30일 동안의 문제만 크롤링됩니다. 사용자는 사용자 지정 필터를 지정하여 이 기본 필터를 재정의할 수 있습니다.

# Kustomer에 연결
<a name="connecting-to-data-kustomer"></a>

Kustomer는 사용하기 쉬운 단일 도구로 고객에게 더 나은 서비스를 제공하는 데 필요한 모든 것을 하나로 모으는 강력한 고객 경험 플랫폼입니다.

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

# AWS Glue의 Kustomer 지원
<a name="kustomer-support"></a>

AWS Glue는 다음과 같이 Kustomer를 지원합니다.

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

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

**지원되는 Kustomer API 버전**  
다음 Kustomer API 버전이 지원됩니다.
+ v1

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

# Kustomer 구성
<a name="kustomer-configuring"></a>

AWS Glue를 사용하여 Kustomer에서 지원되는 대상으로 데이터를 전송하려면 먼저 다음 요구 사항을 충족해야 합니다.

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

다음은 최소 요구 사항입니다.
+ 전송하려는 데이터가 포함된 Kustomer 계정이 있습니다.
+ 계정 설정에서 API 키를 생성했습니다. 자세한 내용은 [API 키 생성](#kustomer-configuring-creating-an-api-key) 섹션을 참조하세요.
+ 연결을 생성하는 동안 AWS Glue에 API 키를 제공합니다.

이러한 요구 사항을 충족하면 Kustomer 계정에 AWS Glue를 연결할 준비가 된 것입니다.

## API 키 생성
<a name="kustomer-configuring-creating-an-api-key"></a>

다음 단계를 따라 AWS Glue Studio에서 Kustomer 커넥터에 대한 연결을 생성하는 데 사용할 API 키를 생성합니다.

1. [자격 증명을 사용하여 Kustomer 대시보드](https://amazon-appflow.kustomerapp.com/login)에 로그인합니다.

1. 왼쪽 메뉴에서 **Settings** 아이콘을 선택합니다.

1. **Security** 드롭다운을 확장하고 **API Keys**를 선택합니다.

1. API Key 생성 페이지의 오른쪽 상단 모서리에서 **Add an API Key**를 선택합니다.

1. 생성 중인 API 키의 필수 사항을 입력합니다.
   + Name: API 키의 이름.
   + Roles: Kustomer API가 작동하려면 ‘org’를 선택해야 합니다.
   + Expires (in days): API 키가 유효한 기간(일). 사용 사례에 적합한 경우 **Never expires**로 유지할 수 있습니다.

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

1. API 키(토큰) 값을 저장하면 AWS Glue Studio에서 Kustomer 커넥터에 대한 연결을 생성할 때 사용할 수 있습니다.

# Kustomer 연결 구성
<a name="kustomer-configuring-connections"></a>

다음 단계를 따라 Kustomer 연결을 구성합니다.

1. AWS Secrets Manager에서 다음 세부 정보로 보안 암호를 생성합니다.

   1. 고객 관리형 연결된 앱의 경우 보안 암호는 키 역할을 하는 `apiKey`와 함께 연결된 앱 소비자 보안 암호를 포함해야 합니다.

   1. 참고: AWS Glue에서 연결의 보안 암호를 생성해야 합니다.

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

   1. **연결**에서 **연결 생성**을 선택합니다.

   1. **데이터 소스**를 선택할 때 Kustomer를 선택합니다.

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

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

**사전 조건**

읽으려는 Kustomer 객체. 객체 이름(예: Brands 또는 Cards)이 필요합니다. 다음 표에는 지원되는 엔터티가 나와 있습니다.

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


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| Brands | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| Cards | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| Chat Settings | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Companies | 예 | 예 | 예 | 예 | 예 | 
| Conversations | 예 | 예 | 예 | 예 | 예 | 
| Customers | 예 | 예 | 예 | 예 | 예 | 
| Customer Searches Pinned | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| Customer Searches Position | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Email Hooks | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| Web Hooks | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| KB Articles | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| KB Categories | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| KB Forms | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| KB Routes | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| KB Tags | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| KB Templates | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| KB Themes | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| Klasses | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| KViews | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| 메시지 | 예 | 예 | 예 | 예 | 예 | 
| Notes | 예 | 예 | 예 | 예 | 예 | 
| 알림 | 아니요 | 예 | 아니요 | 예 | 아니요 | 

**예시:**

```
Kustomer_read = glueContext.create_dynamic_frame.from_options(
    connection_type="kustomer",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "brands",
        "API_VERSION": "v1"
    }
```

## Kustomer 엔터티 및 필드 세부 정보
<a name="kustomer-reading-from-entities-field-details"></a>

엔터티 및 필드 세부 정보에 대한 자세한 내용은 다음을 참조하세요.
+ [Brands](https://api.kustomerapp.com/v1/brands)
+ [Cards](https://api.kustomerapp.com/v1/cards)
+ [Chat Settings](https://api.kustomerapp.com/v1/chat/settings)
+ [Companies](https://api.kustomerapp.com/v1/companies)
+ [Conversations](https://api.kustomerapp.com/v1/conversations)
+ [Customers](https://api.kustomerapp.com/v1/customers)
+ [Customers Searches Pinned](https://api.kustomerapp.com/v1/customers/searches/pinned)
+ [Customer Searches Positions](https://api.kustomerapp.com/v1/customers/searches/positions)
+ [Hooks Email](https://api.kustomerapp.com/v1/hooks/email)
+ [Hooks Web](https://api.kustomerapp.com/v1/hooks/web)
+ [KB Articles](https://api.kustomerapp.com/v1/kb/articles)
+ [KB Categories](https://api.kustomerapp.com/v1/kb/categories)
+ [KB Forms]( https://api.kustomerapp.com/v1/kb/forms)
+ [KB Routes](https://api.kustomerapp.com/v1/kb/routes)
+ [KB Tags](https://api.kustomerapp.com/v1/kb/tags)
+ [KB Templates](https://api.kustomerapp.com/v1/kb/templates)
+ [KB Themes](https://api.kustomerapp.com/v1/kb/themes)
+ [Klasses](https://api.kustomerapp.com/v1/klasses)
+ [Kviews](https://api.kustomerapp.com/v1/kviews)
+ [메시지](https://api.kustomerapp.com/v1/messages)
+ [참고](https://api.kustomerapp.com/v1/notes)
+ [알림](https://api.kustomerapp.com/v1/notifications)

Kustomer API v1

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

## 분할 쿼리
<a name="kustomer-reading-from-partitioning"></a>

**필드 기반 분할**

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

  DateTime 필드의 경우 ISO 형식의 값이 허용됩니다.

  유효한 값의 예제:

  ```
  "2023-01-15T11:18:39.205Z"
  ```
+ `UPPER_BOUND`: 선택한 파티션 필드의 상한 값(**경계 제외**).
+ `NUM_PARTITIONS`: 파티션 수.

엔터티 수준 분할 필드 지원 세부 정보는 다음 표에 나와 있습니다.

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

예시:

```
Kustomer_read = glueContext.create_dynamic_frame.from_options(
    connection_type="kustomer",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "conversation",
        "API_VERSION": "v1",
        "PARTITION_FIELD": "createdAt"
        "LOWER_BOUND": "2023-01-15T11:18:39.205Z"
        "UPPER_BOUND": "2023-02-15T11:18:39.205Z"
        "NUM_PARTITIONS": "2"
    }
```

# Kustomer 연결 옵션
<a name="kustomer-connection-options"></a>

다음은 Kustomer에 대한 연결 옵션입니다.
+ `ENTITY_NAME`(문자열) - (필수) 읽기에 사용됩니다. Stripe에서의 객체 이름.
+ `API_VERSION`(문자열) - (필수) 읽기에 사용됩니다. 사용하려는 Kustomer 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`(문자열) - (필수) 읽기에 사용됩니다. Kustomer 인스턴스 URL.

# Kustomer 제한 사항
<a name="kustomer-connection-limitations"></a>

다음은 Kustomer의 제한 사항 또는 참고 사항입니다.
+ Kustomer API 설명서에서 어떠한 엔드포인트도 선언하지 않았으므로 `Customer Searches` 엔터티는 지원되지 않습니다.
+ `Klasses` 엔터티에 대한 필터링 및 증분 전송은 지원되지 않습니다.
+ 순서 기준은 단일 요청의 여러 적용 가능한 필드에서 지원될 수 있습니다.

  하지만 여러 필드의 기능별 순서는 일부 조합에 대해 SaaS 종단에서 일관되지 않게 작동하는 것으로 관찰되었습니다. 잘못된 정렬 결과를 표시할 수 있는 ‘n’개의 조합이 있을 수 있으므로 예측할 수 없습니다. 예:

  `Customers` 엔터티의 경우 `progressiveStatus desc, name asc`를 기준으로 정렬해도 정렬된 결과가 정확하지 않습니다. `progressiveStatus` 순서만을 기반으로 하여 정렬됩니다. 이러한 동작이 관찰되면 단일 필드를 사용하여 순서를 정할 수 있습니다.
+ ‘id’ 필드의 순서 기준은 `Conversations` 및 `Messages` 엔터티에서만 쿼리 파라미터로 지원됩니다. 예: https://api.kustomerapp.com/v1/conversations?sort=desc(‘id’를 기준으로 결과를 내림차순으로 정렬)

  추가로 다른 필드의 다른 필터 또는 순서는 API 엔드포인트가 POST인 POST 요청 본문으로 변환됩니다(https://api.kustomerapp.com/v1/customers/search). `Conversations` 및 `Messages`에서 ‘id’에 의한 순서 지정 지원을 허용하려면 id에 의한 순서만 존재하거나 다른 적용 가능한 필드에 대한 다른 필터 및/또는 순서 기준만 있어야 합니다.
+ Kustomer는 필터링된 요청 또는 필터링되지 않은 요청과 무관하게 최대 10,000개의 레코드를 가져올 수 있습니다. 이러한 제한으로 인해 10,000개 이상의 레코드를 보유한 엔터티에 대한 데이터 손실이 발생합니다. 이 문제를 어느 정도 완화하기 위해 수행할 수 있는 두 가지 해결 방법이 있습니다.
  + 필터를 적용하여 특정 레코드 세트를 가져옵니다.
  + 필터가 적용된 레코드가 10,000개를 초과하는 경우 후속 신규 요청에 연속 필터 값을 적용하거나 필터에 범위를 적용합니다. 예: 

    첫 번째 요청의 filterExpression: `modifiedAt >= 2022-03-15T05:26:23.000Z and modifiedAt < 2023-03-15T05:26:23.000Z`

    이로 인해 10,000개 레코드 제한이 소진된다고 가정합니다.

    filterExpression: `modifiedAt >= 2023-03-15T05:26:23.000Z`를 사용하여 다른 요청을 트리거할 수 있습니다.
+ SaaS 동작으로 Kustomer의 `CONTAINS` 연산자는 단어 내에서 부분 일치가 아닌 전체 단어 일치만 지원합니다. 예: “body CONTAINS ‘test record’”는 ‘body’ 필드에 ‘test’가 있는 레코드와 일치합니다. 하지만 “body CONTAINS ‘test’”는 ‘body’ 필드에 ‘testAnotherRecord’가 있는 레코드와는 일치하지 않습니다.

# LinkedIn에 연결
<a name="connecting-to-linkedin"></a>

LinkedIn은 다양한 후원 게시물 및 기타 방법을 통해 LinkedIn 소셜 네트워크에 대한 액세스를 제공하는 유료 마케팅 도구입니다. LinkedIn은 B2B 회사가 리드, 온라인 인식, 콘텐츠 공유 등을 구축할 수 있는 강력한 마케팅 도구입니다.

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

# AWS Glue의 LinkedIn 지원
<a name="linkedin-support"></a>

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

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

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

**지원되는 LinkedIn API 버전**  
**202406(2024년 6월)**

# 연결을 생성하고 사용하기 위한 API 작업이 포함된 정책
<a name="linkedin-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 Management Console을 사용하는 경우 AWS Glue 리소스에 대한 전체 액세스 권한을 부여합니다. 이 정책에 지정된 리소스의 이름 변환을 따르면 사용자는 콘솔 전체 용량을 소유합니다. 이 정책은 보통 AWS Glue 콘솔의 사용자에게 해당됩니다.

# LinkedIn 구성
<a name="linkedin-configuring"></a>

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

## 최소 요구 사항
<a name="linkedin-configuring-min-requirements"></a>
+ LinkedIn 계정이 있습니다. 계정 생성에 대한 자세한 내용은 [LinkedIn 계정 생성](linkedin-create-account.md)을 참조하세요.
+ LinkedIn 계정이 API 액세스에 대해 활성화되어 있습니다.
+ LinkedIn 계정에 `OAuth2 API` 통합을 생성했습니다. 이 통합에서는 계정에 대해 인증된 직접 호출을 수행하는 경우 AWS Glue에서 데이터에 안전하게 액세스하는 데 사용하는 클라이언트 자격 증명을 제공합니다. 자세한 내용은 [LinkedIn 계정 생성](linkedin-create-account.md) 섹션을 참조하세요.

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

# LinkedIn 연결 구성
<a name="linkedin-configuring-connections"></a>

 LinkedIn은 OAuth2에 대한 `AUTHORIZATION_CODE` 권한 부여 유형을 지원합니다.

이 권한 부여 유형은 사용자를 인증하기 위해 사용자를 서드파티 권한 부여 서버로 리디렉션하는 방식에 의존하므로 '3각' `OAuth`로 간주됩니다. 사용자는 AWS Glue 콘솔을 통해 연결을 생성할 때에도 LinkedIn에서 자체 연결된 앱을 생성하고 자체 클라이언트 ID와 클라이언트 보안 암호를 제공하기로 선택할 수 있습니다. 이 시나리오에서는 여전히 LinkedIn으로 리디렉션되어 로그인하고 리소스에 액세스할 수 있는 권한을 AWS Glue에 부여합니다.

이 권한 부여 유형은 새로 고침 토큰과 액세스 토큰 둘 다 모두 생성합니다. 액세스 토큰은 생성 후 60일 후에 만료됩니다. 새로 고침 토큰을 사용하여 새 액세스 토큰을 가져올 수 있습니다.

`Authorization Code OAuth` 흐름을 위해 연결된 앱을 생성하는 방법에 대한 퍼블릭 LinkedIn 설명서는 [Authorization Code Flow (3-legged OAuth)](https://learn.microsoft.com/en-us/linkedin/shared/authentication/authorization-code-flow?toc=%2Flinkedin%2Fmarketing%2Ftoc.json&bc=%2Flinkedin%2Fbreadcrumb%2Ftoc.json&view=li-lms-2024-07&tabs=HTTPS1)를 참조하세요.

**LinkedIn 연결 구성**

1.  AWS Secrets Manager에서 다음 세부 정보로 보안 암호를 생성합니다.
   + 고객 관리형 연결된 앱의 경우 - 보안 암호는 키 역할을 하는 `USER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET`과 함께 연결된 앱 소비자 보안 암호를 포함해야 합니다.
   + AWS 관리형 연결된 앱의 경우 - 비어 있는 보안 암호 또는 임시 값이 지정된 보안 암호입니다.
**참고**  
AWS Glue에서 연결당 보안 암호를 생성해야 합니다.

1. AWS Glue Studio의 **데이터 연결**에서 아래 단계에 따라 연결을 생성합니다.

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

   1. LinkedIn 환경을 제공합니다.

   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. 토큰을 넣기 위해 AWS Glue에서 이 연결에 사용할 `secretName`을 선택합니다.

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

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

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

**사전 조건** 

읽으려는 LinkedIn 객체입니다. 사용 가능한 엔터티를 확인하려면 아래 지원되는 엔터티 테이블을 참조하세요.

 **지원되는 엔터티** 


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| Ad Accounts | 예 | 예 | 예 | 예 | 아니요 | 
| Campaigns | 예 | 예 | 예 | 예 | 아니요 | 
| Campaign Groups | 예 | 예 | 예 | 예 | 아니요 | 
| Creatives | 예 | 예 | 예 | 예 | 아니요 | 
| Ad Analytics | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Ad Analytics All AdAcocunts | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Ad Analytics All Campaigns | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Ad Analytics All CampaignGroups | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Ad Analytics All AdCreatives | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Share Statistics | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Page Statistics | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Follower Statistics | 예 | 아니요 | 아니요 | 예 | 아니요 | 

 **예제** 

```
netsuiteerp_read = glueContext.create_dynamic_frame.from_options(
    connection_type="linkedin",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "adaccounts",
        "API_VERSION": "202406"
    }
)
```


**LinkedIn 엔터티 및 필드 세부 정보**  

|  **필드 데이터 유형**  |  **지원되는 필터 연산자**  | 
| --- | --- | 
|  String  |  =  | 
|  DateTime  |  BETWEEN, =  | 
|  Numeric  |  =  | 
|  불  |  =  | 

# LinkedIn 연결 옵션
<a name="linkedin-connection-options"></a>

다음은 LinkedIn의 연결 옵션입니다.
+ `ENTITY_NAME`(문자열) - (필수) 읽기/쓰기에 사용됩니다. LinkedIn에서의 객체 이름입니다. 예: adAccounts.
+ `API_VERSION`(문자열) - (필수) 읽기/쓰기에 사용됩니다. 사용할 LinkedIn Rest API 버전. LinkedIn에서는 현재 버전 202406만 지원하므로 값은 202406입니다.
+ `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 선택한 엔티티에 대해 선택하려는 열입니다.
+ `FILTER_PREDICATE`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.
+ `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리.

# LinkedIn 계정 생성
<a name="linkedin-create-account"></a>

**LinkedIn 앱 및 OAuth 자격 증명 생성**

1. **LinkedIn 개발자 네트워크** 페이지로 이동하여 LinkedIn 계정 자격 증명으로 로그인합니다.

1. **내 앱** 페이지로 이동하여 **애플리케이션 생성**을 선택해 새 LinkedIn 앱을 생성합니다.

1. 앱 등록 양식에 다음 세부 정보를 입력합니다.
   + **회사 이름** - 기존 회사를 선택하거나 새 회사를 생성합니다.
   + **이름** - 애플리케이션 이름을 입력합니다.
   + **설명** - 애플리케이션 설명을 입력합니다.
   + **애플리케이션 로고** - 애플리케이션 로고로 이미지 파일을 선택합니다.
   + **애플리케이션 사용** - 애플리케이션 사용을 선택합니다.
   + **웹 사이트 URL** - 애플리케이션에 대한 자세한 정보가 포함된 웹 사이트 URL을 입력합니다.
   + **비즈니스 이메일** - 비즈니스 이메일 주소를 입력합니다.
   + **회사 전화** - 회사 전화 번호를 입력합니다.
   + **LinkedIn API 사용 약관** - 읽고 동의하세요.

1. 앱 등록 양식이 완료되면 **제출**을 선택합니다.

   인증 키(클라이언트 ID와 클라이언트 보안 암호) 및 기타 관련 세부 정보가 표시되는 **인증** 페이지로 리디렉션됩니다.

1. 웹 애플리케이션에서 사용자의 LinkedIn 계정에서 사용자의 이메일 주소에 액세스해야 하는 경우 `r_emailaddress` 권한을 선택합니다. 또한 LinkedIn 애플리케이션에 대해 승인된 리디렉션 URL 지정할 수 있습니다.

**LinkedIn 계정에서 페이지 생성**

1. [LinkedIn 개발자 제품](https://developer.linkedin.com/)으로 이동합니다.

1. **LinkedIn 개발자 제품** 페이지의 오른쪽 상단에서 **내 앱**을 선택합니다.

1. **내 앱** 페이지의 오른쪽 상단에서 **앱 생성**을 선택합니다.

1. **앱 생성** 페이지의 **앱 이름** 필드에 앱 이름을 입력합니다.

1. **LinkedIn 페이지** 필드에 회사 페이지 이름 또는 URL을 입력합니다.
**참고**  
LinkedIn 페이지가 없는 경우 **새 LinkedIn 생성**을 선택하여 만들 수 있습니다.

1. **개인 정보 보호 정책 URL** 필드에 개인 정보 보호 정책 URL을 입력합니다.

1. **로고 업로드**를 선택하여 사용자가 앱으로 권한을 부여할 때 표시할 이미지를 업로드합니다.

1. **법적 계약** 섹션에서 **이 약관을 읽었으며 이에 동의합니다**를 선택합니다.

1. **앱 생성**을 선택합니다.

   새 앱이 생성되고 **내 앱** 탭에서 사용할 수 있습니다.

**LinkedIn에 캠페인 광고 게시**

1. **Campaign Manager**에 로그인합니다.

1. 기존 **캠페인 그룹**을 선택하거나 **생성**을 선택해 새로 만듭니다.

1. 목표를 선택합니다.

1. 그룹, 예산 및 일정을 선택합니다.

1. 대상 고객을 빌드합니다.

1. 광고 형식을 선택합니다.

1. 예산과 일정을 선택합니다.

1. 광고를 설정합니다.

1. 검토하고 실행합니다.

# 제한 사항
<a name="linkedin-connector-limitations"></a>

분석 필드 `ad_analytics_all_adAccounts`, `ad_analytics_all_campaigns`, `ad_analytics_all_campaign_groups`, `ad_analytics_all_adCreatives`의 경우 레코드를 검색하려면 필터가 필수입니다.

# Mailchimp에 연결
<a name="connecting-to-mailchimp"></a>

Mailchimp는 클라이언트, 고객 및 기타 이해 당사자를 관리하고 이들과 대화하는 데 도움이 되는 올인원 마케팅 플랫폼입니다. 마케팅에 대한 Mailchimp의 접근 방식은 건전한 고객 응대 관리 관행, 정교하게 설계된 이메일, 고유한 자동 워크플로 및 강력한 데이터 분석에 중점을 둡니다. Mailchimp 사용자인 경우 Mailchimp 계정에 AWS Glue를 연결할 수 있습니다. 그런 다음, Mailchimp를 ETL 작업에서의 데이터 소스로 사용할 수 있습니다. 이러한 작업을 실행하여 Mailchimp 및 AWS 서비스 또는 기타 지원되는 애플리케이션 간에 데이터를 전송합니다.

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

# AWS Glue의 Mailchimp 지원
<a name="mailchimp-support"></a>

AWS Glue는 다음과 같이 Mailchimp를 지원합니다.

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

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

**지원되는 Mailchimp API 버전**  
 3.0 

# 연결을 생성하고 사용하기 위한 API 작업이 포함된 정책
<a name="mailchimp-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 Management 콘솔을 사용하는 경우 AWS Glue 리소스에 대한 전체 액세스 권한을 부여합니다. 이 정책에 지정된 리소스의 이름 변환을 따르면 사용자는 콘솔 전체 용량을 소유합니다. 이 정책은 보통 AWS Glue 콘솔의 사용자에게 해당됩니다.

# Mailchimp 구성
<a name="mailchimp-configuring"></a>

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

## 최소 요구 사항
<a name="mailchimp-configuring-min-requirements"></a>
+ 이메일과 암호를 사용하는 Mailchimp 계정이 있습니다. 계정 생성에 대한 자세한 내용은 [Mailchimp 계정 생성](mailchimp-create-account.md)을 참조하세요.
+  AWS Glue에 대한 서비스 액세스 권한으로 AWS 계정을 생성해야 합니다.
+ 다음 리소스 중 하나를 생성했는지 확인합니다. 이러한 리소스는 계정에 대해 인증된 직접 호출을 수행하는 경우 AWS Glue에서 데이터에 안전하게 액세스하는 데 사용하는 자격 증명을 제공합니다.
  + OAuth 2.0 인증을 지원하는 개발자 앱. 개발자 앱 생성에 대한 자세한 내용은 [Mailchimp 계정 생성](mailchimp-create-account.md)을 참조하세요.

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

# Mailchimp 연결 구성
<a name="mailchimp-configuring-connections"></a>

 Mailchimp는 인증 메커니즘에 대해 다음 두 가지 유형을 지원합니다.
+ Mailchimp는 `AUTHORIZATION_CODE` 권한 부여 유형을 지원합니다.
  + 이 권한 부여 유형은 사용자를 인증하기 위해 사용자를 서드파티 권한 부여 서버로 리디렉션하는 방식에 의존하므로 ‘3각’ `OAuth`로 간주됩니다. AWS Glue 콘솔을 통해 연결을 생성할 때 사용됩니다. 연결을 생성하는 사용자는 기본적으로 Mailchimp Client ID 및 Client Secret을 제외한 `OAuth` 관련 정보를 제공할 필요가 없는 AWS Glue 자체 연결된 앱에 의존할 수 있습니다. AWS Glue 콘솔은 사용자를 Mailchimp로 리디렉션합니다. 사용자가 로그인하고 Mailchimp 인스턴스에 액세스하도록 요청된 권한을 AWS Glue에 허용해야 합니다.
  + 사용자는 여전히 AWS Glue 콘솔을 통해 연결을 생성할 때에도 Mailchimp에서 자체 연결된 앱을 생성하고 자체 클라이언트 ID와 클라이언트 보안 암호를 제공하기로 선택할 수 있습니다. 이 시나리오에서는 여전히 Mailchimp로 리디렉션되어 로그인하고 리소스에 액세스할 수 있는 권한을 AWS Glue에 부여합니다.
  + `AUTHORIZATION_CODE OAuth` 흐름에 대한 연결된 앱을 생성하는 방법에 대한 공개 Mailchimp 설명서는 [Access Data on Behalf of Other Users with OAuth 2](https://mailchimp.com/developer/marketing/guides/access-user-data-oauth-2/?msockid=141ebf9ffb4d619525c3ad27fad660d6)를 참조하세요.
+ **사용자 지정 인증** - 사용자 지정 권한 부여에 필요한 API 키 생성에 대한 공개 Mailchimp 설명서는 [About API Keys](https://mailchimp.com/en/help/about-api-keys/?msockid=310fd0fe09d16afe034fc5de08d76b01)를 참조하세요.



다음 단계를 따라 Mailchimp 연결을 구성합니다.

1. AWS Secrets Manager에서 다음 세부 정보로 보안 암호를 생성합니다.
   + `OAuth` 인증 - 고객 관리형 연결된 앱: 보안 암호는 키 역할을 하는 `USER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET`과 함께 연결된 앱 소비자 보안 암호를 포함해야 합니다.
   + 사용자 지정 인증 - 고객 관리형 연결된 앱: 보안 암호는 키 역할을 하는 ‘api\$1key’와 함께 연결된 앱 소비자 보안 암호를 포함해야 합니다.
**참고**  
AWS Glue에서 연결당 보안 암호를 생성해야 합니다.

1. AWS Glue Studio의 **데이터 연결**에서 아래 단계에 따라 연결을 생성합니다.

   1. **연결**에서 **연결 생성**을 선택합니다.

   1. **데이터 소스**를 선택할 때 Mailchimp를 선택합니다.

   1. Mailchimp `instanceUrl`을 입력합니다.

   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. 인증 유형을 선택하여 Mailchimp에 연결합니다.
      + `OAuth` 인증 - 연결하려는 Mailchimp의 토큰 URL, 사용자 관리형 클라이언트 애플리케이션 ClientId를 입력합니다.
      + 사용자 지정 인증 - 인증 유형 사용자 지정을 선택하여 Mailchimp에 연결합니다.

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

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

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

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

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

 **사전 조건** 

읽으려는 Mailchimp 객체. 사용 가능한 엔터티를 확인하려면 아래 지원되는 엔터티 테이블을 참조하세요.

 **지원되는 엔터티** 
+ [Abuse-reports ](https://mailchimp.com/developer/marketing/api/campaign-abuse/)
+ [자동화](https://mailchimp.com/developer/marketing/api/automation/list-automations/)
+ [캠페인](https://mailchimp.com/developer/marketing/api/campaigns/list-campaigns/)
+ [Click-details](https://mailchimp.com/developer/marketing/api/link-clickers/)
+ [Lists](https://mailchimp.com/developer/marketing/api/link-clickers/)
+ [회원](https://mailchimp.com/developer/marketing/api/list-segment-members/)
+ [Open-details](https://mailchimp.com/developer/marketing/api/list-members/)
+ [Segments](https://mailchimp.com/developer/marketing/api/list-segments/)
+ [Stores](https://mailchimp.com/developer/marketing/api/ecommerce-stores/list-stores/)
+ [Unsubscribed](https://mailchimp.com/developer/marketing/api/unsub-reports/)


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| 자동화 | 예 | 예 | 예 | 예 | 예 | 
| Campaigns | 아니요 | 아니요 | 아니요 | 아니요 | 아니요 | 
| Lists | 예 | 예 | 아니요 | 예 | 예 | 
| Reports Abuse | 아니요 | 예 | 아니요 | 예 | 예 | 
| Reports Open | 아니요 | 예 | 아니요 | 예 | 예 | 
| Reports Click | 예 | 예 | 아니요 | 예 | 예 | 
| Reports Unsubscribe | 아니요 | 예 | 아니요 | 예 | 예 | 
| 세그먼트 | 아니요 | 예 | 아니요 | 예 | 예 | 
| Segment Members | 예 | 예 | 아니요 | 예 | 아니요 | 
| Stores | 예 | 예 | 예 | 예 | 아니요 | 

 **예제** 

```
mailchimp_read = glueContext.create_dynamic_frame.from_options(                    
            connection_type="mailchimp",                                           
            connection_options={                                                        
                  "connectionName": "connectionName",                                   
                  "ENTITY_NAME": "stores",  
"INSTANCE_URL": "https://us14.api.mailchimp.com",                     
                  "API_VERSION": "3.0"                                                
               })
```

 **Mailchimp 엔터티 및 필드 세부 정보** 
+ [Abuse-reports ](https://mailchimp.com/developer/marketing/api/campaign-abuse/)
+ [자동화](https://mailchimp.com/developer/marketing/api/automation/list-automations/)
+ [캠페인](https://mailchimp.com/developer/marketing/api/campaigns/list-campaigns/)
+ [Click-details](https://mailchimp.com/developer/marketing/api/link-clickers/)
+ [Lists](https://mailchimp.com/developer/marketing/api/link-clickers/)
+ [회원](https://mailchimp.com/developer/marketing/api/list-segment-members/)
+ [Open-details](https://mailchimp.com/developer/marketing/api/list-members/)
+ [Segments](https://mailchimp.com/developer/marketing/api/list-segments/)
+ [Stores](https://mailchimp.com/developer/marketing/api/ecommerce-stores/list-stores/)
+ [Unsubscribed](https://mailchimp.com/developer/marketing/api/unsub-reports/)

## 쿼리 파티셔닝
<a name="mailchimp-engage-reading-partitioning-queries"></a>

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

  DateTime 필드의 경우 ISO 형식의 값이 허용됩니다.

  유효한 값의 예제:

  ```
  "2024-07-01T00:00:00.000Z"
  ```
+ `UPPER_BOUND`: 선택한 파티션 필드의 상한 값(**경계 제외**).
+ `NUM_PARTITIONS`: 파티션 수.

다음 표에서는 엔터티 분할 필드 지원 세부 정보를 설명합니다.

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

예시:

```
read_read = glueContext.create_dynamic_frame.from_options(
    connection_type="mailchimp",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "automations",
        "API_VERSION": "3.0",
        "INSTANCE_URL": "https://us14.api.mailchimp.com",
        "PARTITION_FIELD": "create_time",
        "LOWER_BOUND": "2024-02-05T14:09:30.115Z",
        "UPPER_BOUND": "2024-06-07T13:30:00.134Z",
        "NUM_PARTITIONS": "3"
    }
```

# Mailchimp 연결 옵션
<a name="mailchimp-connection-options"></a>

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

# Mailchimp 계정 생성
<a name="mailchimp-create-account"></a>

1. [Mailchimp 로그인 페이지](https://login.mailchimp.com/?locale=en)로 이동하여 이메일 ID와 암호를 입력한 다음 **Sign up**을 선택합니다.

1. Mailchimp의 확인 이메일을 열고 확인 링크를 선택하여 계정을 확인합니다.
**참고**  
활성화 이메일을 수신하는 데 걸리는 시간은 다를 수 있습니다. 활성화 이메일을 받지 못한 경우 스팸 폴더를 확인하고 활성화 이메일 문제 해결 팁을 읽어보세요.. Mailchimp는 [admin@pottedplanter.com](mailto:admin@pottedplanter.com) 또는 [security@example.com](mailto:security@example.com)과 같은 역할 기반 이메일 주소의 가입을 차단합니다.  


   계정에 처음 로그인할 때 Mailchimp에서 필수 정보 입력을 요청합니다. Mailchimp는 이 정보를 사용하여 계정이 사용 약관을 준수하는지 확인하고 사용자 및 회사의 요구 사항과 관련된 안내를 제공합니다.

1. 정보를 입력하고 프롬프트에 따라 활성화 프로세스를 완료한 다음 새 Mailchimp 계정을 시작합니다.

**`OAuth2.0` 애플리케이션 등록**

1. [Mailchimp login 페이지](https://login.mailchimp.com/?locale=en)로 이동하여 이메일 ID와 암호를 입력한 다음 **Log in**을 선택합니다.

1. 오른쪽 상단 모서리에서 **User** 아이콘을 선택한 다음 드롭다운 메뉴에서 **Account and billing**을 선택합니다.

1. **Extras**를 선택하고 드롭다운 메뉴에서 **Registered apps**를 선택합니다.

1. **Register An App**을 찾아 선택합니다.

1. 다음 세부 정보를 입력합니다.
   + **App name** – 앱의 이름.
   + **Company / Organization** – 회사 또는 조직의 이름.
   + **App website** – 앱의 웹사이트.
   + **Redirect URI** - 리디렉션 URI 패턴은 로그인 흐름이 완료될 때 Mailchimp가 리디렉션(요청된 경우)할 수 있는 URI 경로(또는 쉼표로 구분된 경로 목록)입니다. 예: `https://ap-southeast-2\\.console\\.aws\\.amazon\\.com`

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

1. **Client ID**와 **Client Secret**이 표시됩니다. 복사하여 안전한 위치에 저장합니다. 그런 다음 **완료**를 선택합니다.
**참고**  
Client ID 및 Client Secret 문자열은 AppFlow 또는 AWS Glue를 사용할 때 이 커넥터와의 연결을 설정하는 데 사용되는 자격 증명입니다.

**API 키 생성**

1. [Mailchimp login 페이지](https://login.mailchimp.com/?locale=en)로 이동하여 이메일 ID와 암호를 입력한 다음 **Log in**을 선택합니다.

1. 오른쪽 상단 모서리에서 **User** 아이콘을 선택한 다음 드롭다운 메뉴에서 **Account and billing**을 선택합니다.

1. **Extras**를 선택하고 드롭다운 메뉴에서 **API keys**를 선택합니다.

1. **Create A Key**를 선택합니다.

1. 키 이름을 입력하고 **Generate Key**를 선택합니다.

   다음 페이지에는 생성된 API 키가 표시됩니다.

1. 키를 복사하고 안전하게 저장한 다음 **Done**을 선택합니다.

# 제한 사항
<a name="mailchimp-connector-limitations"></a>

다음은 Mailchimp 커넥터의 제한 사항입니다.
+ 필터링은 `Campaigns`, `Automations`, `Lists`, `Open Details`, `Members` 및 `Segments` 엔터티에서만 지원됩니다.
+ `DateTime` 데이터 유형 필드에 필터를 사용하는 동안 `yyyy-mm-ddThh:MM:ssZ` 형식으로 값을 전달해야 합니다.

# Microsoft Dynamics 365 CRM에 연결
<a name="connecting-to-microsoft-dynamics-365"></a>

 Microsoft Dynamics 365는 엔터프라이즈 리소스 계획 및 고객 관계 관리 지능형 비즈니스 애플리케이션 제품군입니다.

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

# AWS Glue의 Microsoft Dynamics 365 지원
<a name="microsoft-dynamics-365-support"></a>

AWS Glue는 다음과 같이 Microsoft Dynamics 365를 지원합니다.

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

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

**지원되는 Microsoft Dynamics 365 CRM API 버전**  
 v9.2.

# 연결을 생성하고 사용하기 위한 API 작업이 포함된 정책
<a name="microsoft-dynamics-365-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 Management Console을 사용하는 경우 AWS Glue 리소스에 대한 전체 액세스 권한을 부여합니다. 이 정책에 지정된 리소스의 이름 변환을 따르면 사용자는 콘솔 전체 용량을 소유합니다. 이 정책은 보통 AWS Glue 콘솔의 사용자에게 해당됩니다.

# Microsoft Dynamics 365 CRM 구성
<a name="microsoft-dynamics-365-configuring"></a>

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

## 최소 요구 사항
<a name="microsoft-dynamics-365-configuring-min-requirements"></a>
+  ClientId 및 보안 암호가 있는 Microsoft Dynamics 365 CRM 개발자 계정을 보유하고 있습니다.
+  Microsoft Dynamics 365 CRM 계정에 유효한 라이선스를 사용하는 API 액세스 권한이 있습니다.

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

# Microsoft Dynamics 365 CRM 연결 구성
<a name="microsoft-dynamics-365-configuring-connections"></a>

 **AUTHORIZATION\$1CODE 권한 부여 유형** 
+  이 권한 부여 유형은 사용자를 인증하기 위해 사용자를 서드파티 권한 부여 서버로 리디렉션하는 방식에 의존하므로 '3각' OAuth로 간주됩니다. AWS Glue 콘솔을 통해 연결을 생성할 때 사용됩니다. AWS Glue 콘솔은 사용자를 Microsoft Dynamics 365 CRM으로 리디렉션합니다. 사용자가 로그인하고 Microsoft Dynamics 365 CRM 인스턴스에 액세스하도록 요청된 권한을 AWS Glue에 허용해야 합니다.
+  사용자는 AWS Glue 콘솔을 통해 연결을 생성할 때에도 Microsoft Dynamics 365 CRM에서 자체 연결된 앱을 생성하고 자체 클라이언트 ID와 클라이언트 보안 암호를 제공하기로 선택할 수 있습니다. 이 시나리오에서는 여전히 Microsoft Dynamics 365 CRM으로 리디렉션되어 로그인하고 리소스에 액세스할 수 있는 권한을 AWS Glue에 부여합니다.
+  이 권한 부여 유형은 새로 고침 토큰과 액세스 토큰을 생성합니다. 액세스 토큰은 수명이 짧으며 새로 고침 토큰을 사용하여 사용자 상호 작용 없이 자동으로 새로 고칠 수 있습니다.
+  권한 부여 코드 OAuth 흐름을 위한 연결된 앱 생성에 대한 공개 Microsoft Dynamics 365 CRM 설명서는 Microsoft Learn의 [Microsoft App Registration](https://learn.microsoft.com/en-us/power-apps/developer/data-platform/authenticate-oauth#app-registration)을 참조하세요.

Microsoft Dynamics 365 CRM은 OAuth2.0 인증을 지원합니다.

Microsoft Dynamics 365 CRM 연결 구성:

1.  AWS Secrets Manager에서 다음 세부 정보를 사용하여 보안 암호를 생성합니다. AWS Glue에서 각 연결에 대한 보안 암호를 생성해야 합니다.
   +  AuthorizationCode 권한 부여 유형의 경우: 

      고객 관리형 연결된 앱 - 보안 암호는 키 역할을 하는 `USER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET`과 함께 연결된 앱 클라이언트 보안 암호를 포함해야 합니다.

1. AWS Glue Studio의 **데이터 연결**에서 아래 단계에 따라 연결을 생성합니다.

   1. **데이터 소스**를 선택할 때 Microsoft Dynamics 365을 선택합니다.

   1. 연결할 Microsoft Dynamics 365 CRM 인스턴스의 **INSTANCE\$1URL**을 선택합니다.

   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.  **토큰 URL** 및 **권한 부여 코드 URL**을 선택하여 Microsoft Dynamics 365 CRM 워크스페이스에 액세스합니다.

   1.  Microsoft Dynamics 365 CRM 앱의 **사용자 관리형 클라이언트 애플리케이션 ClientId**를 입력합니다.

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

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

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

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

# Microsoft Dynamics 365 CRM 엔터티에서 읽기
<a name="microsoft-dynamics-365-reading-from-entities"></a>

 **사전 조건** 
+  읽으려는 Microsoft Dynamics 365 CRM 객체입니다. 객체 이름(예: 연락처 또는 계정)이 필요합니다. 다음 표에는 지원되는 엔터티가 나와 있습니다.

 **지원되는 엔터티** 


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| 동적 엔터티 | 예 | 예 | 예 | 예 | 예 | 

 **예제** 

```
dynamics365_read = glueContext.create_dynamic_frame.from_options(
    connection_type="microsoftdynamics365crm",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "dynamic_entity",
        "API_VERSION": "v9.2",
        "INSTANCE_URL": "https://{tenantID}.api.crm.dynamics.com"
    }
```

## Microsoft Dynamics 365 CRM 엔터티 및 필드 세부 정보
<a name="microsoft-dynamics-365-entity-and-field-details"></a>

 **동적 메타데이터를 포함하는 엔터티**: 

Microsoft Dynamics 365 CRM은 메타데이터를 동적으로 가져올 수 있는 엔드포인트를 제공합니다. 그에 따라 동적 엔터티의 경우 운영자 지원은 데이터 유형 수준에서 캡처됩니다.

<a name="microsoft-dynamics-365-metadata-table"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/microsoft-dynamics-365-reading-from-entities.html)

 **분할 쿼리** 

Microsoft Dynamics 365 CRM은 필드 기반 파티셔닝만 지원합니다.

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

   Datetime의 경우 Spark SQL 쿼리에 사용된 Spark 타임스탬프 형식을 허용합니다. 유효한 값의 예제: `"2024-01-30T06:47:51.000Z"`.
+  `UPPER_BOUND`: 선택한 파티션 필드의 상한 값(경계 제외).
+  `NUM_PARTITIONS`: 파티션 수.

 엔터티 수준 분할 필드 지원 세부 정보는 아래 표에 나와 있습니다.


| Entity Name | Partitioning Fields | 데이터 유형 | 
| --- | --- | --- | 
| 동적 엔터티(표준 엔터티) | 쿼리 가능한 동적 DateTime 필드 | createdon, modifiedon | 
| 동적 엔터티(사용자 지정 엔터티) | createdon, modifiedon | createdon, modifiedon | 

 **예제** 

```
dynamics365_read = glueContext.create_dynamic_frame.from_options(
    connection_type="microsoftdynamics365crm",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "dynamic_entity",
        "API_VERSION": "v9.2",
        "instanceUrl": "https://{tenantID}.api.crm.dynamics.com"
        "PARTITION_FIELD": "createdon"
        "LOWER_BOUND": "2024-01-30T06:47:51.000Z"
        "UPPER_BOUND": "2024-06-30T06:47:51.000Z"
        "NUM_PARTITIONS": "10"
    }
```

# Microsoft Dynamics 365 CRM 연결 옵션 참조
<a name="microsoft-dynamics-365-connection-options"></a>

다음은 Microsoft Dynamics 365 CRM에 대한 연결 옵션입니다.
+  `ENTITY_NAME`(문자열) - (필수) 읽기에 사용됩니다. Microsoft Dynamics 365 CRM의 객체 이름입니다.
+  `API_VERSION`(문자열) - (필수) 읽기에 사용됩니다. 사용하려는 Microsoft Dynamics 365 CRM Rest API 버전입니다.
+  `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 객체에 대해 선택할 열.
+  `FILTER_PREDICATE`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.
+  `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리.
+  `INSTANCE_URL`(문자열) - (필수) `https://{tenantID}.api.crm.dynamics.com` 형식의 유효한 Microsoft Dynamics 365 CRM 인스턴스 URL입니다.
+  `NUM_PARTITIONS`(정수) - 기본값: 1. 읽기에 사용됩니다. 읽을 파티션 수.
+  `PARTITION_FIELD`(문자열) - 읽기에 사용됩니다. 쿼리 분할에 사용할 필드입니다.
+  `LOWER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 하한 값(경계 포함). 예시: `2024-01-30T06:47:51.000Z`.
+  `UPPER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 상한 값(경계 제외). 예시: `2024-06-30T06:47:51.000Z`.

# 제한 사항
<a name="microsoft-dynamics-365-connector-limitations"></a>

다음은 Microsoft Dynamics 365 CRM 커넥터에 대한 제한 사항입니다.
+  Microsoft Dynamics 365 CRM에서는 오프셋 파라미터를 지원하지 않으므로 레코드 기반 파티셔닝이 지원되지 않습니다.
+  페이지 매김은 데이터 크기와 속도 제한의 조합으로 인한 SaaS의 내부 서버 예외를 방지하기 위해 페이지당 최대 500개의 레코드로 설정됩니다.
  + [SaaS documentation on pagination](https://learn.microsoft.com/en-us/power-apps/developer/data-platform/webapi/query/page-results?view=dataverse-latest)
  + [SaaS documentation on rate limits](https://learn.microsoft.com/en-us/power-apps/developer/data-platform/api-limits?tabs=sdk)
+  Microsoft Dynamics 365 CRM은 모든 엔터티의 상위 필드에서만 `order by`를 지원합니다. `order by`는 하위 필드에서 지원되지 않습니다.
  + ASC 및 DESC 지침은 모두 지원됩니다.
  + 여러 필드에서 `order by`가 지원됩니다.
+  `aadusers` 표준 엔터티의 "createddatetime" 필드를 필터링하면 필터링을 지원하더라도 SaaS에서 잘못된 요청 오류가 발생합니다. 메타데이터의 동적 특성과 알려진 근본 원인이 없다는 점으로 인해 유사한 문제가 있는 다른 엔터티를 구체적으로 식별할 수 없습니다. 따라서 처리할 수 없습니다.
+  Struct, List 및 Map과 같은 복잡한 객체 유형은 필터링을 지원하지 않습니다.
+  응답에서 검색할 수 있는 많은 필드가 동적 메타데이터 응답에서 `isRetrievable`이 `false`로 표시됩니다. 데이터 손실을 방지하기 위해 `isRetrievable`은 모든 필드에서 `true`로 설정됩니다.
+  필드 기반 파티셔닝은 다음 기준을 준수할 때 모든 엔터티에서 지원됩니다.
  + DateTime 쿼리 가능 필드는 표준 엔터티 또는 사용자 지정 엔터티의 `createdon` 또는 `modifiedon` 필드(시스템 생성)에 있어야 합니다.
  + SaaS 메타데이터 API에서 시스템 생성 필드 또는 null 값을 허용하는 속성이 독점적으로 식별되지 않지만, 기본적으로 사용 가능한 필드만 필터링 가능하고 null 값을 허용하지 않는 것이 일반적입니다. 따라서 위의 필드 선택 기준은 null 값을 허용하지 않는 것으로 간주되며 필터링 가능한 경우 파티셔닝할 수 있습니다.

# Microsoft Teams에 연결
<a name="connecting-to-microsoft-teams"></a>

 Microsoft Teams는 Microsoft 365 내의 협업형 워크스페이스로, 업무 관련 대화, 협업, 화상 채팅 및 문서 공유를 위한 중앙 허브 역할을 하며, 통합된 도구 모음을 통해 작업자 생산성을 지원하도록 설계되었습니다.

**Topics**
+ [AWS Glue의 Microsoft Teams 지원](microsoft-teams-support.md)
+ [연결을 생성하고 사용하기 위한 API 작업이 포함된 정책](microsoft-teams-configuring-iam-permissions.md)
+ [Microsoft Teams 구성](microsoft-teams-configuring.md)
+ [Microsoft Teams 연결 구성](microsoft-teams-configuring-connections.md)
+ [Microsoft Teams 엔터티에서 읽기](microsoft-teams-reading-from-entities.md)
+ [Microsoft Teams 연결 옵션 참조](microsoft-teams-connection-options.md)
+ [제한 사항](microsoft-teams-connector-limitations.md)
+ [새 Microsoft Teams 계정을 생성합니다.](#microsoft-teams-account-creation)

# AWS Glue의 Microsoft Teams 지원
<a name="microsoft-teams-support"></a>

AWS Glue는 다음과 같이 Microsoft Teams를 지원합니다.

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

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

**지원되는 Microsoft Teams API 버전**  
 v1. 버전별 엔터티 지원은 소스에 대해 지원되는 엔터티를 참조하세요.

# 연결을 생성하고 사용하기 위한 API 작업이 포함된 정책
<a name="microsoft-teams-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 Management Console을 사용하는 경우 AWS Glue 리소스에 대한 전체 액세스 권한을 부여합니다. 이 정책에 지정된 리소스의 이름 변환을 따르면 사용자는 콘솔 전체 용량을 소유합니다. 이 정책은 보통 AWS Glue 콘솔의 사용자에게 해당됩니다.

# Microsoft Teams 구성
<a name="microsoft-teams-configuring"></a>

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

## 최소 요구 사항
<a name="microsoft-teams-configuring-min-requirements"></a>
+  이메일과 암호가 있는 Microsoft Teams 개발자 계정이 있습니다. 자세한 내용은 [새 Microsoft Teams 계정을 생성합니다.](connecting-to-microsoft-teams.md#microsoft-teams-account-creation) 섹션을 참조하세요.
+  계정에 대해 인증된 직접 호출을 수행하는 경우 AWS Glue에서 데이터에 안전하게 액세스하기 위해 사용하는 클라이언트 ID와 클라이언트 자격 증명을 제공하는 Microsoft Teams 계정에 OAuth2 앱을 설정해야 합니다. 자세한 내용은 [새 Microsoft Teams 계정을 생성합니다.](connecting-to-microsoft-teams.md#microsoft-teams-account-creation) 섹션을 참조하세요.

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

# Microsoft Teams 연결 구성
<a name="microsoft-teams-configuring-connections"></a>

Microsoft Teams는 인증 메커니즘에 대해 다음 두 가지 유형을 지원합니다.

1.  OAuth 인증: Microsoft Teams는 OAuth2에 대해 AUTHORIZATION\$1CODE 권한 부여 유형을 지원합니다.
   +  이 권한 부여 유형은 사용자를 인증하기 위해 사용자를 서드파티 권한 부여 서버로 리디렉션하는 방식에 의존하므로 '3각' OAuth로 간주됩니다. AWS Glue 콘솔을 통해 연결을 생성할 때 사용됩니다. 연결을 생성하는 사용자는 기본적으로 Microsoft Teams instanceurl을 제외한 OAuth 관련 정보를 제공할 필요가 없는 AWS Glue 자체 연결된 앱에 의존할 수 있습니다. AWS Glue 콘솔은 사용자를 Microsoft Teams로 리디렉션합니다. 사용자가 로그인하고 Microsoft Teams 인스턴스에 액세스하도록 요청된 권한을 AWS Glue에 허용해야 합니다.
   +  사용자는 AWS Glue 콘솔을 통해 연결을 생성할 때에도 Microsoft Teams에서 자체 연결된 앱을 생성하고 자체 클라이언트 ID와 클라이언트 보안 암호를 제공하기로 선택할 수 있습니다. 이 시나리오에서는 여전히 Microsoft Teams로 리디렉션되어 로그인하고 리소스에 액세스할 수 있는 권한을 AWS Glue에 부여합니다.
   +  이 권한 부여 유형은 새로 고침 토큰과 액세스 토큰을 생성합니다. 액세스 토큰은 1시간 동안 활성 상태가 되고 새로 고침 토큰을 사용하여 사용자 상호 작용 없이 자동으로 새로 고칠 수 있습니다.
   +  권한 부여 코드 OAuth 흐름을 위한 연결된 앱 생성에 대한 공개 Microsoft Teams 설명서는 Microsoft Learn의 [Register an application with the Microsoft identity platform - Microsoft Graph](https://learn.microsoft.com/en-us/graph/auth-register-app-v2)를 참조하세요.

다음 단계를 따라 Microsoft Teams 연결을 구성합니다.

1.  AWS Secrets Manager에서 다음 세부 정보를 사용하여 보안 암호를 생성합니다. AWS Glue에서 각 연결에 대한 보안 암호를 생성해야 합니다.

   1.  OAuth 인증: 
      +  고객 관리형 연결된 앱 - 보안 암호는 키 역할을 하는 USER\$1MANAGED\$1CLIENT\$1APPLICATION\$1CLIENT\$1SECRET과 함께 연결된 앱 소비자 보안 암호를 포함해야 합니다.

1. AWS Glue Studio의 **데이터 연결**에서 아래 단계에 따라 연결을 생성합니다.

   1.  데이터 연결에서 **연결 생성**을 선택합니다.

   1. **데이터 소스**를 선택할 때 Microsoft Teams를 선택합니다.

   1. Microsoft Teams **테넌트 ID**를 입력합니다.

   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.  Microsoft Teams 앱의 사용자 관리형 클라이언트 애플리케이션 ClientId를 입력합니다.

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

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

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

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

# Microsoft Teams 엔터티에서 읽기
<a name="microsoft-teams-reading-from-entities"></a>

 **사전 조건** 
+  읽으려는 Microsoft Teams 객체. 객체 이름(예: team 또는 channel-message)이 필요합니다. 다음 표에는 지원되는 엔터티가 나와 있습니다.

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

 모든 개체는 API 버전 1.0에서 지원됩니다.


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| 팀 | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Team Members | 예 | 예 | 아니요 | 예 | 예 | 
| Groups | 예 | 예 | 예 | 예 | 예 | 
| Group Member | 예 | 예 | 아니요 | 예 | 아니요 | 
| 채널 | 예 | 아니요 | 아니요 | 예 | 예 | 
| Channel Messages | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| Channel Message Replies | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| Channel Tabs | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Chats | 예 | 예 | 예 | 예 | 예 | 
| Calendar Events | 예 | 예 | 예 | 예 | 예 | 

 **예제** 

```
MicrosoftTeams_read = glueContext.create_dynamic_frame.from_options(
    connection_type="MicrosoftTeams",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "company",
        "API_VERSION": "v1.0"
    }
```

## Microsoft Teams 엔터티 및 필드 세부 정보
<a name="microsoft-teams-entity-and-field-details"></a>

 엔터티 목록: 
+  Team: [https://docs.microsoft.com/en-us/graph/api/user-list-joinedteams?view=graph-rest-1.0](https://docs.microsoft.com/en-us/graph/api/user-list-joinedteams?view=graph-rest-1.0) 
+  Team-Member: [https://docs.microsoft.com/en-us/graph/api/team-list-members?view=graph-rest-1.0](https://docs.microsoft.com/en-us/graph/api/team-list-members?view=graph-rest-1.0) 
+  Group: [https://docs.microsoft.com/en-us/graph/api/group-list?view=graph-rest-1.0](https://docs.microsoft.com/en-us/graph/api/group-list?view=graph-rest-1.0) 
+  Group-Member: [https://docs.microsoft.com/en-us/graph/api/group-list-members?view=graph-rest-1.0](https://docs.microsoft.com/en-us/graph/api/group-list-members?view=graph-rest-1.0) 
+  Channel: [https://docs.microsoft.com/en-us/graph/api/channel-list?view=graph-rest-1.0](https://docs.microsoft.com/en-us/graph/api/channel-list?view=graph-rest-1.0) 
+  Channel-Message: [https://docs.microsoft.com/en-us/graph/api/channel-list-messages?view=graph-rest-1.0](https://docs.microsoft.com/en-us/graph/api/channel-list-messages?view=graph-rest-1.0) 
+  Channel-Message-Reply: [https://docs.microsoft.com/en-us/graph/api/chatmessage-list-replies?view=graph-rest-1.0](https://docs.microsoft.com/en-us/graph/api/chatmessage-list-replies?view=graph-rest-1.0) 
+  Channel-Tab: [https://docs.microsoft.com/en-us/graph/api/channel-list-tabs?view=graph-rest-1.0](https://docs.microsoft.com/en-us/graph/api/channel-list-tabs?view=graph-rest-1.0) 
+  Chat: [https://docs.microsoft.com/en-us/graph/api/chat-list?view=graph-rest-1.0]( https://docs.microsoft.com/en-us/graph/api/chat-list?view=graph-rest-1.0) 
+  Calendar-Event: [https://docs.microsoft.com/en-us/graph/api/group-list-events?view=graph-rest-1.0](https://docs.microsoft.com/en-us/graph/api/group-list-events?view=graph-rest-1.0) 

 **분할 쿼리** 

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

   날짜의 경우 Spark SQL 쿼리에 사용된 Spark 날짜 형식을 허용합니다. 유효한 값의 예제: `"2024-02-06"`.
+  `UPPER_BOUND`: 선택한 파티션 필드의 상한 값(경계 제외).
+  `NUM_PARTITIONS`: 파티션 수.

 엔터티 수준 분할 필드 지원 세부 정보는 아래 표에 나와 있습니다.


| Entity Name | Partitioning Fields | 데이터 형식 | 
| --- | --- | --- | 
| Team Members | visibleHistoryStartDateTime | DateTime | 
| Groups | createdDateTime | DateTime | 
| 채널 | createdDateTime | DateTime | 
| Chats | createdDateTime, lastModifiedDateTime | DateTime | 
| Calendar Events | createdDateTime, lastModifiedDateTime, originalStart | DateTime | 

 **예제** 

```
microsoftteams_read = glueContext.create_dynamic_frame.from_options(
    connection_type="MicrosoftTeams",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "group",
        "API_VERSION": "v1.0",
        "PARTITION_FIELD": "createdDateTime"
        "LOWER_BOUND": "2022-07-13T07:55:27.065Z"
        "UPPER_BOUND": "2022-08-12T07:55:27.065Z"
        "NUM_PARTITIONS": "2"
    }
```

# Microsoft Teams 연결 옵션 참조
<a name="microsoft-teams-connection-options"></a>

다음은 Microsoft Teams에 대한 연결 옵션입니다.
+  `ENTITY_NAME`(문자열) - (필수) 읽기에 사용됩니다. Microsoft Teams의 객체 이름.
+  `API_VERSION`(문자열) - (필수) 읽기에 사용됩니다. 사용하려는 Microsoft Teams Rest API 버전. 예: v1.0.
+  `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 객체에 대해 선택할 열.
+  `FILTER_PREDICATE`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.
+  `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리.
+  `PARTITION_FIELD`(문자열) - 읽기에 사용됩니다. 쿼리 분할에 사용할 필드입니다.
+  `LOWER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 하한 값(경계 포함).
+  `UPPER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 상한 값(경계 제외).
+  `NUM_PARTITIONS`(정수) - 기본값: 1. 읽기에 사용됩니다. 읽을 파티션 수.

# 제한 사항
<a name="microsoft-teams-connector-limitations"></a>

다음은 Microsoft Teams 커넥터에 대한 제한 사항입니다.
+  Microsoft Teams API는 Chat 및 Team Member 엔터티에 지정된 것보다 적은 수의 레코드를 반환합니다. 이 문제는 Microsoft Teams Support에 보고되었으며, 현재 조사 중입니다.

## 새 Microsoft Teams 계정을 생성합니다.
<a name="microsoft-teams-account-creation"></a>

1.  Microsoft Teams 홈페이지인 [https://account.microsoft.com/account/](https://account.microsoft.com/account/)로 이동하여 **로그인**을 선택합니다.

1.  **계정을 만드세요\$1**를 선택합니다.

1.  계정 생성에 필요한 정보를 입력하고 새 계정을 생성합니다.

1.  Microsoft Teams 웹사이트인 [https://www.microsoft.com/en-in/microsoft-teams/log-in](https://www.microsoft.com/en-in/microsoft-teams/log-in)으로 이동합니다.

1.  방금 생성한 Microsoft 계정을 사용하여 가입합니다.

1.  Teams에 성공적으로 가입한 후 [https://account.microsft.com/services](https://account.microsft.com/services)로 이동합니다.

1.  **Microsoft 365 평가판 사용**을 선택합니다.

1.  아래 Microsoft 365 또는 Microsoft Teams 구독 중 하나를 활성화하여 Microsoft Teams 커넥터의 모든 필수 기능에 액세스합니다.
   + Microsoft Teams Essentials
   + Microsoft 365 Business
   + Microsoft 365 Business Basic
   + Microsoft 365 Business Standard
   + Microsoft 365 Business Premium

**관리형 클라이언트 앱을 생성합니다.**

1.  관리형 애플리케이션을 생성하려면 Microsoft Entra(이전 Azure Active Directory)에 새 OAuth 앱을 등록해야 합니다.

1.  [Microsoft Entra 관리 센터](https://entra.microsoft.com)에 로그인합니다.

1.  여러 테넌트에 액세스할 수 있는 경우 상단 메뉴의 설정 아이콘을 사용하여 디렉터리 \$1 구독 메뉴에서 애플리케이션을 등록하려는 테넌트로 전환합니다.

1.  ID > 애플리케이션 > 앱 등록으로 이동하여 **새 등록**을 선택합니다.

1. 새 애플리케이션의 표시 이름을 입력합니다.

1.  지원되는 계정 유형 섹션에서 애플리케이션을 사용할 수 있는 사용자를 지정합니다. 이 앱을 전역적으로 설정하려면 ‘조직 디렉터리의 계정’ 또는 ‘조직 디렉터리 및 개인 Microsoft 계정의 계정’을 선택합니다.

1.  리디렉션 URI `https://{region}.console.aws.amazon.com/appflow/oauth`를 입력합니다. 예를 들어 `us-west-2 region`의 경우 `https://us-west-2.console.aws.amazon.com/appflow/oauth`를 추가합니다. 사용하려는 여러 리전에 대해 여러 URL을 추가할 수 있습니다.

1.  앱을 등록합니다.

1.  나중에 사용할 수 있도록 클라이언트 ID를 기록해 둡니다.

1.  Essentials 섹션에서 **인증서 또는 암호 추가**를 선택합니다.

1.  **새 클라이언트 암호**를 선택합니다.

1.  설명 및 만료 기간을 입력합니다.

1.  나중에 사용할 수 있도록 클라이언트 보안 암호를 복사하고 저장합니다.

1.  왼쪽 메뉴 목록에서 **API 권한**을 선택합니다.

1.  **권한 추가**를 선택합니다.

1.  ‘Microsoft Graph’를 선택합니다.

1.  ‘위임된 권한’을 선택합니다.

1.  다음 권한을 모두 확인합니다.
   + User.Read
   + Offline\$1access
   + User.Read.All
   + User.ReadWrite.All
   + TeamsTab.ReadWriteForTeam
   + TeamsTab.ReadWriteForChat
   + TeamsTab.ReadWrite.All
   + TeamsTab.Read.All
   + TeamSettings.ReadWrite.All
   + TeamSettings.Read.All
   + TeamMember.ReadWrite.All
   + TeamMember.Read.All
   + Team.ReadBasic.All
   + GroupMember.ReadWrite.All
   + GroupMember.Read.All
   + Group.ReadWrite.All
   + Group.Read.All
   + Directory.ReadWrite.All
   + Directory.Read.All
   + Directory.AccessAsUser.All
   + Chat.ReadWrite
   + Chat.ReadBasic
   + Chat.Read
   + ChannelSettings.ReadWrite.All
   + ChannelSettings.Read.All
   + ChannelMessage.Read.All
   + Channel.ReadBasic.All

1.  **권한 추가**를 선택합니다. 이제 앱이 성공적으로 설정되었습니다. 클라이언트 ID와 클라이언트 보안 암호를 사용하여 새 연결을 생성할 수 있습니다. 자세한 내용은 [https://learn.microsoft.com/en-us/graph/auth-register-app-v2](https://learn.microsoft.com/en-us/graph/auth-register-app-v2)를 참조하세요.

# Mixpanel에 연결
<a name="connecting-to-mixpanel"></a>

Mixpanel은 기업이 사용자 참여를 측정하고 최적화하는 데 도움이 되는 강력한 실시간 분석 플랫폼입니다. Mixpanel은 고객 행동 추적에 사용되는 앱입니다. 이를 통해 사용자가 제품에 참여하는 방식을 추적하고 클릭 몇 번으로 결과를 쿼리하며 시각화할 수 있는 대화형 보고서를 통해 이 데이터를 분석할 수 있습니다. Mixpanel 사용자는 Mixpanel 계정에 AWS Glue를 연결할 수 있습니다. 그런 다음, Mixpanel을 ETL 작업에서의 데이터 소스로 사용할 수 있습니다. 이러한 작업을 실행하여 Mixpanel 및 AWS 서비스 또는 기타 지원되는 애플리케이션 간에 데이터를 전송합니다.

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

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

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

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

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

**지원되는 Mixpanel API 버전**  
 2.0 

# 연결을 생성하고 사용하기 위한 API 작업이 포함된 정책
<a name="mixpanel-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 Management Console을 사용하는 경우 AWS Glue 리소스에 대한 전체 액세스 권한을 부여합니다. 이 정책에 지정된 리소스의 이름 변환을 따르면 사용자는 콘솔 전체 용량을 소유합니다. 이 정책은 보통 AWS Glue 콘솔의 사용자에게 해당됩니다.

# Mixpanel 구성
<a name="mixpanel-configuring"></a>

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

## 최소 요구 사항
<a name="mixpanel-configuring-min-requirements"></a>
+  Mixpanel 계정이 있습니다. 계정 생성에 대한 자세한 내용은 [Mixpanel 계정 생성](mixpanel-create-account.md)을 참조하세요.
+  Mixpanel 계정이 API 액세스에 대해 활성화되어 있습니다. API 액세스는 기본적으로 Enterprise, Unlimited, Developer, Performance 에디션에 대해 활성화됩니다.

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

# Mixpanel 연결 구성
<a name="mixpanel-configuring-connections"></a>

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

`BasicAuth` 흐름에 대한 퍼블릭 Mixpanel 설명서는 [Mixpanel 서비스 계정](https://developer.mixpanel.com/reference/service-accounts) 섹션을 참조하세요.

Mixpanel 연결을 구성하는 방법:

1. AWS Secrets Manager에서 다음 세부 정보로 보안 암호를 생성합니다.
   +  기본 인증의 경우 보안 암호에는 `USERNAME`와 `PASSWORD`를 키로 사용하여 연결된 앱 소비자 보안 암호가 포함되어야 합니다.
**참고**  
AWS Glue에서 연결당 보안 암호를 생성해야 합니다.

1. AWS Glue Studio의 **데이터 연결**에서 아래 단계에 따라 연결을 생성합니다.

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

   1. 연결하려는 Mixpanel의 `INSTANCE_URL`을 제공합니다.

   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.  토큰을 넣기 위해 AWS Glue에서 이 연결에 사용할 `secretName`을 선택합니다.

   1.  네트워크를 사용하려면 **네트워크 옵션**을 선택합니다.

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

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

 **사전 조건** 

데이터를 읽으려는 `Funnels`, `Retention` 또는 `Retention Funnels`와 같은 Mixpanel 객체가 있어야 합니다. 또한 객체 이름을 알아야 합니다.

 **지원되는 엔터티** 


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| Funnels | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Retention | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Segmentation | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Segmentation Sum | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Segmentation Average | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Cohorts | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Engage | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| 이벤트 | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Events Top | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Events Names | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Events Properties | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Events Properties Top | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Events Properties Values | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Annotations | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Profile Event Activity | 예 | 아니요 | 아니요 | 예 | 아니요 | 

 **예제** 

```
mixpanel_read = glueContext.create_dynamic_frame.from_options(
    connection_type="mixpanel",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "/cohorts/list?project_id=2603353",
        "API_VERSION": "2.0",
        "INSTANCE_URL": "https://www.mixpanel.com/api/app/me"
    }
```

 **Mixpanel 엔터티 및 필드 세부 정보** 

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

# Mixpanel 연결 옵션
<a name="mixpanel-connection-options"></a>

다음은 Mixpanel의 연결 옵션입니다.
+  `ENTITY_NAME`(문자열) - (필수) 읽기/쓰기에 사용됩니다. Mixpanel에서의 객체 이름입니다.
+  `API_VERSION`(문자열) - (필수) 읽기/쓰기에 사용됩니다. 사용할 Mixpanel Rest API 버전. 예: v2.0.
+  `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 객체에 대해 선택할 열.
+  `FILTER_PREDICATE`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.
+  `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리.

# Mixpanel 계정 생성 및 클라이언트 앱 구성
<a name="mixpanel-create-account"></a>

**Mixpanel 계정 생성**

1. [Mixpanel 홈 페이지](https://mixpanel.com/)로 이동합니다.

1. **Mixpanel** 홈 페이지의 오른쪽 상단 모서리에서 **가입**을 선택합니다.

1. **시작하기** 페이지에서 다음 작업을 완료합니다.
   + 지정된 필드에 이메일 주소를 입력합니다.
   + 필수 확인란을 선택하여 약관에 동의합니다.
   + 시작하려면 **시작하기**를 선택합니다.

     완료하면 확인 이메일을 받게 됩니다.

1. 이메일 받은 편지함에서 확인 메시지를 확인하고 이메일을 연 다음 지침에 따라 이메일 주소를 확인합니다.

1. 확인 페이지에서 **이메일 확인**을 선택하여 이메일 확인을 완료합니다.

1. **조직 이름 지정** 페이지에서 조직 이름을 입력하고 **다음**을 선택합니다.

1. **첫 번째 프로젝트** 페이지에서 프로젝트 세부 정보를 입력하고 **생성**을 선택합니다.

1. 다음 페이지에서 **시작하기**를 선택하여 계정 생성을 완료합니다.

**Mixpanel 계정에 로그인**

1. [Mixpanel 로그인 페이지](https://mixpanel.com/login/)로 이동합니다.

1. 이메일 주소를 입력하고 **계속**을 선택합니다.

1. 이메일 받은 편지함에서 확인 메시지를 확인하고 이메일을 연 다음 지침에 따라 이메일 주소를 확인합니다.

1. 다음 페이지에서 **로그인 버튼**을 선택하여 계정에 로그인합니다.

**Mixpanel 요금제 구매**

1. Mixpanel 페이지에서 페이지 오른쪽 상단에 있는 **설정** 아이콘을 선택합니다.

1. 옵션 목록에서 **요금제 세부 정보 및 결제**를 선택합니다.

1. **요금제 세부 정보 및 결제** 페이지에서 **업그레이드 또는 수정**을 선택합니다.

1. 다음 페이지에서 구매하려는 요금제를 선택합니다.

   이렇게 하면 계정 생성 및 요금제 구매 프로세스가 완료됩니다.

**사용자 이름 및 클라이언트 보안 암호 생성(앱 등록)**

1. Mixpanel 페이지에서 페이지 오른쪽 상단에 있는 **설정** 아이콘을 선택합니다.

1. 옵션 목록에서 **프로젝트 설정**을 선택합니다.

1. **프로젝트 설정** 페이지에서 **서비스 계정**을 선택한 다음 **서비스 계정 추가**를 선택합니다.

1. **서비스 계정** 드롭다운 목록에서 **서비스 계정을 선택하거나 생성할 이름을 입력**하고 **프로젝트 역할**을 추가한 다음 **만료**를 지정 후 **추가**를 선택합니다.
**중요**  
이전 단계를 완료한 후 다음 페이지에 서비스 계정의 보안 암호 키가 표시됩니다. 서비스 계정의 보안 암호 키를 저장해야 합니다. 이 시점 이후에는 다시 액세스할 수 없습니다.

# 제한 사항
<a name="mixpanel-connector-limitations"></a>

다음은 Mixpanel 커넥터의 제한 사항입니다.
+ `Segmentation Numeric` 엔터티의 경우 필수 필터에 대한 숫자 데이터를 찾을 수 없는 경우 Mixpanel API에서 `400 (Bad Request)` 오류가 발생합니다. 흐름 실패를 방지하기 위해 `OK` 응답으로 이것을 처리하고 있습니다.
+ 다음과 같은 이유로 쿼리 가능한 `limit` 필드가 지원되는 엔터티에서 제거되었습니다.
  + SDK의 제한 특성으로 해석되어 오류 발생
  + 이 필터는 실질적인 용도가 없음
  + 이제 제한 특성 구현에서 동등한 기능을 다룸
+ SaaS 플랫폼에서 분할하는 데 필요한 연산자(`>=`, `<=`, `<`, `>`, `between`)가 없으므로 필드 기반 분할을 지원할 수 없습니다. `between` 연산자를 지원하지만 이 연산자를 지원하는 필드는 검색할 수 없습니다. 따라서 필드 기반 분할의 기준이 충족되지 않습니다.
+  페이지 매김을 지원하는 엔터티에 대해 '오프셋' 값을 가져오는 프로비저닝이 없으므로 Mixpanel에 대한 레코드 기반 분할을 지원할 수 없습니다.
+ `Cohorts` 엔터티는 `CreatedDate/Time` 필드만 지원하며 `UpdatedDate/Time`을 식별할 수 있는 필드가 없기 때문에 결과적으로 `DML_Status`를 식별할 수 없습니다. 또한 삭제된 레코드를 식별할 엔드포인트가 없습니다. 따라서 CDC는 지원되지 않습니다.
+  아래 언급된 엔터티에 대해 AWS Glue 작업을 실행하려면 필수 필터가 필요합니다. 엔터티 이름 및 필요한 필터는 아래 표를 참조하세요.  
**엔터티 이름 및 필수 필터**    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/mixpanel-connector-limitations.html)

# Monday에 연결
<a name="connecting-to-monday"></a>

 Monday.com은 프로젝트 관리 및 팀 협업을 간소화하는 다목적 업무 운영 체제입니다. 사용자 지정 가능한 워크플로, 시각적 대시보드 및 자동화 도구로 생산성을 높입니다. 사용자는 하나의 통합 플랫폼에서 작업을 추적하고, 리소스를 관리하며, 효과적으로 커뮤니케이션할 수 있습니다.

**Topics**
+ [AWS Glue의 Monday 지원](monday-support.md)
+ [연결을 생성하고 사용하기 위한 API 작업이 포함된 정책](monday-configuring-iam-permissions.md)
+ [Monday 구성](monday-configuring.md)
+ [Monday 연결 구성](monday-configuring-connections.md)
+ [Monday 엔터티에서 읽기](monday-reading-from-entities.md)
+ [Monday 연결 옵션 참조](monday-connection-options.md)
+ [제한 사항](monday-connector-limitations.md)
+ [새 Monday 계정을 생성합니다.](#monday-account-creation)

# AWS Glue의 Monday 지원
<a name="monday-support"></a>

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

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

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

**지원되는 Monday API 버전**  
 v2.

# 연결을 생성하고 사용하기 위한 API 작업이 포함된 정책
<a name="monday-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 Management Console을 사용하는 경우 AWS Glue 리소스에 대한 전체 액세스 권한을 부여합니다. 이 정책에 지정된 리소스의 이름 변환을 따르면 사용자는 콘솔 전체 용량을 소유합니다. 이 정책은 보통 AWS Glue 콘솔의 사용자에게 해당됩니다.

# Monday 구성
<a name="monday-configuring"></a>

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

## 최소 요구 사항
<a name="monday-configuring-min-requirements"></a>
+  이메일과 암호가 있는 Monday 개발자 계정이 있습니다. 자세한 내용은 [새 Monday 계정을 생성합니다.](connecting-to-monday.md#monday-account-creation) 섹션을 참조하세요.
+  Monday 개발자 계정이 API 액세스에 대해 활성화되어 있습니다. 평가판 기간 내에 추가 비용 없이 모든 Monday API를 사용할 수 있습니다. 평가판 기간이 끝나면 구독을 구입하여 데이터를 생성하고 액세스해야 합니다. 자세한 내용은 [Monday 라이선싱 페이지](https://developer.monday.com/api-reference/reference/about-the-api-reference)를 참조하세요.

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

# Monday 연결 구성
<a name="monday-configuring-connections"></a>

Monday는 인증 메커니즘에 대해 다음 두 가지 유형을 지원합니다.

1.  OAuth 인증: Monday는 OAuth2에 대해 AUTHORIZATION\$1CODE 권한 부여 유형을 지원합니다.
   +  이 권한 부여 유형은 사용자를 인증하기 위해 사용자를 서드파티 권한 부여 서버로 리디렉션하는 방식에 의존하므로 '3각' OAuth로 간주됩니다. AWS Glue 콘솔을 통해 연결을 생성할 때 사용됩니다. 연결을 생성하는 사용자는 기본적으로 Monday instanceurl을 제외한 OAuth 관련 정보를 제공할 필요가 없는 AWS Glue 자체 연결된 앱에 의존할 수 있습니다. AWS Glue 콘솔은 사용자를 Monday로 리디렉션합니다. 사용자가 로그인하고 Monday 인스턴스에 액세스하도록 요청된 권한을 AWS Glue에 허용해야 합니다.
   +  사용자는 AWS Glue 콘솔을 통해 연결을 생성할 때에도 Monday에서 자체 연결된 앱을 생성하고 자체 클라이언트 ID와 클라이언트 보안 암호를 제공하기로 선택해야 합니다. 이 시나리오에서는 여전히 Monday로 리디렉션되어 로그인하고 리소스에 액세스할 수 있는 권한을 AWS Glue에 부여합니다.
   +  이 권한 부여 유형은 새로 고침 토큰과 액세스 토큰을 생성합니다. 액세스 토큰은 1시간 동안 활성 상태가 되고 새로 고침 토큰을 사용하여 사용자 상호 작용 없이 자동으로 새로 고칠 수 있습니다.
   +  자세한 내용은 [AUTHORIZATION\$1CODE OAuth 흐름을 위한 연결된 앱 생성 관련 설명서](https://developers.Monday.com/docs/api/v1/Oauth)를 참조하세요.

1.  사용자 지정 인증: 
   +  사용자 지정 권한 부여에 필요한 API 키 생성에 대한 공개 Monday 설명서는 [https://developer.monday.com/api-reference/docs/authentication\$1api-token-permissions](https://developer.monday.com/api-reference/docs/authentication#api-token-permissions) 페이지를 참조하세요.

다음 단계를 따라 Monday 연결을 구성합니다.

1.  AWS Secrets Manager에서 다음 세부 정보를 사용하여 보안 암호를 생성합니다. AWS Glue에서 각 연결에 대한 보안 암호를 생성해야 합니다.

   1.  OAuth 인증: 
      +  고객 관리형 연결된 앱 - 보안 암호는 키 역할을 하는 USER\$1MANAGED\$1CLIENT\$1APPLICATION\$1CLIENT\$1SECRET과 함께 연결된 앱 소비자 보안 암호를 포함해야 합니다.

   1.  사용자 지정 인증: 
      +  고객 관리형 연결된 앱 - 보안 암호는 키 역할을 하는 `personalAccessToken`과 함께 연결된 앱 소비자 보안 암호를 포함해야 합니다.

1. AWS Glue Studio의 **데이터 연결**에서 아래 단계에 따라 연결을 생성합니다.

   1.  데이터 연결에서 **연결 생성**을 선택합니다.

   1. **데이터 소스**를 선택할 때 Monday를 선택합니다.

   1. Monday **instanceURL**을 입력합니다.

   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.  인증 유형을 선택하여 Monday에 연결 
      +  OAuth 인증: 연결하려는 Monday의 **토큰 URL** 및 **사용자 관리형 클라이언트 애플리케이션 ClientId**를 입력합니다.
      +  사용자 지정 인증: 인증 유형으로 **사용자 지정**을 선택하여 Monday에 연결합니다.

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

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

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

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

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

 **사전 조건** 
+  읽으려는 Monday 객체. 사용 가능한 엔터티를 확인하려면 아래 지원되는 엔터티 테이블을 참조하세요.

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

 엔터티 목록: 
+  Account: [https://developer.monday.com/api-reference/docs/account\$1queries](https://developer.monday.com/api-reference/docs/account#queries) 
+  Board: [https://developer.monday.com/api-reference/docs/boards\$1queries](https://developer.monday.com/api-reference/docs/boards#queries) 
+  Column: [https://developer.monday.com/api-reference/docs/columns\$1queries](https://developer.monday.com/api-reference/docs/columns#queries) 
+  Docs: [https://developer.monday.com/api-reference/docs/docs\$1queries](https://developer.monday.com/api-reference/docs/docs#queries) 
+  Document Block: [https://developer.monday.com/api-reference/docs/blocks\$1queries](https://developer.monday.com/api-reference/docs/blocks#queries) 
+  Files: [https://developer.monday.com/api-reference/docs/files\$1queries](https://developer.monday.com/api-reference/docs/files#queries) 
+  Folders: [https://developer.monday.com/api-reference/docs/folders\$1queries](https://developer.monday.com/api-reference/docs/folders#queries) 
+  Groups: [https://developer.monday.com/api-reference/docs/groups\$1queries](https://developer.monday.com/api-reference/docs/groups#queries) 
+  Item: [https://developer.monday.com/api-reference/docs/items\$1queries](https://developer.monday.com/api-reference/docs/items#queries) 
+  Subitems: [https://developer.monday.com/api-reference/docs/subitems\$1queries](https://developer.monday.com/api-reference/docs/subitems#queries) 
+  Tags: [https://developer.monday.com/api-reference/docs/tags-queries\$1queries](https://developer.monday.com/api-reference/docs/tags-queries#queries) 
+  Teams: [https://developer.monday.com/api-reference/docs/teams\$1queries](https://developer.monday.com/api-reference/docs/teams#queries) 
+  Updates: [https://developer.monday.com/api-reference/docs/updates\$1queries](https://developer.monday.com/api-reference/docs/updates#queries) 
+  Users: [https://developer.monday.com/api-reference/docs/users\$1queries](https://developer.monday.com/api-reference/docs/users#queries) 
+  Workspaces: [https://developer.monday.com/api-reference/docs/workspaces\$1queries](https://developer.monday.com/api-reference/docs/workspaces#queries) 


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| Account | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Boards | 예 | 예 | 아니요 | 예 | 아니요 | 
| 열 | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Docs | 예 | 예 | 아니요 | 예 | 아니요 | 
| Document Blocks | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| 파일 | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Groups | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Item | 예 | 예 | 아니요 | 예 | 아니요 | 
| Subitems | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Tags | 예 | 아니요 | 아니요 | 예 | 예 | 
| 팀 | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| 업데이트 | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| Users | 예 | 예 | 아니요 | 예 | 아니요 | 
| WorkSpaces | 예 | 예 | 아니요 | 예 | 아니요 | 
| 폴더 | 예 | 예 | 아니요 | 예 | 아니요 | 

 **예제** 

```
monday_read = glueContext.create_dynamic_frame.from_options(
     connection_type="monday",
     connection_options={
         "connectionName": "connectionName",
         "ENTITY_NAME": "account",
         "API_VERSION": "v2"
     }
```

# Monday 연결 옵션 참조
<a name="monday-connection-options"></a>

다음은 Monday의 연결 옵션입니다.
+  `ENTITY_NAME`(문자열) - (필수) 읽기/쓰기에 사용됩니다. Monday에서의 객체 이름.
+  `API_VERSION`(문자열) - (필수) 읽기/쓰기에 사용됩니다. 사용하려는 Monday Rest API 버전입니다. 예: v2.
+  `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 객체에 대해 선택할 열.
+  `FILTER_PREDICATE`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.
+  `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리.

# 제한 사항
<a name="monday-connector-limitations"></a>

다음은 Monday 커넥터의 제한 사항입니다.
+  동적 메타데이터 응답은 아래에 언급된 설명서와 일부 충돌합니다.
  +  Group, Column 엔터티는 필터 작업을 지원하지만 동적 메타데이터 엔드포인트에 존재하지 않으므로 필터링할 수 없는 개체로 유지됩니다.
  +  동적 엔드포인트는 약 15,000개 이상의 라인으로 구성되고 단일 응답으로 모든 엔터티의 메타데이터를 반환합니다. 따라서 필드가 로드되는 데 평균 10초가 걸리므로 작업 실행에 더 많은 시간이 필요합니다.
  +  Monday 속도 제한은 아래 표를 참조하세요. 동적 엔터티의 응답 데이터 크기가 크면 상당한 지연이 발생하며, 필드 로드에 평균 10초가 필요합니다.    
<a name="monday-rate-limit-table"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/monday-connector-limitations.html)

## 새 Monday 계정을 생성합니다.
<a name="monday-account-creation"></a>

1.  Monday 홈페이지인 [https://monday.com/](https://monday.com/)으로 이동하고 **Login**을 선택합니다.

1.  로그인 페이지로 리디렉션됩니다. 페이지 하단에서 **Sign up**을 선택합니다.

1.  이메일 주소를 입력하고 **계속**을 선택합니다. 또는 Google을 통해 로그인할 수 있습니다.

1.  필요한 세부 정보를 입력하고 **Continue**를 선택합니다.

1.  설문 조사 질문을 완료하고 단계에 따라 계정 생성 프로세스를 완료합니다.

**OAuth 애플리케이션을 등록합니다.**

1.  monday.com 계정에 로그인합니다. 화면 왼쪽 하단 모서리에 있는 아바타(사진 아이콘)를 클릭합니다.

1.  **Developer**를 선택합니다.

1.  **앱 생성**을 선택합니다.

1.  이름 및 설명에 관한 필수 필드를 입력합니다.

1. 오른쪽에 있는 ‘OAuth’ 섹션으로 이동하여 범위를 추가하고 ‘Save Feature’를 선택합니다.

1.  범위 옆의 ‘Redirect URLS’ 탭으로 이동하여 리디렉션 URL을 추가하고 ‘Save Feature’를 선택합니다.

1.  **Redirect URLs** 탭에서 앱의 URL을 입력합니다. 이 값은 https://\$1region-code\$1.console.aws.amazon.com/appflow/oauth여야 합니다. 예를 들어 `us-east-1 `을 사용하는 경우 `https://us-east-1.console.aws.amazon.com/appflow/oauth`를 추가할 수 있습니다.

1.  이제 애플리케이션을 사용할 준비가 되었습니다. 자격 증명은 ‘Basic Information’ 섹션에서 찾을 수 있습니다. 클라이언트 ID와 클라이언트 보안 암호 문자열을 기록해 둡니다. 이 문자열은 AppFlow 커넥터를 사용하여 이 앱과 연결하는 데 사용됩니다.

**개인 액세스 토큰 생성:**

 현재 monday.com은 개인 토큰인 V2 API 토큰만 제공합니다. API 토큰에 액세스하려면 사용자 수준에 따라 두 가지 방법 중 하나를 사용할 수 있습니다. 관리자 사용자는 두 방법을 모두 활용하여 API 토큰을 획득할 수 있습니다. 멤버 사용자는 Developer 탭에서 API 토큰에 액세스할 수 있습니다.

 관리자 - monday.com 계정의 관리자 사용자인 경우 다음 단계에 따라 ‘Admins’ 탭에서 API 토큰에 액세스할 수 있습니다.

1.  monday.com 계정에 로그인합니다. 화면 왼쪽 하단 모서리에 있는 아바타(사진 아이콘)를 클릭합니다.

1.  이후 표시되는 메뉴에서 ‘Administration’을 선택합니다(관리자 권한이 있어야 함).

1.  ‘API’ 섹션으로 이동하여 ‘API V2 토큰’을 생성합니다. 토큰을 복사하고 사용할 수 있습니다.

 개발자 - monday.com 계정의 멤버 사용자인 경우 다음 단계를 통해 Developer 탭에서 API 토큰에 액세스할 수 있습니다.

1.  monday.com 계정에 로그인합니다. 화면 왼쪽 하단 모서리에 있는 아바타(사진 아이콘)를 클릭합니다.

1.  이후 표시되는 메뉴에서 ‘Developers’를 선택합니다.

1.  상단 메뉴에서 ‘Developer’ 드롭다운 메뉴를 선택합니다. ‘My Access Tokens’ 드롭다운 메뉴에서 첫 번째 옵션을 선택합니다.

# AWS Glue Studio에서 MongoDB에 연결
<a name="connecting-to-data-mongodb"></a>

 AWS Glue에서는 MongoDB를 기본으로 지원합니다. AWS Glue Studio에서는 MongoDB에 연결하고, 데이터 통합 작업을 작성하며, AWS Glue Studio 서버리스 Spark 런타임에서 실행할 수 있는 시각적 인터페이스를 제공합니다.

**Topics**
+ [MongoDB 연결 생성](creating-mongodb-connection.md)
+ [MongoDB 소스 노드 생성](creating-mongodb-source-node.md)
+ [MongoDB 대상 노드 생성](creating-mongodb-target-node.md)
+ [고급 옵션](#creating-mongodb-connection-advanced-options)

# MongoDB 연결 생성
<a name="creating-mongodb-connection"></a>

**사전 조건**:
+ MongoDB 인스턴스가 Amazon VPC에 있는 경우, 퍼블릭 인터넷을 통과하는 트래픽 없이 AWS Glue 작업이 MongoDB 인스턴스와 통신할 수 있도록 Amazon VPC를 구성하십시오.

  Amazon VPC에서 작업을 실행하는 동안 AWS Glue가 사용할 **VPC**, **서브넷** 및 **보안 그룹**을 식별하거나 생성합니다. 또한 MongoDB 인스턴스와 이 위치 간의 네트워크 트래픽을 허용하도록 Amazon VPC를 구성해야 합니다. 네트워크 레이아웃에 따라 보안 그룹 규칙, 네트워크 ACL, NAT 게이트웨이 및 피어링 연결을 변경해야 할 수도 있습니다.

**MongoDB 연결 구성 방법:**

1. 대안으로 AWS Secrets Manager에서 MongoDB 보안 인증을 사용하여 보안 암호를 생성할 수 있습니다. Secrets Manager에서 보안 암호를 생성하려면 AWS Secrets Manager 설명서의 [Create an AWS Secrets Manager secret](https://docs.aws.amazon.com//secretsmanager/latest/userguide/create_secret.html)에서 제공하는 자습서를 따릅니다. 보안 암호를 생성한 후에는 다음 단계를 위해 보안 암호 이름, *secretName*을 유지합니다.
   + **키/값 페어**를 선택하면 값 *mongodbUser*이 포함된 키 `username`에 대한 페어를 생성합니다.

     **키/값 페어**를 선택하면 값 *mongodbPass*가 포함된 키 `password`에 대한 페어를 생성합니다.

1. AWS Glue 콘솔에서 [AWS Glue 연결 추가](console-connections.md)의 단계에 따라 연결을 생성합니다. 연결을 생성한 후에는 AWS Glue에서 이용하기 위해 연결 이름 *connectionName*을 유지합니다.
   + **연결 유형**을 선택할 때에는 **MongoDB** 또는 **MongoDB Atlas**를 선택합니다.
   + **MongoDB URL** 또는 **MongoDB Atlas URL**을 선택할 때에는 MongoDB 인스턴스의 호스트 이름을 제공하십시오.

     MongoDB URL은 `mongodb://mongoHost:mongoPort/mongoDBname` 형식으로 제공됩니다.

     MongoDB Atlas URL은 `mongodb+srv://mongoHost/mongoDBname` 형식으로 제공됩니다.
   + Secrets Manager 암호를 생성하기로 선택한 경우 AWS Secrets Manager **보안 인증 정보 유형**을 선택합니다.

     그런 다음 **AWS 암호**에 *secretName*을 입력합니다.
   + **사용자 이름과 비밀번호**를 제공하기로 선택한 경우 *mongodbUser*와 *mongodbPass*를 제공하십시오.

1. 다음과 같은 상황에서는 추가 구성이 필요할 수도 있습니다.
   + 

     Amazon VPC에서 AWS에 호스팅된 MongoDB 인스턴스의 경우
     + MongoDB 보안 보안 인증 정보를 정의하는 AWS Glue 연결에 Amazon VPC 연결 정보를 제공해야 합니다. 연결을 만들거나 업데이트할 때 **네트워크 옵션**에서 **VPC**, **서브넷** 및 **보안 그룹**을 설정합니다.

AWS Glue MongoDB 연결을 생성한 후에는 AWS Glue 작업을 실행하기 전에 다음 단계를 수행해야 합니다.
+ 비주얼 에디터에서 작업을 수행할 때는 AWS Glue 작업에 대한 Amazon VPC 연결 정보를 제공해야 MongoDB에 연결할 수 있습니다. Amazon VPC에서 적합한 위치를 식별하여 MongoDB AWS Glue 연결에 제공하십시오.
+ Secrets Manager 암호을 생성하기로 선택한 경우, AWS Glue 작업과 연결된 IAM 역할에 *secretName*을 읽을 수 있는 권한을 부여하십시오.

# MongoDB 소스 노드 생성
<a name="creating-mongodb-source-node"></a>

## 필수 전제 조건
<a name="creating-mongodb-source-node-prerequisites"></a>
+ 이전 섹션 [MongoDB 연결 생성](creating-mongodb-connection.md)에서 설명한 AWS Glue MongoDB 연결입니다.
+ Secrets Manager 암호를 생성하기로 선택한 경우 연결에 사용되는 암호를 읽을 수 있는 적절한 작업 권한이 있어야 합니다.
+ 읽으려는 MongoDB 컬렉션. 컬렉션에 대한 식별 정보가 필요합니다.

  MongoDB 컬렉션은 데이터베이스 이름 *mongodbName* 및 컬렉션 이름 *mongodbCollection*으로 식별됩니다.

## MongoDB 데이터 소스 추가
<a name="creating-mongodb-source-node-add"></a>

****데이터 소스 - MongoDB** 노드 추가 방법:**

1.  MongoDB 데이터 소스의 연결을 선택합니다. 생성했으므로 드롭다운에서 사용할 수 있을 것입니다. 연결을 생성해야 하는 경우 **MongoDB 연결 생성**을 선택합니다. 자세한 내용은 이전[MongoDB 연결 생성](creating-mongodb-connection.md) 섹션을 참조하세요.

    연결을 선택한 후에는 **속성 보기**를 클릭하여 연결 속성을 볼 수 있습니다.

1. **데이터베이스**를 선택합니다. *mongodbName*을 입력합니다.

1. **컬렉션**을 선택하십시오. *mongodbCollection*을 입력하십시오.

1. **파티셔너**, **파티션 크기(MB)**, **파티션 키**를 선택합니다. 파티션 파라미터에 대한 자세한 내용은 [소스로서의 "connectionType": "mongodb"](aws-glue-programming-etl-connect-mongodb-home.md#etl-connect-mongodb-as-source) 섹션을 참조하십시오.

1.  **사용자 지정 MongoDB 속성**에서 필요한 경우 파라미터와 값을 입력합니다.

# MongoDB 대상 노드 생성
<a name="creating-mongodb-target-node"></a>

## 필수 전제 조건
<a name="creating-mongodb-target-node-prerequisites"></a>
+ 이전 섹션 [MongoDB 연결 생성](creating-mongodb-connection.md)에서 설명한 대로 AWS Secrets Manager 암호로 구성된 AWS Glue MongoDB 연결입니다.
+ 연결에 사용되는 보안 암호를 읽을 작업에 대한 적절한 권한.
+ 쓰고 싶은 MongoDB 테이블, *tableName*입니다.

## MongoDB 데이터 대상 추가
<a name="creating-mongodb-target-node-add"></a>

****데이터 대상 - MongoDB** 노드 추가 방법:**

1.  MongoDB 데이터 소스의 연결을 선택합니다. 생성했으므로 드롭다운에서 사용할 수 있을 것입니다. 연결을 생성해야 하는 경우 **MongoDB 연결 생성**을 선택합니다. 자세한 내용은 이전[MongoDB 연결 생성](creating-mongodb-connection.md) 섹션을 참조하세요.

    연결을 선택한 후에는 **속성 보기**를 클릭하여 연결 속성을 볼 수 있습니다.

1. **데이터베이스**를 선택합니다. *mongodbName*을 입력합니다.

1. **컬렉션**을 선택하십시오. *mongodbCollection*을 입력하십시오.

1. **파티셔너**, **파티션 크기(MB)**, **파티션 키**를 선택합니다. 파티션 파라미터에 대한 자세한 내용은 [소스로서의 "connectionType": "mongodb"](aws-glue-programming-etl-connect-mongodb-home.md#etl-connect-mongodb-as-source) 섹션을 참조하십시오.

1. 원하는 경우 **쓰기 재시도**를 선택합니다.

1.  **사용자 지정 MongoDB 속성**에서 필요한 경우 파라미터와 값을 입력합니다.

## 고급 옵션
<a name="creating-mongodb-connection-advanced-options"></a>

MongoDB 노드를 생성할 때 고급 옵션을 제공할 수 있습니다. 이 옵션은 Spark 스크립트에 대한 AWS Glue를 프로그래밍할 때 사용할 수 있는 옵션과 동일합니다.

[MongoDB 연결 옵션 참조](aws-glue-programming-etl-connect-mongodb-home.md#aws-glue-programming-etl-connect-mongodb)를 참조하세요.

# Oracle NetSuite에 연결
<a name="connecting-to-data-oracle-netsuite"></a>

Oracle NetSuite는 핵심 프로세스 자동화와 운영 및 재무 성과에 대한 실시간 가시성 제공을 통해 조직의 보다 효과적인 운영을 지원하는 올인원 클라우드 비즈니스 관리 솔루션입니다. 회계 관리, 주문 처리, 재고 관리, 생산, 공급망 및 창고 운영을 관리하기 위한 단일 통합 애플리케이션 제품군을 활용하는 Oracle NetSuite는 기업에 더욱 명확한 데이터 가시성과 엄격한 비즈니스 관리를 제공합니다.

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

# Oracle NetSuite에 대한 AWS Glue 지원
<a name="oracle-netsuite-support"></a>

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

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

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

**지원되는 Oracle NetSuite API 버전**  
다음 Oracle NetSuite API 버전이 지원됩니다.
+ v1

버전별 엔터티 지원은 소스에 대해 지원되는 엔터티를 참조하세요.

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

# Oracle NetSuite 구성
<a name="oracle-netsuite-configuring"></a>

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

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

다음은 최소 요구 사항입니다.
+ Oracle NetSuite 계정이 있습니다. 자세한 내용은 [Oracle NetSuite 계정 생성](#oracle-netsuite-configuring-creating-oracle-netsuite-account) 섹션을 참조하세요.
+ API 액세스에 대해 Oracle NetSuite 계정이 활성화되어 있습니다.
+ Oracle NetSuite 개발자 계정에서 OAuth 2.0 API 통합을 생성했습니다. 이 통합에서는 계정에 대해 인증된 직접 호출을 수행하는 경우 AWS Glue에서 데이터에 안전하게 액세스하는 데 사용하는 클라이언트 자격 증명을 제공합니다. 자세한 내용은 [Oracle NetSuite 클라이언트 앱 및 OAuth 2.0 자격 증명 생성](#oracle-netsuite-configuring-creating-oracle-netsuite-client-app) 섹션을 참조하세요.

이러한 요구 사항을 충족하면 Oracle NetSuite 계정에 AWS Glue를 연결할 준비가 된 것입니다.

## Oracle NetSuite 계정 생성
<a name="oracle-netsuite-configuring-creating-oracle-netsuite-account"></a>

[Oracle NetSuite](https://www.netsuite.com/portal/home.shtml)로 이동하여 **Free Product Tour**를 선택합니다. 필요한 세부 정보를 입력하여 무료 제품 둘러보기를 이용합니다. 여기를 통해 공급업체에 문의할 수 있습니다. 계정 조달 프로세스는 다음과 같습니다.
+ NetSuite 계정의 조달은 공급업체를 통해 수행되며, 이때 공급업체는 법적 검토가 필요한 양식/견적을 제공합니다.
+ Oracle NetSuite 커넥터에 대해 조달할 계정은 **Standard Cloud Service** 계정입니다.
+ 이 계정은 공급업체에서 생성하며 공급업체에서 임시 자격 증명을 공유합니다. NetSuite <billing@notification.netsuite.com> <system@sent-via.netsuite.com>에서 사용자 이름과 같은 세부 정보와 암호를 설정하는 링크가 포함된 환영 메일을 수신합니다.
+ **Set your password** 링크를 사용하여 공급업체에서 제공한 사용자 이름의 암호를 설정합니다.

## Oracle NetSuite 클라이언트 앱 및 OAuth 2.0 자격 증명 생성
<a name="oracle-netsuite-configuring-creating-oracle-netsuite-client-app"></a>

클라이언트 ID 및 클라이언트 보안 암호를 가져오려면 Oracle NetSuite 클라이언트 앱을 생성합니다.

1. [NetSuite 고객 로그인](https://system.netsuite.com/pages/customerlogin.jsp)을 통해 NetSuite 계정에 로그인하세요.

1. **Setup** > **Company** > **Enable features**를 선택하세요.

1. **SuiteCloud** 섹션으로 이동하여 **SuiteTalk (Web Services)** 아래의 **REST WEB SERVICES** 확인란을 선택하세요.

1. **Manage Authentication**에서 **OAUTH 2.0** 확인란을 선택하세요. **저장**을 클릭합니다.

1. **Setup** > **Integration** > **Manage Integrations**로 이동하여 **New**를 선택하여 OAuth2.0 애플리케이션을 생성하세요.

1. 원하는 이름을 입력하고 **STATE**를 Enabled로 유지하세요.

1. 선택하면 **Token-based Authentication** 아래에 표시된 **TBA: AUTHORIZATION FLOW** 및 **TOKEN-BASED AUTHENTICATION** 확인란의 선택을 취소하세요.

1. **OAuth 2.0**에서 **AUTHORIZATION CODE GRANT** 및 **PUBLIC CLIENT** 확인란을 선택하세요.

1. 인증에서 클라이언트 ID 및 클라이언트 암호를 메모합니다.

1. **REDIRECT URI**를 입력하세요. 예: https://us-east-1.console.aws.amazon.com/gluestudio/oauth

1. **SCOPE**에서 **REST WEB SERVICES** 확인란을 선택하세요.

1. **User Credentials**에서 **USER CREDENTIALS** 확인란을 선택하세요. **저장**을 선택합니다.

1. **Client Credentials**에서 소비자 키/클라이언트 ID 및 소비자 보안 암호/클라이언트 보안 암호를 기록하세요. 이러한 값은 한 번만 표시됩니다.

1. 필요한 경우 **User/Roles** > **Manage Roles** > **New**로 이동하여 관리자 역할을 생성하세요.

1. 사용자 지정 역할을 생성하는 동안 **Permissions** 탭에서 다음 엔터티/기능에 대한 전체 액세스를 추가하세요.
   + 'Deposit', 'Items', 'Item Fulfillment', 'Make Journal Entry', 'Purchase Order', 'Subsidiaries', 'Vendors', 'Bills', 'Vendor Return Authorization', 'Track Time', 'Customer Payment', 'Custom Record Entries', 'Custom Record Types', 'REST Web Services', 'OAuth 2.0 Authorized Applications Management', 'Custom Entity Fields', 'Log in using OAuth 2.0 Access Tokens'.

자세한 내용은 NetSuite Applications Suite 설명서의 [OAuth 2.0](https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/chapter_157769826287.html)을 참조하세요.

# Oracle NetSuite 연결 구성
<a name="oracle-netsuite-configuring-connections"></a>

Oracle NetSuite에서는 OAuth2에 대한 AUTHORIZATION\$1CODE 권한 부여 유형을 지원합니다. 권한 부여 유형은 AWS Glue에서 Oracle NetSuite와 통신하여 데이터에 대한 액세스를 요청하는 방법을 결정합니다.
+ 이 권한 부여 유형은 사용자를 인증하기 위해 사용자를 서드파티 권한 부여 서버로 리디렉션하는 방식에 의존하므로 '3각' OAuth로 간주됩니다. AWS Glue 콘솔을 통해 연결을 생성할 때 사용됩니다. 연결을 생성하는 사용자는 기본적으로 Oracle NetSuite 인스턴스 URL을 제외한 OAuth 관련 정보를 제공할 필요가 없는 AWS Glue 자체 연결된 앱(AWS Glue 관리형 클라이언트 애플리케이션)에 의존할 수 있습니다. AWS Glue 콘솔은 사용자를 Oracle NetSuite로 리디렉션합니다. 사용자가 Oracle NetSuite에 로그인하고 Salesforce 인스턴스에 액세스하도록 요청된 권한을 AWS Glue에 허용해야 합니다.
+ 사용자는 여전히 AWS Glue 콘솔을 통해 연결을 생성할 때에도 Oracle NetSuite에서 자체 연결된 앱을 생성하고 자체 클라이언트 ID와 클라이언트 보안 암호를 제공하기로 선택할 수 있습니다. 이 시나리오에서는 여전히 Oracle NetSuite로 리디렉션되어 로그인하고 리소스에 액세스할 수 있는 권한을 AWS Glue에 부여합니다.
+ 이 권한 부여 유형은 새로 고침 토큰과 액세스 토큰을 생성합니다. 액세스 토큰은 수명이 짧으며 새로 고침 토큰을 사용하여 사용자 상호 작용 없이 자동으로 새로 고칠 수 있습니다.
+ 권한 부여 코드 OAuth 흐름을 위한 연결된 앱 생성에 대한 퍼블릭 Oracle NetSuite 설명서는 [Public apps](https://developers.oracle-netsuite.com/docs/api/creating-an-app)를 참조하세요.

Oracle NetSuite 연결을 구성하는 방법:

1. AWS Secrets Manager에서 다음 세부 정보로 보안 암호를 생성합니다.

   1. 고객 관리형 연결된 앱의 경우 보안 암호는 키 역할을 하는 `USER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET`과 함께 연결된 앱 소비자 보안 암호를 포함해야 합니다.

   1. 참고: AWS Glue에서 연결에 대한 보안 암호를 생성해야 합니다.

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

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

   1. Oracle NetSuite 환경을 제공합니다.

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

# Oracle NetSuite 엔터티에서 읽기
<a name="oracle-netsuite-reading-from-entities"></a>

**사전 조건**

읽으려는 Oracle NetSuite 객체. 객체 이름(예: `deposit` 또는 `timebill`)이 필요합니다. 다음 표에는 지원되는 엔터티가 나와 있습니다.

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


| 개체 | 필터링 가능 | 정렬 기준 지원 | 제한 지원 | SELECT \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| 입금 | 예 | 아니요 | 예 | 예 | 예 | 
| 설명 항목 | 예 | 아니요 | 예 | 예 | 예 | 
| 인벤토리 항목 | 예 | 아니요 | 예 | 예 | 예 | 
| 항목 이행 | 예 | 아니요 | 예 | 예 | 예 | 
| 항목 그룹 | 예 | 아니요 | 예 | 예 | 예 | 
| 저널 항목 | 예 | 아니요 | 예 | 예 | 예 | 
| 인벤토리 외 구매 항목 | 예 | 아니요 | 예 | 예 | 예 | 
| 인벤토리 외 재판매 항목 | 예 | 아니요 | 예 | 예 | 예 | 
| 인벤토리 외 판매 항목 | 예 | 아니요 | 예 | 예 | 예 | 
| Purchase Order | 예 | 아니요 | 예 | 예 | 예 | 
| 자회사 | 예 | 아니요 | 예 | 예 | 예 | 
| Vendor | 예 | 아니요 | 예 | 예 | 예 | 
| 공급업체 청구서 | 예 | 아니요 | 예 | 예 | 예 | 
| 공급업체 반환 권한 부여 | 예 | 아니요 | 예 | 예 | 예 | 
| 시간 청구서 | 예 | 아니요 | 예 | 예 | 예 | 
| 고객 결제 | 예 | 아니요 | 예 | 예 | 예 | 
| 이행 요청 | 예 | 아니요 | 예 | 예 | 예 | 
| Item | 예 | 예 | 예 | 예 | 예 | 
| Transaction Line | 예 | 예 | 예 | 예 | 예 | 
| Transaction Accounting Line | 예 | 예 | 예 | 예 | 예 | 
| Custom Record Types (Dynamic) | 예 | 예 | 예 | 예 | 예 | 

**예시:**

```
netsuiteerp_read = glueContext.create_dynamic_frame.from_options(
    connection_type="netsuiteerp",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "deposit",
        "API_VERSION": "v1"
    }
)
```

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

Oracle NetSuite에서는 선택한 엔터티 아래에서 사용 가능한 필드를 동적으로 로드합니다. 필드의 데이터 유형에 따라 다음 필터 연산자를 지원합니다.


| 필드 데이터 유형 | 지원되는 필터 연산자 | 
| --- | --- | 
| String | LIKE, =, \$1= | 
| 날짜 | BETWEEN, =, <, <=, >, >= | 
| DateTime | BETWEEN, <, <=, >, >= | 
| Numeric |  =, \$1=, <, <=, >, >= | 
| 불 |  =, \$1= | 

**필터 표현식의 부울 값에 대한 예상 입력 형식**:


| 개체 | 부울 "true" 값 형식 | 부울 "false" 값 형식 | 예시 | 
| --- | --- | --- | --- | 
| Item, Transaction Line, Transaction Accounting Line, Custom Record Type 엔터티 | T 또는 t | F 또는 f | isinactive = "T" 또는 isinactive = "t" | 
| 기타 모든 엔터티 | true | false | isinactive = true | 

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

**필드 기반 분할**

Oracle NetSuite 커넥터에는 동적 메타데이터가 있으므로 필드 기반 분할에 대해 지원되는 필드가 동적으로 선택됩니다. 필드 기반 분할은 정수, BigInteger, 날짜 또는 DateTime와 같은 데이터 유형을 사용하는 필드에서 지원됩니다.

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

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

  유효한 값의 예제:

  ```
  "TIMESTAMP \"1707256978123\""
  "TIMESTAMP \"1702600882\""
  "TIMESTAMP '2024-02-06T22:00:00:00.000Z'"
  "TIMESTAMP '2024-02-06T22:00:00:00Z'"
  "TIMESTAMP '2024-02-06'"
  ```
+ `UPPER_BOUND`: 선택한 파티션 필드의 상한 값(**경계 제외**).
+ `NUM_PARTITIONS`: 파티션 수.

예시:

```
netsuiteerp_read = glueContext.create_dynamic_frame.from_options(
    connection_type="netsuiteerp",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "deposit",
        "API_VERSION": "v1",
        "PARTITION_FIELD": "id",
        "LOWER_BOUND": "1",
        "UPPER_BOUND": "10000",
        "NUM_PARTITIONS": "10"
    }
```

**레코드 기반 분할**

Spark에서 동시성을 활용하려는 경우 추가 Spark 옵션(`NUM_PARTITIONS`)을 제공할 수 있습니다. 이 파라미터를 사용하면 Spark 태스크에서 동시에 실행할 수 있는 `NUM_PARTITIONS`개의 하위 쿼리로 원본 쿼리가 분할됩니다.

레코드 기반 분할에서는 존재하는 총 레코드 수를 Oracle NetSuite API에서 쿼리하고 제공된 `NUM_PARTITIONS` 수로 나눕니다. 그런 다음, 결과 레코드 수를 각 하위 쿼리에서 동시에 가져옵니다.
+ `NUM_PARTITIONS`: 파티션 수.

예시:

```
netsuiteerp_read = glueContext.create_dynamic_frame.from_options(
    connection_type="netsuiteerp",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "deposit",
        "API_VERSION": "v1",
        "NUM_PARTITIONS": "3"
    }
```

# Oracle NetSuite 연결 옵션
<a name="oracle-netsuite-connection-options"></a>

다음은 Oracle NetSuite의 연결 옵션입니다.
+ `ENTITY_NAME`(문자열) - (필수) 읽기에 사용됩니다. Oracle NetSuite 엔터티의 이름. 예: deposit.
+ `API_VERSION`(문자열) - (필수) 읽기에 사용됩니다. 사용하려는 Oracle NetSuite Rest API 버전. Oracle NetSuite에서는 현재 버전 v1만 지원하므로 값은 v1입니다.
+ `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 선택한 엔터티에 대해 선택할 열의 쉼표로 구분된 목록.
+ `FILTER_PREDICATE`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.
+ `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리.
+ `PARTITION_FIELD`(문자열) - 읽기에 사용됩니다. 쿼리를 분할하는 데 사용할 필드(필드 기반 분할).
+ `LOWER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 하한 값(경계 포함)으로 필드 기반 분할에 사용됩니다.
+ `UPPER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 상한 값(경계 제외)으로 필드 기반 분할에 사용됩니다.
+ `NUM_PARTITIONS`(정수) - 기본값: 1. 읽기에 사용됩니다. 읽을 파티션 수. 필드 기반 분할 및 레코드 기반 분할 모두에 사용됩니다.
+ `INSTANCEE_URL`(문자열) - https://\$1account-id\$1.suitetalk.api.netsuite.com 형식의 유효한 NetSuite 인스턴스 URL.

# Oracle NetSuite 커넥터 제한 사항 및 참고 사항
<a name="oracle-netsuite-connector-limitations"></a>

다음은 Oracle NetSuite 커넥터의 제한 사항 또는 참고 사항입니다.
+ access\$1token 및 refresh\$1token 파라미터의 값은 JSON 웹 토큰(JWT) 형식입니다. access\$1token은 60분 동안 유효하고, refresh\$1token은 7일 동안 유효합니다.
+ 클라이언트 ID 및 클라이언트 보안 암호 생성 중에 "AUTHORIZATION CODE GRANT"와 함께 "PUBLIC CLIENT"를 선택하면 refresh\$1token은 3시간만 유효하며 일회용입니다.
+ 커넥터를 사용하여 최대 1,00,000개의 레코드를 가져올 수 있습니다. 자세한 내용은 [Executing SuiteQL Queries Through REST Web Services](https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/section_157909186990.html)를 참조하세요.
+ 파티션은 각 파티션이 1,000의 배수로 레코드를 가져오도록 생성됩니다. 단, 남은 레코드를 가져오는 마지막 파티션은 예외입니다.
+ Item, Transaction Line, Transaction Accounting Line 객체의 경우 커넥터는 다음과 같은 이유로 몇 가지 연산자를 지원하지 않습니다.
  + Date 유형의 필드에 `EQUAL_TO`, `NOT_EQUAL_TO` 필터 연산자를 적용하면 신뢰할 수 없는 결과가 제공됩니다.
  + Date 유형의 필드에 `LESS_THAN_OR_EQUAL_TO` 필터 연산자를 적용하면 신뢰할 수 없는 결과가 제공되고 `LESS_THAN` 연산자와 유사하게 동작합니다.
  + Date= 유형의 필드에 `GREATER_THAN` 필터 연산자를 적용하면 신뢰할 수 없는 결과가 제공되고 `GREATER_THAN_OR_EQUAL_TO` 연산자와 유사하게 동작합니다.
+ Item, Transaction Line, Transaction Accounting Line, Custom Record Type 객체의 경우 부울 값은 표준 true/false 대신 T/F 형식으로 제공됩니다. 커넥터는 t/f 값을 true/false로 매핑하여 데이터의 일관성을 보장합니다.

# AWS Glue Studio에서 OpenSearch Service에 연결
<a name="connecting-to-data-opensearch"></a>

 AWS Glue에서는 Amazon OpenSearch Service를 기본으로 지원합니다. AWS Glue Studio에서는 Amazon OpenSearch Service에 연결하고, 데이터 통합 작업을 작성하며, AWS Glue Studio 서버리스 Spark 런타임에서 실행할 수 있는 시각적 인터페이스를 제공합니다. 이 기능은 OpenSearch Service 서버리스와 호환되지 않습니다.

 AWS Glue Studio에서 Amazon OpenSearch Service용 통합 연결을 생성합니다. 자세한 내용은 [고려 사항](using-connectors-unified-connections.md#using-connectors-unified-connections-considerations) 섹션을 참조하세요.

**Topics**
+ [OpenSearch Service 연결 생성](creating-opensearch-connection.md)
+ [OpenSearch Service 소스 노드 생성](creating-opensearch-source-node.md)
+ [OpenSearch Service 대상 노드 생성](creating-opensearch-target-node.md)
+ [고급 옵션](#creating-opensearch-connection-advanced-options)

# OpenSearch Service 연결 생성
<a name="creating-opensearch-connection"></a>

**사전 조건** 
+ Amazon OpenSearch Service 설명서의 지침에 따라 읽으려는 도메인 엔드포인트, *aosEndpoint* 및 포트, *aosPort*를 식별하거나 리소스를 생성하십시오. 도메인 생성에 관해 자세한 내용을 알아보려면 Amazon OpenSearch Service 설명서의 [Amazon OpenSearch Service 도메인 생성 및 관리](https://docs.aws.amazon.com//opensearch-service/latest/developerguide/createupdatedomains.html)를 참조하십시오.

  Amazon OpenSearch Service 도메인 엔드포인트는 기본 형식이 https://search-*domainName*-*unstructuredIdContent*.*region*.es.amazonaws.com입니다. 도메인 엔드포인트에 관해 자세한 내용을 알아보려면 Amazon OpenSearch Service 설명서의 [Amazon OpenSearch Service 도메인 생성 및 관리](https://docs.aws.amazon.com//opensearch-service/latest/developerguide/createupdatedomains.html)를 참조하십시오.

  도메인의 HTTP 기본 보안 인증 정보, *aosUser*와 *aosPassword*를 확인하거나 생성하십시오.

**OpenSearch Service에 대한 연결을 구성하는 방법:**

1. AWS Secrets Manager에서 OpenSearch 보안 인증을 사용하여 보안 암호를 생성합니다. Secrets Manager에서 보안 암호를 생성하려면 AWS Secrets Manager 설명서의 [Create an AWS Secrets Manager secret](https://docs.aws.amazon.com//secretsmanager/latest/userguide/create_secret.html)에서 제공하는 자습서를 따릅니다. 보안 암호를 생성한 후에는 다음 단계를 위해 보안 암호 이름, *secretName*을 유지합니다.
   + **키/값 페어**를 선택하면 값 *aosUser*이 포함된 키 `USERNAME`에 대한 페어를 생성합니다.
   + **키/값 페어**를 선택하면 값 *aosPassword*이 포함된 키 `PASSWORD`에 대한 페어를 생성합니다.

1. AWS Glue 콘솔에서 [AWS Glue 연결 추가](console-connections.md)의 단계에 따라 연결을 생성합니다. 연결을 생성한 후에는 AWS Glue에서 이용하기 위해 연결 이름 *connectionName*을 유지합니다.
   + **연결 유형**을 선택할 때는 OpenSearch Service를 선택합니다.
   + 도메인 엔드포인트를 선택할 때는 *aosEndpoint*를 제공하십시오.
   + 포트를 선택할 때는 *aosPort*를 제공하십시오.
   + **AWS 보안 암호**를 선택할 때 *secretName*을 입력합니다.

# OpenSearch Service 소스 노드 생성
<a name="creating-opensearch-source-node"></a>

## 필수 전제 조건
<a name="creating-opensearch-source-node-prerequisites"></a>
+ 이전 섹션 [OpenSearch Service 연결 생성](creating-opensearch-connection.md)에서 설명한 대로 AWS Secrets Manager 암호로 구성된 AWS Glue OpenSearch Service 연결입니다.
+ 연결에 사용되는 보안 암호를 읽을 작업에 대한 적절한 권한.
+ 읽으려는 OpenSearch Service 인덱스, *aosIndex*.

## OpenSearch Service 데이터 소스 추가
<a name="creating-opensearch-source-node-add"></a>

****데이터 소스 - OpenSearch Service** 노드를 추가하는 방법:**

1.  OpenSearch Service 데이터 소스의 연결을 선택합니다. 생성했으므로 드롭다운에서 사용할 수 있을 것입니다. 연결을 생성해야 하는 경우 **OpenSearch Service 연결 생성**을 선택합니다. 자세한 내용은 이전[OpenSearch Service 연결 생성](creating-opensearch-connection.md) 섹션을 참조하세요.

    연결을 선택한 후에는 **속성 보기**를 클릭하여 연결 속성을 볼 수 있습니다.

1. 읽고 싶은 인덱스인 **인덱스**을 입력합니다.

1. 더 구체적인 결과를 제공하기 위해 OpenSearch 쿼리인 **Query**를 제공할 수도 있습니다. OpenSearch 쿼리 작성에 대한 자세한 내용은 [OpenSearch Service 인덱스에서 읽기](aws-glue-programming-etl-connect-opensearch-home.md#aws-glue-programming-etl-connect-opensearch-read)를 참조하십시오.

1.  **사용자 지정 OpenSearch Service 속성**에서 필요한 경우 파라미터와 값을 입력합니다.

# OpenSearch Service 대상 노드 생성
<a name="creating-opensearch-target-node"></a>

## 필수 전제 조건
<a name="creating-opensearch-target-node-prerequisites"></a>
+ 이전 섹션 [OpenSearch Service 연결 생성](creating-opensearch-connection.md)에서 설명한 대로 AWS Secrets Manager 암호로 구성된 AWS Glue OpenSearch Service 연결입니다.
+ 연결에 사용되는 보안 암호를 읽을 작업에 대한 적절한 권한.
+ 쓰려는 OpenSearch Service 인덱스, *aosIndex*.

## OpenSearch Service 데이터 대상 추가
<a name="creating-opensearch-target-node-add"></a>

****데이터 대상을 추가하는 방법 - OpenSearch Service** 노드:**

1.  OpenSearch Service 데이터 소스의 연결을 선택합니다. 생성했으므로 드롭다운에서 사용할 수 있을 것입니다. 연결을 생성해야 하는 경우 **OpenSearch Service 연결 생성**을 선택합니다. 자세한 내용은 이전[OpenSearch Service 연결 생성](creating-opensearch-connection.md) 섹션을 참조하세요.

    연결을 선택한 후에는 **속성 보기**를 클릭하여 연결 속성을 볼 수 있습니다.

1. 읽고 싶은 인덱스인 **인덱스**을 입력합니다.

1.  **사용자 지정 OpenSearch Service 속성**에서 필요한 경우 파라미터와 값을 입력합니다.

## 고급 옵션
<a name="creating-opensearch-connection-advanced-options"></a>

OpenSearch Service 노드를 생성할 때 고급 옵션을 제공할 수 있습니다. 이 옵션은 Spark 스크립트에 대한 AWS Glue를 프로그래밍할 때 사용할 수 있는 옵션과 동일합니다.

[OpenSearch Service 연결](aws-glue-programming-etl-connect-opensearch-home.md)를 참조하세요.

# Okta에 연결
<a name="connecting-to-okta"></a>

 Okta API는 대규모 또는 복잡한 Okta 계정 및 캠페인을 관리하는 데 사용되는 Okta에 대한 프로그래밍 방식 인터페이스입니다. Okta 사용자인 경우 Okta 계정에 AWS Glue를 연결할 수 있습니다. 그런 다음, Okta를 ETL 작업에서의 데이터 소스로 사용할 수 있습니다. 이러한 작업을 실행하여 Okta 및 AWS 서비스 또는 기타 지원되는 애플리케이션 간에 데이터를 전송합니다.

**Topics**
+ [AWS Glue의 Okta 지원](okta-support.md)
+ [연결을 생성하고 사용하기 위한 API 작업이 포함된 정책](okta-configuring-iam-permissions.md)
+ [Okta 구성](okta-configuring.md)
+ [Okta 연결 구성](okta-configuring-connections.md)
+ [Okta 엔터티에서 읽기](okta-reading-from-entities.md)
+ [Okta 연결 옵션 참조](okta-connection-options.md)
+ [Okta 새 계정 및 개발자 앱 생성 단계](okta-create-account.md)
+ [제한 사항](okta-connector-limitations.md)

# AWS Glue의 Okta 지원
<a name="okta-support"></a>

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

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

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

**지원되는 Okta API 버전**  
 v1.

# 연결을 생성하고 사용하기 위한 API 작업이 포함된 정책
<a name="okta-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 Management Console을 사용하는 경우 AWS Glue 리소스에 대한 전체 액세스 권한을 부여합니다. 이 정책에 지정된 리소스의 이름 변환을 따르면 사용자는 콘솔 전체 용량을 소유합니다. 이 정책은 보통 AWS Glue 콘솔의 사용자에게 해당됩니다.

# Okta 구성
<a name="okta-configuring"></a>

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

## 최소 요구 사항
<a name="okta-configuring-min-requirements"></a>
+  Okta 계정이 있습니다. 계정 생성에 대한 자세한 내용은 [Okta 새 계정 및 개발자 앱 생성 단계](okta-create-account.md) 섹션을 참조하세요.
+  Okta 계정이 API 액세스에 대해 활성화되어 있습니다.
+  Okta 계정에 OAuth2 API 통합을 생성했습니다. 이 통합에서는 계정에 대해 인증된 직접 호출을 수행하는 경우 AWS Glue에서 데이터에 안전하게 액세스하는 데 사용하는 클라이언트 자격 증명을 제공합니다. 자세한 내용은 클라이언트 앱 및 OAuth2.0 보안 인증 생성 단계: Okta 새 계정 및 개발자 앱 생성 단계를 참조하세요.
+  OktaApiToken이 있는 Okta 계정이 있습니다. [Okta 설명서](https://developer.okta.com/docs/guides/create-an-api-token/main/#create-the-token)를 참조하세요.

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

# Okta 연결 구성
<a name="okta-configuring-connections"></a>

 Okta는 두 가지 유형의 인증 메커니즘을 지원합니다.
+  OAuth 인증: Okta는 `AUTHORIZATION_CODE` 권한 부여 유형을 지원합니다.
  +  이 권한 부여 유형은 사용자를 인증하기 위해 사용자를 서드파티 권한 부여 서버로 리디렉션하는 방식에 의존하므로 '3각' OAuth로 간주됩니다. AWS Glue 콘솔을 통해 연결을 생성할 때 사용됩니다. AWS Glue 콘솔은 사용자를 Okta로 리디렉션합니다. 사용자가 로그인하고 Okta 인스턴스에 액세스하도록 요청된 권한을 AWS Glue에 허용해야 합니다.
  +  사용자는 AWS Glue 콘솔을 통해 연결을 생성할 때에도 Okta에서 자체 연결된 앱을 생성하고 자체 클라이언트 ID와 클라이언트 보안 암호를 제공하기로 선택할 수 있습니다. 이 시나리오에서는 여전히 Okta로 리디렉션되어 로그인하고 리소스에 액세스할 수 있는 권한을 AWS Glue에 부여합니다.
  +  이 권한 부여 유형은 새로 고침 토큰과 액세스 토큰을 생성합니다. 액세스 토큰은 수명이 짧으며 새로 고침 토큰을 사용하여 사용자 상호 작용 없이 자동으로 새로 고칠 수 있습니다.
  +  자세한 내용은 [권한 부여 코드 OAuth 흐름을 위한 연결된 앱 생성의 공개 Okta 설명서](https://developers.google.com/workspace/guides/create-credentials)를 참조하세요.
+  사용자 지정 인증: 
  +  사용자 지정 인증에 필요한 API 키 생성에 대한 공개 Okta 설명서는 [Okta 설명서](https://developer.okta.com/docs/guides/create-an-api-token/main/#create-the-token)를 참조하세요.

다음 단계를 따라 Okta 연결을 구성합니다.

1.  AWS Secrets Manager에서 다음 세부 정보로 보안 암호를 생성하세요. AWS Glue에서 각 연결에 대한 보안 암호를 생성해야 합니다.

   1.  OAuth 인증: 
      +  고객 관리형 연결된 앱의 경우 - 보안 암호는 키 역할을 하는 `USER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET`과 함께 연결된 앱 소비자 보안 암호를 포함해야 합니다.

   1.  사용자 지정 인증: 
      +  고객 관리형 연결된 앱 - 보안 암호는 키 역할을 하는 `OktaApiToken`과 함께 연결된 앱 소비자 보안 암호를 포함해야 합니다.

1. AWS Glue Studio의 **데이터 연결**에서 아래 단계에 따라 연결을 생성합니다.

   1.  연결에서 **연결 생성**을 선택합니다.

   1. **데이터 소스**를 선택할 때 Okta를 선택합니다.

   1. Okta 하위 도메인을 입력합니다.

   1. Okta 계정의 Okta 도메인 URL을 선택합니다.

   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.  인증 유형을 선택하여 데이터 소스에 연결합니다.

   1.  OAuth2 인증 유형의 경우 Okta 앱의 **사용자 관리형 클라이언트 애플리케이션 ClientId**를 입력합니다.

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

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

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

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

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

 **사전 조건** 
+  읽으려는 Okta 객체. 사용 가능한 엔터티를 확인하려면 아래 지원되는 엔터티 테이블을 참조하세요.

 **지원되는 엔터티** 


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| Applications | 예 | 예 | 아니요 | 예 | 아니요 | 
| Devices | 예 | 예 | 아니요 | 예 | 예 | 
| Groups | 예 | 예 | 예 | 예 | 예 | 
| Users | 예 | 예 | 예 | 예 | 예 | 
| User Types | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 

 **예제** 

```
okta_read = glueContext.create_dynamic_frame.from_options(
    connection_type="Okta",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "applications",
        "API_VERSION": "v1"
    }
```

 **Okta 엔터티 및 필드 세부 정보** 

 엔터티 목록: 
+  Application: [https://developer.okta.com/docs/api/openapi/okta-management/management/tag/Application/](https://developer.okta.com/docs/api/openapi/okta-management/management/tag/Application/) 
+  Device: [https://developer.okta.com/docs/api/openapi/okta-management/management/tag/Device/](https://developer.okta.com/docs/api/openapi/okta-management/management/tag/Device/) 
+  Group: [https://developer.okta.com/docs/api/openapi/okta-management/management/tag/Group/](https://developer.okta.com/docs/api/openapi/okta-management/management/tag/Group/) 
+  User: [https://developer.okta.com/docs/api/openapi/okta-management/management/tag/User/](https://developer.okta.com/docs/api/openapi/okta-management/management/tag/User/) 
+  User Type: [https://developer.okta.com/docs/api/openapi/okta-management/management/tag/UserType/](https://developer.okta.com/docs/api/openapi/okta-management/management/tag/UserType/) 

 **분할 쿼리** 

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

   날짜의 경우 Spark SQL 쿼리에 사용된 Spark 날짜 형식을 허용합니다. 유효한 값의 예제: `"2024-02-06"`.
+  `UPPER_BOUND`: 선택한 파티션 필드의 상한 값(경계 제외).
+  `NUM_PARTITIONS`: 파티션 수.

 **예제** 

```
okta_read = glueContext.create_dynamic_frame.from_options(
    connection_type="okta",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "lastUpdated",
        "API_VERSION": "v1",
        "PARTITION_FIELD": "lastMembershipUpdated"
        "LOWER_BOUND": "2022-08-10T10:28:46.000Z"
        "UPPER_BOUND": "2024-08-10T10:28:46.000Z"
        "NUM_PARTITIONS": "10"
    }
```

# Okta 연결 옵션 참조
<a name="okta-connection-options"></a>

다음은 Okta의 연결 옵션입니다.
+  `ENTITY_NAME`(문자열) - (필수) 읽기/쓰기에 사용됩니다. Okta에서의 객체 이름.
+  `API_VERSION`(문자열) - (필수) 읽기/쓰기에 사용됩니다. 사용하려는 Okta Rest API 버전입니다. 예: v1.
+  `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 객체에 대해 선택할 열.
+  `FILTER_PREDICATE`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.
+  `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리.
+  `PARTITION_FIELD`(문자열) - 읽기에 사용됩니다. 쿼리 분할에 사용할 필드입니다.
+  `LOWER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 하한 값(경계 포함).
+  `UPPER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 상한 값(경계 제외).
+  `NUM_PARTITIONS`(정수) - 기본값: 1. 읽기에 사용됩니다. 읽을 파티션 수.

# Okta 새 계정 및 개발자 앱 생성 단계
<a name="okta-create-account"></a>

 Okta API에 액세스할 수 있도록 Okta에서 개발자 계정을 생성합니다. 무료 Okta 개발자 계정을 사용하면 Okt API에 액세스하는 데 필요한 대부분의 주요 개발자 기능에 액세스할 수 있습니다.

**Okta에서 개발자 계정 생성**

1.  [https://developer.okta.com/signup/](https://console.cloud.google.com) 페이지로 이동합니다.

1.  계정 정보 이메일, 이름, 성 및 국가/지역을 입력합니다. **I’m not a robot**을 선택하고 **Signup**을 선택합니다.

1.  확인 메일이 등록된 메일 ID로 전송됩니다. Okta 개발자 계정을 활성화하기 위한 링크가 이메일로 전송됩니다. **활성화**를 선택합니다.

1.  암호 재설정 페이지로 리디렉션됩니다. 새 암호를 두 번 입력하고 **Reset password**를 선택합니다.

1.  Okta 개발자 계정 대시보드로 리디렉션됩니다.

**클라이언트 앱 및 OAuth 2.0 자격 증명 생성**

1.  개발자 대시보드에서 앱 통합 생성을 선택합니다.  
![\[스크린샷은 Create OAuth client ID 페이지와 Authorised redirect URIs 섹션을 보여줍니다. 여기에서 URI를 추가하고, 필요한 경우 ADD URI를 선택합니다. 완료되면 CREATE를 선택합니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/create-client-app-step-1.png)

1.  **Create a new app Integration** 창이 표시되고 다양한 로그인 방법이 표시됩니다. **OIDC –OpenID Connect**를 선택합니다.

1.  Application type 섹션으로 스크롤합니다. **Web Application**으로 선택하고 **Next**를 선택합니다.

1.  ‘New Web App Integration’ 화면에서 다음 정보를 입력합니다.
   + App integration name - 앱의 이름을 입력합니다.
   + Grant type - 목록에서 **Authorization Code** 및 **Refresh Token**을 선택합니다.
   + Sign-in redirect URIs - **Add URI**를 선택하고 `https://{regioncode}.console.aws.amazon.com/appflow/oauth`를 추가합니다. 예를 들어 `us-west-2 (Oregon)`을 사용하는 경우 `https://us-east-1.console.aws.amazon.com/appflow/oauth`를 추가할 수 있습니다.
   + Controlled Access - 필요에 따라 사용자 그룹에 앱을 할당하고 **Save**를 선택합니다.

1. 클라이언트 ID와 클라이언트 보안 암호가 생성됩니다.

# 제한 사항
<a name="okta-connector-limitations"></a>

다음은 Okta 커넥터의 제한 사항입니다.
+  ‘Applications’ 엔터티의 경우 1개의 필터만 적용할 수 있습니다. 2개 이상의 필터가 적용되는 경우 400 Bad Request가 오류 요약 - ‘Invalid Search criteria’와 함께 반환됩니다.
+  순서 기준은 검색 쿼리에서만 지원될 수 있습니다. 예: ` http://dev-15940405.okta.com/api/v1/groups?search=type e.q. "OKTA_GROUP"&sortBy=lastUpdated&sortOrder=asc ` 

# PayPal에 연결
<a name="connecting-to-data-paypal"></a>

PayPal은 고객과 온라인 공급업체 간의 이체와 같이 당사자 간의 온라인 자금 이체를 용이하게 하는 결제 시스템입니다. PayPal 사용자인 경우 계정에 지급인, 날짜 및 상태와 같은 거래에 관한 데이터가 포함되어 있습니다. AWS Glue를 사용하여 PayPal에서 특정 AWS 서비스 또는 기타 지원되는 애플리케이션으로 데이터를 전송할 수 있습니다.

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

# AWS Glue의 PayPal 지원
<a name="paypal-support"></a>

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

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

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

**지원되는 PayPal API 버전**  
다음 PayPal API 버전이 지원됩니다.
+ v1

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

# PayPal 구성
<a name="paypal-configuring"></a>

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

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

다음은 최소 요구 사항입니다.
+ 클라이언트 자격 증명을 사용하는 PayPal 계정이 있습니다.
+ PayPal 계정에 유효한 라이선스가 있는 API 액세스 권한이 있습니다.

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

# PayPal 연결 구성
<a name="paypal-configuring-connections"></a>

PayPal은 OAuth2에 대한 CLIENT CREDENTIALS 권한 부여 유형을 지원합니다.
+ 이 권한 부여 유형은 클라이언트가 사용자의 컨텍스트 외부에서 액세스 토큰을 얻는 데 사용하므로 2각 OAuth 2.0으로 간주됩니다. AWS Glue는 클라이언트 ID와 클라이언트 암호를 사용하여 사용자가 정의한 사용자 지정 서비스에서 제공하는 PayPal API를 인증할 수 있습니다.
+ 각 사용자 지정 서비스는 API 전용 사용자가 소유하며, API 전용 사용자는 서비스에 특정 작업을 수행하도록 권한을 부여하는 역할 및 권한 집합을 가집니다. 액세스 토큰은 단일 사용자 지정 서비스와 연결됩니다.
+ 이 권한 부여 유형으로 인해 액세스 토큰이 수명이 짧아지고 `/v2/oauth2/token` 엔드포인트를 다시 직접적으로 호출하여 갱신할 수 있습니다.
+ 클라이언트 자격 증명이 있는 OAuth 2.0에 대한 퍼블릭 PayPal 설명서는 [Authentication](https://developer.paypal.com/api/rest/authentication/)을 참조하세요.

PayPal 연결을 구성하는 방법:

1. AWS Secrets Manager에서 다음 세부 정보로 보안 암호를 생성합니다.

   1. 고객 관리형 연결된 앱의 경우 보안 암호는 키 역할을 하는 `USER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET`과 함께 연결된 앱 소비자 보안 암호를 포함해야 합니다.

   1. 참고: AWS Glue에서 연결의 보안 암호를 생성해야 합니다.

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

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

   1. 연결하려는 PayPal 인스턴스의 `INSTANCE_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`을 읽을 수 있는 권한을 부여합니다.

## OAuth 2.0 자격 증명 가져오기
<a name="paypal-getting-oauth-20-credentials"></a>

Rest API를 호출하려면 클라이언트 ID와 클라이언트 보안 암호를 액세스 토큰으로 교환해야 합니다. 자세한 내용은 [PayPal REST API 시작하기](https://developer.paypal.com/api/rest/)를 참조하세요.

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

**사전 조건**

읽으려는 PayPal 객체입니다. 객체 이름, `transaction`이 필요합니다.

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


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| transaction | 예 | 예 | 아니요 | 예 | 예 | 

**예시:**

```
paypal_read = glueContext.create_dynamic_frame.from_options(
    connection_type="paypal",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "transaction",
        "API_VERSION": "v1",
        "INSTANCE_URL": "https://api-m.paypal.com"
    }
```

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

정적 메타데이터를 포함하는 엔터티:

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

## 쿼리 파티셔닝
<a name="paypal-reading-partitioning-queries"></a>

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

  Datetime 필드의 경우 ISO 형식의 값이 허용됩니다.

  유효한 값의 예제:

  ```
  "2024-07-01T00:00:00.000Z"
  ```
+ `UPPER_BOUND`: 선택한 파티션 필드의 상한 값(**경계 제외**).
+ `NUM_PARTITIONS`: 파티션 수.

엔터티별 분할에는 다음 필드가 지원됩니다.


| 엔터티 이름 | 분할 필드 | 데이터 유형 | 
| --- | --- | --- | 
| transaction | transaction\$1initiation\$1date | DateTime | 

예시:

```
paypal_read = glueContext.create_dynamic_frame.from_options(
    connection_type="paypal",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "transaction",
        "API_VERSION": "v1",
        "PARTITION_FIELD": "transaction_initiation_date"
        "LOWER_BOUND": "2024-07-01T00:00:00.000Z"
        "UPPER_BOUND": "2024-07-02T00:00:00.000Z"
        "NUM_PARTITIONS": "10"
    }
```

# PayPal 연결 옵션 수정
<a name="paypal-connection-options"></a>

다음은 PayPal의 연결 옵션입니다.
+ `ENTITY_NAME`(문자열) - (필수) 읽기에 사용됩니다. PayPal에서의 객체 이름입니다.
+ `API_VERSION`(문자열) - (필수) 읽기에 사용됩니다. 사용할 PayPal Rest API 버전입니다.
+ `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 객체에 대해 선택할 열.
+ `FILTER_PREDICATE`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.
+ `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리.
+ `PARTITION_FIELD`(문자열) - 읽기에 사용됩니다. 쿼리 분할에 사용할 필드입니다.
+ `LOWER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 하한 값(경계 포함).
+ `UPPER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 상한 값(경계 제외).
+ `NUM_PARTITIONS`(정수) - 기본값: 1. 읽기에 사용됩니다. 읽을 파티션 수.

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

다음은 PayPal 커넥터의 제한 사항입니다.
+ [PayPal 거래 설명서](https://developer.paypal.com/docs/api/transaction-search/v1/#search_get)에 따르면 실행된 거래가 거래 내역 직접 호출에 표시되는 데 최대 3시간이 걸린다고 나와 있습니다. 그러나 [https://developer.paypal.com/docs/api/transaction-search/v1/#search_get:~:text=last_refreshed_datetime](https://developer.paypal.com/docs/api/transaction-search/v1/#search_get:~:text=last_refreshed_datetime)에 따라 시간이 더 걸리는 것으로 관찰되었습니다. 여기서 `last_refreshed_datetime`은 API에서 데이터를 사용할 수 있을 때까지의 시간입니다.
+ `last_refreshed_datetime`이 요청된 `end_date`보다 작으면 `end_date`는 해당 시점까지의 데이터만 있으므로 `last_refreshed_datetime`과 같습니다.
+ `transaction_initiation_date` 필드는 `transaction` 엔터티에 제공할 필수 필터이며 이 필드에 [지원되는 최대](https://developer.paypal.com/docs/transaction-search/#:~:text=The%20maximum%20supported%20date%20range%20is%2031%20days.) 날짜 범위는 31일입니다.
+ `transaction_initiation_date` 필드 이외의 필터(쿼리 파라미터)를 사용하여 `transaction` 엔터티 API 요청을 직접적으로 호출하면 [https://developer.paypal.com/docs/api/transaction-search/v1/#search_get:~:text=If%20you%20specify%20one%20or%20more%20optional%20query%20parameters%2C%20the%20ending_balance%20response%20field%20is%20empty.](https://developer.paypal.com/docs/api/transaction-search/v1/#search_get:~:text=If%20you%20specify%20one%20or%20more%20optional%20query%20parameters%2C%20the%20ending_balance%20response%20field%20is%20empty.) 필드 값을 응답에서 가져오지 않을 것으로 예상됩니다.

# Pendo에 연결
<a name="connecting-to-pendo"></a>

Pendo는 사용자 상호 작용 데이터를 저장할 수 있는 풍부한 데이터 스토어를 제공합니다. 고객은 이 데이터를 AWS로 전송하여 다른 제품 데이터와 결합하고, 추가 분석 및 대시보딩을 수행하고, 원하는 경우 알림을 설정할 수 있습니다.

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

# AWS Glue의 Pendo 지원
<a name="pendo-support"></a>

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

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

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

**지원되는 Pendo API 버전**  
 v1 

# 연결을 생성하고 사용하기 위한 API 작업이 포함된 정책
<a name="pendo-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 Management 콘솔을 사용하는 경우 AWS Glue 리소스에 대한 전체 액세스 권한을 부여합니다. 이 정책에 지정된 리소스의 이름 변환을 따르면 사용자는 콘솔 전체 용량을 소유합니다. 이 정책은 보통 AWS Glue 콘솔의 사용자에게 해당됩니다.

# Pendo 구성
<a name="pendo-configuring"></a>

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

## 최소 요구 사항
<a name="pendo-configuring-min-requirements"></a>
+ `write access`가 활성화된 `apiKey`가 있는 Pendo 계정이 있습니다.
+  Pendo 계정에 유효한 라이선스가 있는 API 액세스 권한이 있습니다.

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

# Pendo 연결 구성
<a name="pendo-configuring-connections"></a>

Pendo는 사용자 지정 인증을 지원합니다.

사용자 지정 권한 부여에 필요한 API 키 생성에 대한 공개 Pendo 설명서는 [Authentication – Pendo REST API Documentation](https://engageapi.pendo.io/?bash#getting-started)을 참조하세요.

다음 단계를 따라 Pendo 연결을 구성합니다.

1. AWS Secrets Manager에서 다음 세부 정보로 보안 암호를 생성합니다.
   + 고객 관리형 연결된 앱의 경우 - 보안 암호는 키 역할을 하는 `apiKey`와 함께 연결된 앱 소비자 보안 암호를 포함해야 합니다.
**참고**  
AWS Glue에서 연결당 보안 암호를 생성해야 합니다.

1. AWS Glue Studio의 **데이터 연결**에서 아래 단계에 따라 연결을 생성합니다.

   1. **데이터 소스**를 선택할 때 Pendo를 선택합니다.

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

   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. 토큰을 넣기 위해 AWS Glue에서 이 연결에 사용할 `secretName`을 선택합니다.

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

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

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

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

 **사전 조건** 

읽으려는 Pendo 객체. 사용 가능한 엔터티를 확인하려면 아래 지원되는 엔터티 테이블을 참조하세요.

 **지원되는 엔터티** 
+ [Feature](https://developers.pendo.io/docs/?bash#feature)
+ [Guide](https://developers.pendo.io/docs/?bash#guide)
+ [Page](https://developers.pendo.io/docs/?bash#page)
+ [Report](https://developers.pendo.io/docs/?bash#report)
+ [Report Data](https://developers.pendo.io/docs/?bash#return-report-contents-as-array-of-json-objects)
+ [Visitor](https://developers.pendo.io/docs/?bash#visitor)
+ [Account](https://developers.pendo.io/docs/?bash#entities)
+ [Event](https://developers.pendo.io/docs/?bash#events-grouped)
+ [Feature Event](https://developers.pendo.io/docs/?bash#events-grouped)
+ [Guide Event](https://developers.pendo.io/docs/?bash#events-ungrouped)
+ [Page Event](https://developers.pendo.io/docs/?bash#events-grouped)
+ [Poll Event ](https://developers.pendo.io/docs/?bash#events-ungrouped)
+ [Track Event](https://developers.pendo.io/docs/?bash#events-grouped)


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| Feature | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Guide | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Page | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Report | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Report Data | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Visitor (Aggregation API) | 예 | 아니요 | 예 | 예 | 아니요 | 
| Account (Aggregation API) | 예 | 아니요 | 예 | 예 | 아니요 | 
| Event (Aggregation API) | 예 | 아니요 | 예 | 예 | 아니요 | 
| Feature Event (Aggregation API) | 예 | 아니요 | 예 | 예 | 예 | 
| Guide Event (Aggregation API) | 예 | 아니요 | 예 | 예 | 예 | 
| Account (Aggregation API) | 예 | 아니요 | 예 | 예 | 예 | 
| Page Event (Aggregation API) | 예 | 아니요 | 예 | 예 | 예 | 
| Poll Event (Aggregation API) | 예 | 아니요 | 예 | 예 | 예 | 
| Track Event (Aggregation API) | 예 | 아니요 | 예 | 예 | 예 | 

 **예제** 

```
Pendo_read = glueContext.create_dynamic_frame.from_options(
    connection_type="glue.spark.Pendo",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "feature",
        "API_VERSION": "v1",
        "INSTANCE_URL": "instanceUrl"
    }
```

## 쿼리 파티셔닝
<a name="adobe-marketo-engage-reading-partitioning-queries"></a>

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

  DateTime 필드의 경우 ISO 형식의 값이 허용됩니다.

  유효한 값의 예제:

  ```
  "2024-07-01T00:00:00.000Z"
  ```
+ `UPPER_BOUND`: 선택한 파티션 필드의 상한 값(**경계 제외**).
+ `NUM_PARTITIONS`: 파티션 수.

다음 표에서는 엔터티 분할 필드 지원 세부 정보를 설명합니다.


| 엔터티 이름 | 
| --- | 
| Event | 
|  Feature Event  | 
| Guide Event | 
| Page Event | 
| Poll Event | 
| Track Event | 

예시:

```
pendo_read = glueContext.create_dynamic_frame.from_options(
    connection_type="glue.spark.pendo",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "event",
        "API_VERSION": "v1",
        "INSTANCE_URL": "instanceUrl"
        "NUM_PARTITIONS": "10",
        "PARTITION_FIELD": "appId"
        "LOWER_BOUND": "4656"
        "UPPER_BOUND": "7788"
    }
```

# Pendo 연결 옵션
<a name="pendo-connection-options"></a>

다음은 Pendo에 대한 연결 옵션입니다.
+  `ENTITY_NAME`(문자열) - (필수) 읽기/쓰기에 사용됩니다. Pendo에서의 객체 이름.
+ `INSTANCE_URL`(문자열) - (필수) 다음 값이 허용되는 유효한 Pendo 인스턴스 URL.
  + [기본값](https://app.pendo.io/)
  + [유럽](https://app.eu.pendo.io/)
  + [US1](https://us1.app.pendo.io/)
+ `API_VERSION`(문자열) - (필수) 읽기에 사용됩니다. 사용하려는 Pendo Engage Rest API 버전. 예: 3.0.
+ `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 객체에 대해 선택할 열.
+ `FILTER_PREDICATE`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.
+ `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리.
+ `PARTITION_FIELD`(문자열) - 읽기에 사용됩니다. 쿼리 분할에 사용할 필드입니다.
+ `LOWER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 하한 값(경계 포함).
+ `UPPER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 상한 값(경계 제외).
+ `NUM_PARTITIONS`(정수) - 기본값: 1. 읽기에 사용됩니다. 읽을 파티션 수.

# 제한 사항
<a name="pendo-connector-limitations"></a>

다음은 Pendo 커넥터에 대한 제한 사항입니다.
+ 페이지 매김은 Pendo에서 지원되지 않습니다.
+ 필터링은 Aggregate API 객체(`Account`, `Event`, `Feature Event`, `Guide Events`, `Page Event`, `Poll Event`, `Track Event` 및 `Visitor`)에서만 지원됩니다.
+ DateTimeRange는 Aggregate API 객체(`Event`, `Feature Event`, `Guide Events`, `Page Event`, `Poll Event,` `Track Event`)에 대한 필수 필터 파라미터입니다.
+ dayRange 기간은 시간대의 기간 시작 시점으로 버림됩니다. 예를 들어 제공된 필터가 `2023-01-12T07:55:27.065Z`인 경우 이 기간은 기간의 시작 시점, 즉 `2023-01-12T00:00:00Z`로 버림됩니다.

# Pipedrive에 연결
<a name="connecting-to-pipedrive"></a>

 Pipedrive는 소규모 비즈니스가 리드를 관리하고, 영업 활동을 추적하고, 더 많은 거래를 성사할 수 있도록 설계된 영업 파이프라인 CRM입니다. Pipedrive를 통해 소규모 비즈니스의 영업 팀은 프로세스를 간소화하고 하나의 통합 CRM 영업 도구로 영업 데이터를 통합할 수 있습니다. Pipedrive 사용자인 경우 Pipedrive 계정에 AWS Glue를 연결할 수 있습니다. 그런 다음, Pipedrive를 ETL 작업에서의 데이터 소스로 사용할 수 있습니다. 이러한 작업을 실행하여 Pipedrive 및 AWS 서비스 또는 기타 지원되는 애플리케이션 간에 데이터를 전송합니다.

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

# AWS Glue의 Pipedrive 지원
<a name="pipedrive-support"></a>

AWS Glue는 다음과 같이 Pipedrive를 지원합니다.

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

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

**지원되는 Pipedrive API 버전**  
 v1.

# 연결을 생성하고 사용하기 위한 API 작업이 포함된 정책
<a name="pipedrive-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 Management Console을 사용하는 경우 AWS Glue 리소스에 대한 전체 액세스 권한을 부여합니다. 이 정책에 지정된 리소스의 이름 변환을 따르면 사용자는 콘솔 전체 용량을 소유합니다. 이 정책은 보통 AWS Glue 콘솔의 사용자에게 해당됩니다.

# Pipedrive 구성
<a name="pipedrive-configuring"></a>

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

## 최소 요구 사항
<a name="pipedrive-configuring-min-requirements"></a>
+  Pipedrive 계정이 있습니다.
+  Pipedrive 계정이 API 액세스에 대해 활성화되어 있습니다.

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

# Pipedrive 연결 구성
<a name="pipedrive-configuring-connections"></a>

 Pipedrive에서는 OAuth2에 대한 AUTHORIZATION\$1CODE 권한 부여 유형을 지원합니다.
+  이 권한 부여 유형은 사용자를 인증하기 위해 사용자를 서드파티 권한 부여 서버로 리디렉션하는 방식에 의존하므로 '3각' OAuth로 간주됩니다. AWS Glue 콘솔을 통해 연결을 생성할 때 사용됩니다. 연결을 생성하는 사용자는 기본적으로 Pipedrive instanceurl을 제외한 OAuth 관련 정보를 제공할 필요가 없는 AWS Glue 자체 연결된 앱에 의존할 수 있습니다. AWS Glue 콘솔은 사용자를 Pipedrive로 리디렉션합니다. 사용자가 로그인하고 Pipedrive 인스턴스에 액세스하도록 요청된 권한을 AWS Glue에 허용해야 합니다.
+  사용자는 AWS Glue 콘솔을 통해 연결을 생성할 때에도 Pipedrive에서 자체 연결된 앱을 생성하고 자체 클라이언트 ID와 클라이언트 보안 암호를 제공하기로 선택해야 합니다. 이 시나리오에서는 여전히 Pipedrive로 리디렉션되어 로그인하고 리소스에 액세스할 수 있는 권한을 AWS Glue에 부여합니다.
+  이 권한 부여 유형은 새로 고침 토큰과 액세스 토큰을 생성합니다. 액세스 토큰은 1시간 동안 활성 상태가 되고 새로 고침 토큰을 사용하여 사용자 상호 작용 없이 자동으로 새로 고칠 수 있습니다.
+  자세한 내용은 [AUTHORIZATION\$1CODE OAuth 흐름을 위한 연결된 앱 생성 관련 설명서](https://developers.pipedrive.com/docs/api/v1/Oauth)를 참조하세요.

다음 단계를 따라 Pipedrive 연결을 구성합니다.

1.  AWS Secrets Manager에서 다음 세부 정보로 보안 암호를 생성하세요. AWS Glue에서 각 연결에 대한 보안 암호를 생성해야 합니다.

   1.  고객 관리형 연결된 앱 - 보안 암호는 키 역할을 하는 USER\$1MANAGED\$1CLIENT\$1APPLICATION\$1CLIENT\$1SECRET과 함께 연결된 앱 소비자 보안 암호를 포함해야 합니다.

1. AWS Glue Studio의 **데이터 연결**에서 아래 단계에 따라 연결을 생성합니다.

   1.  데이터 연결에서 **연결 생성**을 선택합니다.

   1. **데이터 소스**를 선택할 때 Pipedrive를 선택합니다.

   1. Pipedrive **instanceURL**을 입력합니다.

   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.  연결하려는 Pipedrive의 사용자 관리형 클라이언트 애플리케이션 ClientId를 입력합니다.

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

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

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

1.  **connectionName**을 입력하고 **다음**을 선택합니다.

1.  다음 페이지에서 **연결 생성**을 선택합니다. Pipedrive에 로그인하라는 메시지가 표시됩니다. 사용자 이름과 암호를 입력하고 **로그인**을 선택합니다.

1.  로그인하면 **앱으로 계속**을 선택합니다. 이제 연결을 사용할 준비가 되었습니다.

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

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

 **사전 조건** 
+  읽으려는 Pipedrive 객체. 사용 가능한 엔터티를 확인하려면 아래 지원되는 엔터티 테이블을 참조하세요.

 **지원되는 엔터티** 


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| Activities | 예 | 예 | 아니요 | 예 | 예 | 
| Activity Type | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Call Logs | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Currencies | 예 | 예 | 아니요 | 예 | 아니요 | 
| Deals | 예 | 예 | 예 | 예 | 예 | 
| Leads | 예 | 예 | 예 | 예 | 아니요 | 
| Lead Sources | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| Lead Labels | 아니요 | 아니요 | 아니요 | 아니요 | 아니요 | 
| Notes | 예 | 예 | 예 | 예 | 예 | 
| Organization | 예 | 예 | 아니요 | 예 | 예 | 
| Permission Sets | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Persons | 예 | 예 | 예 | 예 | 예 | 
| Pipelines | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| Products | 예 | 예 | 아니요 | 예 | 예 | 
| Roles | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| Stages | 예 | 예 | 아니요 | 예 | 아니요 | 
| Users | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 

 **예제** 

```
pipedrive_read= glueContext.create_dynamic_frame.from_options(
    connection_type="PIPEDRIVE",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "activites",
        "API_VERSION": "v1"
    }
```

 **Pipedrive 엔터티 및 필드 세부 정보** 

 엔터티 목록: 
+  Activities: [https://developers.pipedrive.com/docs/api/v1/Activities](https://developers.pipedrive.com/docs/api/v1/Activities) 
+  Activity Type: [https://developers.pipedrive.com/docs/api/v1/ActivityTypes](https://developers.pipedrive.com/docs/api/v1/ActivityTypes) 
+  Call Logs: [https://developers.pipedrive.com/docs/api/v1/CallLogs](https://developers.pipedrive.com/docs/api/v1/CallLogs) 
+  Currencies: [https://developers.pipedrive.com/docs/api/v1/Currencies](https://developers.pipedrive.com/docs/api/v1/Currencies) 
+  Deals: [https://developers.pipedrive.com/docs/api/v1/Deals](https://developers.pipedrive.com/docs/api/v1/Deals) 
+  Leads: [https://developers.pipedrive.com/docs/api/v1/Leads](https://developers.pipedrive.com/docs/api/v1/Leads) 
+  Lead Sources: [https://developers.pipedrive.com/docs/api/v1/LeadSources](https://developers.pipedrive.com/docs/api/v1/LeadSources) 
+  Lead Labels: [https://developers.pipedrive.com/docs/api/v1/LeadLabels](https://developers.pipedrive.com/docs/api/v1/LeadLabels) 
+  Notes: [https://developers.pipedrive.com/docs/api/v1/Notes](https://developers.pipedrive.com/docs/api/v1/Notes) 
+  Organizations: [https://developers.pipedrive.com/docs/api/v1/Organizations](https://developers.pipedrive.com/docs/api/v1/Organizations) 
+  Permission Sets: [https://developers.pipedrive.com/docs/api/v1/PermissionSets](https://developers.pipedrive.com/docs/api/v1/PermissionSets) 
+  Persons: [https://developers.pipedrive.com/docs/api/v1/Persons](https://developers.pipedrive.com/docs/api/v1/Persons) 
+  Pipelines: [https://developers.pipedrive.com/docs/api/v1/Pipelines](https://developers.pipedrive.com/docs/api/v1/Pipelines) 
+  Products: [https://developers.pipedrive.com/docs/api/v1/Products](https://developers.pipedrive.com/docs/api/v1/Products) 
+  Roles: [https://developers.pipedrive.com/docs/api/v1/Roles](https://developers.pipedrive.com/docs/api/v1/Roles) 
+  Stages: [https://developers.pipedrive.com/docs/api/v1/Stages](https://developers.pipedrive.com/docs/api/v1/Stages) 
+  Users: [https://developers.pipedrive.com/docs/api/v1/Users](https://developers.pipedrive.com/docs/api/v1/Users) 


| 개체 | 데이터 형식 | 지원되는 연산자 | 
| --- | --- | --- | 
| Activities, Deals, Notes, Organization, Persons 및 Products. | 날짜 | '=' | 
|  | Integer | '=' | 
|  | String | '=' | 
|  | 부울 | '=' | 

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

 Pipedrive에서는 Activities 엔터티의 필드 하나(due\$1date)만 필드 기반 분할을 지원합니다. 이 필드는 Date 필드입니다.

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

   날짜의 경우 Spark SQL 쿼리에 사용된 Spark 날짜 형식을 허용합니다. 유효한 값의 예제: `"2024-02-06"`.
+  `UPPER_BOUND`: 선택한 파티션 필드의 상한 값(경계 제외).
+  `NUM_PARTITIONS`: 파티션 수.

 **예제** 

```
pipedrive_read = glueContext.create_dynamic_frame.from_options(
    connection_type="PIPEDRIVE",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "activites",
        "API_VERSION": "v1",
        "PARTITION_FIELD": "due_date"
        "LOWER_BOUND": "2023-09-07T02:03:00.000Z"
        "UPPER_BOUND": "2024-05-07T02:03:00.000Z"
        "NUM_PARTITIONS": "10"
    }
```

# Pipedrive 연결 옵션 참조
<a name="pipedrive-connection-options"></a>

다음은 Pipedrive의 연결 옵션입니다.
+  `ENTITY_NAME`(문자열) - (필수) 읽기/쓰기에 사용됩니다. Pipedrive에서의 객체 이름.
+  `API_VERSION`(문자열) - (필수) 읽기/쓰기에 사용됩니다. 사용하려는 Pipedrive Rest API 버전. 예: v1.
+  `INSTANCE_URL`(문자열) - (필수) 사용자가 작업을 실행하려는 인스턴스의 URL. 예: v1.
+  `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 객체에 대해 선택할 열.
+  `FILTER_PREDICATE`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.
+  `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리.
+  `PARTITION_FIELD`(문자열) - 읽기에 사용됩니다. 쿼리 분할에 사용할 필드입니다.
+  `LOWER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 하한 값(경계 포함).
+  `UPPER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 상한 값(경계 제외).
+  `NUM_PARTITIONS`(정수) - 기본값: 1. 읽기에 사용됩니다. 읽을 파티션 수.

# 제한 사항
<a name="pipedrive-connector-limitations"></a>

다음은 Pipedrive 커넥터의 제한 사항입니다.
+ Pipedrive는 하나의 엔터티(Activities)에 대해서만 필드 기반 분할을 지원합니다.
+ Pipedrive는 Activities, Deals, Notes, Persons, Organizations 및 Products 엔터티에 대한 레코드 기반 분할을 지원합니다.
+ Deals 엔터티에서 잘못된 값 필터 값이 사용되는 경우 필터로서의 상태 필드는 모든 레코드를 반환합니다.
+ Deals 엔터티에서 여러 필드의 순서 정렬은 지원되지 않습니다.
+ 성능 데이터를 얻기 위해 로컬 AWS 계정을 활용합니다. 하지만 로컬에서 액세스 토큰 새로 고침 제한으로 인해 1GB의 데이터를 처리하는 AWS Glue 작업이 실패합니다. 그에 따라 179MB의 데이터로 성능 테스트를 최적화했으며, 위의 결과는 이 최적화를 기반으로 합니다. 그럼에도 불구하고 파티션 수의 증가에 따라 SaaS 엔드포인트는 단일 파티션에 비해 더 많은 시간이 걸리는 것을 관측했습니다. 이 동작과 관련하여 Pipedrive 지원 팀과 논의했으며, Pipedrive가 요청을 자동으로 스로틀링하고 응답을 지연시키고 있음을 알렸습니다. 따라서 대규모 데이터 세트로 AWS Glue 작업을 실행하거나 동일한 API 엔드포인트를 여러 번 호출할 때 Pipedrive API의 구현으로 인해 시간 초과 문제가 발생할 수 있습니다. 하지만 파티션 수의 증가에 따른 커넥터 및 심 응답 시간이 예상대로 감소하고 있습니다.

# Productboard에 연결
<a name="connecting-to-productboard"></a>

Productboard는 제품 팀이 적합한 제품을 더욱 빠르게 출시할 수 있도록 지원하는 제품 관리 시스템입니다. Zendesk, UiPath, Microsoft와 같은 3,000곳 이상의 최신 제품 중심 기업이 Productboard를 사용하여 사용자에게 무엇이 실제로 필요한지 이해하고, 앞으로 구축해야 할 사항의 우선순위를 정하고, 로드맵을 중심으로 모든 의견을 모읍니다.

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

# AWS Glue의 Productboard 지원
<a name="productboard-support"></a>

AWS Glue는 다음과 같이 Productboard를 지원합니다.

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

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

**지원되는 Productboard API 버전**  
 v1 

# 연결을 생성하고 사용하기 위한 API 작업이 포함된 정책
<a name="productboard-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 Management 콘솔을 사용하는 경우 AWS Glue 리소스에 대한 전체 액세스 권한을 부여합니다. 이 정책에 지정된 리소스의 이름 변환을 따르면 사용자는 콘솔 전체 용량을 소유합니다. 이 정책은 보통 AWS Glue 콘솔의 사용자에게 해당됩니다.

# Productboard 구성
<a name="productboard-configuring"></a>

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

## 최소 요구 사항
<a name="productboard-configuring-min-requirements"></a>
+ 이메일과 암호를 사용하는 Productboard 계정이 있습니다. 계정 생성에 대한 자세한 내용은 [Productboard 계정 생성](productboard-create-account.md)을 참조하세요.
+  AWS Glue에 대한 서비스 액세스 권한으로 AWS 계정을 생성해야 합니다.
+ Productboard 계정의 인증 세부 정보가 있습니다(사용자 지정 인증 사용 시 JWT 토큰, 또는 OAuth2.0 사용 시 클라이언트 ID 및 보안 암호).
+ 사용자가 `OAuth2.0`을 사용하려는 경우 [Productboard에 애플리케이션을 등록](https://app.productboard.com/oauth2/applications/new)하고 [How to integrate with Productboard via OAuth2 - developer documentation](https://developer.productboard.com/docs/how-to-integrate-with-productboard-via-oauth2-developer-documentation)의 지침에 따라 애플리케이션을 설정합니다.

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

# Productboard 연결 구성
<a name="productboard-configuring-connections"></a>

 

Productboard는 사용자 지정 인증 및 `OAuth2.0`을 지원합니다. `OAuth2.0` Productboard는 `AUTHORIZATION_CODE` 권한 부여 유형을 지원합니다.
+ 이 권한 부여 유형은 사용자를 인증하기 위해 사용자를 서드파티 권한 부여 서버로 리디렉션하는 방식에 의존하므로 ‘3각’ `OAuth`로 간주됩니다. AWS Glue 콘솔을 통해 연결을 생성할 때 사용됩니다. 연결을 생성하는 사용자는 기본적으로 Productboard Client ID 및 Client Secret을 제외한 `OAuth` 관련 정보를 제공할 필요가 없는 AWS Glue 자체 연결된 앱에 의존할 수 있습니다. AWS Glue 콘솔은 사용자를 Productboard로 리디렉션합니다. 사용자가 로그인하고 Productboard 인스턴스에 액세스하도록 요청된 권한을 AWS Glue에 허용해야 합니다.
+ 사용자는 여전히 AWS Glue 콘솔을 통해 연결을 생성할 때에도 Productboard에서 자체 연결된 앱을 생성하고 자체 Client ID 및 Client Secret을 제공하기로 선택할 수 있습니다. 이 시나리오에서는 여전히 Productboard로 리디렉션되어 로그인하고 리소스에 액세스할 수 있는 권한을 AWS Glue에 부여합니다.
+ 이 권한 부여 유형은 새로 고침 토큰과 액세스 토큰을 생성합니다. 액세스 토큰은 수명이 짧으며 새로 고침 토큰을 사용하여 사용자 상호 작용 없이 자동으로 새로 고칠 수 있습니다.
+ `AUTHORIZATION_CODE OAuth` 흐름에 대해 연결된 앱을 생성하는 방법에 대한 공개 Productboard 설명서는 [How to integrate with Productboard via OAuth2 - developer documentation](https://developer.productboard.com/docs/how-to-integrate-with-productboard-via-oauth2-developer-documentation)을 참조하세요.

다음 단계를 따라 Productboard 연결을 구성합니다.

1. AWS Secrets Manager에서 다음 세부 정보로 보안 암호를 생성합니다.
   + `OAuth` 인증 - 고객 관리형 연결된 앱: 보안 암호는 키 역할을 하는 `USER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET`과 함께 연결된 앱 소비자 보안 암호를 포함해야 합니다.
   + `Custom auth` - 고객 관리형 연결된 앱: 보안 암호는 키 역할을 하는 `access_token`과 함께 연결된 앱 `JWT token`을 포함해야 합니다.
**참고**  
AWS Glue에서 연결당 보안 암호를 생성해야 합니다.

1. AWS Glue Studio의 **데이터 연결**에서 아래 단계에 따라 연결을 생성합니다.

   1. **데이터 소스**를 선택할 때 Productboard를 선택합니다.

   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. 인증 유형을 선택하여 데이터 소스에 연결합니다.
      + `OAuth` 인증 - Productboard 앱의 `Token URL` 및 `User Managed Client Application ClientId`를 입력합니다.

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

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

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

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

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

 **사전 조건** 

읽으려는 Productboard 객체. 사용 가능한 엔터티를 확인하려면 아래 지원되는 엔터티 테이블을 참조하세요.

 **지원되는 엔터티** 
+ [Abuse-reports ](https://productboard.com/developer/marketing/api/campaign-abuse/)
+ [자동화](https://productboard.com/developer/marketing/api/automation/list-automations/)
+ [캠페인](https://productboard.com/developer/marketing/api/campaigns/list-campaigns/)
+ [Click-details](https://productboard.com/developer/marketing/api/link-clickers/)
+ [Lists](https://productboard.com/developer/marketing/api/link-clickers/)
+ [회원](https://productboard.com/developer/marketing/api/list-segment-members/)
+ [Open-details](https://productboard.com/developer/marketing/api/list-members/)
+ [Segments](https://productboard.com/developer/marketing/api/list-segments/)
+ [Stores](https://productboard.com/developer/marketing/api/ecommerce-stores/list-stores/)
+ [Unsubscribed](https://productboard.com/developer/marketing/api/unsub-reports/)


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
|  특성  | 예 | 예 | 아니요 | 예 | 예 | 
|  Components  | 아니요 | 예 | 아니요 | 예 | 아니요 | 
|  Products  | 아니요 | 예 | 아니요 | 예 | 아니요 | 
|  Feature Statuses  | 아니요 | 예 | 아니요 | 예 | 예 | 
|  Custom Field Definitions  | 아니요 | 예 | 아니요 | 예 | 아니요 | 
|  Custom Field Values  | 예 | 예 | 아니요 | 예 | 아니요 | 

 **예제** 

```
Productboard_read = glueContext.create_dynamic_frame.from_options(
    connection_type="Productboard",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "feature",
        "API_VERSION": "1"
    }
```

 **Productboard 엔터티 및 필드 세부 정보** 
+ [Features](https://developer.productboard.com/#tag/features)
+ [Components](https://developer.productboard.com/#tag/components)
+ [Feature statuses](https://developer.productboard.com/#tag/statuses)
+ [Products](https://developer.productboard.com/#tag/products)
+ [Custom fields definitions](https://developer.productboard.com/#tag/hierarchyEntitiesCustomFields)
+ [Custom fields values](https://developer.productboard.com/#tag/hierarchyEntitiesCustomFieldsValues)

# Productboard 연결 옵션
<a name="productboard-connection-options"></a>

다음은 Productboard에 대한 연결 옵션입니다.
+  `ENTITY_NAME`(문자열) - (필수) 읽기/쓰기에 사용됩니다. Productboard에 있는 객체의 이름.
+ `API_VERSION`(문자열) - (필수) 읽기에 사용됩니다. 사용하려는 Productboard Engage Rest API 버전. 예: 3.0.
+ `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 객체에 대해 선택할 열.
+ `FILTER_PREDICATE`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.
+ `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리.

# Productboard 계정 생성
<a name="productboard-create-account"></a>

1. [Productboard 가입 페이지](https://app.productboard.com/)로 이동하여 이메일 ID와 암호를 입력한 다음 **Log me in**을 선택합니다.

1. **Account Name** 필드에 Productboard 계정의 이름을 입력한 다음 **I agree to the Privacy Policy check** 확인란을 선택합니다.

1. **Now create your workspace** 페이지의 **Workspace URL** 필드에 새 워크스페이스의 URL을 입력합니다. 이후 **Continue**를 선택하여 다음 페이지로 이동하고 나머지 세부 정보를 입력합니다.

   그러면 평가판 계정이 생성됩니다. 평가판 계정은 15일 동안 무료입니다. 평가판 기간이 만료되면 유료 플랜을 구매할 수 있습니다. 이메일 주소, 암호 및 워크스페이스 URL을 기록해 둡니다. 나중에 계정에 액세스하려면 이 정보가 필요합니다.

**`OAuth2.0` 애플리케이션 등록**

1. [Productboard login 페이지](https://login.productboard.com/?locale=en)로 이동하여 이메일 ID와 암호를 입력하고 **Log in**을 선택합니다.

1. 오른쪽 상단 모서리에서 **User** 아이콘을 선택한 다음 드롭다운 메뉴에서 **Account and billing**을 선택합니다.

1. **Extras**를 선택하고 드롭다운 메뉴에서 **Registered apps**를 선택합니다.

1. **Register An App**을 찾아 선택합니다.

1. 다음 세부 정보를 입력합니다.
   + **App name** – 앱의 이름.
   + **Company / Organization** – 회사 또는 조직의 이름.
   + **App website** – 앱의 웹사이트.
   + **Redirect URI** - 리디렉션 URI 패턴은 로그인 흐름이 완료될 때 Productboard가 리디렉션(요청된 경우)할 수 있는 URI 경로(또는 쉼표로 구분된 경로 목록)입니다. 예: `https://ap-southeast-2\\.console\\.aws\\.amazon\\.com`

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

1. **Client ID**와 **Client Secret**이 표시됩니다. 복사하여 안전한 위치에 저장합니다. 그런 다음 **완료**를 선택합니다.
**참고**  
Client ID 및 Client Secret 문자열은 AppFlow 또는 AWS Glue를 사용할 때 이 커넥터와의 연결을 설정하는 데 사용되는 자격 증명입니다.

**CustomAuth 자격 증명 검색**

1. [Productboard 로그인 페이지](https://app.productboard.com/)로 이동하여 이메일 ID와 암호를 입력하고 **Log me in**을 선택합니다.

   홈 페이지로 리디렉션됩니다.

1. 홈 페이지에서 **Workspace Settings** > **Integrations** > **Public APIs** > **Access Token**으로 이동합니다.
**참고**  
**Public APIs** 섹션이 표시되지 않으면 계정이 Essentials 플랜을 사용 중인 것일 수 있습니다. API 토큰에 액세스하려면 Pro 플랜 이상이 필요합니다. 플랜별 기능 및 이름은 변경될 수 있습니다. 패키지에 대한 자세한 내용은 [Productboard pricing](https://www.productboard.com/pricing/)을 참조하세요.

1. **\$1**를 선택하여 새 토큰을 생성하고, 나중에 참조할 수 있도록 안전하게 저장해야 합니다.

**`OAuth2.0` 자격 증명 생성**

Productboard 커넥터를 사용한 `OAuth2.0` 인증을 활용하려면 Productboard 플랫폼에 애플리케이션을 등록하고 `Client ID` 및 `Client Secret`을 생성해야 합니다

1. [Productboard 로그인 페이지](https://app.productboard.com/)로 이동하여 이메일 ID와 암호를 입력하고 **Log me in**을 선택합니다.

1. Productboard 계정에 새 OAuth2 애플리케이션을 등록하려면 [Producboard](to register new OAuth2 application with your Productboard account) 페이지로 이동합니다.

1. 필요한 필드를 입력하고 액세스하려는 각 엔터티에 필요한 범위를 선택합니다.
**참고**  
지원되는 6개의 엔터티에 필요한 다음 네 가지 범위를 선택했습니다.

1. **리디렉션 URL**은 `https://ap-southeast-2\\.console\\.aws\\.amazon\\.com` 형식이어야 합니다.
**참고**  
Appflow 리디렉션 URL은 변경될 수 있습니다. 사용 가능한 경우 AWS Glue 플랫폼의 리디렉션 URL을 업데이트하세요.

1. **Client ID**와 **Client Secret**이 표시됩니다. 복사하여 안전한 위치에 저장합니다.

1. [How to Integrate with Productboard via OAuth2 developer](https://developer.productboard.com/docs/how-to-integrate-with-productboard-via-oauth2-developer-documentation) 설명서의 단계에 따라 `OAuth2`를 설정하고 확인할 수 있습니다.

# 제한 사항
<a name="productboard-connector-limitations"></a>

다음은 Productboard 커넥터의 제한 사항입니다.
+ Productboard는 필드 기반 또는 레코드 기반 분할을 지원하지 않습니다.

# QuickBooks에 연결
<a name="connecting-to-data-quickbooks"></a>

QuickBooks는 중소기업을 위한 최고의 회계 애플리케이션입니다. QuickBooks 회계 애플리케이션은 1980년대 Intuit의 첫 번째 제품 중 하나로, 원래 데스크톱 소프트웨어였기 때문에 1980년대로 거슬러 올라갑니다. 현재 QuickBooks는 여러 회계 및 비즈니스 재무 애플리케이션을 설치형 소프트웨어와 클라우드 기반 SaaS 소프트웨어로 제공합니다. QuickBooks 사용자는 QuickBooks 계정에 AWS Glue를 연결할 수 있습니다. 그런 다음, QuickBooks를 ETL 작업에서의 데이터 소스로 사용할 수 있습니다. 이러한 작업을 실행하여 QuickBooks 및 AWS 서비스 또는 기타 지원되는 애플리케이션 간에 데이터를 전송합니다.

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

# AWS Glue의 QuickBooks 지원
<a name="quickbooks-support"></a>

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

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

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

**지원되는 QuickBooks API 버전**  
다음 QuickBooks API 버전이 지원됩니다.
+ v3

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

# QuickBooks 구성
<a name="quickbooks-configuring"></a>

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

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

다음은 최소 요구 사항입니다.
+ QuickBooks 계정이 있습니다.
+ QuickBooks 계정이 API 액세스에 대해 활성화되어 있습니다.

자세한 내용은 QuickBooks 설명서에서 다음 주제를 참조하세요.
+ [Intuit 계정 생성](https://quickbooks.intuit.com/learn-support/en-us/help-article/account-management/create-intuit-user-account/L62kSFEOM_US_en_US)
+ [앱 생성 및 개발 시작](https://developer.intuit.com/app/developer/qbo/docs/get-started/start-developing-your-app)

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

# QuickBooks 연결 구성
<a name="quickbooks-configuring-connections"></a>

QuickBooks에서는 OAuth2에 대한 AUTHORIZATION\$1CODE 권한 부여 유형을 지원합니다. 권한 부여 유형은 AWS Glue에서 QuickBooks와 통신하여 데이터에 대한 액세스를 요청하는 방법을 결정합니다.
+ 이 권한 부여 유형은 사용자를 인증하기 위해 사용자를 서드파티 권한 부여 서버로 리디렉션하는 방식에 의존하므로 '3각' OAuth로 간주됩니다. AWS Glue 콘솔을 통해 연결을 생성할 때 사용됩니다.
+ 사용자는 여전히 AWS Glue 콘솔을 통해 연결을 생성할 때에도 QuickBooks에서 자체 연결된 앱을 생성하고 자체 클라이언트 ID와 클라이언트 보안 암호를 제공하기로 선택할 수 있습니다. 이 시나리오에서는 여전히 QuickBooks로 리디렉션되어 로그인하고 리소스에 액세스할 수 있는 권한을 AWS Glue에 부여합니다.
+ 이 권한 부여 유형은 새로 고침 토큰과 액세스 토큰을 생성합니다. 액세스 토큰은 수명이 짧으며 새로 고침 토큰을 사용하여 사용자 상호 작용 없이 자동으로 새로 고칠 수 있습니다.
+ 권한 부여 코드 OAuth 흐름을 위한 연결된 앱 생성에 대한 퍼블릭 QuickBooks 설명서는 [Set up OAuth 2.0](https://developer.intuit.com/app/developer/qbo/docs/develop/authentication-and-authorization/oauth-2.0)을 참조하세요.

QuickBooks 연결을 구성하는 방법:

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

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

   1. 연결하려는 QuickBooks 인스턴스의 인스턴스 URL과 회사 ID를 제공합니다.

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

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

**사전 조건**

읽으려는 QuickBooks 객체입니다.

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


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| Account | 예 | 예 | 예 | 예 | 예 | 
| Bill | 예 | 예 | 예 | 예 | 예 | 
| Company Info | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Customer | 예 | 예 | 예 | 예 | 예 | 
| Employee | 예 | 예 | 예 | 예 | 예 | 
| Estimate | 예 | 예 | 예 | 예 | 예 | 
| Invoice | 예 | 예 | 예 | 예 | 예 | 
| Item | 예 | 예 | 예 | 예 | 예 | 
| Payment | 예 | 예 | 예 | 예 | 예 | 
| Preferences | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Profit and Loss | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Tax Agency | 예 | 예 | 예 | 예 | 예 | 
| Vendors | 예 | 예 | 예 | 예 | 예 | 

**예시:**

```
QuickBooks_read = glueContext.create_dynamic_frame.from_options(
    connection_type="quickbooks",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "Account",
        "API_VERSION": "v3"
    }
```

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

엔터티 및 필드 세부 정보에 대한 자세한 내용은 다음을 참조하세요.
+ [Account](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/most-commonly-used/account)
+ [Bill](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/most-commonly-used/bill)
+ [CompanyInfo](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/most-commonly-used/companyinfo)
+ [Customer](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/most-commonly-used/customer)
+ [Employee](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/most-commonly-used/employee)
+ [Estimate](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/most-commonly-used/estimate)
+ [Invoice](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/most-commonly-used/invoice)
+ [Item](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/most-commonly-used/item)
+ [Payment](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/most-commonly-used/payment)
+ [Preferences](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/most-commonly-used/preferences)
+ [ProfitAndLoss](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/most-commonly-used/profitandloss)
+ [TaxAgency](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/most-commonly-used/taxagency)
+ [Vendor](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/most-commonly-used/vendor)

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

**필드 기반 분할**:

QuickBooks에서 Integer 및 DateTime 데이터 유형 필드는 필드 기반 분할을 지원합니다.

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

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

  유효한 값의 예제:

  ```
  "2024-05-07T02:03:00.00Z"
  ```
+ `UPPER_BOUND`: 선택한 파티션 필드의 상한 값(**경계 제외**).
+ `NUM_PARTITIONS`: 파티션 수.

예시:

```
QuickBooks_read = glueContext.create_dynamic_frame.from_options(
    connection_type="quickbooks",
    connection_options={
        "connectionName": "connectionName",
        "REALMID": "12345678690123456789",
        "ENTITY_NAME": "Account",
        "API_VERSION": "v3",
        "PARTITION_FIELD": "MetaData_CreateTime"
        "LOWER_BOUND": "2023-09-07T02:03:00.000Z"
        "UPPER_BOUND": "2024-05-07T02:03:00.000Z"
        "NUM_PARTITIONS": "10"
    }
```

**레코드 기반 분할**:

원본 쿼리가 Spark 태스크에서 동시에 실행할 수 있는 `NUM_PARTITIONS`개의 하위 쿼리로 분할됩니다.
+ `NUM_PARTITIONS`: 파티션 수.

예시:

```
QuickBooks_read = glueContext.create_dynamic_frame.from_options(
    connection_type="quickbooks",
    connection_options={
        "connectionName": "connectionName",
        "REALMID": "1234567890123456789",
        "ENTITY_NAME": "Bill",
        "API_VERSION": "v3",
        "NUM_PARTITIONS": "10"
    }
```

# QuickBooks 연결 옵션
<a name="quickbooks-connection-options"></a>

다음은 QuickBooks의 연결 옵션입니다.
+ `ENTITY_NAME`(문자열) - (필수) 읽기에 사용됩니다. QuickBooks에서의 객체 이름입니다.
+ `INSTANCE_URL`(문자열) - (필수) 유효한 QuickBooks 인스턴스 URL입니다.
+ `API_VERSION`(문자열) - (필수) 읽기에 사용됩니다. 사용할 QuickBooks Rest API 버전입니다.
+ `REALM_ID`(문자열) - 요청을 보내는 개별 QuickBooks Online 회사를 식별하는 ID입니다.
+ `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 객체에 대해 선택할 열.
+ `FILTER_PREDICATE`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.
+ `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리.
+ `PARTITION_FIELD`(문자열) - 읽기에 사용됩니다. 쿼리 분할에 사용할 필드입니다.
+ `LOWER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 하한 값(경계 포함).
+ `UPPER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 상한 값(경계 제외).
+ `NUM_PARTITIONS`(정수) - 기본값: 1. 읽기에 사용됩니다. 읽을 파티션 수.

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

다음은 QuickBooks 커넥터의 제한 사항입니다.
+ `taxAgency` API에서 필터링을 통한 정렬이 예상대로 작동하지 않습니다.

# REST API에 연결
<a name="connecting-to-data-rest-api"></a>

 AWS Glue를 사용하면 모든 REST API 기반 데이터 소스에 AWS Glue를 연결하는 데 사용할 수 있는 AWS Glue ConnectionType을 구성할 수 있습니다. 이는 ETL 작업에서 데이터 소스로 사용할 수 있습니다. 이러한 작업을 실행하여 REST API 기반 데이터 소스 및 AWS 서비스 또는 기타 지원되는 애플리케이션 간에 데이터를 전송할 수 있습니다.

**Topics**
+ [AWS Glue REST API 지원](rest-api-support.md)
+ [연결 유형을 등록하고 연결을 생성/사용하기 위한 API 작업이 포함된 정책](rest-api-configuring-iam-permissions.md)
+ [REST API ConnectionType 구성](rest-api-configuring.md)
+ [REST API 연결 구성](rest-api-configuring-connections.md)
+ [자습서: REST API ConnectionType 및 연결 생성](rest-api-example.md)
+ [제한 사항](rest-api-limitations.md)

# AWS Glue REST API 지원
<a name="rest-api-support"></a>

AWS Glue는 다음과 같이 REST API를 지원합니다.

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

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

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

 다음 샘플 IAM 정책은 AWS Glue ETL 작업 내에서 REST API 연결을 등록하고 생성하고 관리하고 사용하는 데 필요한 권한을 설명합니다. 새 역할을 생성하는 경우 다음을 포함하는 정책을 생성합니다.

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "glue:RegisterConnectionType",
                "glue:ListConnectionTypes",
                "glue:DescribeConnectionType",
                "glue:CreateConnection",
                "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 콘솔의 사용자에게 해당됩니다.

REST API 연결을 생성할 때 네트워크 옵션을 제공하는 경우 다음 작업도 IAM 역할에 포함되어야 합니다.

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

# REST API ConnectionType 구성
<a name="rest-api-configuring"></a>

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

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

다음은 최소 요구 사항입니다.
+  AWS Glue REST API 연결 유형을 구성하고 등록했습니다. [REST API에 연결](https://docs.aws.amazon.com/glue/latest/dg/rest-api-connections.html)을 참조하십시오.
+  OAuth2 클라이언트 자격 증명, 권한 부여 코드 또는 JWT를 사용하는 경우 그에 따라 클라이언트 앱을 구성합니다.

 이러한 요구 사항을 충족하면 REST API 기반 데이터 소스에 AWS Glue를 연결할 준비가 된 것입니다. 일반적으로 REST API 측에는 추가 구성이 필요하지 않습니다.

# REST API 연결 구성
<a name="rest-api-configuring-connections"></a>

 AWS Glue REST API 커넥터를 구성하려면 AWS Glue 연결 유형을 구성해야 합니다. 이 연결 유형에는 REST 데이터 소스가 작동하고 인증, 요청, 응답, 페이지 매김, 검증, 개체/메타데이터와 같은 사물을 해석하는 방식의 속성에 대한 세부 정보가 포함되어 있습니다. AWS Glue REST 연결 유형에 필요한 속성의 전체 목록은[ RegisterConnectionType](https://docs.aws.amazon.com/glue/latest/webapi/API_DescribeConnectionType.html) API 및 [REST API에 연결](https://docs.aws.amazon.com/glue/latest/dg/rest-api-connections.html)을 위한 단계를 참조하십시오.

 REST API 커넥터를 생성할 때 관련 작업을 허용하려면 다음 정책이 필요합니다.

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

# 자습서: REST API ConnectionType 및 연결 생성
<a name="rest-api-example"></a>

**Foo REST API에 연결**

 AWS Glue REST API ConnectionType과 Foo REST API에 대한 해당 AWS Glue 연결을 생성합니다. 이 API에는 다음과 같은 속성이 있습니다(REST API 설명서에서 검색할 수 있음).
+  **인스턴스 URL**: https://foo.cloud.com/rest/v1.
+  **인증 유형**: OAuth2(클라이언트 자격 증명).
+  **REST 메서드**: GET.
+  **페이지 매김 유형**: 요청의 쿼리 파라미터에 속성 “제한” 및 “오프셋”이 배치된 오프셋입니다.
+ **지원되는 엔터티**:
  +  **Bar**: 상대 경로 [/bar.json].
  +  **Baz**: 상대 경로 [/baz.json].

 모든 세부 정보를 가져오면 Foo REST API에 대한 AWS Glue 연결 생성을 시작할 수 있습니다.

**REST API 연결을 생성하려면**:

1.  AWS API, CLI 또는 SDK를 사용하여 RegisterConnectionType API를 호출하여 AWS Glue에서 REST API 연결 유형을 생성합니다. 그러면 AWS Glue에 새 ConnectionType 리소스가 생성됩니다.

   ```
   {
       "ConnectionType": "REST-FOO-CONNECTOR",
       "IntegrationType": "REST",
       "Description": "AWS Glue Connection Type for the FOO REST API",
       "ConnectionProperties": {
           "Url": {
               "Name": "Url",
               "Required": true,
               "DefaultValue": "https://foo.cloud.com/rest/v1",
               "PropertyType": "USER_INPUT"
           }
       },
       "ConnectorAuthenticationConfiguration": {
           "AuthenticationTypes": ["OAUTH2"],
           "OAuth2Properties": {
               "OAuth2GrantType": "CLIENT_CREDENTIALS"
           }
       },
       "RestConfiguration": {
           "GlobalSourceConfiguration": {
           "RequestMethod": "GET",
           "ResponseConfiguration": {
               "ResultPath": "$.result",
               "ErrorPath": "$.error.message"
           },
           "PaginationConfiguration": {
               "OffsetConfiguration": {
                   "OffsetParameter": {
                       "Key": "offset",
                       "PropertyLocation": "QUERY_PARAM"
                   },
                   "LimitParameter": {
                       "Key": "limit",
                       "PropertyLocation": "QUERY_PARAM",
                       "DefaultValue": "50"
                   }
               }
           }
       },
       "ValidationEndpointConfiguration": {
           "RequestMethod": "GET",
           "RequestPath": "/bar.json?offset=1&limit=10"
       },
       "EntityConfigurations": {
           "bar": {
               "SourceConfiguration": {
                   "RequestMethod": "GET",
                   "RequestPath": "/bar.json",
                   "ResponseConfiguration": {
                       "ResultPath": "$.result",
                       "ErrorPath": "$.error.message"
                   }
               },
               "Schema": {
                   "name": {
                       "Name": "name",
                       "FieldDataType": "STRING"
                   },
                   "description": {
                       "Name": "description",
                       "FieldDataType": "STRING"
                   },
                   "id": {
                       "Name": "id",
                       "FieldDataType": "STRING"
                   },
                   "status": {
                       "Name": "status",
                       "FieldDataType": "STRING"
                   }
               }
           }
       }
   }
   }
   ```

1.  AWS Secrets Manager에서 보안 암호를 생성합니다. 보안 암호에는 `USER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET`를 키로 사용하여 연결된 앱 소비자 보안 암호가 포함되어야 합니다.
**참고**  
AWS Glue에서 연결당 보안 암호를 생성해야 합니다.

1.  AWS API, CLI 또는 SDK를 사용하여 CreateConnection API를 호출하여 AWS Glue 연결을 생성합니다.

   1.  1단계의 REST 연결 유형 이름을 “ConnectionType”으로 참조합니다.

   1.  AWS Glue ConnectionType 등록 프로세스 중에 정의된 InstanceUrl 및 기타 ConnectionProperties를 제공합니다.

   1.  구성된 인증 유형 중에서 선택합니다. REST API Foo는 ClientCredentials 권한 부여 유형과 함께 OAuth2를 사용합니다.

   1.  구성된 **SecretArn** 및 기타 **AuthenticationProperties**를 제공합니다. 예를 들어 `OAUTH2`를 AuthenticationType으로 구성했으므로 CreateConnectionInput에서 “OAuth2Properties”를 설정합니다. 이렇게 하려면 “OAuth2GrantType”, “TokenUrl” 및 “OAuth2ClientApplication”과 같은 속성이 필요합니다.

1.  CreateConnection을 요청하여 AWS Glue 연결을 생성합니다.

   ```
   {
       "ConnectionInput": {
           "Name": "ConnectionFooREST",
           "ConnectionType": "REST-FOO-CONNECTOR",
           "ConnectionProperties": {},
           "ValidateCredentials": true,
           "AuthenticationConfiguration": {
               "AuthenticationType": "OAUTH2",
               "SecretArn": "arn:aws:secretsmanager:<region>:<accountId>:secret:<secretId>",
               "OAuth2Properties": {
                   "OAuth2GrantType": "CLIENT_CREDENTIALS",
                   "TokenUrl": "https://foo.cloud.com/oauth/token",
                   "OAuth2ClientApplication": {
                       "UserManagedClientApplicationClientId": "your-managed-client-id"
                   }
               }
           }
       }
   }
   ```

# 제한 사항
<a name="rest-api-limitations"></a>

다음은 REST API 커넥터에 대한 제한 사항입니다.
+  REST API 커넥터는 AWS API, CLI 또는 SDK를 통해서만 사용할 수 있습니다. 콘솔을 통해 REST 커넥터를 구성할 수 없습니다.
+  AWS Glue REST ConnectionType은 REST API 기반 데이터 소스에서 데이터를 읽도록만 구성할 수 있습니다. 연결은 AWS Glue ETL 작업에서 소스로만 사용할 수 있습니다.
+  필터링 및 파티셔닝은 지원되지 않습니다.
+  필드 선택은 지원되지 않습니다.

# Salesforce에 연결
<a name="connecting-to-data-salesforce"></a>

Salesforce는 영업, 고객 서비스, 전자 상거래 등에 도움이 되는 고객 관계 관리(CRM) 소프트웨어를 제공합니다. Salesforce 사용자인 경우 Salesforce 계정에 AWS Glue를 연결할 수 있습니다. 그런 다음, ETL 작업에서 Salesforce를 데이터 소스 또는 대상으로 사용할 수 있습니다. 이러한 작업을 실행하여 Salesforce와 AWS 서비스 또는 기타 지원되는 애플리케이션 간에 데이터를 전송하세요.

**Topics**
+ [Salesforce에 대한 AWS Glue 지원](salesforce-support.md)
+ [연결을 생성하고 사용하기 위한 API 작업이 포함된 정책](salesforce-configuring-iam-permissions.md)
+ [Salesforce 구성](salesforce-configuring.md)
+ [시스템 관리자 프로필 적용](#salesforce-configuring-apply-system-admin-profile)
+ [Salesforce 연결 구성](salesforce-configuring-connections.md)
+ [Salesforce에서 읽기](salesforce-reading-from-entities.md)
+ [Salesforce에 쓰기](salesforce-writing-to.md)
+ [Salesforce 연결 옵션](salesforce-connection-options.md)
+ [Salesforce 커넥터의 제한 사항](salesforce-connector-limitations.md)
+ [Salesforce에 대한 권한 부여 코드 흐름 설정](salesforce-setup-authorization-code-flow.md)
+ [Salesforce용 JWT 베어러 OAuth 흐름 설정](salesforce-setup-jwt-bearer-oauth.md)

# Salesforce에 대한 AWS Glue 지원
<a name="salesforce-support"></a>

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

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

**대상으로서 지원되나요?**  
예. AWS Glue ETL 작업을 사용하여 Salesforce에 레코드를 쓸 수 있습니다.

**지원되는 Salesforce API 버전**  
다음 Salesforce API 버전이 지원됩니다.
+ v58.0
+ v59.0
+ v60.0

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

다음 샘플 IAM 정책은 AWS Glue ETL 작업 내에서 Salesforce 연결을 생성하고 관리하고 사용하는 데 필요한 권한을 설명합니다. 새 역할을 생성하는 경우 다음을 포함하는 정책을 생성합니다.

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "secretsmanager:DescribeSecret",
        "secretsmanager:GetSecretValue",
        "secretsmanager:PutSecretValue",
        "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 콘솔의 사용자에게 해당됩니다.

Salesforce 연결을 생성할 때 네트워크 옵션을 제공하는 경우 다음 작업도 IAM 역할에 포함되어야 합니다.

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

****  

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

------

 제로 ETL Salesforce 연결은 [제로 ETL 사전 조건](https://docs.aws.amazon.com/glue/latest/dg/zero-etl-prerequisites.html)을 참조하세요.

 제로 ETL Salesforce 연결은 [제로 ETL 사전 조건](https://docs.aws.amazon.com/glue/latest/dg/zero-etl-prerequisites.html)을 참조하세요.

# Salesforce 구성
<a name="salesforce-configuring"></a>

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

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

다음은 최소 요구 사항입니다.
+ Salesforce 계정이 있습니다.
+ Salesforce 계정이 API 액세스에 대해 활성화되어 있습니다. API 액세스는 기본적으로 Enterprise, Unlimited, Developer, Performance 에디션에 대해 활성화됩니다.

이러한 요구 사항을 충족하면 Salesforce 계정에 AWS Glue를 연결할 준비가 된 것입니다. AWS Glue에서는 AWS 관리형 연결된 앱을 사용하여 나머지 요구 사항을 처리합니다.

## Salesforce용 AWS 관리형 연결된 앱
<a name="salesforce-configuring-connected-app"></a>

AWS 관리형 연결된 앱을 사용하면 더 적은 단계로 Salesforce 연결을 생성할 수 있습니다. Salesforce에서 연결된 앱은 외부 애플리케이션(예: AWS Glue)이 OAuth 2.0을 사용하여 Salesforce 데이터에 액세스할 수 있도록 권한을 부여하는 프레임워크입니다. AWS 관리형 연결된 앱을 사용하려면 AWS Glue 콘솔을 사용하여 Salesforce 연결을 생성합니다. 연결을 구성할 때 **OAuth 권한 부여 유형**을 **권한 부여 코드**로 설정하고 **AWS 관리형 클라이언트 애플리케이션 사용** 확인란을 선택한 상태로 둡니다.

연결을 저장하면 Salesforce 계정에 로그인하고 AWS Glue 액세스를 승인하도록 Salesforce로 리디렉션됩니다.

## 시스템 관리자 프로필 적용
<a name="salesforce-configuring-apply-system-admin-profile"></a>

 Salesforce에서 다음 단계에 따라 시스템 관리자 프로필을 적용합니다.

1.  Salesforce에서 **설정 > 연결된 앱 > 연결된 앱 OAuth 사용**으로 이동합니다.

1.  연결된 앱 목록에서 AWS Glue를 찾아 **설치**를 선택합니다. 필요한 경우 **차단 해제**를 선택합니다.

1.  **설정 > 연결된 앱 관리**로 이동한 다음 AWS Glue를 선택합니다. OAuth 정책에서 **관리자가 승인한 사용자가 사전 인증됨**을 선택하고 **시스템 관리자** 프로필을 선택합니다. 이 작업은 AWS Glue에 대한 액세스를 시스템 관리자 프로필이 있는 사용자로만 제한합니다.

## 시스템 관리자 프로필 적용
<a name="salesforce-configuring-apply-system-admin-profile"></a>

 Salesforce에서 다음 단계에 따라 시스템 관리자 프로필을 적용합니다.

1.  Salesforce에서 **설정 > 연결된 앱 > 연결된 앱 OAuth 사용**으로 이동합니다.

1.  연결된 앱 목록에서 AWS Glue를 찾아 **설치**를 선택합니다. 필요한 경우 **차단 해제**를 선택합니다.

1.  **설정 > 연결된 앱 관리**로 이동한 다음 AWS Glue를 선택합니다. OAuth 정책에서 **관리자가 승인한 사용자가 사전 인증됨**을 선택하고 **시스템 관리자** 프로필을 선택합니다. 이 작업은 AWS Glue에 대한 액세스를 시스템 관리자 프로필이 있는 사용자로만 제한합니다.

# Salesforce 연결 구성
<a name="salesforce-configuring-connections"></a>

Salesforce 연결을 구성하는 방법:

1. AWS Secrets Manager에서 다음 세부 정보로 보안 암호를 생성합니다.

   1. JWT\$1TOKEN 권한 부여 유형의 경우 시크릿에는 해당 값과 함께 JWT\$1TOKEN 키가 포함되어야 합니다.

   1. AuthorizationCode 권한 부여 유형의 경우:

      1. AWS 관리형 연결된 앱의 경우 비어 있는 보안 암호 또는 임시 값이 지정된 보안 암호를 제공해야 합니다.

      1. 고객 관리형 연결된 앱의 경우 보안 암호는 키 역할을 하는 `USER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET`과 함께 연결된 앱 `Consumer Secret`를 포함해야 합니다.

   1. 참고: AWS Glue에서 연결에 대한 보안 암호를 생성해야 합니다.

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

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

   1. 연결하려는 Salesforce 인스턴스의 INSTANCE\$1URL을 제공합니다.

   1. Salesforce 환경을 제공합니다.

   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. 연결에 사용할 OAuth2 권한 부여 유형을 선택합니다. 권한 부여 유형은 AWS Glue에서 Salesforce와 통신하여 데이터에 대한 액세스를 요청하는 방법을 결정합니다. 선택한 항목은 연결을 생성하기 전에 충족해야 하는 요구 사항에 영향을 미칩니다. 다음 유형 중 하나를 선택할 수 있습니다.
      + **JWT\$1BEARER 권한 부여 유형**: 이 권한 부여 유형은 JSON 웹 토큰(JWT)을 Salesforce 인스턴스에서 특정 사용자의 권한으로 미리 생성할 수 있으므로 자동화 시나리오에 적합합니다. 생성자는 JWT의 유효 기간을 제어할 수 있습니다. AWS Glue에서는 JWT를 사용하여 Salesforce API를 직접 호출하는 데 사용되는 액세스 토큰을 가져올 수 있습니다.

        이 흐름을 사용하려면 사용자가 Salesforce 인스턴스에서 연결된 앱을 생성하여 사용자를 위한 JWT 기반 액세스 토큰을 발급할 수 있어야 합니다.

        JWT 베어러 OAuth 흐름에 대한 연결된 앱을 생성하는 방법에 대한 자세한 내용은 [OAuth 2.0 JWT bearer flow for server-to-server integration](https://help.salesforce.com/s/articleView?id=sf.remoteaccess_oauth_jwt_flow.htm)을 참조하세요. Salesforce 연결된 앱을 사용하여 JWT 베어러 흐름을 설정하려면 [Salesforce용 JWT 베어러 OAuth 흐름 설정](salesforce-setup-jwt-bearer-oauth.md) 섹션을 참조하세요.
      + **AUTHORIZATION\$1CODE 권한 부여 유형**: 이 권한 부여 유형은 사용자를 인증하기 위해 사용자를 서드파티 권한 부여 서버로 리디렉션하는 방식에 의존하므로 '3각' OAuth로 간주됩니다. AWS Glue 콘솔을 통해 연결을 생성할 때 사용됩니다. 연결을 생성하는 사용자는 기본적으로 Salesforce 인스턴스 URL을 제외한 OAuth 관련 정보를 제공할 필요가 없는 AWS Glue 연결된 앱(AWS Glue 관리형 클라이언트 애플리케이션)에 의존할 수 있습니다. AWS Glue 콘솔은 사용자를 Salesforce로 리디렉션합니다. 사용자가 Salesforce에 로그인하고 Salesforce 인스턴스에 액세스하도록 요청된 권한을 AWS Glue에 허용해야 합니다.

        사용자는 AWS Glue 콘솔을 통해 연결을 생성할 때 Salesforce에서 자체 연결된 앱을 생성하고 자체 클라이언트 ID와 클라이언트 시크릿을 제공하기로 선택할 수 있습니다. 이 시나리오에서는 여전히 Salesforce로 리디렉션되어 로그인하고 리소스에 액세스할 수 있는 권한을 AWS Glue에 부여합니다.

        이 권한 부여 유형은 새로 고침 토큰과 액세스 토큰을 생성합니다. 액세스 토큰은 수명이 짧으며 새로 고침 토큰을 사용하여 사용자 상호 작용 없이 자동으로 새로 고칠 수 있습니다.

        권한 부여 코드 OAuth 흐름을 위한 연결된 앱 생성에 대한 자세한 내용은 [Salesforce에 대한 권한 부여 코드 흐름 설정](salesforce-setup-authorization-code-flow.md) 섹션을 참조하세요.

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

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

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

1. 네트워크 옵션을 제공하는 경우 IAM 역할에 다음 권한도 부여합니다.

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

****  

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

------

## AWS CLI를 사용하여 Salesforce 연결 구성
<a name="salesforce-configuring-connections-cli"></a>

AWS CLI를 사용하여 Salesforce 연결을 생성할 수 있습니다.

```
aws glue create-connection --connection-input \
"{\"Name\": \"salesforce-conn1\",\"ConnectionType\": \"SALESFORCE\",\"ConnectionProperties\": {\"ROLE_ARN\": \"arn:aws:iam::123456789012:role/glue-role\",\"INSTANCE_URL\": \"https://example.my.salesforce.com\"},\"ValidateCredentials\": true,\"AuthenticationConfiguration\": {\"AuthenticationType\": \"OAUTH2\",\"SecretArn\": \"arn:aws:secretsmanager:us-east-1:123456789012:secret:salesforce-conn1-secret-IAmcdk\",\"OAuth2Properties\": {\"OAuth2GrantType\": \"JWT_BEARER\",\"TokenUrl\": \"https://login.salesforce.com/services/oauth2/token\"}}}" \
--endpoint-url https://glue.us-east-1.amazonaws.com \
--region us-east-1
```

# Salesforce에서 읽기
<a name="salesforce-reading-from-entities"></a>

**사전 조건**

읽으려는 Salesforce sObject. `Account` `Case` 또는 `Opportunity`와 같은 객체 이름이 필요합니다.

**예시:**

```
salesforce_read = glueContext.create_dynamic_frame.from_options(
    connection_type="salesforce",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "Account",
        "API_VERSION": "v60.0"
    }
)
```

## 쿼리 파티셔닝
<a name="salesforce-reading-partitioning-queries"></a>

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

  날짜 또는 타임스탬프 필드의 경우 커넥터는 Spark SQL 쿼리에 사용된 Spark 타임스탬프 형식을 허용합니다.

  유효한 값의 예제:

  ```
  "TIMESTAMP \"1707256978123\""
  "TIMESTAMP '2018-01-01 00:00:00.000 UTC'"
  "TIMESTAMP \"2018-01-01 00:00:00 Pacific/Tahiti\"" 
  "TIMESTAMP \"2018-01-01 00:00:00\""
  "TIMESTAMP \"-123456789\" Pacific/Tahiti"
  "TIMESTAMP \"1702600882\""
  ```
+ `UPPER_BOUND`: 선택한 파티션 필드의 상한 값(**경계 제외**).
+ `NUM_PARTITIONS`: 파티션 수.
+  `TRANSFER_MODE`: `SYNC`와 `ASYNC`의 두 가지 모드를 지원합니다. 기본값은 `SYNC`입니다. `ASYNC`로 설정하면 Bulk API 2.0 Query가 처리에 활용됩니다.

예시:

```
salesforce_read = glueContext.create_dynamic_frame.from_options(
    connection_type="salesforce",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "Account",
        "API_VERSION": "v60.0",
        "PARTITION_FIELD": "SystemModstamp",
        "LOWER_BOUND": "TIMESTAMP '2021-01-01 00:00:00 Pacific/Tahiti'",
        "UPPER_BOUND": "TIMESTAMP '2023-01-10 00:00:00 Pacific/Tahiti'",
        "NUM_PARTITIONS": "10",
        "TRANSFER_MODE": "ASYNC" 
    }
)
```

## FILTER\$1PREDICATE 옵션
<a name="salesforce-filter-predicate"></a>

**FILTER\$1PREDICATE**: 선택적 파라미터입니다. 이 옵션은 쿼리 필터에서 사용됩니다.

**FILTER\$1PREDICATE** 예제:

```
     Case 1: FILTER_PREDICATE with single criterion
     Examples: 	
       LastModifiedDate >= TIMESTAMP '2025-04-01 00:00:00 Pacific/Tahiti'
       LastModifiedDate <= TIMESTAMP "2025-04-01 00:00:00"
       LastModifiedDate >= TIMESTAMP '2018-01-01 00:00:00.000 UTC'
       LastModifiedDate <= TIMESTAMP "-123456789 Pacific/Tahiti"
       LastModifiedDate <= TIMESTAMP "1702600882"

     Case 2: FILTER_PREDICATE with multiple criteria
     Examples: 
       LastModifiedDate >= TIMESTAMP '2025-04-01 00:00:00 Pacific/Tahiti' AND Id = "0012w00001CotGiAAJ"
       LastModifiedDate >= TIMESTAMP "1702600882" AND Id = "001gL000002i26MQAQ"

     Case 3: FILTER_PREDICATE single criterion with LIMIT
     Examples: 
       LastModifiedDate >= TIMESTAMP "1702600882" LIMIT 2

     Case 4: FILTER_PREDICATE with LIMIT
     Examples: 
       LIMIT 2
```

# Salesforce에 쓰기
<a name="salesforce-writing-to"></a>

**사전 조건**

쓰려는 Salesforce sObject입니다. `Account` `Case` 또는 `Opportunity`와 같은 객체 이름이 필요합니다.

Salesforce 커넥터는 네 가지 쓰기 작업을 지원합니다.
+ INSERT
+ UPSERT
+ UPDATE
+ DELETE

`UPSERT` 쓰기 작업을 사용하는 경우 레코드의 외부 ID 필드를 지정하려면 `ID_FIELD_NAMES` 옵션을 제공해야 합니다.

 연결 옵션을 추가할 수도 있습니다.
+  `TRANSFER_MODE`: `SYNC`와 `ASYNC`의 두 가지 모드를 지원합니다. 기본값은 `SYNC`입니다. `ASYNC`로 설정하면 Bulk API 2.0 Ingest가 처리에 활용됩니다.
+  `FAIL_ON_FIRST_ERROR`: 기본값은 `FALSE`로, 실패한 쓰기 레코드가 몇 개 있더라도 AWS Glue 작업이 모든 데이터 처리를 계속한다는 의미입니다. `TRUE`로 설정하면 실패한 쓰기 레코드가 있는 경우 AWS Glue 작업이 실패하고 처리를 계속하지 않습니다.

**예제**

```
salesforce_write = glueContext.write_dynamic_frame.from_options(
    frame=frameToWrite,
    connection_type="salesforce",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "Account",
        "API_VERSION": "v60.0",
        "WRITE_OPERATION": "INSERT",
        "TRANSFER_MODE": "ASYNC",
        "FAIL_ON_FIRST_ERROR": "true"
    }
)
```

# Salesforce 연결 옵션
<a name="salesforce-connection-options"></a>

다음 연결 옵션은 Salesforce 커넥터에서 지원됩니다.
+ `ENTITY_NAME`(문자열) - (필수) 읽기/쓰기에 사용됩니다. Salesforce에서의 객체 이름입니다.
+ `API_VERSION`(문자열) - (필수) 읽기/쓰기에 사용됩니다. 사용하려는 Salesforce Rest API 버전.
+ `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 객체에 대해 선택할 열.
+ `FILTER_PREDICATE`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.

  필터 조건자를 제공할 때에는 `AND` 연산자만 지원됩니다. 현재 `OR`, `IN`과 같은 다른 연산자는 지원되지 않습니다.
+ `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리.
+ `PARTITION_FIELD`(문자열) - 읽기에 사용됩니다. 쿼리 분할에 사용할 필드입니다.
+ `LOWER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 하한 값(경계 포함).
+ `UPPER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 상한 값(경계 제외).
+ `NUM_PARTITIONS`(정수) - 기본값: 1. 읽기에 사용됩니다. 읽을 파티션 수.
+ `IMPORT_DELETED_RECORDS`(문자열) - 기본값: FALSE. 읽기에 사용됩니다. 쿼리하는 동안 삭제 레코드를 가져오려면 다음을 수행합니다.
+ `WRITE_OPERATION`(문자열) - 기본값: INSERT. 쓰기에 사용됩니다. 값은 INSERT, UPDATE, UPSERT, DELETE여야 합니다.
+ `ID_FIELD_NAMES`(문자열) - 기본값: null. UPDATE 및 UPSERT에 필요합니다.

# Salesforce 커넥터의 제한 사항
<a name="salesforce-connector-limitations"></a>

다음은 Salesforce 커넥터의 제한 사항입니다.
+ Spark SQL만 지원하며 Salesforce SOQL은 지원되지 않습니다.
+ 작업 북마크는 지원되지 않습니다.
+ Salesforce 필드 이름은 대/소문자를 구분합니다. Salesforce에 쓸 때 데이터는 Salesforce 내에 정의된 필드의 대/소문자와 일치해야 합니다.

# Salesforce에 대한 권한 부여 코드 흐름 설정
<a name="salesforce-setup-authorization-code-flow"></a>

OAuth 2.0 권한 부여 코드 흐름을 활성화하려면 Salesforce 공개 문서를 참조하세요.

연결된 앱을 구성하려면:

1. **OAuth 설정 활성화** 확인란을 활성화합니다.

1. **콜백 URL** 텍스트 필드에 AWS Glue에 대한 리디렉션 URL을 하나 이상 입력합니다.

   리디렉션 URL 형식은 다음과 같습니다.

   https://*region*.console.aws.amazon.com/gluestudio/oauth

   이 URL에서 *region*은 AWS Glue를 사용하여 Salesforce의 데이터를 전송하는 AWS 리전의 코드입니다. 미국 동부(버지니아 북부) 리전의 경우 이 코드는 `us-east-1`입니다. 해당 리전의 URL은 다음과 같습니다.

   https://us-east-1.console.aws.amazon.com/gluestudio/oauth

   AWS Glue가 지원하는 AWS 리전과 해당 코드에 대해서는 *AWS 일반 참조*의 [AWS Glue 엔드포인트 및 할당량](https://docs.aws.amazon.com/general/latest/gr/glue.html)을 참조하세요.

1. **웹 서버 흐름에 보안 암호 필요** 확인란을 활성화합니다.

1. **사용 가능한 OAuth 범위** 목록에서 다음 범위를 추가합니다.
   + API로 사용자 데이터 관리(api)
   + 사용자 지정 권한 액세스(custom\$1permissions)
   + 자격 증명 URL 서비스 액세스(id, profile, email, address, phone)
   + 고유한 사용자 식별자 액세스(openid)
   + 언제든지 요청 수행(refresh\$1token, offline\$1access)

1. 연결된 앱의 새로 고침 토큰 정책을 **해지될 때까지 새로 고침 토큰이 유효함**으로 설정합니다. 그렇지 않으면 새로 고침 토큰이 만료되면 작업이 실패합니다. 새로 고침 토큰 정책을 확인하고 편집하는 방법에 대한 자세한 내용은 Salesforce 설명서의 [연결된 앱에 대한 OAuth 액세스 정책 관리](https://help.salesforce.com/articleView?id=connected_app_manage_oauth.htm)를 참조하세요.

# Salesforce용 JWT 베어러 OAuth 흐름 설정
<a name="salesforce-setup-jwt-bearer-oauth"></a>

[OAuth 2.0 JSON 웹 토큰](https://help.salesforce.com/s/articleView?id=sf.remoteaccess_oauth_jwt_flow.htm)과 서버 간 통합을 활성화하려면 Salesforce 공개 설명서를 참조하세요.

JWT를 생성하고 Salesforce에서 연결된 앱을 적절하게 구성한 후에는 Secrets Manager 보안 암호에 설정된 `JWT_TOKEN` 키를 사용하여 새 Salesforce 연결을 생성할 수 있습니다. 연결을 생성할 때 OAuth 권한 부여 유형을 **JWT 보유자 토큰**으로 설정합니다.

# Salesforce Marketing Cloud에 연결
<a name="connecting-to-data-salesforce-marketing-cloud"></a>

Salesforce Marketing Cloud는 이메일, 모바일, 소셜 및 온라인 마케팅을 위한 마케팅 자동화 및 분석 소프트웨어 제공업체입니다. 또한 컨설팅 및 구현 서비스도 제공합니다. Salesforce Marketing Cloud 사용자는 Salesforce Marketing Cloud 계정에 AWS Glue를 연결할 수 있습니다. 그런 다음, ETL 작업에서 Salesforce Marketing Cloud를 데이터 소스 또는 대상으로 사용할 수 있습니다. 이러한 작업을 실행하여 Salesforce Marketing Cloud 및 AWS 서비스 또는 기타 지원되는 애플리케이션 간에 데이터를 전송합니다.

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

# Salesforce Marketing Cloud에 대한 AWS Glue 지원
<a name="salesforce-marketing-cloud-support"></a>

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

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

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

**지원되는 Salesforce Marketing Cloud API 버전**  
다음 Salesforce Marketing Cloud API 버전이 지원됩니다.
+ v1

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

# Salesforce Marketing Cloud 구성
<a name="salesforce-marketing-cloud-configuring"></a>

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

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

다음은 최소 요구 사항입니다.
+ Salesforce Marketing Cloud 계정이 있습니다. 자세한 내용은 [Salesforce Marketing Cloud 계정 생성](#salesforce-marketing-cloud-configuring-creating-salesforce-marketing-cloud-account) 섹션을 참조하세요.
+ Salesforce Marketing Cloud 계정이 API 액세스에 대해 활성화되어 있습니다. API 액세스는 기본적으로 Enterprise, Unlimited, Developer, Performance 에디션에 대해 활성화됩니다.

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

## Salesforce Marketing Cloud 계정 생성
<a name="salesforce-marketing-cloud-configuring-creating-salesforce-marketing-cloud-account"></a>

Salesforce Marketing Cloud의 경우 계정 생성을 위해 공급업체에 문의해야 합니다. 사용자 또는 회사가 Salesforce와 연결되어 있는 경우 Salesforce 계정 관리자에게 문의하여 Salesforce Marketing Cloud 라이선스를 요청합니다. 그렇지 않으면 다음과 같이 Salesforce 담당자에게 연락처를 요청할 수 있습니다.

1. https://www.salesforce.com/in/products/marketing-cloud/overview/로 이동하고 **Sign up**을 선택하세요.

1. 페이지 오른쪽 상단의 **문의하기** 링크를 선택하세요.

1. 양식에 필요한 정보를 입력하고 **연락 요청**을 선택하세요.

Salesforce 담당자가 요구 사항을 논의하기 위해 연락을 드릴 것입니다.

## 프로젝트 및 OAuth 2.0 자격 증명 생성
<a name="salesforce-marketing-cloud-configuring-creating-salesforce-marketing-cloud-project-oauth"></a>

프로젝트 및 OAuth 2.0 자격 증명을 가져오는 방법:

1. 사용자 이름과 암호를 사용하여 [Salesforce Marketing Cloud 인스턴스](https://mc.login.exacttarget.com/hub-cas/login)에 로그인하고 등록된 휴대폰 번호를 사용하여 인증하세요.

1. 오른쪽 상단에서 프로필을 클릭한 다음, **Setup**으로 이동하세요.

1. **Platform Tools**에서 **Apps**를 선택하고 **Installed Packages**를 선택하세요.  
![\[\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/sfmc-platform-tools.png)

1. **Installed Packages** 페이지에서 오른쪽 상단에 있는 **New**를 클릭하세요. 패키지의 이름 및 설명을 제공하세요.

   패키지를 저장하세요. 패키지를 저장한 후 패키지 세부 정보를 볼 수 있습니다.

1. 패키지의 **Details** 페이지에서 **Component** 섹션 아래 **Add Component**를 선택하세요.  
![\[\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/sfmc-add-component.png)

1. **Component Type**을 'API Integration'으로 선택하고 **Next**를 클릭하세요.

1. **Integration Type**을 'Server-to-Server'(클라이언트 자격 증명 OAuth 권한 부여 유형)로 선택하고 **Next**를 클릭하세요.

1. 요구 사항에 따라 범위를 추가하고 **Save**를 클릭하세요.

# Salesforce Marketing Cloud 연결 구성
<a name="salesforce-marketing-cloud-configuring-connections"></a>

Salesforce Marketing Cloud는 OAuth2에 대한 CLIENT CREDENTIALS 권한 부여 유형을 지원합니다.
+ 이 권한 부여 유형은 클라이언트가 사용자의 컨텍스트 외부에서 액세스 토큰을 얻는 데 사용하므로 2각 OAuth 2.0으로 간주됩니다. AWS Glue는 클라이언트 ID와 클라이언트 암호를 사용하여 사용자가 정의한 사용자 지정 서비스에서 제공하는 Salesforce Marketing Cloud API를 인증할 수 있습니다.
+ 각 사용자 지정 서비스는 API 전용 사용자가 소유하며, API 전용 사용자는 서비스에 특정 작업을 수행하도록 권한을 부여하는 역할 및 권한 집합을 가집니다. 액세스 토큰은 단일 사용자 지정 서비스와 연결됩니다.
+ 이 권한 부여 유형은 수명이 짧은 액세스 토큰을 생성하며 ID 엔드포인트를 호출하여 갱신할 수 있습니다.
+ 클라이언트 자격 증명이 포함된 OAuth 2.0용 퍼블릭 Salesforce Marketing Cloud 설명서는 [Set Up Your Development Environment for Enhanced Packages](https://developer.salesforce.com/docs/marketing/marketing-cloud/guide/mc-dev-setup-enhanced.html)를 참조하세요.

Salesforce Marketing Cloud 연결을 구성하는 방법:

1. AWS Secrets Manager에서 다음 세부 정보로 보안 암호를 생성합니다.

   1. 고객 관리형 연결된 앱의 경우 보안 암호는 키 역할을 하는 `USER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET`과 함께 연결된 앱 소비자 보안 암호를 포함해야 합니다.

   1. 참고: AWS Glue에서 연결의 보안 암호를 생성해야 합니다.

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

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

   1. 연결하려는 Salesforce Marketing Cloud의 `Subdomain Endpoint` 항목을 제공합니다.

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

# Salesforce Marketing Cloud 엔터티에서 읽기
<a name="salesforce-marketing-cloud-reading-from-entities"></a>

**사전 조건**

읽으려는 Salesforce Marketing Cloud 객체. 객체 이름(예: `Activity` 또는 `Campaigns`)이 필요합니다. 다음 표에는 지원되는 엔터티가 나와 있습니다.

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


| 개체 | 인터페이스 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | SELECT \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | --- | 
| 이벤트 알림 콜백 | REST | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| 시드-목록 | REST | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| 설정 | REST | 예 | 예 | 아니요 | 예 | 아니요 | 
| 도메인 확인 | REST | 예 | 예 | 예 | 예 | 아니요 | 
| 객체 중첩된 태그 | REST | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Contact | REST | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| 이벤트 알림 구독 | REST | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| 메시지 전송 | REST | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| 활동 | SOAP | 아니요 | 아니요 | 아니요 | 예 | 예 | 
| 반송 이벤트 | SOAP | 아니요 | 아니요 | 아니요 | 예 | 예 | 
| 클릭 이벤트 | SOAP | 아니요 | 아니요 | 아니요 | 예 | 예 | 
| 콘텐츠 영역 | SOAP | 아니요 | 아니요 | 아니요 | 예 | 예 | 
| 데이터 확장 | SOAP | 아니요 | 예 | 아니요 | 예 | 예 | 
| 이메일 | SOAP | 아니요 | 예 | 아니요 | 예 | 예 | 
| 전달된 이메일 이벤트 | SOAP | 아니요 | 예 | 아니요 | 예 | 예 | 
| 이메일 OptInEvent 전달 | SOAP | 아니요 | 예 | 아니요 | 예 | 예 | 
| 링크 | SOAP | 아니요 | 예 | 아니요 | 예 | 예 | 
| 링크 전송 | SOAP | 아니요 | 예 | 아니요 | 예 | 예 | 
| 나열 | SOAP | 아니요 | 예 | 아니요 | 예 | 예 | 
| 구독자 나열 | SOAP | 아니요 | 예 | 아니요 | 예 | 예 | 
| 전송되지 않은 이벤트 | SOAP | 아니요 | 예 | 아니요 | 예 | 예 | 
| 열린 이벤트 | SOAP | 아니요 | 예 | 아니요 | 예 | 예 | 
| Send | SOAP | 아니요 | 예 | 아니요 | 예 | 예 | 
| 전송된 이벤트 | SOAP | 아니요 | 예 | 아니요 | 예 | 예 | 
| 구독자 | SOAP | 아니요 | 예 | 아니요 | 예 | 예 | 
| 설문조사 이벤트 | SOAP | 아니요 | 예 | 아니요 | 예 | 예 | 
| 구독 해지 이벤트 | SOAP | 아니요 | 예 | 아니요 | 예 | 예 | 
| 감사 이벤트 | REST | 아니요 | 예 | 예 | 예 | 아니요 | 
| Campaigns | REST | 아니요 | 예 | 예 | 예 | 아니요 | 
| 상호작용 | REST | 아니요 | 예 | 예 | 예 | 아니요 | 
| 콘텐츠 자산 | REST | 아니요 | 예 | 예 | 예 | 아니요 | 

**REST에 대한 예제**:

```
salesforcemarketingcloud_read = glueContext.create_dynamic_frame.from_options(
    connection_type="salesforcemarketingcloud",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "Campaigns",
        "API_VERSION": "v1",
        "INSTANCE_URL": "https://**********************.rest.marketingcloudapis.com"
    }
)
```

**SOAP에 대한 예제**:

```
salesforcemarketingcloud_read = glueContext.create_dynamic_frame.from_options(
    connection_type="salesforcemarketingcloud",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "Activity",
        "API_VERSION": "v1",
        "INSTANCE_URL": "https://**********************.soap.marketingcloudapis.com"
    }
)
```

**Salesforce Marketing Cloud 엔터티 및 필드 세부 정보**:

다음 표에서는 Salesforce Marketing Cloud 엔터티를 설명합니다. 정적 메타데이터를 포함하는 REST 엔터티와 동적 메타데이터를 포함하는 SOAP 엔터티가 있습니다.

**정적 메타데이터를 포함하는 REST 엔터티**:

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

**동적 메타데이터를 포함하는 SOAP 엔터티**:

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

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

Salesforce Marketing Cloud에서 정수 및 DateTime 데이터 유형 필드는 필드 기반 분할을 지원합니다.

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

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

  유효한 값의 예제:

  ```
  “2024-05-07T02:03:00.00Z"
  ```
+ `UPPER_BOUND`: 선택한 파티션 필드의 상한 값(**경계 제외**).
+ `NUM_PARTITIONS`: 파티션 수.

예시:

```
salesforcemarketingcloud_read = glueContext.create_dynamic_frame.from_options(
    connection_type="salesforcemarketingcloud",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "ListSubscriber",
        "API_VERSION": "v1",
        "PARTITION_FIELD": "CreatedDate",
        "LOWER_BOUND": "2023-09-07T02:03:00.000Z",
        "UPPER_BOUND": "2024-05-07T02:03:00.000Z",
        "NUM_PARTITIONS": "10"
    }
)
```

# Salesforce Marketing Cloud 엔터티에 쓰기
<a name="salesforce-marketing-cloud-writing-to-entities"></a>

**사전 조건**
+ 쓰기 대상 Salesforce Marketing 객체입니다. `List`나 `Campaigns` 또는 아래 표에 설명된 다른 엔터티와 같은 객체의 이름을 지정해야 합니다.
+ Salesforce Marketing Cloud 커넥터는 3가지 쓰기 작업을 지원합니다.
  + INSERT
  + UPSERT
  + UPDATE

  `UPDATE` 및 `UPSERT` 쓰기 작업을 사용하는 경우 레코드의 외부 ID 필드를 지정하려면 `ID_FIELD_NAMES` 옵션을 제공해야 합니다.

**대상에 지원되는 엔터티**:


| 개체 | 우선순위 | 인터페이스(REST, SOAP 등) | 삽입 가능 | 업데이트 가능 | 업서트 가능 | 
| --- | --- | --- | --- | --- | --- | 
| Campaigns | P0 | REST | Y- 단일 | Y- 단일 | N | 
| 콘텐츠 자산 | P0 | REST | Y- 단일, 대량 | Y- 단일 | N | 
| Contact | P1 | REST | Y- 단일 | Y- 단일 | N | 
| 도메인 확인 | P1 | REST | Y- 단일 | Y- 단일, 대량 | N | 
| 이벤트 알림 콜백 | P1 | REST | Y- 단일 | Y- 단일 | N | 
| 이벤트 알림 구독 | P1 | REST | Y- 단일 | Y- 단일 | N | 
| 메시지 전송 | P1 | REST | Y- 단일 | N | N | 
| 객체 중첩된 태그 | P2 | REST | Y- 단일 | Y- 단일 | N | 
| 시드-목록 | P1 | REST | Y- 단일 | Y- 단일 | N | 
| 설정 | P1 | REST | Y- 단일 | Y- 단일 | N | 
| 데이터 확장 | P0 | SOAP | Y- 단일 | Y- 단일 | Y- 단일 | 
| 이메일 | P0 | SOAP | Y- 단일 | Y- 단일 | N | 
| 나열 | P0 | SOAP | Y- 단일 | Y- 단일 | N | 
| Send | P0 | SOAP | Y- 단일 | N | N | 
| 구독자 | P0 | SOAP | Y- 단일 | Y- 단일 | N | 

**REST에 대한 INSERT 작업의 예시**:

```
salesforcemarketingcloud_write = glueContext.write_dynamic_frame.from_options(
    connection_type="salesforcemarketingcloud",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "Campaigns",
        "API_VERSION": "v1",
        "writeOperation" : "INSERT",
        "INSTANCE_URL": "https://**********************.rest.marketingcloudapis.com"
    }
)
```

**SOAP에 대한 INSERT 작업의 예시**:

```
salesforcemarketingcloud_write = glueContext.write_dynamic_frame.from_options(
    connection_type="salesforcemarketingcloud",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "List",
        "API_VERSION": "v1",
        "writeOperation" : "INSERT",
        "INSTANCE_URL": "https://**********************.rest.marketingcloudapis.com"
    }
)
```

**REST에 대한 UPDATE 작업의 예시**:

```
salesforcemarketingcloud_write = glueContext.write_dynamic_frame.from_options(
    connection_type="salesforcemarketingcloud",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "Campaigns",
        "API_VERSION": "v1",
        "writeOperation" : "UPDATE",
         "ID_FIELD_NAMES": "id",
        "INSTANCE_URL": "https://**********************.rest.marketingcloudapis.com"
    }
)
```

**SOAP에 대한 UPDATE 작업의 예시**:

```
salesforcemarketingcloud_write = glueContext.write_dynamic_frame.from_options(
    connection_type="salesforcemarketingcloud",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "List",
        "API_VERSION": "v1",
        "writeOperation" : "UPDATE",
         "ID_FIELD_NAMES": "id",
        "INSTANCE_URL": "https://**********************.rest.marketingcloudapis.com"
    }
)
```

**SOAP에 대한 UPSERT 작업의 예시**:

```
salesforcemarketingcloud_write = glueContext.write_dynamic_frame.from_options(
    connection_type="salesforcemarketingcloud",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "DataExtension/Insert-***E/6*******3",
        "API_VERSION": "v1",
        "writeOperation" : "UPSERT",
        "INSTANCE_URL": "https://**********************.rest.marketingcloudapis.com"
    }
)
```

# Salesforce Marketing Cloud 연결 옵션
<a name="salesforce-marketing-cloud-connection-options"></a>

다음은 Salesforce Marketing Cloud에 대한 연결 옵션입니다.
+ `ENTITY_NAME`(문자열) - (필수) 읽기에 사용됩니다. Salesforce Marketing Cloud에서의 객체 이름입니다.
+ `API_VERSION`(문자열) - (필수) 읽기에 사용됩니다. 사용할 Salesforce Marketing Cloud Rest 및 SOAP API 버전입니다.
+ `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 객체에 대해 선택할 열.
+ `FILTER_PREDICATE`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.
+ `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리.
+ `PARTITION_FIELD`(문자열) - 읽기에 사용됩니다. 쿼리 분할에 사용할 필드입니다.
+ `LOWER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 하한 값(경계 포함).
+ `UPPER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 상한 값(경계 제외).
+ `NUM_PARTITIONS`(정수) - 기본값: 1. 읽기에 사용됩니다. 읽을 파티션 수.
+ `WRITE_OPERATION`(문자열) - 기본값: INSERT. 쓰기에 사용됩니다. 값은 INSERT, UPDATE, UPSERT여야 합니다.
+ `ID_FIELD_NAMES`(문자열) - 기본값: null. UPDATE/UPSERT에 필요합니다.

# Salesforce Marketing Cloud 커넥터에 대한 제한 사항 및 참고 사항
<a name="salesforce-marketing-cloud-connector-limitations"></a>

다음은 Salesforce Marketing Cloud 커넥터에 대한 제한 사항 및 참고 사항입니다.
+ DateTime 데이터 유형 필드에 필터를 사용하는 경우 ‘yyyy-mm-ddThh:MM:ssZ’ 형식으로 값을 전달해야 합니다.
+ 데이터 미리 보기에서 부울 데이터 유형 값은 공백으로 제공됩니다.
+ SOAP 엔터티의 경우 최대 2개의 필터를 정의할 수 있으며, REST 엔터티의 경우 하나의 필터만 정의할 수 있어서 필터를 사용한 파티셔닝 테스트가 제한됩니다.
+ SaaS 측에서 몇 가지 예상치 못한 동작이 관찰되었습니다. `linksend` 엔터티의 `Link.Alias` 필드는 CONTAINS 연산자(예: `Link.Alias CONTAINS "ViewPrivacyPolicy"`)를 지원하지 않으며, 데이터 확장 엔터티의 필터 연산자(예: EQUALS 및 GREATER THAN)는 예상 결과를 반환하지 않습니다.
+ SFMC ClickEvent SOAP API는 새로 생성된 레코드 반영이 지연되므로 최근에 생성된 레코드는 API 응답에서 즉시 사용할 수 없을 수 있습니다.

  예: **2025-01-10T14:30:00**에 5개의 새 ClickEvent 레코드를 생성하고 SOAP API를 사용하여 즉시 가져오는 경우 응답에 5개의 레코드가 모두 포함되지 않을 수 있습니다. 새로 생성된 레코드가 API 응답에 표시되는 데 최대 5분이 걸릴 수 있습니다. 이 지연은 데이터 검색과 예약된 실행에도 영향을 미칠 수 있습니다.
+ **2025-03-11T04:46:00**(밀리초 제외) 및 **2025-03-11T04:46:00.000Z**의 두 가지 DateTime 형식은 AWS Glue(밀리초 포함)에서 쓰기 작업을 수행할 때 지원됩니다.
+ 이벤트 알림 구독 엔터티의 경우 확인된 콜백 URL에 대해서만 구독을 생성할 수 있으며 콜백당 최대 200개의 구독을 보유할 수 있습니다.
+ 이벤트 알림 콜백 엔터티의 경우 계정당 최대 50개의 레코드를 생성할 수 있습니다.

# Salesforce Commerce Cloud에 연결
<a name="connecting-to-salesforce-commerce-cloud"></a>

 B2C Commerce API는 B2C Commerce 인스턴스와 상호 작용하기 위한 RESTful API 모음입니다. Salesforce Commerce API와 그 약어인 SCAPI, 또는 Commerce API라고도 합니다.

 API를 통해 개발자는 전체 스토어프론트부터 사용자 지정 판매자 도구, Business Manager 강화에 이르기까지 다양한 애플리케이션을 구축할 수 있습니다. 모든 B2C Commerce 고객의 경우 API를 추가 비용 없이 사용할 수 있습니다.

 API는 Shopper API와 Admin API로 나뉩니다. 그리고 각 그룹 내에서 API 패밀리와 관련 기능에 초점을 맞춘 소규모 그룹으로 나뉩니다.

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

# AWS Glue의 Salesforce Commerce Cloud에 지원
<a name="salesforce-commerce-cloud-support"></a>

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

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

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

**지원되는 Salesforce Commerce Cloud API 버전**  
 v1.

# 연결을 생성하고 사용하기 위한 API 작업이 포함된 정책
<a name="salesforce-commerce-cloud-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 Management Console을 사용하는 경우 AWS Glue 리소스에 대한 전체 액세스 권한을 부여합니다. 이 정책에 지정된 리소스의 이름 변환을 따르면 사용자는 콘솔 전체 용량을 소유합니다. 이 정책은 보통 AWS Glue 콘솔의 사용자에게 해당됩니다.

# Salesforce Commerce Cloud 구성
<a name="salesforce-commerce-cloud-configuring"></a>

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

## 최소 요구 사항
<a name="salesforce-commerce-cloud-configuring-min-requirements"></a>
+  clientId 및 clientSecret이 있는 Salesforce Commerce Cloud 클라이언트 애플리케이션이 있습니다.
+  Salesforce Commerce Cloud 계정이 API 액세스에 대해 활성화되어 있습니다.

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

# Salesforce Commerce Cloud 연결 구성
<a name="salesforce-commerce-cloud-configuring-connections"></a>

 Salesforce Commerce Cloud는 OAuth2에 대한 CLIENT CREDENTIALS 권한 부여 유형을 지원합니다.
+  이 권한 부여 유형은 클라이언트가 사용자의 컨텍스트 외부에서 액세스 토큰을 얻는 데 사용하므로 2각 OAuth 2.0으로 간주됩니다. AWS Glue는 클라이언트 ID와 클라이언트 보안 암호를 사용하여 사용자가 정의한 사용자 지정 서비스에서 제공하는 Salesforce Commerce Cloud API를 인증할 수 있습니다.
+  각 사용자 지정 서비스는 API 전용 사용자가 소유하며, API 전용 사용자는 서비스에 특정 작업을 수행하도록 권한을 부여하는 역할 및 권한 집합을 가집니다. 액세스 토큰은 단일 사용자 지정 서비스와 연결됩니다.
+  이 권한 부여 유형은 수명이 짧은 액세스 토큰을 생성하며 ID 엔드포인트를 호출하여 갱신할 수 있습니다.
+  클라이언트 자격 증명 생성에 대한 Salesforce Commerce Cloud 설명서에서 정보를 찾으려면 [Salesforce 설명서](https://developer.salesforce.com/docs/commerce/commerce-api/guide/authorization.html)를 참조하세요.

다음 단계를 따라 Salesforce Commerce Cloud 연결을 구성합니다.

1.  AWS Secrets Manager에서 다음 세부 정보를 사용하여 보안 암호를 생성합니다. AWS Glue에서 각 연결에 대한 보안 암호를 생성해야 합니다.

   1.  고객 관리형 연결된 앱 - 보안 암호는 키 역할을 하는 USER\$1MANAGED\$1CLIENT\$1APPLICATION\$1CLIENT\$1SECRET과 함께 연결된 앱 소비자 보안 암호를 포함해야 합니다.

1. AWS Glue Studio의 **데이터 연결**에서 아래 단계에 따라 연결을 생성합니다.

   1.  데이터 연결에서 **연결 생성**을 선택합니다.

   1. **데이터 소스**를 선택할 때 Salesforce Commerce Cloud를 선택합니다.

   1. Salesforce Commerce Cloud **단축 코드**, **조직 ID** 및 **사이트 ID**를 입력합니다.

   1. Salesforce Commerce Cloud 계정의 Salesforce Commerce Cloud 도메인 URL을 선택합니다.

   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.  연결하려는 Salesforce Commerce Cloud의 OAuth 범위(선택 사항으로 사용자 관리형 클라이언트 애플리케이션 ClientId)를 입력합니다.

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

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

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

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

# Salesforce Commerce Cloud 엔터티에서 읽기
<a name="salesforce-commerce-cloud-reading-from-entities"></a>

 **사전 조건** 
+  읽으려는 Salesforce Commerce Cloud 객체. 사용 가능한 엔터티를 확인하려면 아래 지원되는 엔터티 테이블을 참조하세요.

 **지원되는 엔터티** 


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| Assignments | 예 | 예 | 예 | 예 | 예 | 
| Campaigns | 예 | 예 | 예 | 예 | 예 | 
| Catalogs | 예 | 예 | 예 | 예 | 예 | 
| Categories | 예 | 예 | 예 | 예 | 예 | 
| Coupons | 예 | 예 | 예 | 예 | 예 | 
| Gift Certificates | 예 | 예 | 예 | 예 | 예 | 
| Products | 예 | 예 | 예 | 예 | 예 | 
| Promotions | 예 | 예 | 예 | 예 | 예 | 
| Source Code Groups | 예 | 예 | 예 | 예 | 예 | 

 **예제** 

```
salesforce_commerce_cloud_read = glueContext.create_dynamic_frame.from_options(
     connection_type="SalesforceCommerceCloud",
     connection_options={
         "connectionName": "connectionName",
         "ENTITY_NAME": "campaign",
         "API_VERSION": "v1"      
     }
)
```

 **Salesforce Commerce Cloud 엔터티 및 필드 세부 정보** 

 엔터티 목록: 
+  Assignments: [https://developer.salesforce.com/docs/commerce/commerce-api/references/assignments]( https://developer.salesforce.com/docs/commerce/commerce-api/references/assignments) 
+  Campaigns: [https://developer.salesforce.com/docs/commerce/commerce-api/references/campaigns](https://developer.salesforce.com/docs/commerce/commerce-api/references/campaigns) 
+  Catalogs: [https://developer.salesforce.com/docs/commerce/commerce-api/references/catalogs](https://developer.salesforce.com/docs/commerce/commerce-api/references/catalogs) 
+  Categories: [https://developer.salesforce.com/docs/commerce/commerce-api/references/catalogs?meta=searchCategories](https://developer.salesforce.com/docs/commerce/commerce-api/references/catalogs?meta=searchCategories) 
+  Gift Certificates: [https://developer.salesforce.com/docs/commerce/commerce-api/references/gift-certificates](https://developer.salesforce.com/docs/commerce/commerce-api/references/gift-certificates) 
+  Products: [https://developer.salesforce.com/docs/commerce/commerce-api/references/products](https://developer.salesforce.com/docs/commerce/commerce-api/references/products) 
+  Promotions: [https://developer.salesforce.com/docs/commerce/commerce-api/references/promotions](https://developer.salesforce.com/docs/commerce/commerce-api/references/promotions) 
+  Source Code Groups: [https://developer.salesforce.com/docs/commerce/commerce-api/references/source-code-groups](https://developer.salesforce.com/docs/commerce/commerce-api/references/source-code-groups) 

 **분할 쿼리** 

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

   날짜의 경우 Spark SQL 쿼리에 사용된 Spark 날짜 형식을 허용합니다. 유효한 값의 예제: `"2024-02-06"`.
+  `UPPER_BOUND`: 선택한 파티션 필드의 상한 값(경계 제외).
+  `NUM_PARTITIONS`: 파티션 수.

 엔터티 수준 분할 필드 지원 세부 정보는 아래 표에 나와 있습니다.


| 개체 | 분할 필드 | 데이터 유형 | 
| --- | --- | --- | 
| Campaigns | lastModified | DateTime | 
| Campaigns | startDate | DateTime | 
| Campaigns | endDate | DateTime | 
| Catalogs | creationDate | DateTime | 
| Categories | creatiionDate | DateTime | 
| Gift Certificates | merchantId | String | 
| Gift Certificates | creatiionDate | DateTime | 
| Products | creatiionDate | DateTime | 
| Products | lastModified | DateTime | 
| Source Code Groups | creationDate | DateTime | 
| Source Code Groups | startTime | DateTime | 
| Source Code Groups | endTime | DateTime | 

 **예제** 

```
 salesforceCommerceCloud_read = glueContext.create_dynamic_frame.from_options(
     connection_type="SalesforceCommerceCloud",
     connection_options={
         "connectionName": "connectionName",
         "ENTITY_NAME": "coupons",
         "API_VERSION": "v1",
         "PARTITION_FIELD": "creationDate",
         "LOWER_BOUND": "2020-05-01T20:55:02.000Z",
         "UPPER_BOUND": "2024-07-11T20:55:02.000Z",
         "NUM_PARTITIONS": "10"
     }
)
```

# Salesforce Commerce Cloud 연결 옵션 참조
<a name="salesforce-commerce-cloud-connection-options"></a>

다음은 Salesforce Commerce Cloud의 연결 옵션입니다.
+  `ENTITY_NAME`(문자열) - (필수) 읽기에 사용됩니다. Salesforce Commerce Cloud에서의 객체 이름.
+  `API_VERSION`(문자열) - (필수) 읽기/쓰기에 사용됩니다. 사용하려는 Salesforce Commerce Cloud Rest API 버전. 예: v1.
+  `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 객체에 대해 선택할 열.
+  `FILTER_PREDICATE`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.
+  `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리.
+  `PARTITION_FIELD`(문자열) - 읽기에 사용됩니다. 쿼리 분할에 사용할 필드입니다.
+  `LOWER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 하한 값(경계 포함).
+  `UPPER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 상한 값(경계 제외).
+  `NUM_PARTITIONS`(정수) - 기본값: 1. 읽기에 사용됩니다. 읽을 파티션 수.

# 제한 사항
<a name="salesforce-commerce-cloud-connector-limitations"></a>

다음은 Salesforce Commerce Cloud 커넥터의 제한 사항입니다.
+ 분할 시 Contains 필터가 예상대로 작동하지 않습니다.
+ CDN Zones의 엔터티는 샌드박스 인스턴스를 지원하지 않으며, 개발 및 프로덕션 인스턴스 유형만 지원합니다. 자세한 내용은 [https://help.salesforce.com/s/articleView?id=cc.b2c\$1embedded\$1cdn\$1overview.htm](https://help.salesforce.com/s/articleView?id=cc.b2c_embedded_cdn_overview.htm) 페이지를 참조하세요.
+ Salesforce Commerce Cloud에서 동적 메타데이터를 가져올 API 엔드포인트가 없습니다. 따라서 제품 및 카테고리 엔터티의 사용자 지정 필드를 지원하는 프로비저닝이 없습니다.
+ 사이트 ID는 필수 쿼리 파라미터입니다. 사용자 지정 커넥터 설정을 통해 사이트 ID 값을 전달해야 합니다. 자세한 내용은 [Base URL and Request Formation](https://developer.salesforce.com/docs/commerce/commerce-api/guide/base-url.html)을 참조하세요.
+ 아래 표에 언급된 대로 서로 다른 연산자를 조합하여 단일 API 요청에서 최대 두 개의 필드(있는 경우 Levels 제외)에 필터를 적용할 수 있습니다.    
<a name="salesforce-commerce-cloud-limitations-filters"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/salesforce-commerce-cloud-connector-limitations.html)
+ 일부 엔터티에서 검색할 때 필드의 데이터 유형은 검색 가능한 필드로 사용되는 경우와 다릅니다. 그에 따라 이러한 필드에는 필터 특성의 프로비저닝이 없습니다. 다음 표에는 이러한 필드에 대한 세부 정보가 나와 있습니다.    
<a name="salesforce-commerce-cloud-limitations-filters-provision"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/salesforce-commerce-cloud-connector-limitations.html)

# Salesforce Marketing Cloud Account Engagement에 연결
<a name="connecting-to-data-salesforce-marketing-cloud-account-engagement"></a>

Salesforce Marketing Cloud Account Engagement는 회사가 의미 있는 연결을 생성하고, 추가 파이프라인을 생성하며, 더 많은 거래를 성사할 수 있도록 영업을 지원하는 마케팅 자동화 솔루션입니다. Salesforce Marketing Cloud Account Engagement 사용자인 경우 Salesforce Marketing Cloud Account Engagement 계정에 AWS Glue를 연결할 수 있습니다. Salesforce Marketing Cloud Account Engagement를 ETL 작업에서 데이터 소스로 사용할 수 있습니다. 이러한 작업을 실행하여 Salesforce Marketing Cloud Account Engagement에서 AWS 서비스 또는 기타 지원되는 애플리케이션으로 데이터를 전송합니다.

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

# Salesforce Marketing Cloud Account Engagement에 대한 AWS Glue의 지원
<a name="salesforce-marketing-cloud-account-engagement-support"></a>

AWS Glue에서는 다음과 같이 Salesforce Marketing Cloud Account Engagement를 지원합니다.

**소스로 지원되나요?**  
예. AWS Glue ETL 작업을 사용하여 Salesforce Marketing Cloud Account Engagement에서 비동기 또는 동기화 모드로 데이터를 쿼리할 수 있습니다.

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

**지원되는 Salesforce Marketing Cloud Account Engagement API 버전**  
다음 Salesforce Marketing Cloud Account Engagement API 버전이 지원됩니다.
+ v5

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

# Salesforce Marketing Cloud Account Engagement 구성
<a name="salesforce-marketing-cloud-account-engagement-configuring"></a>

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

## 최소 요구 사항
<a name="salesforce-marketing-cloud-account-engagement-configuring-min-requirements"></a>

다음은 최소 요구 사항입니다.
+ Salesforce 마케팅 계정이 있습니다.
+ Salesforce 계정에 대해 라이선스가 부여된 Account Engagement 계획이 있습니다.
+ Salesforce 사용자를 Account Engagement 사용자와 동기화했습니다.
+ OAuth 자격 증명을 얻기 위해 App Manager 아래에서 새 연결된 앱을 생성했습니다.

이러한 요구 사항을 충족하면 Salesforce Marketing Cloud Account Engagement 계정에 AWS Glue를 연결할 준비가 된 것입니다.

# Salesforce Marketing Cloud Account Engagement 연결 구성
<a name="salesforce-marketing-cloud-account-engagement-configuring-connections"></a>

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

Salesforce Marketing Cloud Account Engagement 연결을 구성하는 방법:

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

   1. **연결 유형**을 선택할 때 Salesforce Marketing Cloud Account Engagement를 선택하세요.

   1. 연결하려는 Salesforce Marketing Cloud Account Engagement 인스턴스의 `INSTANCE_URL` 항목을 제공하세요.

   1. 연결하려는 Salesforce Marketing Cloud Account Engagement 인스턴스의 `PARDOT_BUSINESS_UNIT_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. 사용자 관리형 클라이언트 애플리케이션 클라이언트 ID(연결된 앱의 클라이언트 ID)를 제공합니다.

   1. 토큰을 넣기 위해 AWS Glue에서 이 연결에 사용할 `secretName`을 선택합니다. 선택한 보안 암호에는 값이 연결된 앱의 클라이언트 보안 암호인 `USER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET` 키가 있어야 합니다.

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

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

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

# Salesforce Marketing Cloud Account Engagement 엔터티에서 읽기
<a name="salesforce-marketing-cloud-account-engagement-reading-from-entities"></a>

**사전 조건**

읽으려는 Salesforce Marketing Cloud Account Engagement 객체. 객체 이름이 필요합니다.

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


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| 캠페인 | 예 | 예 | 예 | 예 | 예 | 
| 동적 콘텐츠 | 예 | 예 | 예 | 예 | 예 | 
| 이메일 | 예 | 예 | 예 | 예 | 예 | 
| 이메일 템플릿 | 예 | 예 | 예 | 예 | 예 | 
| 참여 스튜디오 프로그램 | 예 | 예 | 예 | 예 | 예 | 
| 폴더 콘텐츠 | 예 | 예 | 예 | 예 | 예 | 
| 랜딩 페이지 | 예 | 예 | 예 | 예 | 예 | 
| 수명 주기 기록 | 예 | 예 | 예 | 예 | 예 | 
| 수명 주기 단계 | 예 | 예 | 예 | 예 | 예 | 
| 나열 | 예 | 예 | 예 | 예 | 예 | 
| 이메일 나열 | 예 | 예 | 예 | 예 | 예 | 
| 멤버쉽 나열 | 예 | 예 | 예 | 예 | 예 | 
| 기회 | 예 | 예 | 예 | 예 | 예 | 
| 잠재 고객 | 예 | 예 | 예 | 예 | 예 | 
| 잠재 고객 계정 | 예 | 예 | 예 | 예 | 예 | 
| User | 예 | 예 | 예 | 예 | 예 | 

**예시:**

```
salesforcepardot_read = glueContext.create_dynamic_frame.from_options(
    connection_type="SalesforcePardot",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "entityName",
        "API_VERSION": "v5"
    }
   )
```

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


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| 캠페인 | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| 동적 콘텐츠 | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| 이메일 템플릿 | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| 랜딩 페이지 | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| 수명 주기 기록 | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| 수명 주기 단계 | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| 나열 | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| 이메일 나열 | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| 멤버쉽 나열 | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| 기회 | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| 잠재 고객 | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| 잠재 고객 계정 | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| User | 예 | 아니요 | 아니요 | 예 | 아니요 | 

**예시:**

```
salesforcepardot_read = glueContext.create_dynamic_frame.from_options(
    connection_type="SalesforcePardot",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "entityName",
        "API_VERSION": "v5",
        "TRANSFER_MODE": "ASYNC"
    }
   )
```

**Salesforce Marketing Cloud Account Engagement 엔터티 및 필드 세부 정보**:

다음 엔터티의 필드 세부 정보를 보려면 [Salesforce Marketing Cloud Account Engagement API](https://developer.salesforce.com/docs/marketing/pardot)로 이동하여 **가이드**를 선택하고 **오픈 소스 API 래퍼**로 스크롤한 다음, 메뉴에서 **버전 5 문서**를 확장하고 엔터티를 선택합니다.

엔터티 목록:
+ 캠페인
+ 동적 콘텐츠
+ 이메일
+ 이메일 템플릿
+ 참여 스튜디오 프로그램
+ 폴더 콘텐츠
+ 랜딩 페이지
+ 수명 주기 기록
+ 수명 주기 단계
+ 나열
+ 이메일 나열
+ 멤버쉽 나열
+ Opportunity
+ 잠재 고객
+ 잠재 고객 계정
+ User

위에서 언급한 필드 외에도 비동기 모드는 아래 표와 같이 각 엔터티에 대해 특정 필터링 가능 필드를 지원합니다.


| 개체 | 비동기에서 지원되는 추가 필터링 가능 필드 | 
| --- | --- | 
| 캠페인 | createdAfter, createdBefore, deleted, updatedAfter, updatedBefore | 
| 동적 콘텐츠 | createdAfter, createdBefore, deleted, updatedAfter, updatedBefore | 
| 이메일 템플릿 | createdAfter, createdBefore, deleted, updatedAfter, updatedBefore | 
| 참여 스튜디오 프로그램 | - | 
| 랜딩 페이지 | createdAfter, createdBefore, deleted, updatedAfter, updatedBefore | 
| 수명 주기 기록 | createdAfter, createdBefore | 
| 수명 주기 단계 | createdAfter, createdBefore, deleted, updatedAfter, updatedBefore | 
| 나열 | createdAfter, createdBefore, deleted, updatedAfter, updatedBefore | 
| 이메일 나열 | createdAfter, createdBefore, deleted, updatedAfter, updatedBefore | 
| 멤버쉽 나열 | createdAfter, createdBefore, deleted, updatedAfter, updatedBefore | 
| Opportunity | createdAfter, createdBefore, deleted, updatedAfter, updatedBefore | 
| 잠재 고객 | createdAfter, createdBefore, deleted, updatedAfter, updatedBefore | 
| 잠재 고객 계정 | createdAfter, createdBefore, deleted | 
| User | createdAfter, createdBefore, deleted, updatedAfter, updatedBefore | 

추가 필드에 대한 자세한 내용은 [Salesforce Export API](https://developer.salesforce.com/docs/marketing/pardot/guide/export-v5.html#procedures)를 참조하세요.

커넥터에 대한 다음 고려 사항에 유의합니다.
+ 엔터티에서 `delete` 필드 값은 `false`(기본값), `true` 또는 `all`일 수 있습니다.

## 분할 쿼리
<a name="salesforce-marketing-cloud-account-engagement-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 타임스탬프 형식을 허용합니다.

  유효한 값의 예제:

  ```
  "2022-01-01T01:01:01.000Z"
  ```
+ `UPPER_BOUND`: 선택한 파티션 필드의 상한 값(**경계 제외**).
+ `NUM_PARTITIONS`: 파티션 수.
+ `PARTITION_BY`: 수행할 분할 유형. 필드 기반 분할의 경우 "FIELD"를 전달해야 합니다.

예시:

```
salesforcepardot_read = glueContext.create_dynamic_frame.from_options(
    connection_type="salesforcepardot",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "entityName",
        "API_VERSION": "v5",
        "PARTITION_FIELD": "createdAt"
        "LOWER_BOUND": "2022-01-01T01:01:01.000Z"
        "UPPER_BOUND": "2024-01-01T01:01:01.000Z"
        "NUM_PARTITIONS": "10",
        "PARTITION_BY": "FIELD"
    }
   )
```

# Salesforce Marketing Cloud Account Engagement 연결 옵션
<a name="salesforce-marketing-cloud-account-engagement-connection-options"></a>

다음은 Salesforce Marketing Cloud Account Engagement에 대한 연결 옵션입니다.
+ `ENTITY_NAME`(문자열) - (필수) 읽기에 사용됩니다. Salesforce Marketing Cloud Account Engagement에서의 객체 이름.
+ `PARDOT_BUSINESS_UNIT_ID` - (필수) 연결을 생성하는 데 사용됩니다. 연결하려는 Salesforce Marketing Cloud Account Engagement 인스턴스의 사업부 ID.
+ `API_VERSION`(문자열) - (필수) 읽기에 사용됩니다. 사용할 Salesforce Marketing Cloud Account Engagement Rest API 버전.
+ `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 객체에 대해 선택할 열.
+ `FILTER_PREDICATE`(문자열) -
  + 동기화 모드에서 - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.
  + 비동기 모드에서 - 기본값: 현재 `DateTime` 값(사용자 시간대 기준) - 1년. 읽기에 사용됩니다.
+ `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리.
+ `PARTITION_FIELD`(문자열) - 읽기에 사용됩니다. 쿼리 분할에 사용할 필드입니다.
+ `LOWER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 하한 값(경계 포함).
+ `UPPER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 상한 값(경계 제외).
+ `NUM_PARTITIONS`(정수) - 기본값: 1. 읽기에 사용됩니다. 읽을 파티션 수.
+ `INSTANCE_URL`(문자열) - (필수) 읽기에 사용됩니다. 유효한 Salesforce Marketing Cloud Account Engagement 인스턴스 URL.
+ `PARTITION_BY`(문자열) - (필수) 읽기에 사용됩니다. 수행할 분할의 유형. 필드 기반 분할의 경우 "FIELD"를 전달해야 합니다.
+ `TRANSFER_MODE`(문자열) - (선택 사항), 비동기 모드에서 작업을 실행하는 데 사용할 값으로, 이 옵션이 제공되지 않은 경우 동기화 모드에서 작업이 실행됩니다.

# Salesforce Marketing Cloud Account Engagement 커넥터에 대한 제한 사항 및 참고 사항
<a name="salesforce-marketing-cloud-account-engagement-connector-limitations"></a>

다음과 같은 참조 사항 및 제한 사항이 적용됩니다.
+ 제한과 분할이 모두 적용되면 제한이 분할보다 우선합니다.
+ API 문서에 따라 `SalesforceMarketingCloudEngagement`에서는 일일 및 동시 요청에 RateLimit를 적용했습니다. 자세한 내용은 [Rate Limits](https://developer.salesforce.com/docs/marketing/pardot/guide/overview.html?q=limitation#rate-limits)를 참조하세요.
+ 내보내기 API에는 일일 Account Engagement API 직접 호출 한도와, 계정에 대한 동시 Account Engagement API 직접 호출 한도가 적용됩니다.
+ 대기열과 마찬가지로 내보내기/비동기 API 직접 호출은 각 계정에 대해 순차적으로 실행됩니다. 이전 내보내기는 최신 내보내기 전에 처리됩니다.
+ 파티션은 비동기 모드에서 지원되지 않습니다.
+ 내보내기/비동기 API 직접 호출에 지정된 선택한 필드 수는 150개를 초과할 수 없습니다.
+ **Prospect** 엔터티는 150개 이상의 필드를 지원하지만 한 번에 150개 필드만 선택할 수 있습니다. `Select All`을 선택하면 일부 필드가 제외됩니다. 제외된 필드에 대한 데이터를 검색하려면 `Selected Fields` 옵션에 해당 필드를 포함해야 합니다.

  다음은 `SELECT_ALL`에서 제외된 필드 목록입니다. - `updatedBy.firstName`, `updatedBy.lastName`, `updatedBy.jobTitle`, `updatedBy.roleName`, `updatedBy.salesforceId`, `updatedBy.createdAt`, `updatedBy.updatedAt`, `updatedBy.isDeleted`, `updatedBy.createdById`, `updatedBy.updatedById`, `updatedBy.tagReplacementLanguage` 
+ 컬렉션 필드는 비동기화에 대해 내보낼 수 없습니다. 예를 들어 이메일 목록에서 `senderOptions` 및 `replyToOptions` 필드는 지원되지 않습니다.
+ 모든 엔터티에 대해 필터는 필수입니다. 필터가 제공되지 않은 경우 기본 필터 조건자가 현재 날짜-시간(표준 시간대에 맞게 조정됨)에서 1년을 뺀 값으로 `Created After` 필드에 설정됩니다.
+ Salesforce Marketing Cloud Account Engagement 제한 사항에 따라 비동기에서 데이터를 가져오는 최대 범위는 1년입니다. 1년 이상의 기간에 대해 쿼리하면 작업에서 오류가 발생합니다.
+ 현재 Salesforce Pardot에 버그가 있습니다. 데이터가 없는 단일 필드만 작업에 포함된 경우 필드 값은 올바른 결과를 반환하지 않으며, 대신 필드 이름이 여러 번 반환됩니다. Salesforce Pardot 팀은 문제를 알고 있으며 해결을 위해 적극적으로 노력하고 있습니다.

# AWS Glue Studio에서 SAP HANA에 연결
<a name="connecting-to-data-saphana"></a>

 AWS Glue에서는 SAP HANA을 기본으로 지원합니다. AWS Glue Studio에서는 SAP HANA에 연결하고, 데이터 통합 작업을 작성하며, AWS Glue Studio 서버리스 Spark 런타임에서 실행할 수 있는 시각적 인터페이스를 제공합니다.

 AWS Glue Studio에서 SAP HANA용 통합 연결을 생성합니다. 자세한 내용은 [고려 사항](using-connectors-unified-connections.md#using-connectors-unified-connections-considerations) 섹션을 참조하세요.

**Topics**
+ [SAP HANA 커넥션 생성](creating-saphana-connection.md)
+ [SAP HANA 소스 노드 생성](creating-saphana-source-node.md)
+ [SAP HANA 대상 노드 생성](creating-saphana-target-node.md)
+ [고급 옵션](#creating-saphana-connection-advanced-options)

# SAP HANA 커넥션 생성
<a name="creating-saphana-connection"></a>

AWS Glue에서 SAP HANA에 연결하려면 AWS Secrets Manager 보안 암호에서 SAP HANA 보안 인증 정보를 생성하고 저장한 다음 해당 보안 암호를 SAP HANA AWS Glue 연결에 연결해야 합니다. SAP HANA 서비스와 AWS Glue 간에 네트워크 연결을 구성해야 합니다.

**사전 조건** 
+ SAP HANA 서비스가 Amazon VPC에 있는 경우, 퍼블릭 인터넷을 통과하는 트래픽 없이 AWS Glue 작업이 SAP HANA 서비스와 통신할 수 있도록 Amazon VPC를 구성하십시오.

  Amazon VPC에서 작업을 실행하는 동안 AWS Glue가 사용할 **VPC**, **서브넷** 및 **보안 그룹**을 식별하거나 생성합니다. 또한 Amazon VPC가 SAP HANA 엔드포인트와 이 위치 간의 네트워크 트래픽을 허용하도록 구성되어 있는지 확인해야 합니다. 작업을 수행하려면 SAP HANA JDBC 포트와의 TCP 연결을 설정해야 합니다. SAP HANA 포트에 대한 자세한 내용은 [SAP HANA 설명서](https://help.sap.com/docs/HANA_SMART_DATA_INTEGRATION/7952ef28a6914997abc01745fef1b607/88e2e8bded9e4041ad3ad87dc46c7b55.html?locale=en-US)를 참조하십시오. 네트워크 레이아웃에 따라 보안 그룹 규칙, 네트워크 ACL, NAT 게이트웨이 및 피어링 연결을 변경해야 할 수도 있습니다.

**SAP HANA에 대한 연결 구성하는 방법:**

1. AWS Secrets Manager에서 SAP HANA 보안 인증을 사용하여 보안 암호를 생성합니다. Secrets Manager에서 보안 암호를 생성하려면 AWS Secrets Manager 설명서의 [Create an AWS Secrets Manager secret](https://docs.aws.amazon.com//secretsmanager/latest/userguide/create_secret.html)에서 제공하는 자습서를 따릅니다. 보안 암호를 생성한 후에는 다음 단계를 위해 보안 암호 이름, *secretName*을 유지합니다.
   + **키/값 페어**를 선택하면 값 *saphanaUsername*이 포함된 키 `username/USERNAME`에 대한 페어를 생성합니다.
   + **키/값 페어**를 선택하면 값 *saphanaPassword*가 포함된 키 `password/PASSWORD`에 대한 페어를 생성합니다.

1. AWS Glue 콘솔에서 [AWS Glue 연결 추가](console-connections.md)의 단계에 따라 연결을 생성합니다. 연결을 생성한 후에는 AWS Glue에서 이용하기 위해 연결 이름 *connectionName*을 유지합니다.
   + **연결 유형**을 선택할 때 SAP HANA를 선택합니다.
   + **SAP HANA URL을** 제공할 때는 인스턴스의 URL을 제공하십시오.

     SAP HANA JDBC URL은 `jdbc:sap://saphanaHostname:saphanaPort/?databaseName=saphanaDBname,ParameterName=ParameterValue` 형식입니다

     AWS Glue는 JDBC URL 매개 변수가 필요합니다.
     + `databaseName` - 연결할 SAP HANA의 기본 데이터베이스입니다.
   + **AWS 보안 암호**를 선택할 때 *secretName*을 입력합니다.

AWS Glue SAP HANA 연결을 생성한 후에는 AWS Glue 작업을 실행하기 전에 다음 단계를 수행해야 합니다.
+ AWS Glue 작업 권한과 연결된 IAM 역할에 *secretName*을 읽을 수 있는 권한을 부여합니다.

# SAP HANA 소스 노드 생성
<a name="creating-saphana-source-node"></a>

## 필수 전제 조건
<a name="creating-saphana-source-node-prerequisites"></a>
+ 이전 섹션 [SAP HANA 커넥션 생성](creating-saphana-connection.md)에서 설명한 것처럼 AWS Secrets Manager 암호로 구성된 AWS Glue SAP HANA 연결입니다.
+ 연결에 사용되는 보안 암호를 읽을 작업에 대한 적절한 권한.
+ 읽으려는 SAP HANA 테이블, *tableName* 또는 쿼리 *targetQuery*.

  SAP HANA 테이블 이름 및 스키마 이름을 `schemaName.tableName` 형식으로 테이블을 지정할 수 있습니다. 테이블이 기본 스키마 "public"에 있는 경우 스키마 이름과 "." 구분 기호는 필요하지 않습니다. 이것을 *tableIdentifier*라고 합니다. 데이터베이스는 `connectionName`에서 JDBC URL 매개변수로 제공된다는 점에 유의하십시오.

## SAP HANA 데이터 소스 추가
<a name="creating-saphana-source-node-add"></a>

****데이터 소스 - SAP HANA** 노드를 추가하는 방법:**

1.  SAP HANA 데이터 소스의 연결을 선택합니다. 생성했으므로 드롭다운에서 사용할 수 있을 것입니다. 연결을 생성해야 하는 경우 **SAP HANA 연결 생성**을 선택합니다. 자세한 내용은 이전[SAP HANA 커넥션 생성](creating-saphana-connection.md) 섹션을 참조하세요.

    연결을 선택한 후에는 **속성 보기**를 클릭하여 연결 속성을 볼 수 있습니다.

1.  **SAP HANA 소스** 옵션을 선택하십시오.
   +  **단일 테이블 선택** - 단일 테이블에서 모든 데이터에 액세스할 수 있습니다.
   +  **사용자 지정 쿼리 입력** - 사용자 지정 쿼리를 기반으로 여러 테이블의 데이터 세트에 액세스할 수 있습니다.

1.  단일 테이블을 선택한 경우 *tableName*을 입력합니다.

    **사용자 지정 쿼리 입력**을 선택한 경우 SQL SELECT 쿼리를 입력합니다.

1.  **사용자 지정 SAP HANA 속성**에서 필요한 경우 파라미터와 값을 입력합니다.

# SAP HANA 대상 노드 생성
<a name="creating-saphana-target-node"></a>

## 필수 전제 조건
<a name="creating-saphana-target-node-prerequisites"></a>
+ 이전 섹션 [SAP HANA 커넥션 생성](creating-saphana-connection.md)에서 설명한 것처럼 AWS Secrets Manager 암호로 구성된 AWS Glue SAP HANA 연결입니다.
+ 연결에 사용되는 보안 암호를 읽을 작업에 대한 적절한 권한.
+ 쓰고 싶은 SAP HANA 테이블, *tableName*

  SAP HANA 테이블 이름 및 스키마 이름을 `schemaName.tableName` 형식으로 테이블을 지정할 수 있습니다. 테이블이 기본 스키마 "public"에 있는 경우 스키마 이름과 "." 구분 기호는 필요하지 않습니다. 이것을 *tableIdentifier*라고 합니다. 데이터베이스는 `connectionName`에서 JDBC URL 매개변수로 제공된다는 점에 유의하십시오.

## SAP HANA 데이터 대상 추가
<a name="creating-saphana-target-node-add"></a>

****데이터 대상 - SAP HANA** 노드 추가 방법:**

1.  SAP HANA 데이터 소스의 연결을 선택합니다. 생성했으므로 드롭다운에서 사용할 수 있을 것입니다. 연결을 생성해야 하는 경우 **SAP HANA 연결 생성**을 선택합니다. 자세한 내용은 이전[SAP HANA 커넥션 생성](creating-saphana-connection.md) 섹션을 참조하세요.

    연결을 선택한 후에는 **속성 보기**를 클릭하여 연결 속성을 볼 수 있습니다.

1. *tableName*을 제공하여 **테이블 이름**을 구성합니다.

1.  **사용자 지정 Teradata 속성**에서 필요한 경우 파라미터와 값을 입력합니다.

## 고급 옵션
<a name="creating-saphana-connection-advanced-options"></a>

SAP HANA 노드를 생성할 때 고급 옵션을 제공할 수 있습니다. 이 옵션은 Spark 스크립트에 대한 AWS Glue를 프로그래밍할 때 사용할 수 있는 옵션과 동일합니다.

[SAP HANA 커넥션](aws-glue-programming-etl-connect-saphana-home.md)를 참조하세요.

# SAP OData에 연결
<a name="connecting-to-data-sap-odata"></a>

SAP OData는 Advanced Business Application Programming(ABAP)을 사용하여 SAP에 있는 데이터를 쿼리 및 업데이트하는 데 사용되는 표준 웹 프로토콜로, HTTP와 같은 웹 기술을 적용 및 빌드하여 다양한 외부 애플리케이션, 플랫폼 및 디바이스의 정보에 대한 액세스를 제공합니다. 이 제품을 사용하면 SAP 시스템, 애플리케이션 또는 데이터와 원활하게 통합하는 데 필요한 모든 요소에 액세스할 수 있습니다.

**Topics**
+ [SAP OData에 대한 AWS Glue의 지원](sap-odata-support.md)
+ [연결 만들기](sap-odata-creating-connections.md)
+ [SAP OData 작업 생성](sap-odata-creating-job.md)
+ [SAP OData에 쓰기](sap-odata-writing.md)
+ [SAP OData 상태 관리 스크립트 사용](sap-odata-state-management-script.md)
+ [비 ODP 엔터티를 위한 파티셔닝](sap-odata-non-odp-entities-partitioning.md)
+ [SAP OData 연결 옵션](sap-odata-connection-options.md)
+ [SAP OData 엔터티 및 필드 세부 정보](sap-odata-entity-field-details.md)

# SAP OData에 대한 AWS Glue의 지원
<a name="sap-odata-support"></a>

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

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

**대상으로서 지원되나요?**  
예. AWS Glue ETL 작업을 사용하여 SAP OData에 레코드를 쓸 수 있습니다.

**지원되는 SAP OData API 버전**  
다음 SAP OData API 버전이 지원됩니다.
+ 2.0

**지원되는 소스**  
지원되는 소스는 다음과 같습니다.
+ ODP(운영 데이터 프로비저닝) 소스:
  + BW 추출기(DataSource)
  + CDS 뷰
  + SLT
+ 비 ODP 소스, 예:
  + CDS 뷰 서비스
  + RFC 기반 서비스
  + 사용자 지정 ABAP 서비스

**지원되는 SAP 구성 요소**  
다음은 최소 요구 사항입니다.
+ 서비스 검색을 위해 카탈로그 서비스를 활성화해야 합니다.
  + SAP 시스템의 SAP Gateway에서 추출할 운영 데이터 프로비저닝(ODP) 데이터 소스를 구성합니다.
  + **OData V2.0**: `/IWFND/MAINT_SERVICE` 트랜잭션을 통해 SAP Gateway에서 OData V2.0 카탈로그 서비스를 활성화합니다.
  + `/IWFND/MAINT_SERVICE` 트랜잭션을 통해 SAP Gateway에서 OData V2.0 서비스를 활성화합니다.
  + SAP OData 서비스는 `$top` 및 `$skip`과 같은 클라이언트 측 페이지 매김/쿼리 옵션을 지원해야 합니다. 또한 시스템 쿼리 옵션 `$count`도 지원해야 합니다.
  + SAP 사용자가 서비스를 검색하고 SAP OData 서비스를 사용하여 데이터를 추출하려면 필요한 권한을 제공해야 합니다. SAP에서 제공하는 보안 설명서를 참조하세요.
+ OAuth 2.0을 권한 부여 메커니즘으로 사용하려는 경우 OData 서비스에 대해 OAuth 2.0을 활성화하고 SAP 설명서에 따라 OAuth 클라이언트를 등록해야 합니다.
+ ODP 데이터 소스를 기반으로 OData 서비스를 생성하려면 SAP Gateway Foundation을 ERP/BW 스택 또는 허브 구성에 로컬로 설치해야 합니다.
  + ERP/BW 애플리케이션의 경우 SAP NetWeaver AS ABAP 스택이 7.50 SP02 이상이어야 합니다.
  + 허브 시스템(SAP Gateway)의 경우 원격 허브 설정을 위해 허브 시스템의 SAP NetWeaver AS ABAP가 7.50 SP01 이상이어야 합니다.
+ 비 ODP 소스의 경우 SAP NetWeaver 스택 버전은 7.40 SP02 이상이어야 합니다.

**지원되는 인증 방법**  
지원되는 인증 방법은 다음과 같습니다.
+ 기본 인증
+ OAuth 2.0

# 사전 조건
<a name="sap-odata-prerequisites"></a>

SAP OData 연결을 사용하여 SAP OData에서 데이터를 추출하기 위한 AWS Glue 작업을 시작하기 전에 다음 사전 조건을 완료합니다.
+ 관련 SAP OData 서비스는 SAP 시스템에서 활성화하여 데이터 소스를 사용할 수 있도록 해야 합니다. OData 서비스가 활성화되지 않은 경우 Glue 작업은 SAP에서 데이터에 액세스하거나 추출할 수 없습니다.
+ SAP에서 기본(사용자 지정) 인증 또는 OAuth 2.0과 같은 적절한 인증 메커니즘을 구성하여 AWS Glue 작업이 SAP OData 서비스와 성공적으로 연결할 수 있도록 해야 합니다.
+ AWS Glue 작업에 SAP, Secrets Manager 및 프로세스와 관련된 기타 AWS 리소스에 액세스할 수 있는 적절한 권한을 부여하도록 IAM 정책을 구성합니다.
+ SAP 시스템이 프라이빗 네트워크 내에서 호스트되는 경우 AWS Glue 작업이 퍼블릭 인터넷을 통해 민감한 데이터를 노출하지 않고 SAP와 안전하게 통신할 수 있도록 VPC 연결을 구성해야 합니다.

AWS Secrets Manager를 사용하여 AWS Glue 작업이 런타임에 동적으로 검색할 수 있는 SAP 자격 증명과 같은 민감한 정보를 안전하게 저장할 수 있습니다. 이 접근 방식을 사용하면 자격 증명을 하드 코딩할 필요가 없으므로 보안 및 유연성이 향상됩니다.

다음 사전 조건은 AWS Glue와 SAP OData 간의 원활한 통합을 위해 각 구성 요소를 설정하는 방법에 대한 단계별 지침을 제공합니다.

**Topics**
+ [SAP OData 활성화](sap-odata-activation.md)
+ [IAM 정책](sap-odata-configuring-iam-permissions.md)
+ [연결/VPC 연결](sap-odata-connectivity-vpc-connection.md)
+ [SAP 인증](sap-odata-authentication.md)
+ [인증 비밀을 저장할 AWS Secrets Manager](sap-odata-aws-secret-manager-auth-secret.md)

# SAP OData 활성화
<a name="sap-odata-activation"></a>

SAP OData 연결을 위한 다음 단계를 완료합니다.

## ODBC 소스
<a name="sap-odata-odp-sources"></a>

ODP 공급자에서 데이터를 전송하려면 먼저 다음 요구 사항을 충족해야 합니다.
+ SAP NetWeaver AS ABAP 인스턴스가 있어야 합니다.
+ SAP NetWeaver 인스턴스에 데이터를 전송할 ODP 공급자가 포함되어야 합니다. ODP 공급자가 다음을 포함해야 합니다.
  + SAP DataSources(트랜잭션 코드 RSO2)
  + SAP Core Data Services ABAP CDS 뷰
  + SAP BW 또는 SAP BW/4HANA 시스템(InfoObject, DataStore 객체)
  + SAP Landscape Replication Server(SAP SLT)를 통해 SAP 소스 시스템에서 테이블 및 DB 뷰를 실시간 복제
  + SAP ABAP 기반 소스의 SAP HANA 정보 뷰
+ SAP NetWeaver 인스턴스에는 SAP Gateway Foundation 구성 요소가 있어야 합니다.
+ ODP 공급자로부터 데이터를 추출하는 OData 서비스를 생성해야 합니다. OData 서비스를 생성하려면 SAP Gateway Service Builder를 사용합니다. ODP 데이터에 액세스하기 위해 Amazon AppFlow는 OData API를 사용하여 이 서비스를 직접적으로 호출합니다. 자세한 내용은 SAP BW/4HANA 설명서의 [OData를 통해 OData 데이터를 추출하기 위한 서비스 생성](https://help.sap.com/docs/SAP_BPC_VERSION_BW4HANA/dd104a87ab9249968e6279e61378ff66/69b481859ef34bab9cc7d449e6fff7b6.html?version=11.0)을 참조하세요.
+ ODP 데이터 소스를 기반으로 OData 서비스를 생성하려면 SAP Gateway Foundation을 ERP/BW 스택 또는 허브 구성에 로컬로 설치해야 합니다.
  + ERP/BW 애플리케이션의 경우 SAP NetWeaver AS ABAP 스택이 7.50 SP02 이상이어야 합니다.
  + 허브 시스템(SAP Gateway)의 경우 원격 허브 설정을 위해 허브 시스템의 SAP NetWeaver AS ABAP가 7.50 SP01 이상이어야 합니다.

## 비ODP 소스
<a name="sap-odata-non-odp-sources"></a>
+ SAP NetWeaver 스택 버전은 7.40 SP02 이상이어야 합니다.
+ 서비스 검색을 위해 카탈로그 서비스를 활성화해야 합니다.
  + **OData V2.0**: `/IWFND/MAINT_SERVICE` 트랜잭션을 통해 SAP Gateway에서 하나 이상의 OData V2.0 카탈로그 서비스를 활성화할 수 있습니다.
+ SAP OData 서비스는 `$top` 및 `$skip`과 같은 클라이언트 측 페이지 매김/쿼리 옵션을 지원해야 합니다. 또한 시스템 쿼리 옵션 `$count`도 지원해야 합니다.
+ OAuth 2.0의 경우 OData 서비스에 대해 OAuth 2.0을 활성화하고 SAP 설명서에 따라 OAuth 클라이언트를 등록하고 다음과 같이 권한이 부여된 리디렉션 URL을 설정해야 합니다.
  + `https://<region>.console.aws.amazon.com/gluestudio/oauth`. `<region>`을 AWS Glue가 실행 중인 리전으로 바꿉니다(예: us-east-1).
  + HTTPS를 통해 연결하려면 보안 설정을 활성화해야 합니다.
+ SAP 사용자가 서비스를 검색하고 SAP OData 서비스를 사용하여 데이터를 추출하려면 필요한 권한을 제공해야 합니다. SAP에서 제공하는 보안 설명서를 참조하세요.

# IAM 정책
<a name="sap-odata-configuring-iam-permissions"></a>

## 연결을 생성하고 사용하기 위한 API 작업이 포함된 정책
<a name="sap-odata-policies-api-operations"></a>

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

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

****  

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

------

역할은 작업에서 사용하는 모든 리소스(예: Amazon S3)에 대한 액세스 권한을 부여해야 합니다. 위 메서드를 사용하지 않으려는 경우 다음 관리형 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 콘솔의 사용자에게 해당됩니다.
+ [SecretsManagerReadWrite](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/SecretsManagerReadWrite) – AWS Management Console을 통해 AWS Secrets Manager에 대한 읽기/쓰기 액세스를 제공합니다. 참고: 여기에는 IAM 작업이 제외되므로 교체 구성이 필요한 경우 `IAMFullAccess`와 함께 사용합니다.

**VPC를 구성하는 데 필요한 IAM 정책/권한**

VPC 연결을 사용하여 AWS Glue 연결을 생성하는 동안 다음 IAM 권한이 필요합니다. 자세한 내용은 [AWS Glue에 대한 IAM 정책 생성](https://docs.aws.amazon.com/glue/latest/dg/create-service-policy.html)을 참조하세요.

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

****  

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

------

# 연결/VPC 연결
<a name="sap-odata-connectivity-vpc-connection"></a>

VPC 연결 단계:

1. 기존 VPC 연결을 사용하거나 [Amazon VPC 설명서](https://docs.aws.amazon.com/vpc/latest/userguide/create-vpc.html)에 따라 새 연결을 생성합니다.

1. 트래픽을 인터넷으로 라우팅하는 NAT 게이트웨이가 있어야 합니다.

1. VPC 엔드포인트를 Amazon S3 게이트웨이로 선택하여 연결을 생성합니다.

1. AWS에서 제공하는 DNS 서비스를 사용하려면 DNS 확인 및 DNS 호스트 이름을 활성화합니다.

1. 생성된 VPC로 이동하여 STS, AWS Glue, Secrets Manager와 같은 다양한 서비스에 필요한 엔드포인트를 추가합니다.

   1. 엔드포인트 생성을 선택합니다.

   1. 서비스 범주에서 AWS 서비스를 선택합니다.

   1. 서비스 이름에서 연결할 서비스를 선택합니다.

   1. VPC 및 DNS 이름 활성화를 선택합니다.

   1. VPC 연결에 필요한 VCP 엔드포인트:

      1. [STS](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sts_vpc_endpoint_create.html)

      1. [AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/vpc-interface-endpoints.html)

      1. [보안 관리자](https://docs.aws.amazon.com/secretsmanager/latest/userguide/vpc-endpoint-overview.html)

## 보안 그룹 구성
<a name="sap-odata-security-group-configuration"></a>

보안 그룹은 AWS Glue가 연결할 수 있도록 AWS Glue VPC에서 수신 대기 포트로의 트래픽을 허용해야 합니다. 소스 IP 주소의 범위를 최대한 제한하는 것이 좋습니다.

AWS Glue에는 자체로부터의 모든 인바운드 트래픽을 허용하는 특수 보안 그룹이 필요합니다. 보안 그룹에서 발생하는 모든 트래픽을 허용하는 자체 참조 규칙을 생성할 수 있습니다. 기존 보안 그룹을 수정하고 보안 그룹을 소스로 지정할 수 있습니다.

URL 엔드포인트(NLB 또는 SAP 인스턴스)의 HTTPS 포트에서 통신을 개방합니다.

## 연결 옵션
<a name="sap-odata-connectivity-options"></a>
+ 내부 및 외부 NLB와의 HTTPS 연결, 자체 서명된 SSL 인증서가 아닌 인증 기관(CA)의 SSL 인증서
+ SAP 인스턴스와의 HTTPS 연결, 자체 서명된 SSL 인증서가 아닌 인증 기관(CA)의 SSL 인증서

# SAP 인증
<a name="sap-odata-authentication"></a>

SAP 커넥터는 사용자 지정(SAP 기본 인증임) 및 OAUTH 인증 방법을 모두 지원합니다.

## 사용자 지정 인증
<a name="sap-odata-custom-authentication"></a>

AWS Glue는 SAP 시스템에 대한 연결을 설정하기 위한 방법으로 사용자 지정(기본 인증)을 지원하므로 보안 액세스를 위해 사용자 이름 및 암호를 사용할 수 있습니다. 이 권한 부여 유형은 SAP OData 인스턴스에서 특정 사용자의 권한을 통해 사용자 이름 및 암호를 미리 사용할 수 있으므로 자동화 시나리오에 적합합니다. AWS Glue에서는 사용자 이름 및 암호를 사용하여 SAP OData API를 인증할 수 있습니다. AWS Glue에서 기본 권한 부여는 사용자 지정 권한 부여로 구현됩니다.

기본 권한 부여 흐름에 대한 퍼블릭 SAP OData 설명서는 [HTTP Basic Authentication](https://help.sap.com/docs/SAP_SUCCESSFACTORS_PLATFORM/d599f15995d348a1b45ba5603e2aba9b/5c8bca0af1654b05a83193b2922dcee2.html)을 참조하세요.

## OAuth 2.0 인증
<a name="sap-odata-oauth-2.0-authentication"></a>

AWS Glue는 SAP 시스템에 대한 연결을 설정하기 위한 보안 인증 메커니즘으로 OAuth 2.0도 지원합니다. 이를 통해 원활한 통합이 가능하면서도 최신 인증 표준을 준수하고 데이터 액세스의 보안을 강화할 수 있습니다.

## AUTHORIZATION\$1CODE 권한 부여 유형
<a name="sap-odata-authentication-code-grant-type"></a>

권한 부여 유형은 AWS Glue에서 SAP OData와 통신하여 데이터에 대한 액세스를 요청하는 방법을 결정합니다. SAP OData에서는 `AUTHORIZATION_CODE` 권한 부여 유형만 지원합니다. 이 권한 부여 유형은 사용자를 인증하기 위해 사용자를 서드파티 권한 부여 서버로 리디렉션하는 방식에 의존하므로 '3각' OAuth로 간주됩니다. AWS Glue 콘솔을 통해 연결을 생성할 때 사용됩니다.

사용자는 AWS Glue 콘솔을 통해 연결을 생성할 때에도 SAP OData에서 자체 연결된 앱을 생성하고 자체 클라이언트 ID와 클라이언트 보안 암호를 제공하기로 선택할 수 있습니다. 이 시나리오에서는 여전히 SAP OData로 리디렉션되어 로그인하고 리소스에 액세스할 수 있는 권한을 AWS Glue에 부여합니다.

이 권한 부여 유형은 새로 고침 토큰과 액세스 토큰을 생성합니다. 액세스 토큰은 수명이 짧으며 새로 고침 토큰을 사용하여 사용자 상호 작용 없이 자동으로 새로 고칠 수 있습니다.

권한 부여 코드 OAuth 흐름을 위한 연결된 앱 생성에 대한 퍼블릭 SAP OData 설명서는 [Authentication Using OAuth 2.0](https://help.sap.com/docs/ABAP_PLATFORM_NEW/e815bb97839a4d83be6c4fca48ee5777/2e5104fd87ff452b9acb247bd02b9f9e.html)을 참조하세요.

# 인증 비밀을 저장할 AWS Secrets Manager
<a name="sap-odata-aws-secret-manager-auth-secret"></a>

SAP OData 연결 비밀을 AWS Secrets Manager에 저장하고, [IAM 정책](sap-odata-configuring-iam-permissions.md) 섹션에 지정된 대로 검색에 필요한 권한을 구성하고, 연결을 생성하는 동안 사용해야 합니다.

AWS Secrets Manager용 AWS Management Console을 사용하여 SAP 소스에 대한 비밀을 생성합니다. 자세한 내용은 [AWS Secrets Manager 비밀 생성](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html)을 참조하세요. AWS Secrets Manager의 세부 정보에는 다음 코드의 요소가 포함되어야 합니다.

## 사용자 지정 인증 비밀
<a name="sap-odata-custom-auth-secret"></a>

*<SAP 사용자 이름>* 대신 SAP 시스템 사용자 이름, *<SAP 사용자 이름 암호>* 대신 해당 암호, 그리고 True 또는 False를 입력해야 합니다. 이 컨텍스트에서 `basicAuthDisableSSO`를 `true`로 설정하면 기본 인증 요청에 대해 AWS Single Sign-On(SSO)가 비활성화되어 각 요청에 대해 명시적 사용자 자격 증명이 필요합니다. 반대로 `false`로 설정하면 사용 가능한 경우 기존 SSO 세션을 사용할 수 있습니다.

```
{
   "basicAuthUsername": "<your SAP username>",
   "basicAuthPassword": "<your SAP username password>",
   "basicAuthDisableSSO": "<True/False>",
   "customAuthenticationType": "CustomBasicAuth"
}
```

## OAuth 2.0 비밀
<a name="sap-odata-oauth-2.0-secret"></a>

OAuth 2.0을 인증 메커니즘으로 사용하는 경우 AWS Secrets Manager의 비밀에는 다음 형식의 **사용자 관리형 클라이언트 애플리케이션 ClientId**가 있어야 합니다. <클라이언트 비밀> 대신 SAP 클라이언트 비밀을 입력해야 합니다.

```
{"USER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET": "<your client secret>"
}
```

# 연결 만들기
<a name="sap-odata-creating-connections"></a>

SAP OData 연결을 구성하는 방법:

1. AWS Management Console에 로그인하여 [AWS Glue 콘솔](https://console.aws.amazon.com/glue)을 엽니다. AWS Glue Studio에서 아래 단계에 따라 연결을 생성합니다.

   1. 왼쪽 패널에서 데이터 연결을 클릭합니다.

   1. 연결 생성을 클릭합니다.

   1. **데이터 소스 선택**에서 **SAP OData**를 선택합니다.

   1. 연결하려는 SAP OData 인스턴스의 **애플리케이션 호스트 URL**을 제공하세요. 이 애플리케이션 호스트 URL은 비 VPC 연결을 위해 퍼블릭 인터넷을 통해 액세스할 수 있어야 합니다.

   1. 연결하려는 SAP OData 인스턴스의 **애플리케이션 서비스 경로**를 제공하세요. 이 경로는 카탈로그 서비스 경로와 동일합니다. 예: `/sap/opu/odata/iwfnd/catalogservice;v=2`. AWS Glue는 특정 객체 경로를 허용하지 않습니다.

   1. 연결하려는 SAP OData 인스턴스의 **클라이언트 번호**를 제공하세요. 사용 가능한 값은 [001-999]입니다. 예: 010

   1. 연결하려는 SAP OData 인스턴스의 **포트 번호**를 제공하세요. 예: 443

   1. 연결하려는 SAP OData 인스턴스의 **로그온 언어**를 제공하세요. 예: EN

   1. AWS Glue가 수임할 수 있고 [IAM 정책](sap-odata-configuring-iam-permissions.md) 섹션에 설명된 권한이 있는 AWS IAM 역할을 선택합니다.

   1. AWS Glue에서 이 연결에 사용할 **인증 유형**을 드롭다운 목록에서 선택합니다. OAUTH2 또는 사용자 지정

      1. 사용자 지정 - [인증 비밀을 저장할 AWS Secrets Manager](sap-odata-aws-secret-manager-auth-secret.md) 섹션에 지정된 대로 생성한 비밀을 선택합니다.

      1. OAuth 2.0 - OAuth 2.0의 경우에만 다음 항목을 입력합니다.

         1. **사용자 관리형 클라이언트 애플리케이션 ClientId**에 클라이언트 ID를 입력합니다.

         1. AWS Secrets Manager에 [인증 비밀을 저장할 AWS Secrets Manager](sap-odata-aws-secret-manager-auth-secret.md) 섹션에서 생성한 `USER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET`(클라이언트 비밀)를 입력합니다.

         1. **권한 부여 코드 URL**에 권한 부여 코드 URL을 입력합니다.

         1. **권한 부여 토큰 URL**에 권한 부여 토큰 URL을 입력합니다.

         1. **OAuth 범위**에 OAuth 범위를 공백으로 구분하여 입력합니다. 예시: `/IWFND/SG_MED_CATALOG_0002 ZAPI_SALES_ORDER_SRV_0001`

   1. 네트워크를 사용하려는 경우 네트워크 옵션을 선택합니다. 자세한 내용은 [연결/VPC 연결](sap-odata-connectivity-vpc-connection.md)을 참조하세요.

1. AWS Glue 작업 권한과 연결된 IAM 역할에 `secretName`을 읽을 수 있는 권한을 부여합니다. 자세한 내용은 [IAM 정책](sap-odata-configuring-iam-permissions.md) 단원을 참조하십시오.

1. **연결 테스트**를 선택하고 연결을 테스트합니다. 연결 테스트가 통과하면 다음을 클릭하여 연결 이름을 입력하고 연결을 저장합니다. 네트워크 옵션(VPC)을 선택한 경우 연결 테스트 기능을 사용할 수 없습니다.

# SAP OData 작업 생성
<a name="sap-odata-creating-job"></a>

[AWS Glue Studio를 사용하여 시각적 ETL 작업 구축](https://docs.aws.amazon.com/glue/latest/dg/author-job-glue.html) 참조

# 운영 데이터 프로비저닝(ODP) 소스
<a name="sap-odata-operational-data-provisioning-sources"></a>

운영 데이터 프로비저닝(ODP)은 다양한 대상 애플리케이션의 데이터 추출 및 복제를 지원하는 데 사용할 수 있는 기술 인프라를 제공하며 이러한 시나리오에서 델타 메커니즘을 지원합니다. 델타 절차의 경우 소스(ODP 공급자)의 데이터는 업데이트 프로세스를 사용하여 델타 대기열(운영 델타 대기열 - ODQ)에 자동으로 기록되거나 추출기 인터페이스를 사용하여 델타 대기열에 전달됩니다. ODP 공급자는 DataSource(추출기), ABAP Core Data Services 뷰(ABAP CDS 뷰), SAP BW 또는 SAP BW/4HANA, SAP Landscape Transformation Replication Server(SLT) 및 SAP HANA 정보 뷰(계산 뷰)일 수 있습니다. 대상 애플리케이션(ODQ '구독자' 또는 보다 일반적으로 'ODP 소비자'라고 함)은 델타 대기열에서 데이터를 검색하고 데이터를 계속 처리합니다.

## 전체 로드
<a name="sap-odata-full-load"></a>

SAP OData 및 ODP 엔터티의 컨텍스트에서 **전체 로드**는 단일 작업으로 ODP 엔터티에서 사용 가능한 모든 데이터를 추출하는 프로세스를 나타냅니다. 이 작업은 소스 시스템에서 전체 데이터세트를 검색하여 대상 시스템에 엔터티 데이터의 포괄적인 최신 사본이 로드되도록 보장합니다. 전체 로드는 일반적으로 소스가 증분 로드를 지원하지 않는 경우 또는 대상 시스템의 새로 고침이 필요한 경우에 사용됩니다.

**예제**

DynamicFrame을 생성할 때 `ENABLE_CDC` 플래그를 false로 명시적으로 설정할 수 있습니다. 참고: `ENABLE_CDC`는 기본적으로 false입니다. 델타 대기열을 초기화하지 않으려는 경우 이 플래그를 보내거나 true로 설정할 필요가 없습니다. 이 플래그를 true로 설정하지 않으면 전체 로드 추출이 수행됩니다.

```
sapodata_df = glueContext.create_dynamic_frame.from_options(
    connection_type="SAPOData",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "entityName",
        "ENABLE_CDC": "false"
    }, transformation_ctx=key)
```

## 증분 로드
<a name="sap-odata-incremental-load"></a>

ODP(운영 데이터 프로비저닝) 엔터티의 컨텍스트에서 **증분 로드**는 마지막 데이터 추출 이후 소스 시스템에서 새 데이터 또는 변경된 데이터(델타)만 추출하여 이미 처리된 레코드를 사전 처리하지 않도록 합니다. 이 접근 방식은 효율성을 크게 개선하고, 데이터 전송 볼륨을 줄이고, 성능을 향상하고, 시스템 간의 효율적인 동기화를 보장하고, 처리 시간을 최소화합니다. 특히 자주 변경되는 대규모 데이터세트의 경우 효과적입니다.

# 델타 토큰 기반 증분 전송
<a name="sap-odata-incremental-transfers"></a>

이를 지원하는 ODP 지원 엔터티에 대해 변경 데이터 캡처(CDC)를 사용하여 증분 전송을 활성화하려면 다음 단계를 따르세요.

1. 스크립트 모드에서 증분 전송 작업을 생성합니다.

1. DataFrame 또는 Glue DynamicFrame을 생성할 때 `"ENABLE_CDC": "True"` 옵션을 전달해야 합니다. 이 옵션을 사용하면 SAP로부터 변경된 데이터의 후속 검색에 사용할 수 있는 델타 토큰을 수신할 수 있습니다.

델타 토큰은 DELTA\$1TOKEN 열의 마지막 데이터프레임 행에 있습니다. 이 토큰을 후속 직접 호출에서 커넥터 옵션으로 사용하여 다음 데이터세트를 증분 검색할 수 있습니다.

**예제**
+ DynamicFrame을 생성할 때 `ENABLE_CDC` 플래그를 `true`로 설정합니다. 참고: `ENABLE_CDC`는 기본적으로 `false`입니다. 델타 대기열을 초기화하지 않으려는 경우 이 플래그를 보내거나 true로 설정할 필요가 없습니다. 이 플래그를 true로 설정하지 않으면 전체 로드 추출이 수행됩니다.

  ```
  sapodata_df = glueContext.create_dynamic_frame.from_options(
      connection_type="SAPOData",
      connection_options={
          "connectionName": "connectionName",
          "ENTITY_NAME": "entityName",
          "ENABLE_CDC": "true"
      }, transformation_ctx=key)
  
  # Extract the delta token from the last row of the DELTA_TOKEN column
  delta_token_1 = your_logic_to_extract_delta_token(sapodata_df) # e.g., D20241029164449_000370000
  ```
+ 새 이벤트를 검색하는 옵션으로 추출된 델타 토큰을 전달할 수 있습니다.

  ```
  sapodata_df_2 = glueContext.create_dynamic_frame.from_options(
      connection_type="SAPOData",
      connection_options={
          "connectionName": "connectionName",
          "ENTITY_NAME": "entityName",
          // passing the delta token retrieved in the last run
          "DELTA_TOKEN": delta_token_1
      } , transformation_ctx=key)
  
  # Extract the new delta token for the next run
  delta_token_2 = your_logic_to_extract_delta_token(sapodata_df_2)
  ```

`DELTA_TOKEN`이 있는 마지막 레코드는 소스의 트랜잭션 레코드가 아니며 델타 토큰 값을 전달할 목적으로만 존재합니다.

`DELTA_TOKEN` 외에도 데이터프레임의 각 행에서 다음 필드가 반환됩니다.
+ **GLUE\$1FETCH\$1SQ**: EPOC 타임스탬프에서 생성된 시퀀스 필드(레코드가 수신된 순서에 따름)이며 각 레코드에 대해 고유합니다. 소스 시스템에서 변경 순서를 알거나 설정해야 하는 경우 사용할 수 있습니다. 이 필드는 ODP 지원 엔터티에만 표시됩니다.
+ **DML\$1STATUS**: 소스에서 새로 삽입된 레코드 및 업데이트된 레코드에 대해서는 `UPDATED`, 소스에서 삭제된 레코드에 대해서는 `DELETED`를 표시합니다.

상태를 관리하고 델타 토큰을 재사용하여 예제를 통해 변경된 레코드를 검색하는 방법에 대한 자세한 내용은 [SAP OData 상태 관리 스크립트 사용](sap-odata-state-management-script.md) 섹션을 참조하세요.

## 델타 토큰 무효화
<a name="sap-odata-invalidation"></a>

델타 토큰은 서비스 컬렉션 및 사용자와 연결됩니다. 동일한 서비스 컬렉션 및 사용자에 대해 `“ENABLE_CDC” : “true”`를 사용한 새 초기 풀이 시작되는 경우 이전 초기화의 결과로 발급된 이전의 모든 델타 토큰은 SAP OData 서비스에서 무효화됩니다. 만료된 델타 토큰으로 커넥터를 간접적으로 호출하면 예외가 발생합니다.

`Could not open data access via extraction API RODPS_REPL_ODP_OPEN` 

# OData 서비스(비ODP 소스)
<a name="sap-odata-non-odp-services"></a>

## 전체 로드
<a name="sap-odata-non-odp-full-load"></a>

비 ODP(운영 데이터 프로비저닝) 시스템의 경우 **전체 로드**는 소스 시스템에서 전체 데이터세트를 추출하여 대상 시스템에 로드합니다. 비 ODP 시스템은 본질적으로 델타와 같은 고급 데이터 추출 메커니즘을 지원하지 않으므로 프로세스는 간단하지만 데이터 크기에 따라 리소스 집약적일 수 있습니다.

## 증분 로드
<a name="sap-odata-non-odp-incremental-load"></a>

**ODP(운영 데이터 프로비저닝)**를 지원하지 않는 시스템 또는 엔터티의 경우 변경 사항을 추적하고 추출하는 타임스탬프 기반 메커니즘을 구현하여 증분 데이터 전송을 수동으로 관리할 수 있습니다.

**타임스탬프 기반 증분 전송**

비 ODP 지원 엔터티(또는 ENABLE\$1CDC 플래그를 사용하지 않는 ODP 지원 엔터티)의 경우 커넥터에서 `filteringExpression` 옵션을 사용하여 데이터를 검색하려는 `datetime` 간격을 표시할 수 있습니다. 이 방법은 각 레코드가 마지막으로 생성/수정된 시점을 나타내는 데이터의 타임스탬프 필드에 의존합니다.

**예제**

2024-01-01T00:00:00.000 이후 변경된 레코드 검색

```
sapodata_df = glueContext.create_dynamic_frame.from_options(
    connection_type="SAPOData",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "entityName",
        "filteringExpression": "LastChangeDateTime >= 2024-01-01T00:00:00.000"
    }, transformation_ctx=key)
```

참고: 이 예제에서 `LastChangeDateTime`은 각 레코드가 마지막으로 수정된 시간을 나타내는 필드입니다. 실제 필드 이름은 특정 SAP OData 엔터티에 따라 다를 수 있습니다.

후속 실행에서 새 데이터의 새 하위 세트를 가져오려면 `filteringExpression`을 새 타임스탬프로 업데이트해야 합니다. 일반적으로 이전에 검색된 데이터의 최대 타임스탬프 값입니다.

**예제**

```
max_timestamp = get_max_timestamp(sapodata_df)  # Function to get the max timestamp from the previous run
next_filtering_expression = f"LastChangeDateTime > {max_timestamp}"

# Use this next_filtering_expression in your next run
```

다음 섹션에서는 이러한 타임스탬프 기반 증분 전송을 관리하기 위한 자동화된 접근 방식을 제공합니다. 이 경우 실행 간에 필터링 표현식을 수동으로 업데이트하지 않아도 됩니다.

# SAP OData에 쓰기
<a name="sap-odata-writing"></a>

 이 섹션에서는 SAP OData용 AWS Glue 커넥터를 사용하여 SAP OData 서비스에 데이터를 쓰는 방법을 설명합니다.

**사전 조건**
+ SAP OData 서비스에 대한 액세스
+ 데이터를 쓰려는 SAP OData EntitySet 객체. 객체 이름이 필요합니다.
+ 유효한 SAP OData 자격 증명 및 유효한 연결
+ [IAM 정책](https://docs.aws.amazon.com/glue/latest/dg/sap-odata-configuring-iam-permissions.html) 설명된 적절한 권한

SAP OData 커넥터는 두 가지 쓰기 작업을 지원합니다.
+ INSERT
+ UPDATE

UPDATE 쓰기 작업을 사용하는 경우 ID\$1FIELD\$1NAMES를 제공하여 레코드의 외부 ID 필드를 지정해야 합니다.

**예시:**

```
sapodata_write = glueContext.write_dynamic_frame.from_options(
    frame=frameToWrite,
    connection_type="sapodata",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "entityName",
        "WRITE_OPERATION": "INSERT"
    }
```

# SAP OData 상태 관리 스크립트 사용
<a name="sap-odata-state-management-script"></a>

AWS Glue 작업에서 SAP OData 상태 관리 스크립트를 사용하려면 다음 단계를 수행하세요.
+ 퍼블릭 Amazon S3 버킷에서 상태 관리 스크립트(`s3://aws-blogs-artifacts-public/artifacts/BDB-4789/sap_odata_state_management.zip `)를 다운로드합니다.
+ 스크립트를 AWS Glue 작업에서 액세스할 권한이 있는 Amazon S3 버킷에 업로드합니다.
+ AWS Glue 작업에서 스크립트 참조: AWS Glue 작업을 생성하거나 업데이트할 때 Amazon S3 버킷의 스크립트 경로를 참조하는 `'--extra-py-files'` 옵션을 전달합니다. 예: `--extra-py-files s3://your-bucket/path/to/sap_odata_state_management.py`
+ AWS Glue 작업 스크립트에서 상태 관리 라이브러리를 가져오고 사용하세요.

## 델타 토큰 기반 증분 전송 예제
<a name="sap-odata-delta-token-incremental-transfer"></a>

다음은 델타 토큰 기반 증분 전송에 상태 관리 스크립트를 사용하는 방법에 대한 예제입니다.

```
from sap_odata_state_management import StateManagerFactory, StateManagerType, StateType

# Initialize the state manager
state_manager = StateManagerFactory.create_manager(
    manager_type=StateManagerType.JOB_TAG,
    state_type=StateType.DELTA_TOKEN,
    options={
        "job_name": args['JOB_NAME'],
        "logger": logger
    }
)

# Get connector options (including delta token if available)
key = "SAPODataNode"
connector_options = state_manager.get_connector_options(key)

# Use the connector options in your Glue job
df = glueContext.create_dynamic_frame.from_options(
    connection_type="SAPOData",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "entityName",
        "ENABLE_CDC": "true",
        **connector_options
    }
)

# Process your data here...

# Update the state after processing
state_manager.update_state(key, sapodata_df.toDF())
```

## 타임스탬프 기반 증분 전송 예제
<a name="sap-odata-timestamp-incremental-transfer"></a>

다음은 델타 토큰 기반 증분 전송에 상태 관리 스크립트를 사용하는 방법에 대한 예제입니다.

```
from sap_odata_state_management import StateManagerFactory, StateManagerType, StateType

# Initialize the state manager
state_manager = StateManagerFactory.create_manager(
    manager_type=StateManagerType.JOB_TAG,
    state_type=StateType.DELTA_TOKEN,
    options={
        "job_name": args['JOB_NAME'],
        "logger": logger
    }
)

# Get connector options (including delta token if available)
key = "SAPODataNode"
connector_options = state_manager.get_connector_options(key)

# Use the connector options in your Glue job
df = glueContext.create_dynamic_frame.from_options(
    connection_type="SAPOData",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "entityName",
        "ENABLE_CDC": "true",
        **connector_options
    }
)

# Process your data here...

# Update the state after processing
state_manager.update_state(key, sapodata_df.toDF())
```

두 예제 모두에서 상태 관리 스크립트는 작업 실행 간에 상태(델타 토큰 또는 타임스탬프)를 저장하는 복잡성을 처리합니다. 커넥터 옵션을 가져올 때 마지막 알려진 상태를 자동으로 검색하고 처리 후 상태를 업데이트하므로 각 작업 실행이 새 데이터 또는 변경된 데이터만 처리할 수 있습니다.

# 비 ODP 엔터티를 위한 파티셔닝
<a name="sap-odata-non-odp-entities-partitioning"></a>

Apache Spark에서 파니셔닝은 병렬 처리를 위해 클러스터의 워커 노드 간에 데이터를 분할하고 배포하는 방법을 나타냅니다. 각 파티션은 태스크에서 독립적으로 처리할 수 있는 데이터의 논리적 청크입니다. 파티셔닝은 성능, 확장성 및 리소스 사용률에 직접적인 영향을 미치는 Spark의 기본 개념입니다. AWS Glue 작업은 Spark의 파티셔닝 메커니즘을 사용하여 데이터세트를 클러스터의 워커 노드에서 병렬로 처리할 수 있는 더 작은 청크(파티션)로 나눕니다. 참고로 ODP 엔터티에는 파티셔닝이 적용되지 않습니다.

자세한 내용은 [AWS Glue Spark 및 PySpark 작업을](https://docs.aws.amazon.com/glue/latest/dg/spark_and_pyspark.html) 참조하세요.

**사전 조건**

읽으려는 SAP OData의 객체. 객체/EntitySet 이름이 필요합니다. 예를 들면 ` /sap/opu/odata/sap/API_SALES_ORDER_SRV/A_SalesOrder `입니다.

**예제**

```
sapodata_read = glueContext.create_dynamic_frame.from_options(
    connection_type="SAPOData",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "/sap/opu/odata/sap/API_SALES_ORDER_SRV/A_SalesOrder"
    }, transformation_ctx=key)
```

## 파티셔닝 쿼리
<a name="sap-odata-partitioning-queries"></a>

### 필드 기반 파티셔닝
<a name="sap-odata-field-based-partitioning"></a>

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

   데이터 유형이 DateTime인 필드의 경우 Spark SQL 쿼리에 사용된 Spark 타임스탬프 형식을 허용합니다.

  유효한 값의 예: `"2000-01-01T00:00:00.000Z"` 
+ `UPPER_BOUND`: 선택한 파티션 필드의 상한 값(경계 제외).
+ `NUM_PARTITIONS`: 파티션 수.
+ `PARTITION_BY`: 수행할 파티셔닝 유형. 필드 기반 파티셔닝의 경우 `FIELD`가 전달됩니다.

**예제**

```
sapodata= glueContext.create_dynamic_frame.from_options(
    connection_type="sapodata",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "/sap/opu/odata/sap/SEPM_HCM_SCENARIO_SRV/EmployeeSet",
        "PARTITION_FIELD": "validStartDate"
        "LOWER_BOUND": "2000-01-01T00:00:00.000Z"
        "UPPER_BOUND": "2020-01-01T00:00:00.000Z"
        "NUM_PARTITIONS": "10",
        "PARTITION_BY": "FIELD"
    }, transformation_ctx=key)
```

### 레코드 기반 파티셔닝
<a name="sap-odata-record-based-partitioning"></a>

Spark 태스크에서 동시에 실행할 수 있는 `NUM_PARTITIONS`개의 하위 쿼리로 원본 쿼리가 분할됩니다.

ODP 엔터티에서 페이지 매김은 다음 토큰/건너뛰기 토큰을 통해 지원되므로 레코드 기반 분할은 비ODP 엔터티에 대해서만 지원됩니다.
+ `PARTITION_BY`: 수행할 파티셔닝 유형. 레코드 기반 파티셔닝의 경우 `COUNT`가 전달됩니다.

**예제**

```
sapodata= glueContext.create_dynamic_frame.from_options(
    connection_type="sapodata",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "/sap/opu/odata/sap/SEPM_HCM_SCENARIO_SRV/EmployeeSet",
        "NUM_PARTITIONS": "10",
        "PARTITION_BY": "COUNT"
    }, transformation_ctx=key)
```

# 제한 사항/콜아웃
<a name="sap-odata-limitations"></a>
+ 페이지 매김은 건너뛰기 토큰/델타 토큰을 사용하여 처리되므로 ODP 엔터티는 레코드 기반 분할과 호환되지 않습니다. 따라서 레코드 기반 분할의 경우 maxConcurrency의 기본값은 사용자 입력과 관계없이 'null'로 설정됩니다.
+ 제한과 파티션이 모두 적용되면 제한이 파티셔닝보다 우선합니다.

# SAP OData 연결 옵션
<a name="sap-odata-connection-options"></a>

다음은 SAP OData에 대한 연결 옵션입니다.
+ `ENTITY_NAME`(문자열) - (필수) 읽기에 사용됩니다. SAP OData에서의 객체 이름.

  예: /sap/opu/odata/sap/API\$1SALES\$1ORDER\$1SRV/A\$1SalesOrder
+ `API_VERSION`(문자열) - (선택 사항) 읽기에 사용됩니다. 사용할 SAP OData Rest API 버전. 예: 2.0.
+ `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 객체에 대해 선택할 열.

  예: SalesOrder
+ `FILTER_PREDICATE`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.

  예: `SalesOrder = "10"`
+ `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리.

  예: `SELECT * FROM /sap/opu/odata/sap/API_SALES_ORDER_SRV/A_SalesOrder`
+ `PARTITION_FIELD`(문자열) - 읽기에 사용됩니다. 쿼리 분할에 사용할 필드입니다.

  예: `ValidStartDate`
+ `LOWER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 하한 값(경계 포함).

  예: `"2000-01-01T00:00:00.000Z"`
+ `UPPER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 상한 값(경계 제외).

  예: `"2024-01-01T00:00:00.000Z"`
+ `NUM_PARTITIONS`(정수) - 기본값: 1. 읽기에 사용됩니다. 읽을 파티션 수.
+ `INSTANCE_URL`(문자열) - SAP 인스턴스 애플리케이션 호스트 URL.

  예: `https://example-externaldata.sierra.aws.dev`
+ `SERVICE_PATH`(문자열) - SAP 인스턴스 애플리케이션 서비스 경로.

  예: `/sap/opu/odata/iwfnd/catalogservice;v=2`
+ `CLIENT_NUMBER`(문자열) - SAP 인스턴스 애플리케이션 클라이언트 번호.

  예: 100
+ `PORT_NUMBER`(문자열) - 기본값: SAP 인스턴스 애플리케이션 포트 번호.

  예: 443
+ `LOGON_LANGUAGE`(문자열) - SAP 인스턴스 애플리케이션 로그온 언어.

  예: `EN`
+ `ENABLE_CDC`(문자열) - CDC가 활성화된 상태(즉, 트랙 변경 사항 포함)에서 작업 실행 여부를 정의합니다.

  예: `True/False`
+ `DELTA_TOKEN`(문자열) - 제공된 유효한 델타 토큰을 기반으로 증분 데이터 풀을 실행합니다.

  예: `D20241107043437_000463000`
+ `PAGE_SIZE`(정수) - 레코드 쿼리를 위한 페이지 크기를 정의합니다. 기본 페이지 크기는 50,000입니다. 페이지 크기를 지정하면 SAP는 전체 데이터세트가 아닌 API 직접 호출당 정의된 수의 레코드만 반환합니다. 커넥터는 여전히 총 레코드 수를 제공하고 지정된 페이지 크기를 사용하여 페이지 매김을 처리합니다. 더 큰 페이지 크기가 필요한 경우 허용되는 최댓값인 500,000까지 선택할 수 있습니다. 지정된 페이지 크기가 500,000을 초과하면 무시됩니다. 대신 시스템은 허용되는 최대 페이지 크기를 사용합니다. 연결 옵션 `PAGE_SIZE`를 원하는 값으로 추가하여 AWS Glue Studio UI에서 페이지 크기를 지정할 수 있습니다.

  예: `20000`

# SAP OData 엔터티 및 필드 세부 정보
<a name="sap-odata-entity-field-details"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/sap-odata-entity-field-details.html)

# SendGrid에 연결
<a name="connecting-to-data-sendgrid"></a>

SendGrid는 트랜잭션 및 마케팅 이메일을 위한 고객 커뮤니케이션 플랫폼입니다.
+ SendGrid 커넥터는 연락처 목록을 생성 및 관리하고 이메일 마케팅 캠페인을 생성하는 데 도움이 됩니다.
+ SendGrid를 사용하면 온라인 비즈니스, 비영리 단체 및 기타 온라인 단체가 마케팅 이메일을 작성하여 대규모 대상에게 전송하고 해당 이메일의 참여도를 모니터링할 수 있습니다.

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

# AWS Glue의 SendGrid 지원
<a name="sendgrid-support"></a>

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

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

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

**지원되는 SendGrid API 버전**  
다음 SendGrid API 버전이 지원됩니다.
+ v3

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

# SendGrid 구성
<a name="sendgrid-configuring"></a>

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

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

다음은 최소 요구 사항입니다.
+ API 키가 있는 SendGrid 계정이 있습니다.
+ SendGrid 계정에 유효한 라이선스가 있는 API 액세스 권한이 있습니다.

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

# SendGrid 연결 구성
<a name="sendgrid-configuring-connections"></a>

SendGrid는 사용자 지정 인증을 지원합니다.

사용자 지정 인증에 필요한 API 키 생성에 대한 퍼블릭 SendGrid 설명서는 [Authentication](https://www.twilio.com/docs/sendgrid/api-reference/how-to-use-the-sendgrid-v3-api/authentication)을 참조하세요.

SendGrid 연결을 구성하는 방법:

1. AWS Secrets Manager에서 다음 세부 정보로 보안 암호를 생성합니다.

   1. 고객 관리형 연결된 앱의 경우 보안 암호는 키 역할을 하는 `api_key`과 함께 연결된 앱 소비자 보안 암호를 포함해야 합니다.

   1. 참고: AWS Glue에서 연결의 보안 암호를 생성해야 합니다.

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

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

   1. 연결하려는 SendGrid 인스턴스의 `INSTANCE_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`을 읽을 수 있는 권한을 부여합니다.

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

**사전 조건**

읽으려는 SendGrid 객체입니다. 객체 이름(예: `lists`, `singlesends` 또는 `segments`)이 필요합니다.

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


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| Lists | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| Single Sends | 예 | 예 | 아니요 | 예 | 아니요 | 
| Marketing Campaign Stats-Automations | 예 | 예 | 아니요 | 예 | 아니요 | 
| Marketing Campaign Stats-Single Sends | 예 | 예 | 아니요 | 예 | 아니요 | 
| Segments | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Contacts | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| 범주 | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Stats | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Unsubscribe Groups | 예 | 아니요 | 아니요 | 예 | 아니요 | 

**예시:**

```
sendgrid_read = glueContext.create_dynamic_frame.from_options(
    connection_type="sendgrid",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "lists",
        "API_VERSION": "v3",
        "INSTANCE_URL": "instanceUrl"
    }
```

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

정적 메타데이터를 포함하는 엔터티:

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

**참고**  
커넥터의 응답에서 Struct 및 List 데이터 유형은 String 데이터 유형으로 변환되며, DateTime 데이터 유형은 타임스탬프로 변환됩니다.

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

SendGrid는 필터 기반 분할 또는 레코드 기반 분할을 지원하지 않습니다.

# SendGrid 연결 옵션
<a name="sendgrid-connection-options"></a>

다음은 SendGrid의 연결 옵션입니다.
+ `ENTITY_NAME`(문자열) - (필수) 읽기에 사용됩니다. SendGrid에서의 객체 이름입니다.
+ `API_VERSION`(문자열) - (필수) 읽기에 사용됩니다. 사용할 SendGrid Rest API 버전입니다.
+ `INSTANCE_URL`(문자열) - (필수) 읽기에 사용됩니다. 유효한 SendGrid 인스턴스 URL입니다.
+ `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 객체에 대해 선택할 열.
+ `FILTER_PREDICATE`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.
+ `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리.

# SendGrid 제한 사항
<a name="sendgrid-limitations"></a>

다음은 SendGrid의 제한 사항 또는 참고 사항입니다.
+ 증분 풀은 `start_date` 필드의 Stats 엔터티와 `event_timestamp` 필드의 Contact 엔터티에서만 지원됩니다.
+ 페이지 매김은 Marketing Campaign Stats(Automations), Marketing Campaign Stats(Single Sends), Single Sends 및 Lists 엔터티에서만 지원됩니다.
+ Stats 엔터티의 경우 `start_date`는 필수 필터 파라미터입니다.
+ 액세스가 제한된 API 키는 이메일 API 및 Stats 엔터티에 대한 읽기 액세스를 지원할 수 없습니다. 전체 액세스 권한이 있는 API 키를 사용합니다. 자세한 내용은 [API 개요](https://www.twilio.com/docs/sendgrid/api-reference/api-keys/create-api-keys#api-overview) 섹션을 참조하세요.

# ServiceNow에 연결
<a name="connecting-to-data-servicenow"></a>

ServiceNow는 IT 관리 워크플로를 자동화하기 위한 클라우드 기반 SaaS 플랫폼입니다. ServiceNow 플랫폼은 다른 도구와 쉽게 통합되어 사용자가 다양한 앱 및 플러그인을 사용하여 프로젝트, 팀 및 고객 상호 작용을 관리할 수 있습니다. ServiceNow 사용자는 ServiceNow 계정에 AWS Glue를 연결할 수 있습니다. 그런 다음, ServiceNow를 ETL 작업에서의 데이터 소스로 사용할 수 있습니다. 이러한 작업을 실행하여 ServiceNow 및 AWS 서비스 또는 기타 지원되는 애플리케이션 간에 데이터를 전송합니다.

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

# ServiceNow에 대한 AWS Glue 지원
<a name="servicenow-support"></a>

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

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

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

**지원되는 ServiceNow API 버전**  
다음 ServiceNow API 버전이 지원됩니다.
+ v2

버전별 엔터티 지원은 소스에 대해 지원되는 엔터티를 참조하세요.

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

# ServiceNow 구성
<a name="servicenow-configuring"></a>

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

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

다음은 최소 요구 사항입니다.
+ 이메일 및 암호가 설정된 ServiceNow 계정이 있어야 합니다. 자세한 내용은 [ServiceNow 계정 생성](#servicenow-configuring-creating-servicenow-account) 섹션을 참조하세요.
+ API 액세스에 대해 ServiceNow 계정이 활성화되어 있습니다. ServiceNow API는 모두 추가 비용 없이 사용 가능합니다.

이러한 요구 사항을 충족하면 ServiceNow 계정에 AWS Glue를 연결할 준비가 된 것입니다.

## ServiceNow 계정 생성
<a name="servicenow-configuring-creating-servicenow-account"></a>

ServiceNow 계정을 생성하는 방법:

1. servicenow.com의 가입 페이지로 이동하여 세부 정보를 입력하고 **Continue**를 클릭하세요.

1. 등록된 메일에서 확인 코드를 받으면 해당 코드를 입력하고 **Verify**를 선택하세요.

1. 다중 인증을 설정하거나 건너뛰세요.

계정이 생성되고 ServiceNow에 사용자 프로파일이 표시됩니다.

## ServiceNow 개발자 인스턴스 생성
<a name="servicenow-configuring-creating-servicenow-developer-instance"></a>

ServiceNow에 로그인한 후 개발자 인스턴스를 요청합니다.

1. [ServiceNow login page](https://signon.service-now.com/x_snc_sso_auth.do?pageId=username)에서 계정 자격 증명을 입력하세요.

1. **ServiceNow Developer Program**을 선택하세요.  
![\[\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/servicenow-dev-program.png)

1. 오른쪽 상단에서 **Request Instance**를 선택하세요.

1. 직무를 입력하세요. 이용 약관에 대한 동의를 표시하고 **Finish setup**을 선택하세요.

1. 인스턴스가 생성되면 인스턴스 URL 및 자격 증명을 기록하세요.

## BasicAuth 자격 증명 검색
<a name="servicenow-configuring-basic-auth"></a>

무료 계정에 대한 기본 인증 자격 증명을 검색하는 방법:

1. [ServiceNow login page](https://signon.service-now.com/x_snc_sso_auth.do?pageId=username)에서 계정 자격 증명을 입력하세요.

1. 홈 페이지에서 프로파일 편집 섹션(오른쪽 상단)을 선택하고 **Manage Instance Password**를 선택하세요.

1. 사용자 이름, 암호, 인스턴스 URL과 같은 로그인 자격 증명을 검색하세요.

**참고**  
계정에 대해 MFA가 활성화된 경우 기본 인증: <username>:<password><MFA Token>의 사용자 암호 끝에 MFA 토큰을 추가하세요.

자세한 내용은 ServiceNow 설명서의 [Building applications](https://docs.servicenow.com/bundle/xanadu-application-development/page/build/custom-application/concept/build-applications.html)를 참조하세요.

## OAuth 2.0 자격 증명 생성
<a name="servicenow-configuring-basic-auth"></a>

ServiceNow 커넥터에서 OAuth2.0을 사용하려면 인바운드 클라이언트)를 생성하여 클라이언트 ID 및 클라이언트 보안 암호를 생성해야 합니다.

1. [ServiceNow login page](https://signon.service-now.com/x_snc_sso_auth.do?pageId=username)에서 계정 자격 증명을 입력하세요.

1. 홈 페이지에서 **Start Building**을 선택하세요.

1. App Engine Studio 페이지에서 **Application Registry**를 검색하세요.

1. 오른쪽 상단에서 **New**를 선택하세요.

1. **Create an OAuth API endpoint for external clients** 옵션을 선택하세요.

1. OAuth 구성을 필요한 대로 변경하고 **Update**를 선택하세요.

   리디렉션 URL 예: https://us-east-1.console.aws.amazon.com/gluestudio/oauth

1. 새로 생성된 OAuth 클라이언트 앱을 선택하여 클라이언트 ID 및 클라이언트 보안 암호를 검색하세요.

1. 추가 처리를 위해 클라이언트 ID 및 클라이언트 보안 암호를 저장하세요.

비프로덕션 개발자 계정에서 OAuth를 구성하는 방법:

1. ServiceNow 설명서의 [Create an authentication profile](https://docs.servicenow.com/bundle/washingtondc-platform-security/page/integrate/authentication/task/create-an-authentication-profile.html) 주제를 사용하여 인증 프로파일을 생성하세요.

1. Authentication Profile for OAuth에서 **Type**을 OAuth으로 선택하고 위에서 생성한 인바운드 클라이언트를 선택하여 **OAuth Entity**로 설정하세요.

1. 클라이언트가 여러 개 있는 경우 인증 프로파일을 여러 개 생성하여 인증 프로파일에 필요한 OAuth 엔터티를 설정해야 합니다.

1. 구성되지 않은 경우 REST API 액세스 정책을 생성하여 TABLE API에 대한 액세스 권한을 부여하세요. [Create REST API access policy](https://docs.servicenow.com/bundle/washingtondc-platform-security/page/integrate/authentication/task/create-api-access-policy.html)를 참조하세요.

# ServiceNow 연결 구성
<a name="servicenow-configuring-connections"></a>

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

ServiceNow 연결을 구성하는 방법:

1. AWS Secrets Manager에서 다음 세부 정보로 보안 암호를 생성합니다.

   1. 기본 인증을 위해 보안 암호에는 `USERNAME` 및 `PASSWORD`를 키로 사용하여 연결된 앱 소비자 보안 암호가 포함되어야 합니다.

   1. 인증 코드 권한 부여 유형의 경우 보안 암호에는 키 역할을 하는 `USER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET`과 함께 연결된 앱 소비자 보안 암호가 포함되어야 합니다.

   1. 참고: AWS Glue에서 연결당 시크릿을 생성해야 합니다.

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

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

   1. 연결하려는 ServiceNow 인스턴스의 INSTANCE\$1URL을 제공합니다.

   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에서 연결에 사용할 **인증 유형**을 선택하세요.

      1. 기본 인증: 이 인증 유형은 ServiceNow 인스턴스에서 특정 사용자의 권한을 통해 사용자 이름 및 암호를 미리 사용할 수 있으므로 자동화 시나리오에 적합합니다. AWS Glue에서는 사용자 이름 및 암호를 사용하여 ServiceNow API를 인증할 수 있습니다. 기본 인증: `Username` 및 `Password`의 경우에만 다음 입력을 제공합니다.

      1. OAuth2: OAuth2: `ClientId`, `ClientSecret`, `Authorization URL`, `Authorization Token URL`의 경우에만 다음 입력을 제공합니다.

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

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

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

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

**사전 조건**

읽으려는 ServiceNow Tables 객체. 객체 이름(예: pa\$1bucket 또는 incident)이 필요합니다.

**예시:**

```
servicenow_read = glueContext.create_dynamic_frame.from_options(
    connection_type="servicenow",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "pa_buckets",
        "API_VERSION": "v2"
        "instanceUrl": "https://<instance-name>.service-now.com"
    }
)
```

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

다음 엔터티에 대해 ServiceNow에서는 메타데이터를 동적으로 가져오도록 엔드포인트를 제공하므로 운영자 지원은 각 엔터티의 데이터 유형 수준에서 캡처됩니다.

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

**참고**  
구조체 데이터 유형은 커넥터의 응답에서 문자열 데이터 유형으로 변환됩니다.

**참고**  
`DML_STATUS`는 CREATED/UPDATED 레코드를 추적하는 데 사용되는 추가 사용자 정의 속성입니다.

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

**필드 기반 분할**:

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

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/servicenow-reading-from-entities.html)
+ `PARTITION_FIELD`: 쿼리 분할에 사용할 필드의 이름입니다.
+ `LOWER_BOUND`: 선택한 파티션 필드의 하한 값(**경계 포함**).

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

  유효한 값의 예제:

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

다음 표에서는 엔터티 분할 필드 지원 세부 정보를 설명합니다.

예시:

```
servicenow_read = glueContext.create_dynamic_frame.from_options(
    connection_type="servicenow",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "pa_buckets",
        "API_VERSION": "v2",
        "instanceUrl": "https://<instance-name>.service-now.com"
        "PARTITION_FIELD": "sys_created_on"
        "LOWER_BOUND": "2024-01-30T06:47:51.000Z"
        "UPPER_BOUND": "2024-06-30T06:47:51.000Z"
        "NUM_PARTITIONS": "10"
    }
```

**레코드 기반 분할**:

Spark에서 동시성을 활용하려는 경우 추가 Spark 옵션(`NUM_PARTITIONS`)을 제공할 수 있습니다. 이 파라미터를 사용하면 Spark 태스크에서 동시에 실행할 수 있는 `NUM_PARTITIONS`개의 하위 쿼리로 원본 쿼리가 분할됩니다.

레코드 기반 분할에서는 존재하는 총 레코드 수를 ServiceNow API에서 쿼리하고 제공된 `NUM_PARTITIONS` 수로 나눕니다. 그런 다음, 결과 레코드 수를 각 하위 쿼리에서 동시에 가져옵니다.
+ `NUM_PARTITIONS`: 파티션 수.

예시:

```
servicenow_read = glueContext.create_dynamic_frame.from_options(
    connection_type="servicenow",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "pa_buckets",
        "API_VERSION": "v2",
        "instanceUrl": "https://<instance-name>.service-now.com"
        "NUM_PARTITIONS": "2"
    }
```

# ServiceNow 연결 옵션
<a name="servicenow-connection-options"></a>

다음은 ServiceNow에 대한 연결 옵션입니다.
+ `ENTITY_NAME`(문자열) - (필수) 읽기에 사용됩니다. ServiceNow의 객체 이름입니다.
+ `API_VERSION`(문자열) - (필수) 읽기에 사용됩니다. 사용하려는 ServiceNow Rest API 버전입니다. 예: v1,v2,v3,v4.
+ `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 객체에 대해 선택할 열.
+ `FILTER_PREDICATE`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.
+ `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리.
+ `PARTITION_FIELD`(문자열) - 읽기에 사용됩니다. 쿼리 분할에 사용할 필드입니다.
+ `LOWER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 하한 값(경계 포함). 예: 2024-01-30T06:47:51.000Z.
+ `UPPER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 상한 값(경계 제외). 예: 2024-06-30T06:47:51.000Z.
+ `NUM_PARTITIONS`(정수) - 기본값: 1. 읽기에 사용됩니다. 읽을 파티션 수. 예: 10.
+ `INSTANCE_URL`(문자열) - (필수) https://<instance-name>.service-now.com 형식의 유효한 ServiceNow 인스턴스 URL.
+ `PAGE_SIZE`(정수) - 레코드 쿼리를 위한 페이지 크기를 정의합니다. 기본 페이지 크기는 1,000입니다. 페이지 크기를 지정하면 ServiceNow는 전체 데이터세트가 아닌 API 직접 호출당 정의된 수의 레코드만 반환합니다. 커넥터는 여전히 총 레코드 수를 제공하고 지정된 페이지 크기를 사용하여 페이지 매김을 처리합니다. 더 큰 페이지 크기가 필요한 경우 허용되는 최댓값인 10,000까지 선택할 수 있습니다. 지정된 페이지 크기가 10,000을 초과하면 무시됩니다. 대신 시스템은 허용되는 최대 페이지 크기를 사용합니다. 연결 옵션 `PAGE_SIZE`를 원하는 값으로 추가하여 AWS Glue Studio UI에서 페이지 크기를 지정할 수 있습니다. 예: 5000.

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

다음은 ServiceNow 커넥터의 제한 사항 또는 참고 사항입니다.
+ [SaaS 설명서](https://www.servicenow.com/docs/bundle/washingtondc-application-development/page/build/applications/reference/r_GlobalDefaultFields.html)에 따라 `sys_created_on`, `sys_updated_on`, `sys_mod_count`는 시스템에서 생성된 필드입니다. 커넥터는 SaaS API를 사용하여 응답 본문에 이 필드를 제공합니다.
  + SaaS가 개체에 대해 이 필드를 생성하지 않으면 필터 기반 파티셔닝을 지원할 수 없습니다.
+ SaaS API가 응답에서 `sys_created_on` 및 `sys_updated_on` 필드를 반환하지 않으면 `DML_STATUS`를 계산할 수 없습니다.
+ 읽기 성능 및 효율성 향상
  + 이제 ServiceNow 커넥터는 사용자가 ORDER BY 절을 지정하지 않은 경우 `sys_id` 필드(메타데이터에 있어야 함)를 기준으로 레코드를 오름차순으로 자동 정렬합니다. 이 경우 레코드는 최적화된 새 키 세트 기반 페이지 매김으로 페이지 매김됩니다.
  + ORDER BY 절을 지정하면 새 최적화가 사용되지 않으며 기존(사용자 정의 Order By 및 Offset-Limit 기반 페이지 매김) 방법을 사용하여 레코드를 가져옵니다.

# AWS Glue Studio에서 Slack에 연결
<a name="connecting-to-data-slack"></a>

 Slack은 사용자가 다양한 공개 및 비공개 채널을 통해 메시지와 첨부 파일을 보낼 수 있는 엔터프라이즈 커뮤니케이션 앱입니다. Slack 사용자인 경우 Slack 계정에 AWS Glue를 연결할 수 있습니다. 그런 다음, Slack을 ETL 작업에서의 데이터 소스로 사용할 수 있습니다. 이러한 작업을 실행하여 Slack 및 AWS 서비스 또는 기타 지원되는 애플리케이션 간에 데이터를 전송합니다.

**Topics**
+ [Slack에 대한 AWS Glue의 지원](slack-support.md)
+ [연결을 생성하고 사용하기 위한 API 작업이 포함된 정책](slack-configuring-iam-permissions.md)
+ [Slack 구성](slack-configuring.md)
+ [Slack 연결 구성](slack-configuring-connections.md)
+ [Slack 엔터티에서 읽기](slack-reading-from-entities.md)
+ [Slack 연결 옵션](slack-connection-options.md)
+ [제한 사항](slack-limitations.md)
+ [새 Slack 계정 생성 및 클라이언트 앱 구성](slack-new-account-creation.md)

# Slack에 대한 AWS Glue의 지원
<a name="slack-support"></a>

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

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

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

**지원되는 Slack API 버전**  
 Slack API v2.

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

 다음 샘플 정책은 연결을 생성하고 사용하는 데 필요한 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, Amazon 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 콘솔의 사용자에게 해당됩니다.

# Slack 구성
<a name="slack-configuring"></a>

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

## 최소 요구 사항
<a name="slack-configuring-min-requirements"></a>
+  Slack 계정이 있어야 합니다. 자세한 내용은 [새 Slack 계정 생성 및 클라이언트 앱 구성](slack-new-account-creation.md) 섹션을 참조하세요.

 이러한 요구 사항을 충족하면 Slack 계정에 AWS Glue를 연결할 준비가 된 것입니다.

# Slack 연결 구성
<a name="slack-configuring-connections"></a>

 Slack에서는 OAuth 2에 대한 `AUTHORIZATION_CODE` 권한 부여 유형을 지원합니다.

 이 권한 부여 유형은 사용자를 인증하기 위해 사용자를 서드파티 권한 부여 서버로 리디렉션하는 방식에 의존하므로 '3각' OAuth로 간주됩니다. AWS Glue 콘솔을 통해 연결을 생성할 때 사용됩니다. AWS Glue 콘솔은 사용자를 Slack으로 리디렉션합니다. 사용자가 로그인하고 Slack 인스턴스에 액세스하도록 요청된 권한을 AWS Glue에 허용해야 합니다.

 사용자는 여전히 AWS Glue 콘솔을 통해 연결을 생성할 때에도 Slack에서 자체 연결된 앱을 생성하고 자체 클라이언트 ID와 클라이언트 보안 암호를 제공하기로 선택할 수 있습니다. 이 시나리오에서는 여전히 Slack으로 리디렉션되어 로그인하고 리소스에 액세스할 수 있는 권한을 AWS Glue에 부여합니다.

 이 권한 부여 유형은 새로 고침 토큰과 액세스 토큰을 생성합니다. 액세스 토큰은 생성 후 1시간 후에 만료됩니다. 새로 고침 토큰을 사용하여 새 액세스 토큰을 가져올 수 있습니다.

 권한 부여 코드 OAuth 흐름을 위한 연결된 앱 생성에 대한 자세한 내용은 [Slack API](https://api.slack.com/quickstart)를 참조하세요.

Slack 연결을 구성하는 방법:

1.  AWS Secrets Manager에서 다음 세부 정보로 보안 암호를 생성하세요. AWS Glue에서 연결에 대한 보안 암호를 생성해야 합니다.

   1.  고객 관리형 연결된 앱의 경우 - 보안 암호는 키 역할을 하는 `USER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET`과 함께 연결된 앱 소비자 보안 암호를 포함해야 합니다.

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

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

   1. Slack 환경을 제공합니다.

   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.  토큰을 넣기 위해 AWS Glue에서 이 연결에 사용할 `secretName`을 선택합니다.

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

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

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

 **사전 조건** 
+  읽으려는 Slack 객체.

 **지원되는 엔터티** 


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| 대화 | 예 | 예 | 아니요 | 예 | 예 | 

 **예제** 

```
slack_read = glueContext.create_dynamic_frame.from_options(
    connection_type="slack",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "conversations/C058W38R5J8"
    }
)
```

 **Slack 엔터티 및 필드 세부 정보** 


| 개체 | 필드 | 데이터 형식 | 지원되는 연산자 | 
| --- | --- | --- | --- | 
| 대화 | attachments | 나열 | NA | 
| 대화 | bot\$1id | String | NA | 
| 대화 | 블록 | 나열 | NA | 
| 대화 | client\$1msg\$1id | String | NA | 
| 대화 | is\$1starred | 불 | NA | 
| 대화 | last\$1read | String | NA | 
| 대화 | latest\$1reply | String | NA | 
| 대화 | reactions | 나열 | NA | 
| 대화 | replies | 나열 | NA | 
| 대화 | reply\$1count | Integer | NA | 
| 대화 | reply\$1users | 나열 | NA | 
| 대화 | reply\$1users\$1count | Integer | NA | 
| 대화 | subscribed | 불 | NA | 
| 대화 | subtype | String | NA | 
| 대화 | 텍스트 | String | NA | 
| 대화 | team | String | NA | 
| 대화 | thread\$1ts | String | NA | 
| 대화 | ts | String | EQUAL\$1TO, BETWEEN, LESS\$1THAN, LESS\$1THAN\$1OR\$1EQUAL\$1TO, GREATER\$1THAN, GREATER\$1THAN\$1OR\$1EQUAL\$1TO | 
| 대화 | type | String | NA | 
| 대화 | 사용자 | String | NA | 
| 대화 | inviter | String | NA | 
| 대화 | root | Struct | NA | 
| 대화 | is\$1locked | 불 | NA | 
| 대화 | files | 나열 | NA | 
| 대화 | room | Struct | NA | 
| 대화 | 업로드 | 불 | NA | 
| 대화 | display\$1as\$1bot | 불 | NA | 
| 대화 | 채널 | String | NA | 
| 대화 | no\$1notifications | 불 | NA | 
| 대화 | permalink | String | NA | 
| 대화 | pinned\$1to | 나열 | NA | 
| 대화 | pinned\$1info | Struct | NA | 
| 대화 | edited | Struct | NA | 
| 대화 | app\$1id | String | NA | 
| 대화 | bot\$1profile | Struct | NA | 
| 대화 | metadata | Struct | NA | 

 **분할 쿼리** 

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

   날짜의 경우 Spark SQL 쿼리에 사용된 Spark 날짜 형식을 허용합니다. 유효한 값의 예제: `"2024-07-01T00:00:00.000Z"`.
+  `UPPER_BOUND`: 선택한 파티션 필드의 상한 값(경계 제외).
+  `NUM_PARTITIONS`: 파티션 수.

 엔터티 수준 분할 필드 지원 세부 정보는 아래 표에 캡처되어 있습니다.


| Entity Name | 분할 필드 | 데이터 형식 | 
| --- | --- | --- | 
| 대화 | ts | String | 

 **예제** 

```
slack_read = glueContext.create_dynamic_frame.from_options(
    connection_type="slack",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "conversations/C058W38R5J8",
        "PARTITION_FIELD": "ts"
        "LOWER_BOUND": "2022-12-01T00:00:00.000Z"
        "UPPER_BOUND": "2024-09-23T15:00:00.000Z"
        "NUM_PARTITIONS": "2"
    }
)
```

# Slack 연결 옵션
<a name="slack-connection-options"></a>

다음은 Slack에 대한 연결 옵션입니다.
+  `ENTITY_NAME`(문자열) - (필수) 읽기에 사용됩니다. 지원되는 엔터티 이름. 예시: `conversations/C058W38R5J8`.
+  `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 객체에 대해 선택할 필드.
+  `FILTER_PREDICATE`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.
+  `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리.
+  `NUM_PARTITIONS`(정수) - 기본값: 1. 읽기에 사용됩니다. 읽을 파티션 수.

# 제한 사항
<a name="slack-limitations"></a>

다음은 Slack 커넥터에 대한 제한 사항입니다.
+  커넥터는 주어진 대화에서 사용할 수 있는 총 레코드(메시지) 수를 가져올 수 있는 수단을 제공하지 않으므로 레코드 기반 분할은 지원되지 않습니다.

# 새 Slack 계정 생성 및 클라이언트 앱 구성
<a name="slack-new-account-creation"></a>

**Slack 계정 생성**

1. [Slack 홈 페이지](https://slack.com/intl/en-in/)를 열어 계정에 가입하세요.

1. **SIGN UP WITH EMAIL ADDRESS**를 선택하세요. 이메일 ID를 입력하고 **계속**을 선택하세요.

1. 이메일 주소로 전송된 6자리 코드를 입력하세요. 그러면 워크스페이스를 생성하거나 기존 워크스페이스에 가입하도록 리디렉션됩니다.

1. **Create a workspace**를 선택하여 새 워크스페이스를 생성하세요. 설정 프로세스의 일환으로 몇 가지 질문에 답하도록 리디렉션됩니다.
   + 회사 이름
   + 이름.
   + 이메일로 동료를 추가하는 방법
   + 함께 작업하는 팀? (채널 이름이 됩니다.)

1. 이러한 질문에 대한 입력 필드를 채우고 계속하세요. 이제 계정을 사용할 준비가 되었습니다.



**Slack 개발자 앱 생성**

1. Slack 계정에 로그인하고 Slack 워크스페이스에 로그인하세요.

1. 워크스페이스 메뉴에서 **Tools and settings**를 선택하고 **Manage apps**를 선택하세요.

1. Slack App Directory 메뉴에서 **Build**를 선택하세요.

1. **Your Apps** 페이지에서 **Create an App**을 선택하세요.

1. **앱 생성** 페이지에서 **처음부터 생성**을 선택합니다.

1. 열리는 **Name app & choose workspace** 대화 상자에서 앱 이름을 추가하고 **Pick a workspace to deploy your app in**을 선택하세요. 그런 다음, **Create App**을 선택하세요.

1. 앱 자격 증명에 표시된 클라이언트 ID 및 보안 암호를 기록하세요.

1. OAuth & Permissions 사이드바에서 Scopes로 이동하고 **Add an OAuth Scope**를 선택하세요. 구성을 위해 리디렉션 URL을 앱에 추가하여 'Add to Slack' 버튼을 자동으로 생성하거나 앱을 배포할 수 있습니다. 리디렉션 URL 섹션까지 스크롤하여 **Add New Redirect URL**을 선택하고 저장하세요.

1. 그런 다음, OAuth Tokens for Your Workspace 섹션으로 스크롤하고 **Install to Workspace**를 선택하세요.

1. 생성한 앱에서 연결하려는 Slack 워크스페이스에 액세스할 수 있는 권한을 요청하고 있음을 알리는 대화 상자가 열리면 **Allow**을 선택하세요.

1. 성공적으로 완료되면 콘솔에 OAuth Tokens for Your Workspace 화면이 표시됩니다.

1. OAuth Tokens for Your Workspace 화면에서 AWS Glue에 연결하는 데 사용할 OAuth 토큰을 복사하고 저장하세요.

1. 다음으로, Slack 팀 ID를 검색하세요. Slack 워크스페이스 메뉴에서 **Tools and settings**를 선택하고 **Manage apps**를 선택하세요. 열리는 페이지의 URL에서 팀 ID를 찾을 수 있습니다.

1. 앱의 퍼블릭 배포를 위해 사이드바의 **Manage Distribution** 버튼으로 이동하여 활성화할 수 있습니다. 아래로 스크롤하여 Share Your App with Other Workspaces 섹션으로 이동하고 **Remove Hard Coded Information**을 선택하세요. 동의를 제공하고 **Active Public Distribution**을 선택하세요.

1. 이제 앱의 퍼블릭 배포가 수행됩니다. 엔터티 API에 액세스하려면 사용자가 액세스하려는 모든 워크스페이스 채널에 앱을 추가해야 합니다.

1. Slack 계정에 로그인하고 채널에 액세스해야 하는 워크스페이스를 여세요.

1. 워크스페이스에서 앱이 액세스하려는 채널을 열고 채널 제목을 선택하세요. 팝업에서 **Integrations** 탭을 선택하고 앱을 추가하세요. 그러면 앱이 채널과 통합되어 API에 액세스할 수 있습니다.

   OAuth 2.0 클라이언트 ID에는 하나 이상의 승인된 리디렉션 URL이 포함되어야 합니다. 리디렉션 URL 형식은 다음과 같습니다.
**참고**  
 Appflow 리디렉션 URL은 변경 가능하며, AWS Glue 플랫폼의 사후 리디렉션 URL을 사용할 수 있습니다. 클라이언트 ID 및 클라이언트 보안 암호는 OAuth 2.0 클라이언트 ID의 설정에서 가져옵니다.    
<a name="slack-redirect-url-detail"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/slack-new-account-creation.html)

# Smartsheet에 연결
<a name="connecting-to-smartsheet"></a>

Smartsheet는 작업 관리 및 공동 작업 SaaS 제품입니다. 기본적으로 Smartsheet를 사용하면 사용자가 스프레드시트와 같은 객체를 사용하여 비즈니스 데이터를 생성, 저장 및 활용할 수 있습니다.

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

# AWS Glue의 Smartsheet 지원
<a name="smartsheet-support"></a>

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

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

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

**지원되는 Smartsheet API 버전**  
 v2.0 

# 연결을 생성하고 사용하기 위한 API 작업이 포함된 정책
<a name="smartsheet-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 Management 콘솔을 사용하는 경우 AWS Glue 리소스에 대한 전체 액세스 권한을 부여합니다. 이 정책에 지정된 리소스의 이름 변환을 따르면 사용자는 콘솔 전체 용량을 소유합니다. 이 정책은 보통 AWS Glue 콘솔의 사용자에게 해당됩니다.

# Smartsheet 구성
<a name="smartsheet-configuring"></a>

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

## 최소 요구 사항
<a name="smartsheet-configuring-min-requirements"></a>
+ 이메일과 암호를 사용하는 Smartsheet 계정이 있습니다. 계정 생성에 대한 자세한 내용은 [Smartsheet 계정 생성](smartsheet-create-account.md)을 참조하세요.
+ Smartsheet 계정에는 유효한 라이선스가 있는 API 액세스 권한이 있습니다.
+ Smartsheet 계정에는 `Sheets` 엔터티에 대한 **Pro 요금제**와 `Events` 엔터티에 대한 이벤트 보고 추가 기능이 포함된 엔터프라이즈 요금제가 있습니다.

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

# Smartsheet 연결 구성
<a name="smartsheet-configuring-connections"></a>

 Smartsheet는 OAuth2에 대한 `AUTHORIZATION_CODE` 권한 부여 유형을 지원합니다.

이 권한 부여 유형은 사용자를 인증하기 위해 사용자를 서드파티 권한 부여 서버로 리디렉션하는 방식에 의존하므로 '3각' `OAuth`로 간주됩니다. 사용자는 AWS Glue 콘솔을 통해 연결을 생성할 때에도 Smartsheet에서 자체 연결된 앱을 생성하고 자체 클라이언트 ID와 클라이언트 보안 암호를 제공하기로 선택할 수 있습니다. 이 시나리오에서는 여전히 Smartsheet으로 리디렉션되어 로그인하고 리소스에 액세스할 수 있는 권한을 AWS Glue에 부여합니다.

이 권한 부여 유형은 새로 고침 토큰과 액세스 토큰을 생성합니다. 액세스 토큰은 수명이 짧으며 새로 고침 토큰을 사용하여 사용자 상호 작용 없이 자동으로 새로 고칠 수 있습니다.

AUTHORIZATION\$1CODE OAuth 흐름을 위한 연결된 앱 생성에 대한 퍼블릭 Smartsheet 설명서는 [Smartsheet API](https://smartsheet.redoc.ly/#section/OAuth-Walkthrough)를 참조하세요.

스마트시트 연결을 구성하는 방법:

1. AWS Secrets Manager에서 다음 세부 정보로 보안 암호를 생성합니다.

   고객 관리형 연결된 앱의 경우 - 보안 암호는 키 역할을 하는 `USER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET`과 함께 연결된 앱 소비자 보안 암호를 포함해야 합니다.
**참고**  
AWS Glue에서 연결당 보안 암호를 생성해야 합니다.

1. AWS Glue Studio의 **데이터 연결**에서 아래 단계에 따라 연결을 생성합니다.

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

   1. 연결하려는 Smartsheet의 `instanceUrl` 항목을 제공합니다.

   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. 토큰을 넣기 위해 AWS Glue에서 이 연결에 사용할 `secretName`을 선택합니다.

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

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

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

 **사전 조건** 

읽으려는 `Smartsheet` 객체입니다. 사용 가능한 엔터티를 확인하려면 아래 지원되는 엔터티 테이블을 참조하세요.

 **지원되는 엔터티** 


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| List Sheet | 예 | 예 | 아니요 | 예 | 아니요 | 
| Row Metadata | 예 | 예 | 아니요 | 예 | 아니요 | 
| Sheet Metadata | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Sheet Data | 예 | 예 | 예 | 예 | 아니요 | 
| Event | 예 | 예 | 아니요 | 예 | 아니요 | 

 **예제** 

```
Smartsheet_read = glueContext.create_dynamic_frame.from_options(
    connection_type="smartsheet",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "list-sheets",
        "API_VERSION": "2.0",
        "INSTANCE_URL": "https://api.smartsheet.com"
    })
```

 **Smartsheet 엔터티 및 필드 세부 정보** 

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

**동적 메타데이터를 포함하는 엔터티**:

다음 엔터티의 경우, Smartsheet는 메타데이터를 동적으로 가져올 수 있는 엔드포인트를 제공하여 데이터 유형 수준에서 운영자 지원을 캡처할 수 있습니다.


| 개체 |  데이터 형식  | 지원되는 연산자 | 
| --- | --- | --- | 
|  Sheet Data  |  String  | NA | 
| Sheet Data |  Long  | "=" | 
| Sheet Data | Integer | NA | 
| Sheet Data | DateTime | > | 

 **예제** 

```
Smartsheet_read = glueContext.create_dynamic_frame.from_options(
    connection_type="smartsheet",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "list-sheets",
        "API_VERSION": "2.0",
        "INSTANCE_URL": "https://api.smartsheet.com"
    }
```

# Smartsheet 연결 옵션
<a name="smartsheet-connection-options"></a>

다음은 Smartsheet의 연결 옵션입니다.
+ `ENTITY_NAME`(문자열) - (필수) 읽기/쓰기에 사용됩니다. Smartsheet에서의 객체 이름입니다.
+ `API_VERSION`(문자열) - (필수) 읽기/쓰기에 사용됩니다. 사용할 Smartsheet Rest API 버전입니다. 예: v2.0.
+ `INSTANCE_URL`(문자열) - (필수) 읽기에 사용됩니다. Smartsheet 인스턴스 URL입니다.
+ `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 객체에 대해 선택할 열.
+ `FILTER_PREDICATE`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.
+ `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리.

# Smartsheet 계정 생성
<a name="smartsheet-create-account"></a>

1. [Smartsheet 가입 페이지](https://app.smartsheet.com/home)에 액세스하여 Smartsheet 계정에 가입합니다.

1. **새로 만들기**를 선택하여 새 계정을 만들거나 등록된 Google, Microsoft 또는 Apple 계정을 사용하여 로그인합니다.

1.   메시지가 표시되면 업무용 이메일 주소를 입력합니다.  

1.   **계속**을 선택하고 필요한 경우 신원을 확인합니다.  

1. Smartsheet에서 확인 이메일을 열고 확인 링크를 선택하여 계정을 확인합니다.

   기본적으로 평가판을 구독하게 됩니다.

1. 왼쪽 하단 모서리에서 **계정** 아이콘을 선택하고 **라이선스 추가/업그레이드**를 선택하여 요금제를 업그레이드합니다.
**참고**  
이는 **엔터프라이즈** 요금제의 부가 기능인 **이벤트 보고**에 액세스하는 데 필요합니다.

1. **엔터프라이즈** 요금제에서 **문의**를 선택하여 지원팀에 계정 업그레이드를 요청합니다.

1. 지원 요청 양식에서 요금제를 업그레이드하는 데 필요한 세부 정보와 요구 사항을 제공합니다.

   이렇게 하면 **엔터프라이즈** 요금제로 업그레이드가 완료됩니다.

**`OAuth2.0` 자격 증명 생성**

1. **개발자 도구**에 액세스하기 위해 계정의 요금제를 업그레이드한 후 [Smartsheet 개발자](https://developers.smartsheet.com/)에 액세스합니다.

   활성화 이메일을 받게 됩니다.

1. Smartsheet에서 활성화 이메일을 열고 활성화 링크를 선택하여 계정에서 개발자 도구를 활성화합니다.

   개발자 도구를 사용하면 앱을 생성할 수 있습니다.

1. Smartsheet 계정의 홈 페이지를 열고 **계정**을 선택하여 액세스를 확인합니다.

1. 서비스 목록에서 **개발자 도구**를 선택하고 **개발자 프로필** 세부 정보를 입력합니다.

1. **새 앱 생성**을 선택합니다.

1. 앱 등록 양식에 다음 세부 정보를 입력합니다.
   + **이름** - 앱의 이름입니다.
   + **설명** - 앱 설명입니다.
   + **URL** - 랜딩 페이지의 앱 또는 URL을 시작할 수 있는 URL입니다.
   + **연락처/지원** - 지원팀의 연락처 정보입니다.
   + **리디렉션 URL** - [OAuth 2.0 ](https://.console.aws.amazon.com/appflow/oauth)자격 증명을 수신할 애플리케이션 내의 URL(콜백 URL이라고도 함)입니다.

1. **저장**을 선택합니다.

   Smartsheet는 앱에 클라이언트 ID와 클라이언트 보안 암호를 할당합니다. 다음 단계에 이러한 값을 기록합니다. **개발자 도구** 섹션의 뒷부분에서도 다시 확인할 수 있습니다.

# 제한 사항
<a name="smartsheet-connector-limitations"></a>

Smartsheet는 필드 기반 또는 레코드 기반 분할을 지원하지 않습니다.

# AWS Glue Studio에서 Snapchat Ads에 연결
<a name="connecting-to-data-snapchat-ads"></a>

 Snapchat은 원래 Snapchat Inc.인 Snap Inc.에서 개발한 멀티미디어 인스턴트 메시징 앱 및 서비스입니다. Snapchat의 주요 기능 중 하나는 수신자가 사진과 메시지를 짧은 시간 동안만 사용할 수 있고 이후에는 사용할 수 없게 되는 기능입니다. Snapchat Marketing은 Snapchat 사용자에게 제공하기 위해 비즈니스에서 비용을 지불할 수 있는 게시물입니다.

**Topics**
+ [Snapchat Ads에 대한 AWS Glue의 지원](snapchat-ads-support.md)
+ [연결을 생성하고 사용하기 위한 API 작업이 포함된 정책](snapchat-ads-configuring-iam-permissions.md)
+ [Snapchat Ads 구성](snapchat-ads-configuring.md)
+ [Snapchat Ads 연결 구성](snapchat-ads-configuring-connections.md)
+ [Snapchat Ads 엔터티에서 읽기](snapchat-ads-reading-from-entities.md)
+ [Snapchat Ads 연결 옵션](snapchat-ads-connection-options.md)
+ [Snapchat Ad 계정 생성 및 클라이언트 앱 구성](connecting-to-data-snapchat-ads-new-account.md)
+ [Snapchat Ads 계정에서 앱 생성](connecting-to-data-snapchat-ads-managed-client-application.md)

# Snapchat Ads에 대한 AWS Glue의 지원
<a name="snapchat-ads-support"></a>

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

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

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

**지원되는 Snapchat Ads API 버전**  
 v1.

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

# Snapchat Ads 구성
<a name="snapchat-ads-configuring"></a>

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

## 최소 요구 사항
<a name="snapchat-ads-configuring-min-requirements"></a>
+  Snapchat Ads 계정이 있습니다. 계정 생성에 대한 자세한 내용은 [Snapchat Ad 계정 생성 및 클라이언트 앱 구성](connecting-to-data-snapchat-ads-new-account.md) 섹션을 참조하세요.
+  Snapchat Ads 계정에서 OAuth2 앱을 생성했습니다. 이 통합에서는 계정에 대해 인증된 직접 호출을 수행하는 경우 AWS Glue에서 데이터에 안전하게 액세스하는 데 사용하는 자격 증명을 제공합니다. 자세한 내용은 [Snapchat Ads 계정에서 앱 생성](connecting-to-data-snapchat-ads-managed-client-application.md) 섹션을 참조하세요.

 이러한 요구 사항을 충족하면 Snapchat Ads 계정에 AWS Glue를 연결할 준비가 된 것입니다. Snapchat Ads에서 연결된 앱은 외부 애플리케이션(예: AWS Glue)이 Snapchat Ads 데이터에 액세스할 수 있도록 권한을 부여하는 프레임워크입니다.

# Snapchat Ads 연결 구성
<a name="snapchat-ads-configuring-connections"></a>

 Snapchat Ads에서는 `AUTHORIZATION_CODE` 권한 부여 유형만 지원합니다.

 이 권한 부여 유형은 사용자를 인증하기 위해 사용자를 서드파티 권한 부여 서버로 리디렉션하는 방식에 의존하므로 '3각' OAuth로 간주됩니다. AWS Glue 콘솔을 통해 연결을 생성할 때 사용됩니다. 연결을 생성하는 사용자는 기본적으로 Snapchat Ads 인스턴스 URL을 제외한 OAuth 관련 정보를 제공할 필요가 없는 AWS Glue 자체 연결된 앱(AWS Glue 관리형 클라이언트 애플리케이션)에 의존할 수 있습니다. AWS Glue 콘솔은 사용자를 Snapchat Ads로 리디렉션합니다. 사용자가 로그인하고 Snapchat Ads 인스턴스에 액세스하도록 요청된 권한을 AWS Glue에 허용해야 합니다.

 사용자는 AWS Glue 콘솔을 통해 연결을 생성할 때에도 Snapchat Ads에서 자체 연결된 앱을 생성하고 자체 클라이언트 ID와 클라이언트 보안 암호를 제공하기로 선택할 수 있습니다. 이 시나리오에서는 여전히 Snapchat Ads로 리디렉션되어 로그인하고 리소스에 액세스할 수 있는 권한을 AWS Glue에 부여합니다.

 이 권한 부여 유형은 새로 고침 토큰과 액세스 토큰을 생성합니다. 액세스 토큰은 생성 후 1시간 후에 만료됩니다. 새로 고침 토큰을 사용하여 새 액세스 토큰을 가져올 수 있습니다.

 권한 부여 코드 OAuth 흐름을 위한 연결된 앱 생성에 대한 자세한 내용은 [Ads API](https://marketingapi.snapchat.com/docs/#authentication)를 참조하세요.

Snapchat Ads 연결을 구성하는 방법:

1.  AWS Secrets Manager에서 다음 세부 정보로 보안 암호를 생성하세요. AWS Glue에서 각 연결에 대한 보안 암호를 생성해야 합니다.

   1.  고객 관리형 연결된 앱의 경우 - 보안 암호는 키 역할을 하는 `USER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET`과 함께 연결된 앱 소비자 보안 암호를 포함해야 합니다.

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

   1. **연결 유형**을 선택할 때 Snapchat Ads를 선택하세요.

   1. Snapchat Ads 환경을 제공합니다.

   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.  토큰을 넣기 위해 AWS Glue에서 이 연결에 사용할 `secretName`을 선택합니다.

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

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

# Snapchat Ads 엔터티에서 읽기
<a name="snapchat-ads-reading-from-entities"></a>

 **사전 조건** 
+  읽으려는 Snapchat Ads 객체. 사용 가능한 엔터티를 확인하려면 아래 지원되는 엔터티 테이블을 참조하세요.

 **지원되는 엔터티** 


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| Organization | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| 광고 계정 | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| 크리에이티브 | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| 미디어 | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| 캠페인 | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| 광고 계정 아래 광고 | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| 캠페인 아래 광고 | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| 광고 스쿼드 | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| 세그먼트 | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 

 **예제** 

```
snapchatads_read = glueContext.create_dynamic_frame.from_options(
    connection_type="snapchatAds",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "organization",
        "API_VERSION": "v1"
    }
)
```

 **Snapchat Ads 엔터티 및 필드 세부 정보** 

 Snapchat Ads에서는 선택한 엔터티 아래에서 사용 가능한 필드를 동적으로 로드합니다. 필드의 데이터 유형에 따라 다음 필터 연산자를 지원합니다.


| 필드 데이터 유형 | 지원되는 필터 연산자 | 
| --- | --- | 
| 불 | = | 

 **분할 쿼리** 
+  필드 기반 분할: 지원되지 않습니다.
+  레코드 기반 분할: 지원되지 않습니다.

# Snapchat Ads 연결 옵션
<a name="snapchat-ads-connection-options"></a>

다음은 Snapchat Ads에 대한 연결 옵션입니다.
+  `ENTITY_NAME`(문자열) - (필수) 읽기에 사용됩니다. Snapchat Ads 엔터티의 이름. 예시: ` campaign `.
+  `API_VERSION`(문자열) - (필수) 읽기에 사용됩니다. 사용할 Snapchat Ads Rest API 버전. Snapchat Ads에서는 현재 버전 v1만 지원하므로 값은 v1입니다.
+  `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 선택한 엔터티에 대해 선택할 열의 쉼표로 구분된 목록.
+  `FILTER_PREDICATE`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.
+  `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리.

# Snapchat Ad 계정 생성 및 클라이언트 앱 구성
<a name="connecting-to-data-snapchat-ads-new-account"></a>

**Topics**
+ [Snapchat Ads 가입](#snapchat-ads-sign-up)
+ [Snapchat Ad 계정을 생성하는 단계](#snapchat-ads-create-ad-account)

## Snapchat Ads 가입
<a name="snapchat-ads-sign-up"></a>

**Snapchat Ads에 가입하는 방법:**

1.  [Snapchat Ads Manager](https://ads.snapchat.com/)로 이동하세요. **Snapchat이 처음인가요?** 옆의 **가입**을 선택하세요.

1.  **계정 만들기** 화면에서 프롬프트에 따라 회사 이름, 이메일, 비밀번호 등을 입력합니다. **다음**을 선택합니다.

1.  **프로필 만들기** 화면에서 사용자 이름, 웹사이트(선택 사항) 값을 입력하고 **계정 만들기**를 선택하세요. 그러면 **프로필 편집** 화면에서 프로필 사진과 약력을 추가하는 옵션이 제공됩니다. **확인**을 선택합니다.

1.  **비즈니스 정보** 화면에서 국가, 통화, 전화번호, GSTIN 등과 같은 필수 필드를 작성하고 **다음**을 선택하여 계정 만들기 프로세스를 완료합니다.

## Snapchat Ad 계정을 생성하는 단계
<a name="snapchat-ads-create-ad-account"></a>

**Snapchat Ad 계정을 생성하는 방법:**

1.  **Ads Manager**에 로그인하세요. 그런 다음, 상단 모서리의 탐색을 클릭하고 **Ad Accounts**를 선택하세요.

1.  **\$1 New Ad Account**를 선택하세요. 광고주 세부 정보를 입력하세요.
   +  광고주를 대신하여 광고를 구매하는 에이전시인지 여부를 선택하세요. 'Yes'를 선택하는 경우 연령, 성별 또는 우편번호 수준의 타겟팅을 포함할 수 있는 타겟팅 파라미터를 사용하면 광고가 거부될 수 있습니다. 최소 연령 타겟팅은 최대 21세까지 적용될 수 있습니다.
   +  광고 계정에서 주택, 크레딧 또는 고용 광고를 실행할지 여부를 선택하세요. 'Yes'를 선택하는 경우 연령, 성별 또는 우편번호 수준의 타겟팅을 포함할 수 있는 타겟팅 파라미터를 사용하면 광고가 거부될 수 있습니다. 최소 연령 타겟팅은 최대 21세까지 적용될 수 있습니다.
   +  광고 계정을 정치 광고에 사용할지 여부를 선택하세요. 정치 광고를 실행하는 경우 광고 비용을 지불하는 후원 정치 단체 또는 변호 단체를 입력하세요. 정치 단체를 정확하게 입력하지 않으면 광고가 거부될 수 있습니다. 또한 광고를 제출하기 전에 연결된 필수 '정치 광고 검토 양식'을 작성해야 합니다.

1.  **Account Details**를 선택하고 광고 계정 정보를 입력하세요.    
<a name="snapchat-ads-account-details"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/connecting-to-data-snapchat-ads-new-account.html)

1.  **Create Account**를 선택하세요. 광고 계정이 생성되며 Ads Manager의 Ad Accounts 부분에서 찾을 수 있습니다. 광고 실행을 시작하려면 결제 방법을 입력해야 합니다. 광고 계정에 멤버를 추가할 수도 있습니다.

1.  기존 결제를 사용할지 아니면 새로 생성할지 선택하세요. 그런 다음, **Save Payment Method**를 선택하세요.

1.  광고 계정에 추가할 비즈니스에 [초대한 멤버](https://businesshelp.snapchat.com/s/article/manage-members?language=en_US)를 선택하세요. 할당할 수 있는 역할 및 권한에 대한 자세한 내용은 [Roles and Permissions Overview](https://businesshelp.snapchat.com/s/article/roles-permissions?language=en_US)를 참조하세요. 그러면 추가된 멤버가 Ads Manager에 로그인하여 이 광고 계정에 액세스할 수 있습니다. 완료되면 멤버를 저장하세요.

 광고 계정에 대한 자세한 내용은 다음을 참조하세요. [https://businesshelp.snapchat.com/s/article/roles-permissions?language=en_US](https://businesshelp.snapchat.com/s/article/roles-permissions?language=en_US)https://businesshelp.snapchat.com/s/article/roles-permissions?language=en\$1US 

# Snapchat Ads 계정에서 앱 생성
<a name="connecting-to-data-snapchat-ads-managed-client-application"></a>

 Snapchat의 Marketing API에 대한 액세스를 활성화하려면 비즈니스 계정이 설정되어 있어야 합니다. 그런 다음, 아래 단계를 수행하세요.

1.  Ads Manager에 로그인하세요. 그런 다음, 왼쪽 상단의 메뉴를 선택하고 **Business Dashboard**, **Business Details**를 차례로 선택하세요.

1.  **\$1OAuth App**을 선택하세요.

1.  앱 이름을 입력하고 Snap 리디렉션 URI로 `https://<aws-region>.console.aws.amazon.com/gluestudio/oauth` URL을 추가하세요. 예를 들어 us-west-1 리전을 사용하는 경우 URL은 `https://us-west-1.console.aws.amazon.com/gluestudio/oauth) and choose Create OAuth App`입니다. **Create OAuth App**을 선택하세요.

1.  앱 자격 증명(클라이언트 ID 및 클라이언트 보안 암호)가 표시됩니다. 연결을 생성하는 데 필요하므로 저장하세요.

# AWS Glue Studio에서 Snowflake에 연결
<a name="connecting-to-data-snowflake"></a>

**참고**  
 AWS Glue for Spark를 사용하여 AWS Glue 4.0 이상 버전에서 Snowflake의 테이블에서 읽고 쓸 수 있습니다. 프로그래밍 방식으로 AWS Glue 작업을 통해 Snowflake를 구성하려면 [Redshift 연결](aws-glue-programming-etl-connect-redshift-home.md) 섹션을 참조하세요.

 AWS Glue에서는 Snowflake에 대한 기본 제공 지원을 제공합니다. AWS Glue Studio에서는 Snowflake에 연결하고, 데이터 통합 작업을 작성하며, AWS Glue Studio 서버리스 Spark 런타임에서 실행할 수 있는 시각적 인터페이스를 제공합니다.

 AWS Glue Studio에서 Snowflake용 통합 연결을 생성합니다. 자세한 내용은 [고려 사항](using-connectors-unified-connections.md#using-connectors-unified-connections-considerations) 섹션을 참조하세요.

**Topics**
+ [Snowflake 연결 생성](creating-snowflake-connection.md)
+ [Snowflake 소스 노드 생성](creating-snowflake-source-node.md)
+ [Snowflake 대상 노드 생성](creating-snowflake-target-node.md)
+ [고급 옵션](#creating-snowflake-connection-advanced-options)

# Snowflake 연결 생성
<a name="creating-snowflake-connection"></a>

**참고**  
 통합 연결(연결 v2)은 모든 연결을 표준화하여 기본 인증 자격 증명에 `PASSWORD` 키인 `USERNAME`을 사용합니다. `sfUser`, `sfPassword`가 포함된 보안 암호로 API를 통해 v1 연결을 생성할 수 있습니다.

 AWS Glue Studio에서 **데이터 소스 - Snowflake** 노드를 추가할 때 기존 AWS Glue Snowflake 연결을 선택하거나 새 연결을 생성할 수 있습니다. Snowflake에 연결하도록 구성된 `JDBC` 유형 연결이 아니라 `SNOWFLAKE` 유형 연결을 선택해야 합니다. 다음 절차에 따라 AWS Glue Snowflake 연결을 생성합니다.

**Snowflake 연결을 생성하려면**

1. Snowflake에서 사용자, *snowflakeUser* 및 암호, *snowflakePassword*를 생성합니다.

1. 이 사용자가 상호 작용하는 Snowflake 웨어하우스(*snowflakeWarehouse*)를 결정합니다. Snowflake에서 *snowflakeUser*에 대해 `DEFAULT_WAREHOUSE`로 설정하거나 다음 단계에서 사용하도록 기억합니다.

1. AWS Secrets Manager에서 Snowflake 보안 인증을 사용하여 보안 암호를 생성합니다. Secrets Manager에서 보안 암호를 생성하려면 AWS Secrets Manager 설명서의 [Create an AWS Secrets Manager secret](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html#create_secret_cli)에서 제공하는 자습서를 따릅니다. 보안 암호를 생성한 후에는 다음 단계를 위해 보안 암호 이름, *secretName*을 유지합니다.
   + **키/값 페어**를 선택하면 키가 `sfUser`인 *snowflakeUser*에 대한 페어를 생성합니다.
   + **키/값 페어**를 선택하면 키가 `sfPassword`인 *snowflakePassword*에 대한 페어를 생성합니다.
   + **키/값 페어**를 선택하면 키가 `sfWarehouse`인 *snowflakeWarehouse*에 대한 페어를 생성합니다. Snowflake에 기본값이 설정된 경우에는 필요하지 않습니다.

1. AWS Glue 데이터 카탈로그에서 [AWS Glue 연결 추가](https://docs.aws.amazon.com//glue/latest/dg/console-connections.html) 단계에 따라 연결을 생성합니다. 연결을 생성한 후에는 다음 단계를 위해 연결 이름, *connectionName*을 유지합니다.
   + **연결 유형**을 선택할 때 Snowflake를 선택합니다.
   + **Snowflake URL**을 선택할 때 Snowflake 인스턴스의 호스트 이름을 제공합니다. URL은 `account_identifier.snowflakecomputing.com` 양식의 호스트 이름을 사용합니다.
   + **AWS 보안 암호**를 선택할 때 *secretName*을 입력합니다.

# Snowflake 소스 노드 생성
<a name="creating-snowflake-source-node"></a>

## 필요한 권한
<a name="creating-snowflake-source-node-permissions"></a>

 Snowflake 데이터 소스를 사용하는 AWS Glue Studio 작업에는 추가 권한이 필요합니다. ETL 작업에 권한을 추가하는 방법에 대한 자세한 내용은 [ETL 작업에 필요한 IAM 권한 검토](https://docs.aws.amazon.com/glue/latest/ug/setting-up.html#getting-started-min-privs-job)를 참조하세요.

 `SNOWFLAKE` AWS Glue 연결은 AWS Secrets Manager 보안 암호를 사용하여 보안 인증 정보를 제공합니다. AWS Glue Studio에서 작업 및 데이터 미리 보기 역할에는 이 보안 암호를 읽을 수 있는 권한이 있어야 합니다.

## Snowflake 데이터 소스 추가
<a name="creating-snowflake-source-node-add"></a>

**사전 조건:**
+ Snowflake 보안 인증의 AWS Secrets Manager 보안 암호
+ Snowflake 유형 AWS Glue 데이터 카탈로그 연결

****데이터 소스 - Snowflake** 노드를 추가하려면:**

1.  Snowflake 데이터 소스의 연결을 선택합니다. 이 경우 연결이 이미 존재하며 기존 연결 중에서 선택할 수 있다고 가정합니다. 연결을 생성해야 하는 경우 **Snowflake 연결 생성**을 선택합니다. 자세한 내용은 [커넥터 및 연결 사용 개요](https://docs.aws.amazon.com/glue/latest/ug/connectors-chapter.html#using-connectors-overview)를 참조하세요.

    연결을 선택한 후에는 **속성 보기**를 클릭하여 연결 속성을 볼 수 있습니다. URL, 보안 그룹, 서브넷, 가용 영역, 설명, 생성 날짜(UTC) 및 최종 업데이트(UTC) 타임스탬프를 비롯한 연결 정보가 표시됩니다.

1.  다음과 같은 Snowflake 소스 옵션을 선택합니다.
   +  **단일 테이블 선택** - 단일 Snowflake 테이블에서 액세스하려는 데이터가 들어 있는 테이블입니다.
   +  **사용자 지정 쿼리 입력** - 사용자 지정 쿼리를 기반으로 여러 Snowflake 테이블의 데이터 세트에 액세스할 수 있습니다.

1.  단일 테이블을 선택한 경우 Snowflake 스키마의 이름을 입력합니다.

    또는 **사용자 지정 쿼리 입력**을 선택합니다. 여러 Snowflake 테이블에서 사용자 지정 데이터 세트에 액세스하려면 이 옵션을 선택합니다. 이 옵션을 선택하는 경우 Snowflake 쿼리를 입력합니다.

1.  **성능 및 보안** 옵션(선택 사항)에서,
   +  **쿼리 푸시다운 활성화** - Snowflake 인스턴스로 작업을 오프로드할지 여부를 선택합니다.

1.  **사용자 지정 Snowflake 속성**(선택 사항)에서 필요한 경우 파라미터와 값을 입력합니다.

# Snowflake 대상 노드 생성
<a name="creating-snowflake-target-node"></a>

## 필요한 권한
<a name="creating-snowflake-target-node-permissions"></a>

 Snowflake 데이터 소스를 사용하는 AWS Glue Studio 작업에는 추가 권한이 필요합니다. ETL 작업에 권한을 추가하는 방법에 대한 자세한 내용은 [ETL 작업에 필요한 IAM 권한 검토](https://docs.aws.amazon.com/glue/latest/ug/setting-up.html#getting-started-min-privs-job)를 참조하세요.

 `SNOWFLAKE` AWS Glue 연결은 AWS Secrets Manager 보안 암호를 사용하여 보안 인증 정보를 제공합니다. AWS Glue Studio에서 작업 및 데이터 미리 보기 역할에는 이 보안 암호를 읽을 수 있는 권한이 있어야 합니다.

## Snowflake 데이터 대상 추가
<a name="creating-snowflake-target-node-add"></a>

**Snowflake 대상 노드를 생성하려면:**

1.  기존 Snowflake 테이블을 대상으로 선택하거나 새 테이블 이름을 입력합니다.

1.  **데이터 대상 - Snowflake** 대상 노드를 사용하는 경우 다음 옵션 중에서 선택할 수 있습니다.
   +  **추가** - 테이블이 이미 있는 경우 모든 새 데이터를 테이블에 삽입으로 덤프합니다. 테이블이 없으면 새로 생성한 후 새 데이터를 모두 삽입합니다.
   +  **병합** - AWS Glue는 사용자가 지정한 조건에 따라 대상 테이블에 데이터를 추가하거나 업데이트합니다.

      다음과 같은 옵션을 선택합니다.
     + **키 및 간단한 작업 선택** - 소스 데이터와 대상 데이터 세트 사이에서 일치하는 키로 사용할 열을 선택합니다.

       일치하는 경우 다음 옵션을 지정합니다.
       + 대상 데이터 세트의 레코드를 소스의 데이터로 업데이트합니다.
       + 대상 데이터 세트에서 레코드를 삭제합니다.

       일치하지 않는 경우 다음 옵션을 지정합니다.
       + 소스 데이터를 대상 데이터 세트에 새 행으로 삽입합니다.
       + 아무 작업 안 함.
     + **사용자 지정 MERGE 명령문 입력** - 그런 다음 **병합 명령문 검증**을 선택하여 명령문이 유효한지 여부를 검증할 수 있습니다.
   +  **잘라내기** - 테이블이 이미 있는 경우 먼저 대상 테이블의 콘텐츠를 지워서 테이블 데이터를 잘라냅니다. 잘라내기에 성공하면 모든 데이터를 삽입합니다. 테이블이 없는 경우 테이블을 생성하고 모든 데이터를 삽입합니다. 잘라내기에 실패하면 작업에 실패합니다.
   +  **삭제** - 테이블이 이미 있는 경우 테이블 메타데이터와 데이터를 삭제합니다. 삭제에 성공하면 모든 데이터를 삽입합니다. 테이블이 없는 경우 테이블을 생성하고 모든 데이터를 삽입합니다. 삭제에 실패하면 작업에 실패합니다.

## 고급 옵션
<a name="creating-snowflake-connection-advanced-options"></a>

AWS Glue 개발자 안내서의 [Snowflake 연결](https://docs.aws.amazon.com//glue/latest/dg/aws-glue-programming-etl-connect-snowflake-home.html)을 참조하세요.

# AWS Glue Studio에서 Stripe에 연결
<a name="connecting-to-data-stripe"></a>

 Stripe는 비즈니스를 위한 온라인 결제 처리 및 신용카드 처리 플랫폼입니다. Stripe 플랫폼을 사용하면 비즈니스에서 온라인 결제를 수락하고, 전자 상거래에 대한 구독(반복 결제)을 생성하며, 결제 대금을 받을 수 있도록 계정을 다시 설정할 수 있습니다. 또한 Stripe에서는 비즈니스가 자체 마켓플레이스를 설정하고 결제 대금을 수금한 후 '연결'된 계정을 통해 판매자 또는 서비스 제공업체에 지불할 수 있도록 하는 다자간 결제를 지원합니다.

**Topics**
+ [Stripe에 대한 AWS Glue의 지원](stripe-support.md)
+ [연결을 생성하고 사용하기 위한 API 작업이 포함된 정책](stripe-configuring-iam-permissions.md)
+ [Stripe 구성](stripe-configuring.md)
+ [Stripe 연결 구성](stripe-configuring-connections.md)
+ [Stripe 엔터티에서 읽기](stripe-reading-from-entities.md)
+ [Stripe 연결 옵션](stripe-connection-options.md)
+ [제한 사항](stripe-limitations.md)
+ [새 Stripe 계정 생성 및 클라이언트 앱 구성](stripe-new-account-creation.md)

# Stripe에 대한 AWS Glue의 지원
<a name="stripe-support"></a>

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

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

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

**지원되는 Slack API 버전**  
 v1.

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

 다음 샘플 정책은 연결을 생성하고 사용하는 데 필요한 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, Amazon 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 콘솔의 사용자에게 해당됩니다.

# Stripe 구성
<a name="stripe-configuring"></a>

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

## 최소 요구 사항
<a name="stripe-configuring-min-requirements"></a>
+  이메일 및 암호를 사용하는 Stripe 계정이 있어야 합니다. 자세한 내용은 [새 Stripe 계정 생성 및 클라이언트 앱 구성](stripe-new-account-creation.md) 섹션을 참조하세요.
+  Stripe 계정이 API 액세스에 대해 활성화되어 있습니다. Stripe API의 모든 사용은 추가 비용 없이 이용 가능합니다.

 이러한 요구 사항을 충족하면 Stripe 계정에 AWS Glue를 연결할 준비가 된 것입니다.

# Stripe 연결 구성
<a name="stripe-configuring-connections"></a>

 Stripe에서는 사용자 지정 인증을 지원합니다. 사용자 지정 권한 부여에 필요한 API 키를 생성하는 방법에 대한 자세한 내용은 [STRIPE REST API 설명서](https://docs.stripe.com/api/authentication)를 참조하세요.

Stripe 연결을 구성하는 방법:

1.  AWS Secrets Manager에서 다음 세부 정보로 보안 암호를 생성하세요. AWS Glue에서 각 연결에 대한 보안 암호를 생성해야 합니다.

   1.  고객 관리형 연결된 앱의 경우 - 보안 암호는 키 역할을 하는 `USER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET`과 함께 연결된 앱 소비자 보안 암호를 포함해야 합니다.

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

   1. **연결 유형**을 선택할 때 Stripe를 선택하세요.

   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.  토큰을 넣기 위해 AWS Glue에서 이 연결에 사용할 `secretName`을 선택합니다.

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

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

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

 **사전 조건** 
+  읽으려는 Stripe 객체.

 **지원되는 엔터티** 


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| 밸런스 | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| 밸런스 트랜잭션 | 예 | 예 | 아니요 | 예 | 예 | 
| 요금 | 예 | 예 | 아니요 | 예 | 예 | 
| 이의 | 예 | 예 | 아니요 | 예 | 예 | 
| 파일 링크 | 예 | 예 | 아니요 | 예 | 예 | 
| PaymentIntents | 예 | 예 | 아니요 | 예 | 예 | 
| SetupIntents | 예 | 예 | 아니요 | 예 | 예 | 
| 결제 금액 | 예 | 예 | 아니요 | 예 | 예 | 
| 환불 | 예 | 예 | 아니요 | 예 | 예 | 
| Products | 예 | 예 | 아니요 | 예 | 예 | 
| 가격 | 예 | 예 | 아니요 | 예 | 예 | 
| Coupons | 예 | 예 | 아니요 | 예 | 예 | 
| 프로모션 코드 | 예 | 예 | 아니요 | 예 | 예 | 
| 세금 코드 | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| 세율 | 예 | 예 | 아니요 | 예 | 예 | 
| 배송 요금 | 예 | 예 | 아니요 | 예 | 예 | 
| 세션 | 예 | 예 | 아니요 | 예 | 예 | 
| 크레딧 노트 | 예 | 예 | 아니요 | 예 | 예 | 
| Customer | 예 | 예 | 아니요 | 예 | 예 | 
| 인보이스 | 예 | 예 | 아니요 | 예 | 예 | 
| 인보이스 항목 | 예 | 예 | 아니요 | 예 | 아니요 | 
| 계획 | 예 | 예 | 아니요 | 예 | 예 | 
| 견적 | 예 | 예 | 아니요 | 예 | 아니요 | 
| 구독 | 예 | 예 | 아니요 | 예 |  | 
| 구독 항목 | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| 구독 일정 | 예 | 예 | 아니요 | 예 | 예 | 
| Accounts | 아니요 | 예 | 아니요 | 예 | 예 | 
| 애플리케이션 요금 | 예 | 예 | 아니요 | 예 | 예 | 
| 국가 사양 | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| 전송 | 예 | 예 | 아니요 | 예 | 예 | 
| 조기 사기 경고 | 예 | 예 | 아니요 | 예 | 예 | 
| 보고서 유형 | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 

 **예제** 

```
stripe_read = glueContext.create_dynamic_frame.from_options(
    connection_type="stripe",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "coupons",
        "API_VERSION": "v1"
    }
)
```

 **Stripe 엔터티 및 필드 세부 정보** 


| 개체 | 필드 | 데이터 형식 | 지원되는 연산자 | 
| --- | --- | --- | --- | 
| 밸런스 |  |  |  | 
|  | available | 나열 |  | 
|  | connect\$1reserved | 나열 |  | 
|  | 보류 중 | 나열 |  | 
|  | livemode | 불 |  | 
|  | 객체 | String |  | 
|  | instant\$1available | 나열 |  | 
|  | issuing | Struct |  | 
| 밸런스 트랜잭션 |  |  |  | 
|  | id | String |  | 
|  | 객체 | String |  | 
|  | amount | Integer |  | 
|  | available\$1on | DateTime | =, >=, <=,<,> | 
|  | created | DateTime | =, >=, <=,<,> | 
|  | currency | String |  | 
|  | 설명 | String |  | 
|  | exchange\$1rate | BigDecimal |  | 
|  | fee | Integer |  | 
|  | fee\$1details | 나열 |  | 
|  | net | Integer |  | 
|  | reporting\$1category | String |  | 
|  | source | String | = | 
|  | status | String |  | 
|  | type | String | = | 
|  | cross\$1border\$1classification | String |  | 
| 요금 |  |  |  | 
|  | id | String |  | 
|  | 객체 | String |  | 
|  | amount | Integer | =, <, > | 
|  | amount\$1captured | Integer |  | 
|  | amount\$1refunded | Integer |  | 
|  | 애플리케이션 | String |  | 
|  | application\$1fee | String |  | 
|  | application\$1fee\$1amount | Integer |  | 
|  | balance\$1transaction | String |  | 
|  | billing\$1details | Struct |  | 
|  | calculated\$1statement\$1descriptor | String |  | 
|  | captured | 불 |  | 
|  | created | DateTime | =, >=, <=,<,> | 
|  | currency | String |  | 
|  | customer | String | = | 
|  | 설명 | String |  | 
|  | destination | String |  | 
|  | dispute | String |  | 
|  | disputed | 불 | = | 
|  | failure\$1balance\$1transaction | String |  | 
|  | failure\$1code | String |  | 
|  | failure\$1message | String |  | 
|  | fraud\$1details | Struct |  | 
|  | 인보이스 | String |  | 
|  | livemode | 불 |  | 
|  | metadata | Struct |  | 
|  | on\$1behalf\$1of | String |  | 
|  | 순서 | String |  | 
|  | outcome | Struct |  | 
|  | paid | 불 |  | 
|  | payment\$1intent | String | = | 
|  | payment\$1method | String |  | 
|  | payment\$1method\$1details | Struct |  | 
|  | receipt\$1email | String |  | 
|  | receipt\$1number | String |  | 
|  | receipt\$1url | String |  | 
|  | refunded | 불 | = | 
|  | refunds | Struct |  | 
|  | review | String |  | 
|  | shipping | Struct |  | 
|  | source | Struct |  | 
|  | source\$1transfer | String |  | 
|  | statement\$1descriptor | String |  | 
|  | statement\$1descriptor\$1suffix | String |  | 
|  | status | String |  | 
|  | 전송 | String |  | 
|  | transfer\$1data | Struct |  | 
|  | transfer\$1group | String | = | 
| 이의 |  |  |  | 
|  | id | String |  | 
|  | 객체 | String |  | 
|  | amount | Integer | =, <, > | 
|  | balance\$1transaction | String |  | 
|  | balance\$1transactions | 나열 |  | 
|  | 요금 | String | = | 
|  | created | DateTime | =, >=, <=,<,> | 
|  | currency | String |  | 
|  | evidence | Struct |  | 
|  | evidence\$1details | Struct |  | 
|  | is\$1charge\$1refundable | 불 |  | 
|  | livemode | 불 |  | 
|  | metadata | Struct |  | 
|  | payment\$1intent | String | = | 
|  | reason | String | = | 
|  | status | String |  | 
|  | payment\$1method\$1details | Struct |  | 
| 파일 링크 |  |  |  | 
|  | id | String |  | 
|  | 객체 | String |  | 
|  | created | DateTime | =, >=, <=,<,> | 
|  | expired | 불 | = | 
|  | expires\$1at | DateTime |  | 
|  | 파일 | String | = | 
|  | livemode | 불 |  | 
|  | metadata | Struct |  | 
|  | url | String |  | 
| PaymentIntents |  |  |  | 
|  | id | String |  | 
|  | 객체 | String |  | 
|  | amount | Integer |  | 
|  | amount\$1capturable | Integer |  | 
|  | amount\$1details | Struct |  | 
|  | amount\$1received | Integer |  | 
|  | 애플리케이션 | String |  | 
|  | application\$1fee\$1amount | Integer |  | 
|  | automatic\$1payment\$1methods | Struct |  | 
|  | canceled\$1at | DateTime |  | 
|  | cancellation\$1reason | String |  | 
|  | capture\$1method | String |  | 
|  | client\$1secret | String |  | 
|  | confirmation\$1method | String |  | 
|  | created | DateTime | =, >=, <=,<,> | 
|  | currency | String |  | 
|  | customer | String | = | 
|  | 설명 | String |  | 
|  | 인보이스 | String |  | 
|  | last\$1payment\$1error | Struct |  | 
|  | latest\$1charge | String |  | 
|  | livemode | 불 |  | 
|  | metadata | Struct |  | 
|  | next\$1action | Struct |  | 
|  | on\$1behalf\$1of | String |  | 
|  | payment\$1method | String |  | 
|  | payment\$1method\$1options | Struct |  | 
|  | payment\$1method\$1types | 나열 |  | 
|  | payment\$1method\$1configuration\$1details | Struct |  | 
|  | 처리 중 | Struct |  | 
|  | receipt\$1email | String |  | 
|  | review | String |  | 
|  | setup\$1future\$1usage | String |  | 
|  | shipping | Struct |  | 
|  | source | String |  | 
|  | statement\$1descriptor | String |  | 
|  | statement\$1descriptor\$1suffix | String |  | 
|  | status | String |  | 
|  | transfer\$1data | Struct |  | 
|  | transfer\$1group | String |  | 
| SetupIntents |  |  |  | 
|  | id | String |  | 
|  | 객체 | String |  | 
|  | 애플리케이션 | String |  | 
|  | cancellation\$1reason | String |  | 
|  | client\$1secret | String |  | 
|  | created | DateTime | =, >=, <=,<,> | 
|  | customer | String | = | 
|  | 설명 | String |  | 
|  | flow\$1directions | 나열 |  | 
|  | last\$1setup\$1error | Struct |  | 
|  | latest\$1attempt | String |  | 
|  | livemode | 불 |  | 
|  | mandate | String |  | 
|  | metadata | Struct |  | 
|  | next\$1action | Struct |  | 
|  | on\$1behalf\$1of | String |  | 
|  | payment\$1method | String |  | 
|  | payment\$1method\$1options | Struct |  | 
|  | payment\$1method\$1types | 나열 |  | 
|  | single\$1use\$1mandate | String |  | 
|  | status | String |  | 
|  | 사용 | String |  | 
|  | automatic\$1payment\$1methods | Struct |  | 
| 결제 금액 |  |  |  | 
|  | id | String |  | 
|  | 객체 | String |  | 
|  | amount | Integer | =, <, > | 
|  | arrival\$1date | DateTime | =, >=, <=,<,> | 
|  | automatic | 불 |  | 
|  | balance\$1transaction | String |  | 
|  | created | DateTime | =, >=, <=,<,> | 
|  | currency | String |  | 
|  | 설명 | String | = | 
|  | destination | String |  | 
|  | failure\$1balance\$1transaction | String |  | 
|  | failure\$1code | String |  | 
|  | failure\$1message | String |  | 
|  | livemode | 불 |  | 
|  | metadata | Struct |  | 
|  | method | String |  | 
|  | original\$1payout | String |  | 
|  | reversed\$1by | String |  | 
|  | reconciliation\$1status | String |  | 
|  | source\$1type | String |  | 
|  | statement\$1descriptor | String |  | 
|  | status | String |  | 
|  | type | String |  | 
|  | application\$1fee | String |  | 
|  | application\$1fee\$1amount | Integer |  | 
| 환불 |  |  |  | 
|  | id | String |  | 
|  | 객체 | String |  | 
|  | amount | Integer |  | 
|  | balance\$1transaction | String |  | 
|  | 요금 | String | = | 
|  | created | DateTime | =, >=, <=,<,> | 
|  | currency | String |  | 
|  | metadata | Struct |  | 
|  | destination\$1details | Struct |  | 
|  | payment\$1intent | String | = | 
|  | reason | String |  | 
|  | receipt\$1number | String |  | 
|  | source\$1transfer\$1reversal | String |  | 
|  | status | String |  | 
|  | transfer\$1reversal | String |  | 
| Products |  |  |  | 
|  | id | String |  | 
|  | 객체 | String |  | 
|  | 활성화 | 불 | = | 
|  | attributes | 나열 |  | 
|  | created | DateTime | =, >=, <=,<,> | 
|  | default\$1price | String |  | 
|  | 설명 | String |  | 
|  | 이미지 | 나열 |  | 
|  | livemode | 불 |  | 
|  | metadata | Struct |  | 
|  | name | String |  | 
|  | package\$1dimensions | Struct |  | 
|  | shippable | 불 |  | 
|  | statement\$1descriptor | String |  | 
|  | tax\$1code | String |  | 
|  | type | String | = | 
|  | unit\$1label | String |  | 
|  | updated | DateTime |  | 
|  | url | String |  | 
|  | 기능 | 나열 |  | 
| 가격 |  |  |  | 
|  | id | String |  | 
|  | 객체 | String |  | 
|  | 활성화 | 불 | = | 
|  | billing\$1scheme | String |  | 
|  | created | DateTime | =, >=, <=,<,> | 
|  | currency | String | = | 
|  | custom\$1unit\$1amount | Struct |  | 
|  | livemode | 불 |  | 
|  | lookup\$1key | String |  | 
|  | metadata | Struct |  | 
|  | nickname | String |  | 
|  | product | String | = | 
|  | recurring | Struct |  | 
|  | tax\$1behavior | String |  | 
|  | tiers\$1mode | String |  | 
|  | transform\$1quantity | Struct |  | 
|  | type | String | = | 
|  | unit\$1amount | Integer |  | 
|  | unit\$1amount\$1decimal | String |  | 
| 쿠폰 |  |  |  | 
|  | Id | String |  | 
|  | 객체 | String |  | 
|  | amount\$1off | Integer |  | 
|  | created | DateTime | =, >=, <=,<,> | 
|  | currency | String | = | 
|  | duration | String | = | 
|  | duration\$1in\$1months | Integer | =,<,> | 
|  | livemode | 불 |  | 
|  | max\$1redemptions | Integer | =, <, > | 
|  | metadata | Struct |  | 
|  | name | String |  | 
|  | percent\$1off | 배정밀도 실수 | = | 
|  | redeem\$1by | DateTime | =, >=, <=, <, > | 
|  | times\$1redeemed | Integer |  | 
|  | 유효함 | 불 |  | 
| 프로모션 코드 |  |  |  | 
|  | Id | String |  | 
|  | 객체 | String |  | 
|  | 활성화 | 불 | = | 
|  | code | String | = | 
|  | coupon | Struct |  | 
|  | created | DateTime | =,>=,<=,<,> | 
|  | customer | String |  | 
|  | expires\$1at | DateTime |  | 
|  | livemode | 불 |  | 
|  | max\$1redemptions | Integer |  | 
|  | metadata | Struct |  | 
|  | 제한 사항 | Struct |  | 
|  | times\$1redeemed | Integer |  | 
| 세금 코드 |  |  |  | 
|  | Id | String |  | 
|  | 객체 | String |  | 
|  | 설명 | String |  | 
|  | name | String |  | 
| 세율 |  |  |  | 
|  | Id | String |  | 
|  | 객체 | String |  | 
|  | 활성화 | 불 | = | 
|  | country | String |  | 
|  | created | DateTime | =, >=, <=, <, > | 
|  | 설명 | String |  | 
|  | display\$1name | String |  | 
|  | inclusive | 불 | = | 
|  | jurisdiction | String |  | 
|  | jurisdiction\$1level | String |  | 
|  | livemode | 불 |  | 
|  | metadata | Struct |  | 
|  | percentage | 배정밀도 실수 |  | 
|  | effective\$1percentage | 배정밀도 실수 |  | 
|  | state | String |  | 
|  | tax\$1type | String |  | 
| 배송 요금 |  |  |  | 
|  | Id | String |  | 
|  | 객체 | String |  | 
|  | 활성화 | 불 | = | 
|  | created | DateTime | =, >=, <=, <, > | 
|  | delivery\$1estimate | Struct |  | 
|  | display\$1name | String |  | 
|  | fixed\$1amount | Struct |  | 
|  | livemode | 불 |  | 
|  | metadata | Struct |  | 
|  | tax\$1behavior | String |  | 
|  | tax\$1code | String |  | 
|  | type | String |  | 
| 세션 |  |  |  | 
|  | id | String |  | 
|  | 객체 | String |  | 
|  | after\$1expiration | Struct |  | 
|  | allow\$1promotion\$1codes | 불 |  | 
|  | amount\$1subtotal | Integer |  | 
|  | amount\$1total | Integer |  | 
|  | automatic\$1tax | Struct |  | 
|  | billing\$1address\$1collection | String |  | 
|  | cancel\$1url | String |  | 
|  | client\$1reference\$1id | String |  | 
|  | consent | Struct |  | 
|  | consent\$1collection | Struct |  | 
|  | created | DateTime | =, >=, <=, <, > | 
|  | currency | String |  | 
|  | custom\$1text | Struct |  | 
|  | customer | String |  | 
|  | customer\$1creation | String |  | 
|  | customer\$1details | Struct |  | 
|  | customer\$1email | String |  | 
|  | expires\$1at | DateTime |  | 
|  | 인보이스 | String |  | 
|  | invoice\$1creation | Struct |  | 
|  | livemode | 불 |  | 
|  | locale | String |  | 
|  | metadata | Struct |  | 
|  | mode | String |  | 
|  | payment\$1intent | String | = | 
|  | payment\$1link | String |  | 
|  | payment\$1method\$1collection | String |  | 
|  | payment\$1method\$1options | Struct |  | 
|  | payment\$1method\$1types | 나열 |  | 
|  | payment\$1status | String |  | 
|  | phone\$1number\$1collection | Struct |  | 
|  | recovered\$1from | String |  | 
|  | setup\$1intent | String |  | 
|  | shipping\$1address\$1collection | Struct |  | 
|  | shipping\$1cost | Struct |  | 
|  | shipping\$1details | Struct |  | 
|  | shipping\$1options | 나열 |  | 
|  | status | String |  | 
|  | submit\$1type | String |  | 
|  | 구독 | String |  | 
|  | success\$1url | String |  | 
|  | tax\$1id\$1collection | Struct |  | 
|  | total\$1details | Struct |  | 
|  | url | String |  | 
|  | ui\$1mode | String |  | 
| 크레딧 노트 |  |  |  | 
|  | id | String |  | 
|  | 객체 | String |  | 
|  | amount | Integer |  | 
|  | created | DateTime | =, >=, <=, <, > | 
|  | currency | String |  | 
|  | customer | String | = | 
|  | customer\$1balance\$1transaction | String |  | 
|  | discount\$1amount | Integer |  | 
|  | discount\$1amounts | 나열 |  | 
|  | 인보이스 | String | = | 
|  | lines | Struct |  | 
|  | livemode | 불 |  | 
|  | memo | String |  | 
|  | metadata | Struct |  | 
|  | 숫자 | String |  | 
|  | out\$1of\$1band\$1amount | Integer |  | 
|  | pdf | String |  | 
|  | reason | String |  | 
|  | refund | String |  | 
|  | status | String |  | 
|  | subtotal | Integer |  | 
|  | subtotal\$1excluding\$1tax | Integer |  | 
|  | tax\$1amounts | 나열 |  | 
|  | total | Integer |  | 
|  | total\$1excluding\$1tax | Integer |  | 
|  | type | String |  | 
|  | voided\$1at | DateTime |  | 
|  | amount\$1shipping | Integer |  | 
|  | effective\$1at | DateTime |  | 
|  | shipping\$1cost | Struct |  | 
| Customer |  |  |  | 
|  | id | String |  | 
|  | 객체 | String |  | 
|  | address | Struct |  | 
|  | balance | Integer |  | 
|  | created | DateTime |  | 
|  | currency | String | =, >=, <=, <, > | 
|  | default\$1source | String |  | 
|  | delinquent | 불 | = | 
|  | 설명 | String |  | 
|  | discount | Struct |  | 
|  | 이메일 | String | = | 
|  | invoice\$1prefix | String |  | 
|  | invoice\$1settings | Struct |  | 
|  | livemode | 불 |  | 
|  | metadata | Struct |  | 
|  | name | String |  | 
|  | next\$1invoice\$1sequence | Integer |  | 
|  | phone | String |  | 
|  | preferred\$1locales | 나열 |  | 
|  | shipping | Struct |  | 
|  | tax\$1exempt | String |  | 
|  | test\$1clock | String |  | 
| 인보이스 |  |  |  | 
|  | id | String |  | 
|  | 객체 | String |  | 
|  | account\$1country | String |  | 
|  | account\$1name | String |  | 
|  | account\$1tax\$1ids | 나열 |  | 
|  | amount\$1due | Integer |  | 
|  | amount\$1paid | Integer |  | 
|  | amount\$1remaining | Integer |  | 
|  | 애플리케이션 | String |  | 
|  | application\$1fee\$1amount | Integer |  | 
|  | attempt\$1count | Integer |  | 
|  | attempted | 불 | = | 
|  | auto\$1advance | 불 | = | 
|  | automatic\$1tax | Struct |  | 
|  | billing\$1reason | String |  | 
|  | 요금 | String |  | 
|  | collection\$1method | String | = | 
|  | created | DateTime | =, >=, <=, <, > | 
|  | currency | String |  | 
|  | custom\$1fields | 나열 |  | 
|  | customer | String | = | 
|  | customer\$1address | Struct |  | 
|  | customer\$1email | String |  | 
|  | customer\$1name | String |  | 
|  | customer\$1phone | String |  | 
|  | customer\$1shipping | Struct |  | 
|  | customer\$1tax\$1exempt | String |  | 
|  | customer\$1tax\$1ids | 나열 |  | 
|  | default\$1payment\$1method | String |  | 
|  | default\$1source | String |  | 
|  | default\$1tax\$1rates | 나열 |  | 
|  | 설명 | String |  | 
|  | discount | Struct |  | 
|  | discounts | 나열 |  | 
|  | due\$1date | DateTime | =, >=, <=, <, > | 
|  | ending\$1balance | Integer |  | 
|  | footer | String |  | 
|  | from\$1invoice | Struct |  | 
|  | hosted\$1invoice\$1url | String |  | 
|  | invoice\$1pdf | String |  | 
|  | last\$1finalization\$1error | Struct |  | 
|  | latest\$1revision | String |  | 
|  | lines | Struct |  | 
|  | livemode | 불 |  | 
|  | metadata | Struct |  | 
|  | next\$1payment\$1attempt | DateTime |  | 
|  | 숫자 | String |  | 
|  | on\$1behalf\$1of | String |  | 
|  | paid | 불 | = | 
|  | paid\$1out\$1of\$1band | 불 |  | 
|  | payment\$1intent | String |  | 
|  | payment\$1settings | Struct |  | 
|  | period\$1end | DateTime | =, >=, <=, <, > | 
|  | period\$1start | DateTime | =, >=, <=, <, > | 
|  | post\$1payment\$1credit\$1notes\$1amount | Integer |  | 
|  | pre\$1payment\$1credit\$1notes\$1amount | Integer |  | 
|  | quote | String |  | 
|  | receipt\$1number | String |  | 
|  | rendering | Struct |  | 
|  | rendering\$1options | Struct |  | 
|  | starting\$1balance | Integer |  | 
|  | statement\$1descriptor | String |  | 
|  | status | String | = | 
|  | status\$1transitions | Struct |  | 
|  | 구독 | String |  | 
|  | subscription\$1details | Struct |  | 
|  | subtotal | Integer | =, <, > | 
|  | subtotal\$1excluding\$1tax | Integer |  | 
|  | tax | Integer |  | 
|  | test\$1clock | String |  | 
|  | total | Integer | =, <, > | 
|  | total\$1discount\$1amounts | 나열 |  | 
|  | total\$1excluding\$1tax | Integer |  | 
|  | total\$1tax\$1amounts | 나열 |  | 
|  | transfer\$1data | Struct |  | 
|  | webhooks\$1delivered\$1at | DateTime |  | 
|  | automatically\$1finalizes\$1at | DateTime |  | 
|  | effective\$1at | DateTime |  | 
|  | 발행자 | Struct |  | 
| 인보이스 항목 |  |  |  | 
|  | id | String |  | 
|  | 객체 | String |  | 
|  | amount | Integer | =, <, > | 
|  | currency | String |  | 
|  | customer | String | = | 
|  | date | DateTime |  | 
|  | 설명 | String |  | 
|  | discountable | 불 |  | 
|  | discounts | 나열 |  | 
|  | 인보이스 | String | = | 
|  | livemode | 불 |  | 
|  | metadata | Struct |  | 
|  | 기간 | Struct |  | 
|  | 계획 | Struct |  | 
|  | 가격 | Struct |  | 
|  | proration | 불 | = | 
|  | quantity | Integer |  | 
|  | 구독 | String |  | 
|  | subscription\$1item | String |  | 
|  | tax\$1rates | 나열 |  | 
|  | test\$1clock | String |  | 
|  | unit\$1amount | Integer |  | 
|  | unit\$1amount\$1decimal | String |  | 
| 계획 |  |  |  | 
|  | id | String |  | 
|  | 객체 | String |  | 
|  | 활성화 | 불 | = | 
|  | aggregate\$1usage | String |  | 
|  | amount | Integer |  | 
|  | amount\$1decimal | String |  | 
|  | billing\$1scheme | String |  | 
|  | created | DateTime | =, >=, <=, <, > | 
|  | currency | String | = | 
|  | interval | String | = | 
|  | interval\$1count | Integer |  | 
|  | livemode | 불 |  | 
|  | metadata | Struct |  | 
|  | nickname | String |  | 
|  | product | String | = | 
|  | tiers\$1mode | String |  | 
|  | transform\$1usage | Struct |  | 
|  | trial\$1period\$1days | Integer | =, <, > | 
|  | usage\$1type | String |  | 
|  | 측정 | String |  | 
| 견적 |  |  |  | 
|  | id | String |  | 
|  | 객체 | String |  | 
|  | amount\$1subtotal | Integer |  | 
|  | amount\$1total | Integer |  | 
|  | 애플리케이션 | String |  | 
|  | application\$1fee\$1amount | Integer |  | 
|  | application\$1fee\$1percent | 배정밀도 실수 |  | 
|  | automatic\$1tax | Struct |  | 
|  | collection\$1method | String |  | 
|  | computed | Struct |  | 
|  | created | DateTime |  | 
|  | currency | String |  | 
|  | customer | String | = | 
|  | default\$1tax\$1rates | 나열 |  | 
|  | 설명 | String |  | 
|  | discounts | 나열 |  | 
|  | expires\$1at | DateTime |  | 
|  | footer | String |  | 
|  | from\$1quote | Struct |  | 
|  | header | String |  | 
|  | 인보이스 | String |  | 
|  | invoice\$1settings | Struct |  | 
|  | livemode | 불 |  | 
|  | metadata | Struct |  | 
|  | 숫자 | String |  | 
|  | on\$1behalf\$1of | String |  | 
|  | status | String | = | 
|  | status\$1transitions | Struct |  | 
|  | 구독 | String |  | 
|  | subscription\$1data | Struct |  | 
|  | subscription\$1schedule | String |  | 
|  | test\$1clock | String |  | 
|  | total\$1details | Struct |  | 
|  | transfer\$1data | Struct |  | 
| 구독 |  |  |  | 
|  | id | String |  | 
|  | 객체 | String |  | 
|  | 애플리케이션 | String |  | 
|  | application\$1fee\$1percent | 배정밀도 실수 |  | 
|  | automatic\$1tax | Struct |  | 
|  | billing\$1cycle\$1anchor | DateTime |  | 
|  | billing\$1thresholds | Struct |  | 
|  | cancel\$1at | DateTime |  | 
|  | cancel\$1at\$1period\$1end | 불 |  | 
|  | canceled\$1at | DateTime |  | 
|  | collection\$1method | String | = | 
|  | created | DateTime | =, >=, <=,<,> | 
|  | currency | String |  | 
|  | current\$1period\$1end | DateTime | =, >=, <= | 
|  | current\$1period\$1start | DateTime | =, >=, <= | 
|  | customer | String | = | 
|  | days\$1until\$1due | Integer |  | 
|  | default\$1payment\$1method | String |  | 
|  | default\$1source | String |  | 
|  | default\$1tax\$1rates | 나열 |  | 
|  | 설명 | String |  | 
|  | discount | Struct |  | 
|  | ended\$1at | DateTime |  | 
|  | 항목 | Struct |  | 
|  | latest\$1invoice | String |  | 
|  | livemode | 불 |  | 
|  | metadata | Struct |  | 
|  | next\$1pending\$1invoice\$1item\$1invoice | DateTime |  | 
|  | pause\$1collection | Struct |  | 
|  | payment\$1settings | Struct |  | 
|  | pending\$1invoice\$1item\$1interval | Struct |  | 
|  | pending\$1setup\$1intent | String |  | 
|  | pending\$1update | Struct |  | 
|  | 계획 | Struct |  | 
|  | quantity | Integer |  | 
|  | schedule | String |  | 
|  | start\$1date | DateTime |  | 
|  | status | String | = | 
|  | test\$1clock | String |  | 
|  | transfer\$1data | Struct |  | 
|  | trial\$1end | DateTime |  | 
|  | trial\$1start | DateTime |  | 
| 구독 항목 |  |  |  | 
|  | Id | String |  | 
|  | 객체 | String |  | 
|  | billing\$1thresholds | Struct |  | 
|  | created | DateTime | =, >=, <=, <, > | 
|  | metadata | Struct |  | 
|  | 계획 | Struct |  | 
|  | 가격 | Struct |  | 
|  | 구독 | String |  | 
|  | tax\$1rates | 나열 |  | 
|  | discounts | 나열 |  | 
| 구독 일정 |  |  |  | 
|  | 객체 | String |  | 
|  | 애플리케이션 | String |  | 
|  | canceled\$1at | DateTime |  | 
|  | completed\$1at | DateTime |  | 
|  | created | DateTime |  | 
|  | current\$1phase | Struct |  | 
|  | customer | String | = | 
|  | default\$1settings | Struct |  | 
|  | end\$1behavior | String |  | 
|  | livemode | 불 |  | 
|  | metadata | Struct |  | 
|  | 단계 | 나열 |  | 
|  | released\$1at | DateTime |  | 
|  | released\$1subscription | String |  | 
|  | renewal\$1interval | String |  | 
|  | status | String |  | 
|  | 구독 | String |  | 
|  | test\$1clock | String |  | 
| Accounts |  |  |  | 
|  | details\$1submitted | 불 |  | 
|  | tos\$1acceptance | Struct |  | 
|  | type | String |  | 
|  | metadata | Struct |  | 
|  | id | String |  | 
|  | 객체 | String |  | 
|  | default\$1currency | String |  | 
|  | 역량 | Struct |  | 
|  | charges\$1enabled | 불 |  | 
|  | settings | Struct |  | 
|  | 요구 사항 | Struct |  | 
|  | payouts\$1enabled | 불 |  | 
|  | future\$1requirements | Struct |  | 
|  | external\$1accounts | Struct |  | 
|  | 컨트롤러 | Struct |  | 
|  | country | String |  | 
|  | 이메일 | String |  | 
|  | created | DateTime | =, >=, <=, <, > | 
|  | business\$1profile | Struct |  | 
|  | business\$1type | String |  | 
|  | company | Struct |  | 
| 애플리케이션 요금 |  |  |  | 
|  | id | String |  | 
|  | 객체 | String |  | 
|  | account | String |  | 
|  | amount | Integer | =, <, > | 
|  | amount\$1refunded | Integer | =, <, > | 
|  | 애플리케이션 | String |  | 
|  | balance\$1transaction | String |  | 
|  | 요금 | String | = | 
|  | created | DateTime |  | 
|  | currency | String |  | 
|  | livemode | 불 |  | 
|  | originating\$1transaction | String |  | 
|  | refunded | 불 | = | 
|  | refunds | Struct |  | 
|  | fee\$1source | Struct |  | 
| 국가 사양 |  |  |  | 
|  | id | String |  | 
|  | 객체 | String |  | 
|  | default\$1currency | String |  | 
|  | supported\$1bank\$1account\$1currencies | Struct |  | 
|  | supported\$1payment\$1currencies | 나열 |  | 
|  | supported\$1payment\$1methods | 나열 |  | 
|  | supported\$1transfer\$1countries | 나열 |  | 
|  | verification\$1fields | Struct |  | 
| 전송 |  |  |  | 
|  | id | String |  | 
|  | 객체 | String |  | 
|  | amount | Integer | =, <, > | 
|  | amount\$1reversed | Integer |  | 
|  | balance\$1transaction | String |  | 
|  | created | DateTime | =, >=, <=, <, > | 
|  | currency | String | = | 
|  | 설명 | String |  | 
|  | destination | String | = | 
|  | destination\$1payment | String |  | 
|  | livemode | 불 |  | 
|  | metadata | Struct |  | 
|  | reversals | Struct |  | 
|  | reversed | 불 |  | 
|  | source\$1transaction | String |  | 
|  | source\$1type | String |  | 
|  | transfer\$1group | String | = | 
| 조기 사기 경고 |  |  |  | 
|  | id | String |  | 
|  | 객체 | String |  | 
|  | actionable | 불 |  | 
|  | 요금 | String | = | 
|  | created | DateTime | =, >=, <=, <, > | 
|  | fraud\$1type | String |  | 
|  | livemode | 불 |  | 
|  | payment\$1intent | String | = | 
| 보고서 유형 |  |  |  | 
|  | id | String |  | 
|  | 객체 | String |  | 
|  | data\$1available\$1end | DateTime |  | 
|  | data\$1available\$1start | DateTime |  | 
|  | default\$1columns | 나열 |  | 
|  | livemode | 불 |  | 
|  | name | String |  | 
|  | updated | DateTime |  | 
|  | version | Integer |  | 

 **분할 쿼리** 

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

   날짜의 경우 Spark SQL 쿼리에 사용된 Spark 날짜 형식을 허용합니다. 유효한 값의 예제: `"2024-07-01T00:00:00.000Z"`.
+  `UPPER_BOUND`: 선택한 파티션 필드의 상한 값(경계 제외).
+  `NUM_PARTITIONS`: 파티션 수.

 엔터티 수준 분할 필드 지원 세부 정보는 아래 표에 캡처되어 있습니다.


| Entity Name | 분할 필드 | 데이터 형식 | 
| --- | --- | --- | 
| 밸런스 트랜잭션 | created | DateTime | 
| 요금 | created | DateTime | 
| 이의 | created | DateTime | 
| 파일 링크 | created | DateTime | 
| PaymentIntents | created | DateTime | 
| SetupIntents | created | DateTime | 
| 결제 금액 | created | DateTime | 
| 환불 | created | DateTime | 
| Products | created | DateTime | 
| 가격 | created | DateTime | 
| 쿠폰 | created | DateTime | 
| 프로모션 코드 | created | DateTime | 
| 세율 | created | DateTime | 
| 배송 요금 | created | DateTime | 
| 세션 | created | DateTime | 
| 크레딧 노트 | created | DateTime | 
| Customer | created | DateTime | 
| 인보이스 | created | DateTime | 
| 계획 | created | DateTime | 
| 구독 | created | DateTime | 
| 구독 일정 | created | DateTime | 
| Accounts | created | DateTime | 
| 애플리케이션 요금 | created | DateTime | 
| 전송 | created | DateTime | 
| 조기 사기 경고 | created | DateTime | 

 **예제** 

```
stripe_read = glueContext.create_dynamic_frame.from_options(
    connection_type="stripe",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "coupons",
        "API_VERSION": "v1",
        "PARTITION_FIELD": "created"
        "LOWER_BOUND": "2024-05-01T20:55:02.000Z"
        "UPPER_BOUND": "2024-07-11T20:55:02.000Z"
        "NUM_PARTITIONS": "10"
    }
)
```

# Stripe 연결 옵션
<a name="stripe-connection-options"></a>

다음은 Stripe에 대한 연결 옵션입니다.
+  `ENTITY_NAME`(문자열) - (필수) 읽기/쓰기에 사용됩니다. Stripe에서의 객체 이름.
+  `API_VERSION`(문자열) - (필수) 읽기/쓰기에 사용됩니다. 사용할 Stripe Rest API 버전. 예: v1.
+  `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 객체에 대해 선택할 열.
+  `FILTER_PREDICATE`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.
+  `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리.
+  `PARTITION_FIELD`(문자열) - 읽기에 사용됩니다. 쿼리 분할에 사용할 필드입니다.
+  `LOWER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 하한 값(경계 포함).
+  `UPPER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 상한 값(경계 제외).
+  `NUM_PARTITIONS`(정수) - 기본값: 1. 읽기에 사용됩니다. 읽을 파티션 수.

# 제한 사항
<a name="stripe-limitations"></a>

다음은 Stripe 커넥터에 대한 제한 사항입니다.
+  커넥터에서 지원하는 필드 기반 분할만 해당됩니다.
+  커넥터에서 레코드 기반 분할을 지원하지 않으며 총 레코드 수를 검색하도록 프로비저닝되지 않습니다.
+  프라이머리 키 데이터 유형은 문자열이므로 ID 기반 분할은 커넥터에서 지원하지 않습니다.

# 새 Stripe 계정 생성 및 클라이언트 앱 구성
<a name="stripe-new-account-creation"></a>

**Stripe 계정 생성**

1. **https://dashboard.stripe.com/register** 링크를 선택하세요.

1. 이메일, 전체 이름, 암호를 입력하고 **Create Account**를 선택하세요.

1. 계정으로 로그인한 후 **Open Gmail**을 선택하여 계정을 확인하세요.

1. 이메일에 수신된 확인 링크를 클릭하여 계정을 확인하세요.

1. 이메일 주소 확인을 클릭하면 다른 페이지로 리디렉션됩니다.

1. **Activate payments**를 클릭하여 계정을 활성화하면 Activate payments(**https://dashboard.stripe.com/welcome**) 페이지로 리디렉션되고 유효한 세부 정보를 모두 입력한 후 **Continue** 버튼을 선택하세요.



**Slack 개발자 앱 생성**

1. [Stripe](https://dashboard.stripe.com/login)에 로그인하세요.

1. 아래 그림의 맨 위에 표시된 **Developers**를 선택하세요.

1. Developers 아래에서 **API keys**를 선택하세요.

1. API 키를 가져오려면 **Reveal test key**를 선택하세요.

# AWS Glue Studio의 Teradata 밴티지에 연결
<a name="connecting-to-data-teradata"></a>

 AWS Glue에서는 Teradata Vantage를 기본으로 지원합니다. AWS Glue Studio에는 Teradata에 연결하고, 데이터 통합 작업을 작성하며, AWS Glue Studio 서버리스 Spark 런타임에서 실행할 수 있는 시각적 인터페이스가 있습니다.

 AWS Glue Studio에서 Teradata Vantage용 통합 연결을 생성합니다. 자세한 내용은 [고려 사항](using-connectors-unified-connections.md#using-connectors-unified-connections-considerations) 섹션을 참조하세요.

**Topics**
+ [Teradata Vantage 연결 생성](creating-teradata-connection.md)
+ [Teradata 소스 노드 생성](creating-teradata-source-node.md)
+ [Teradata 대상 노드 생성](creating-teradata-target-node.md)
+ [고급 옵션](#creating-teradata-connection-advanced-options)

# Teradata Vantage 연결 생성
<a name="creating-teradata-connection"></a>

AWS Glue에서 Teradata Vantage에 연결하려면 Teradata 보안 인증 정보를 생성하여 AWS Secrets Manager 암호에 저장한 다음 해당 암호를 AWS Glue Teradata 연결에 연결해야 합니다.

**사전 조건** 
+ Amazon VPC를 통해 Teradata 환경에 액세스하는 경우, AWS Glue 작업이 Teradata 환경과 통신할 수 있도록 Amazon VPC를 구성하십시오. 퍼블릭 인터넷을 통해 Teradata 환경에 액세스하는 것은 권장하지 않습니다.

  Amazon VPC에서 작업을 실행하는 동안 AWS Glue가 사용할 **VPC**, **서브넷** 및 **보안 그룹**을 식별하거나 생성합니다. 또한 Amazon VPC가 Teradata 인스턴스와 이 위치 간의 네트워크 트래픽을 허용하도록 구성되어 있는지 확인해야 합니다. 작업을 수행하려면 Teradata 클라이언트 포트와 TCP 연결을 설정해야 합니다. Teradata 포트에 대한 자세한 내용은 [Teradata 설명서](https://docs.teradata.com/r/Teradata-VantageTM-on-AWS-DIY-Installation-and-Administration-Guide/April-2020/Before-Deploying-Vantage-on-AWS-DIY/Security-Groups-and-Ports)를 참조하십시오.

  네트워크 레이아웃에 따라 보안 VPC 연결에는 Amazon VPC 및 기타 네트워킹 서비스를 변경해야 할 수 있습니다. AWS 연결에 대한 자세한 내용은 Teradata 설명서의 [AWS연결 옵션](https://docs.teradata.com/r/Teradata-VantageCloud-Enterprise/Get-Started/Connecting-Your-Environment/AWS-Connectivity-Options)을 참조하십시오.

**AWS Glue Teradata 연결을 구성하는 방법:**

1. Teradata 구성에서 AWS Glue가 *teradataUser* 및 *teradataPassword*와 연결할 사용자 및 암호를 식별하거나 생성합니다. 자세한 내용은 Teradata 설명서의 [Vantage 보안 개요](https://docs.teradata.com/r/Configuring-Teradata-VantageTM-After-Installation/January-2021/Security-Overview/Vantage-Security-Overview)를 참조하십시오.

1. AWS Secrets Manager에서 Teradata 보안 인증 정보를 사용하여 보안 암호를 생성합니다. Secrets Manager에서 보안 암호를 생성하려면 AWS Secrets Manager 설명서의 [Create an AWS Secrets Manager secret](https://docs.aws.amazon.com//secretsmanager/latest/userguide/create_secret.html)에서 제공하는 자습서를 따릅니다. 보안 암호를 생성한 후에는 다음 단계를 위해 보안 암호 이름, *secretName*을 유지합니다.
   + **키/값 페어**를 선택하면 값 *teradataUsername*이 포함된 키 `user`에 대한 페어를 생성합니다.
   + **키/값 페어**를 선택하면 값 *teradataPassword*가 포함된 키 `password`에 대한 페어를 생성합니다.

1. AWS Glue 콘솔에서 [AWS Glue 연결 추가](console-connections.md)의 단계에 따라 연결을 생성합니다. 연결을 생성한 후에는 다음 단계를 위해 연결 이름, *connectionName*을 유지합니다.
   + **연결 유형**을 선택할 때 Teradata를 선택합니다.
   + **JDBC URL**을 제공할 때는 인스턴스의 URL을 제공하십시오. 또한 JDBC URL에 쉼표로 구분된 특정 연결 매개변수를 하드코딩할 수 있습니다. URL의 형식: `jdbc:teradata://teradataHostname/ParameterName=ParameterValue,ParameterName=ParameterValue`

     지원되는 URL 파라미터는 다음과 같습니다.
     + `DATABASE` - 기본으로 액세스하는 호스트의 데이터베이스 이름입니다.
     + `DBS_PORT` - 비표준 포트에서 실행할 때 사용되는 데이터베이스 포트입니다.
   + **보안 인증 정보 유형**을 선택할 때에는 **AWS Secrets Manager**을 선택한 다음 **AWS보안 암호**를 *secretName*으로 설정합니다.

1. 다음과 같은 상황에서는 추가 구성이 필요할 수도 있습니다.
   + 

     Amazon VPC에서 AWS에 호스팅된 Teradata 인스턴스의 경우
     + Teradata 보안 보안 인증 정보를 정의하는 AWS Glue 연결에 Amazon VPC 연결 정보를 제공해야 합니다. 연결을 만들거나 업데이트할 때 **네트워크 옵션**에서 **VPC**, **서브넷** 및 **보안 그룹**을 설정합니다.

# Teradata 소스 노드 생성
<a name="creating-teradata-source-node"></a>

## 필수 전제 조건
<a name="creating-teradata-source-node-prerequisites"></a>
+ 이전 섹션 [Teradata Vantage 연결 생성](creating-teradata-connection.md)에서 설명한 것처럼 AWS Secrets Manager 암호로 구성된 AWS Glue Teradata Vantage 연결입니다.
+ 연결에 사용되는 보안 암호를 읽을 작업에 대한 적절한 권한.
+ 읽으려는 Teradata 테이블, *tableName* 또는 쿼리 *targetQuery*.

## Teradata 데이터 소스 추가
<a name="creating-teradata-source-node-add"></a>

****데이터 소스 - Teradata** 노드를 추가하는 방법:**

1.  Teradata 데이터 소스의 연결을 선택합니다. 생성했으므로 드롭다운에서 사용할 수 있을 것입니다. 연결을 생성해야 하는 경우 **새 연결 생성**을 선택합니다. 자세한 내용은 이전[Teradata Vantage 연결 생성](creating-teradata-connection.md) 섹션을 참조하세요.

    연결을 선택한 후에는 **속성 보기**를 클릭하여 연결 속성을 볼 수 있습니다.

1.  **Teradata 소스** 옵션 선택: 
   +  **단일 테이블 선택** - 단일 테이블에서 모든 데이터에 액세스할 수 있습니다.
   +  **사용자 지정 쿼리 입력** - 사용자 지정 쿼리를 기반으로 여러 테이블의 데이터 세트에 액세스할 수 있습니다.

1.  단일 테이블을 선택한 경우 *tableName*을 입력합니다.

    **사용자 지정 쿼리 입력**을 선택한 경우 SQL SELECT 쿼리를 입력합니다.

1.  **사용자 지정 Teradata 속성**에서 필요한 경우 파라미터와 값을 입력합니다.

# Teradata 대상 노드 생성
<a name="creating-teradata-target-node"></a>

## 필수 전제 조건
<a name="creating-teradata-target-node-prerequisites"></a>
+ 이전 섹션 [Teradata Vantage 연결 생성](creating-teradata-connection.md)에서 설명한 것처럼 AWS Secrets Manager 암호로 구성된 AWS Glue Teradata Vantage 연결입니다.
+ 연결에 사용되는 보안 암호를 읽을 작업에 대한 적절한 권한.
+ 쓰고 싶은 Teradata 테이블, *tableName*

## Teradata 데이터 대상 추가
<a name="creating-teradata-target-node-add"></a>

****데이터 대상 - Teradata** 노드를 추가하는 방법:**

1.  Teradata 데이터 소스의 연결을 선택합니다. 생성했으므로 드롭다운에서 사용할 수 있을 것입니다. 연결을 생성해야 하는 경우 **Teradata 연결 생성**을 선택합니다. 자세한 내용은 [커넥터 및 연결 사용 개요](https://docs.aws.amazon.com/glue/latest/ug/connectors-chapter.html#using-connectors-overview)를 참조하세요.

    연결을 선택한 후에는 **속성 보기**를 클릭하여 연결 속성을 볼 수 있습니다.

1. *tableName*을 제공하여 **테이블 이름**을 구성합니다.

1.  **사용자 지정 Teradata 속성**에서 필요한 경우 파라미터와 값을 입력합니다.

## 고급 옵션
<a name="creating-teradata-connection-advanced-options"></a>

Teradata 노드를 생성할 때 고급 옵션을 제공할 수 있습니다. 이 옵션은 Spark 스크립트에 대한 AWS Glue를 프로그래밍할 때 사용할 수 있는 옵션과 동일합니다.

[Teradata Vantage 연결](aws-glue-programming-etl-connect-teradata-home.md)를 참조하세요.

# 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' 필드 필터는 필수입니다.

# AWS Glue Studio의 Vertica 입력에 연결
<a name="connecting-to-data-vertica"></a>

 AWS Glue에서는 Vertica를 기본으로 지원합니다. AWS Glue Studio에는 Vertica에 연결하고, 데이터 통합 작업을 작성하며, AWS Glue Studio 서버리스 Spark 런타임에서 실행할 수 있는 시각적 인터페이스가 있습니다.

 AWS Glue Studio는 Vertica용 통합 연결을 생성합니다. 자세한 내용은 [고려 사항](using-connectors-unified-connections.md#using-connectors-unified-connections-considerations) 섹션을 참조하세요.

**Topics**
+ [Vertica 연결 생성](creating-vertica-connection.md)
+ [Vertica 소스 노드 생성](creating-vertica-source-node.md)
+ [Vertica 대상 노드 생성](creating-vertica-target-node.md)
+ [고급 옵션](#creating-vertica-connection-advanced-options)

# Vertica 연결 생성
<a name="creating-vertica-connection"></a>

**사전 조건** 
+ *tempS3Path*에서 참조하여 데이터베이스에서 읽고 쓸 때 임시 스토리지로 사용하는 Amazon S3 버킷 또는 폴더.
**참고**  
AWS Glue 작업 데이터 미리 보기에서 Vertica를 사용하는 경우 임시 파일이 *tempS3Path*에서 자동으로 제거되지 않을 수 있습니다. 임시 파일을 제거하려면 **데이터 미리 보기** 창에서 **세션 종료**를 선택하여 데이터 미리 보기 세션을 바로 종료합니다.  
데이터 미리 보기 세션이 바로 종료되도록 보장할 수 없는 경우 이전 데이터를 제거하도록 Amazon S3 수명 주기 구성을 설정하는 것이 좋습니다. 최대 작업 런타임에 여백을 더한 기준으로 49시간이 지난 데이터는 제거하는 것이 좋습니다. Amazon S3 수명 주기 구성에 대한 자세한 내용은 Amazon S3 설명서에서 [스토리지 수명 주기 관리](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html)를 참조하십시오.
+ Amazon S3 경로에 대한 적절한 권한이 있는 IAM 정책을 AWS Glue 작업 역할과 연결할 수 있습니다.
+ Vertica 인스턴스가 Amazon VPC에 있는 경우, 퍼블릭 인터넷을 통과하는 트래픽 없이 AWS Glue 작업이 Vertica 인스턴스와 통신할 수 있도록 Amazon VPC를 구성하십시오.

  Amazon VPC에서 AWS Glue가 작업을 실행하는 동안 사용할 **VPC**, **서브넷**, **보안 그룹**을 식별하거나 생성합니다. 또한 Vertica 인스턴스와 이 위치 간의 네트워크 트래픽을 허용하도록 Amazon VPC를 구성해야 합니다. 작업을 수행하려면 Vertica 클라이언트 포트(기본값 5433)와의 TCP 연결을 설정해야 합니다. 네트워크 레이아웃에 따라 보안 그룹 규칙, 네트워크 ACL, NAT 게이트웨이 및 피어링 연결을 변경해야 할 수도 있습니다.

**Vertica에 대한 연결 구성하는 방법:**

1. AWS Secrets Manager에서 Vertica 보안 인증 정보, *verticaUsername*, *verticaPassword*을 사용하여 암호를 생성합니다. Secrets Manager에서 보안 암호를 생성하려면 AWS Secrets Manager 설명서의 [Create an AWS Secrets Manager secret](https://docs.aws.amazon.com//secretsmanager/latest/userguide/create_secret.html)에서 제공하는 자습서를 따릅니다. 보안 암호를 생성한 후에는 다음 단계를 위해 보안 암호 이름, *secretName*을 유지합니다.
   + **키/값 페어**를 선택하면 값 *verticaUsername*이 포함된 키 `user`에 대한 페어를 생성합니다.
   + **키/값 페어**를 선택하면 값 *verticaPassword*이 포함된 키 `password`에 대한 페어를 생성합니다.

1. AWS Glue 콘솔에서 [AWS Glue 연결 추가](console-connections.md)의 단계에 따라 연결을 생성합니다. 연결을 생성한 후에는 다음 단계를 위해 연결 이름, *connectionName*을 유지합니다.
   + **연결 유형**을 선택할 때 Vertica를 선택합니다.
   + **Vertica 호스트**를 선택할 때 Vertica 설치의 호스트 이름을 제공합니다.
   + **Vertica 포트**를 선택하면 해당 포트를 통해 Vertica 설치를 사용할 수 있습니다.
   + **AWS 보안 암호**를 선택할 때 *secretName*을 입력합니다.

1. 다음과 같은 상황에서는 추가 구성이 필요할 수도 있습니다.
   + 

     Amazon VPC에서 AWS에 호스팅된 Vertica 인스턴스의 경우
     + Vertica 보안 보안 인증 정보를 정의하는 Amazon VPC 연결 정보를 AWS Glue 연결에 제공하십시오. 연결을 만들거나 업데이트할 때 **네트워크 옵션**에서 **VPC**, **서브넷** 및 **보안 그룹**을 설정합니다.

AWS Glue 작업을 실행하기 전에 다음 단계를 수행해야 합니다.
+ AWS Glue 작업과 권한과 연결된 IAM 역할을 *tempS3Path*에 부여합니다.
+ AWS Glue 작업 권한과 연결된 IAM 역할에 *secretName*을 읽을 수 있는 권한을 부여합니다.

# Vertica 소스 노드 생성
<a name="creating-vertica-source-node"></a>

## 필수 전제 조건
<a name="creating-vertica-source-node-prerequisites"></a>
+ 이전 섹션 [Vertica 연결 생성](creating-vertica-connection.md)에서 설명한 대로 Vertica 유형 AWS Glue 데이터 카탈로그 연결인 *connectionName*과 임시 Amazon S3 위치인 *tempS3Path*를 사용합니다.
+ 읽으려는 Vertica 테이블, *tableName* 또는 쿼리 *targetQuery*.

## Vertica 데이터 소스 추가
<a name="creating-vertica-source-node-add"></a>

****데이터 소스 - Vertica** 노드 추가하는 방법:**

1.  Vertica 데이터 소스의 연결을 선택합니다. 생성했으므로 드롭다운에서 사용할 수 있을 것입니다. 연결을 생성해야 하는 경우 **Vertica 연결 생성**을 선택합니다. 자세한 내용은 이전[Vertica 연결 생성](creating-vertica-connection.md) 섹션을 참조하세요.

    연결을 선택한 후에는 **속성 보기**를 클릭하여 연결 속성을 볼 수 있습니다.

1. 테이블이 포함된 **데이터베이스**를 선택합니다.

1. **Amazon S3에서 스테이징** 영역을 선택하고 *tempS3Path*에 S3A URI를 입력합니다.

1. **Vertica 소스**를 선택합니다.
   +  **단일 테이블 선택** - 단일 테이블에서 모든 데이터에 액세스할 수 있습니다.
   +  **사용자 지정 쿼리 입력** - 사용자 지정 쿼리를 기반으로 여러 테이블의 데이터 세트에 액세스할 수 있습니다.

1.  단일 테이블을 선택한 경우 *tableName*을 입력하고 선택적으로 **스키마**를 선택합니다.

    **사용자 지정 쿼리**를 선택한 경우 SQL SELECT 쿼리를 입력하고 선택적으로 **스키마**를 선택합니다.

1.  **사용자 지정 Vertica 속성**에서 필요한 경우 파라미터와 값을 입력합니다.

# Vertica 대상 노드 생성
<a name="creating-vertica-target-node"></a>

## 필수 전제 조건
<a name="creating-vertica-target-node-prerequisites"></a>
+ 이전 섹션 [Vertica 연결 생성](creating-vertica-connection.md)에서 설명한 대로 Vertica 유형 AWS Glue 데이터 카탈로그 연결인 *connectionName*과 임시 Amazon S3 위치인 *tempS3Path*를 사용합니다.

## Vertica 데이터 대상 추가
<a name="creating-vertica-target-node-add"></a>

****데이터 대상 - Vertica** 노드를 추가하는 방법:**

1.  Vertica 데이터 소스의 연결을 선택합니다. 생성했으므로 드롭다운에서 사용할 수 있을 것입니다. 연결을 생성해야 하는 경우 **Vertica 연결 생성**을 선택합니다. 자세한 내용은 이전[Vertica 연결 생성](creating-vertica-connection.md) 섹션을 참조하세요.

    연결을 선택한 후에는 **속성 보기**를 클릭하여 연결 속성을 볼 수 있습니다.

1. 테이블이 포함된 **데이터베이스**를 선택합니다.

1. **Amazon S3에서 스테이징** 영역을 선택하고 *tempS3Path*에 S3A URI를 입력합니다.

1. *tableName*을 **입력하고 선택적으로 스키마**를 선택합니다.

1.  **사용자 지정 Vertica 속성**에서 필요한 경우 파라미터와 값을 입력합니다.

## 고급 옵션
<a name="creating-vertica-connection-advanced-options"></a>

Vertica 노드를 생성할 때 고급 옵션을 제공할 수 있습니다. 이 옵션은 Spark 스크립트에 대한 AWS Glue를 프로그래밍할 때 사용할 수 있는 옵션과 동일합니다.

[수직 연결](aws-glue-programming-etl-connect-vertica-home.md)를 참조하세요.

# WooCommerce에 연결
<a name="connecting-to-data-woocommerce"></a>

WooCommerce는 WordPress 기반 웹 사이트를 위해 빌드된 유연한 오픈 소스 소프트웨어 솔루션입니다. 일반적으로 온라인 전자 상거래 상점을 생성하는 데 사용됩니다. 이 소프트웨어 솔루션을 사용하면 누구나 일반 웹 사이트를 완전한 기능을 갖춘 온라인 상점으로 전환할 수 있습니다.

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

# AWS Glue의 WooCommerce 지원
<a name="woocommerce-support"></a>

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

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

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

**지원되는 WooCommerce API 버전**  
다음 WooCommerce API 버전이 지원됩니다.
+ v3

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

# WooCommerce 구성
<a name="woocommerce-configuring"></a>

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

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

다음은 최소 요구 사항입니다.
+ `consumerKey`와 `consumerSecret`가 있는 WooCommerce 계정이 있습니다.
+ WooCommerce 계정에 유효한 라이선스가 있는 API 액세스 권한이 있습니다.

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

# WooCommerce 연결 구성
<a name="woocommerce-configuring-connections"></a>

WooCommerce에서는 사용자 지정 인증을 지원합니다. 사용자 지정 권한 부여에 필요한 API 키 생성에 대한 퍼블릭 WooCommerce 설명서는 [인증 - WooCommerce REST API 설명서](https://woocommerce.github.io/woocommerce-rest-api-docs/#authentication)를 참조하세요.

WooCommerce 연결을 구성하는 방법:

1. AWS Secrets Manager에서 다음 세부 정보로 보안 암호를 생성합니다.
   + 고객 관리형 연결된 앱의 경우 보안 암호에는 연결된 앱의 소비자 보안 암호와 `consumerSecret` 및 `consumerKey`를 키로 포함해야 합니다. 참고: AWS Glue에서 연결당 보안 암호를 생성해야 합니다.

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

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

   1. 연결하려는 WooCommerce 인스턴스의 `INSTANCE_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`을 읽을 수 있는 권한을 부여합니다.

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

**사전 조건**

읽으려는 WooCommerce 객체입니다. 쿠폰, 주문, 제품 등과 같은 객체 이름이 필요합니다.

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


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| Coupon | 예 | 예 | 예 | 예 | 예 | 
| Coupon Total | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Customers Total | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Order | 예 | 예 | 예 | 예 | 예 | 
| Orders Total | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Payment Gateway | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Product | 예 | 예 | 예 | 예 | 예 | 
| Product attribute | 예 | 예 | 예 | 예 | 예 | 
| Product category | 예 | 예 | 예 | 예 | 예 | 
| Product review | 예 | 예 | 예 | 예 | 예 | 
| Product shipping class | 예 | 예 | 예 | 예 | 예 | 
| Product tag | 예 | 예 | 예 | 예 | 예 | 
| Product variation | 예 | 예 | 예 | 예 | 예 | 
| Products Total | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Report (List) | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Reviews Total | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Sales Report | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Shipping Method | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Shipping Zone | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Shipping Zone Location | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Shipping Zone Method | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Tax Rate | 예 | 예 | 예 | 예 | 예 | 
| Tax Class | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Top Sellers Report | 예 | 아니요 | 아니요 | 예 | 아니요 | 

**예시:**

```
woocommerce_read = glueContext.create_dynamic_frame.from_options(
    connection_type="glue.spark.woocommerce",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "coupon",
        "API_VERSION": "v3",
        "INSTANCE_URL": "instanceUrl"
    }
```

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

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

**참고**  
커넥터의 응답에서 Struct 및 List 데이터 유형은 String 데이터 유형으로 변환되며, DateTime 데이터 유형은 타임스탬프로 변환됩니다.

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

**레코드 기반 분할**:

Spark에서 동시성을 활용하려는 경우 추가 Spark 옵션(`NUM_PARTITIONS`)을 제공할 수 있습니다. 이러한 파라미터를 사용하면 Spark 작업에서 동시에 실행할 수 있는 `NUM_PARTITIONS`개의 하위 쿼리로 원래 쿼리가 분할됩니다.

레코드 기반 분할에서는 존재하는 총 레코드 수를 WooCommerce API에서 쿼리하고 제공된 `NUM_PARTITIONS` 번호로 나눕니다. 그런 다음, 결과 레코드 수를 각 하위 쿼리에서 동시에 가져옵니다.
+ `NUM_PARTITIONS`: 파티션 수.

다음 엔터티는 레코드 기반 분할을 지원합니다.
+ coupon
+ 순서
+ product
+ product-attribute
+ product-attribute-term
+ product-category
+ product-review
+ product-shipping-class
+ product-tag
+ product-variation
+ tax-rate

예시:

```
woocommerce_read = glueContext.create_dynamic_frame.from_options(
    connection_type="glue.spark.woocommerce",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "coupon",
        "API_VERSION": "v3",
        "INSTANCE_URL": "instanceUrl"
        "NUM_PARTITIONS": "10"
    }
```

**레코드 기반 분할**:

원본 쿼리가 Spark 태스크에서 동시에 실행할 수 있는 `NUM_PARTITIONS`개의 하위 쿼리로 분할됩니다.
+ `NUM_PARTITIONS`: 파티션 수.

예시:

```
WooCommerce_read = glueContext.create_dynamic_frame.from_options(
    connection_type="WooCommerce",
    connection_options={
        "connectionName": "connectionName",
        "REALMID": "1234567890123456789",
        "ENTITY_NAME": "Bill",
        "API_VERSION": "v3",
        "NUM_PARTITIONS": "10"
    }
```

# WooCommerce 연결 옵션
<a name="woocommerce-connection-options"></a>

다음은 WooCommerce의 연결 옵션입니다.
+ `ENTITY_NAME`(문자열) - (필수) 읽기에 사용됩니다. WooCommerce에서의 객체 이름입니다.
+ `API_VERSION`(문자열) - (필수) 읽기에 사용됩니다. 사용할 WooCommerce Rest API 버전입니다.
+ `REALM_ID`(문자열) - 요청을 보내는 개별 WooCommerce Online 회사를 식별하는 ID입니다.
+ `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 객체에 대해 선택할 열.
+ `FILTER_PREDICATE`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.
+ `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리.
+ `INSTANCE_URL`(문자열) - (필수) 형식이 https://<instance>.wpcomstaging.com이며 유효한 WooCommerce 인스턴스 URL
+ `NUM_PARTITIONS`(정수) - 기본값: 1. 읽기에 사용됩니다. 읽을 파티션 수.

# Zendesk에 연결
<a name="connecting-to-data-zendesk"></a>

Zendesk는 고객 서비스 포털, 지식 기반 및 온라인 커뮤니티를 구축하는 데 활용할 수 있는 사용자 지정 가능한 도구를 제공하는 클라우드 기반 헬프데스크 관리 솔루션입니다.

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

# Zendesk에 대한 AWS Glue 지원
<a name="zendesk-support"></a>

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

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

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

**지원되는 Zendesk API 버전**  
다음 Zendesk API 버전이 지원됩니다.
+ v2

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

# Zendesk 구성
<a name="zendesk-configuring"></a>

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

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

다음은 최소 요구 사항입니다.
+ Zendesk 계정이 있습니다. 자세한 내용은 [Zendesk 계정 생성](#zendesk-configuring-creating-account) 섹션을 참조하세요.
+ API 액세스에 대해 Zendesk 계정이 활성화되어 있습니다.
+ Zendesk 계정을 사용하면 연결된 앱을 설치할 수 있습니다.

이러한 요구 사항을 충족하면 Zendesk 계정에 AWS Glue를 연결할 준비가 된 것입니다.

## Zendesk 계정 생성
<a name="zendesk-configuring-creating-account"></a>

Zendesk 계정을 생성하는 방법:

1. https://www.zendesk.com/in/register/로 이동하세요.

1. 회사 이메일, 이름, 성, 전화번호, 직함, 회사 이름, 회사 직원 수, 암호 및 선호하는 언어와 같은 세부 정보를 입력하세요. 그런 다음 **Complete trial Signup**을 선택하세요.

1. 계정이 생성되면 수신한 확인 링크를 완료하여 이메일 주소를 확인하세요.

1. 회사 이메일 주소가 확인되면 Zendesk 계정으로 리디렉션됩니다. 원하는 요금제에 맞는 **Buy Zendesk** 옵션을 선택하세요. 참고: Zendesk 커넥터의 경우 Suite Enterprise 요금제를 구매하는 것이 좋습니다.

## 클라이언트 앱 및 OAuth 2.0 자격 증명 생성
<a name="zendesk-configuring-creating-client-app"></a>

클라이언트 앱 및 OAuth 2.0 자격 증명을 생성하는 방법

1. OAuth 2.0 앱을 생성하려는 Zendesk 계정에 로그인합니다(https://www.zendesk.com/in/login/).

1. 톱니 아이콘을 클릭하세요. **Go to admin center** 링크를 선택하여 관리자 센터 페이지를 여세요.

1. 왼쪽 사이드바에서 **Apps and integrations**를 선택한 다음 **APIs** > **Zendesk API**를 선택하세요.

1. Zendesk API 페이지에서 **OAuth Clients** 탭을 선택하세요.

1. 오른쪽에서 **Add Oauth Client**를 선택하세요.

1. 다음 필드를 작성하여 클라이언트를 생성하세요.

   1. Client Name - 앱 이름을 입력합니다. 애플리케이션에 대한 액세스 권한을 부여하도록 요청하는 경우 그리고 Zendesk에 대한 액세스 권한이 있는 서드 파티 앱 목록을 확인하는 경우 사용자에게 표시되는 이름입니다.

   1. Description - 선택 사항 액세스 권한을 부여하도록 요청하는 경우 사용자에게 표시되는 앱에 대한 간단한 설명.

   1. Company - 선택 사항. 애플리케이션에 대한 액세스 권한을 부여하도록 요청하는 경우 사용자에게 표시되는 회사 이름. 이 정보는 액세스 권한을 부여하는 대상을 이해하는 데 도움이 될 수 있습니다.

   1. Logo - 선택 사항. 애플리케이션에 대한 액세스 권한을 부여하도록 요청하는 경우 사용자에게 표시되는 로고입니다. 이미지는 JPG, GIF 또는 PNG일 수 있습니다. 최상의 결과를 얻으려면 사각형 이미지를 업로드하세요. 그러면 권한 부여 페이지에 맞게 크기가 조정됩니다.

   1. Unique Identifier - 필드는 앱에 입력한 이름의 형식이 변경된 버전으로 자동으로 채워집니다. 원하는 경우 변경할 수 있습니다.

   1. Redirect URLs - Zendesk가 애플리케이션에 대한 액세스 권한을 부여하려는 사용자의 결정을 보내는 데 사용해야 하는 하나 이상의 URL을 입력합니다.

      예: https://us-east-1.console.aws.amazon.com/gluestudio/oauth

1. **저장**을 클릭합니다.

1. 페이지를 새로 고치면 미리 채워진 새 **Secret** 필드가 하단에 나타납니다. OAuth2 사양에 지정된 'client\$1secret' 값입니다. 보안 암호 값을 클립보드에 복사하고 안전한 곳에 저장하세요. 참고: 문자는 텍스트 상자 너비를 넘어 확장될 수 있으므로 복사하기 전에 모든 항목을 선택해야 합니다.

1. **저장**을 클릭합니다.

# Zendesk 연결 구성
<a name="zendesk-configuring-connections"></a>

Zendesk 커넥터는 권한 부여 코드 권한 부여 유형을 지원합니다.
+ 이 권한 부여 유형은 사용자를 인증하기 위해 사용자를 서드파티 권한 부여 서버로 리디렉션하는 방식에 의존하므로 '3각' OAuth로 간주됩니다. AWS Glue 콘솔을 통해 연결을 생성할 때 사용됩니다. 연결을 생성하는 사용자는 기본적으로 Zendesk 인스턴스 URL을 제외한 OAuth 관련 정보를 제공할 필요가 없는 AWS Glue 자체 연결된 앱(AWS Glue 관리형 클라이언트 애플리케이션)에 의존할 수 있습니다. AWS Glue 콘솔은 사용자를 Zendesk로 리디렉션합니다. 사용자가 로그인하고 Zendesk 인스턴스에 액세스하도록 요청된 권한을 AWS Glue에 허용해야 합니다.
+ 여전히 AWS Glue 콘솔을 통해 연결을 생성할 때에도 Zendesk에서 자체 연결된 앱을 생성하고 자체 클라이언트 ID와 클라이언트 보안 암호를 제공하기로 선택할 수 있습니다. 이 시나리오에서는 여전히 Zendesk로 리디렉션되어 로그인하고 리소스에 액세스할 수 있는 권한을 AWS Glue에 부여합니다.
+ 이 권한 부여 유형은 액세스 토큰을 생성합니다. 액세스 토큰은 만료되지 않습니다.

권한 부여 코드 OAuth 흐름을 위한 연결된 앱 생성에 대한 퍼블릭 Zendesk 설명서는 [권한 부여 유형용 OAuth 토큰](https://developer.zendesk.com/api-reference/ticketing/oauth/grant_type_tokens/)을 참조하세요.

Zendesk 연결을 구성하는 방법:

1. AWS Secrets Manager에서 다음 세부 정보로 보안 암호를 생성합니다.

   1. AuthorizationCode 권한 부여 유형의 경우 고객 관리형 연결된 앱에서는 시크릿에 키 역할을 하는 `USER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET`과 함께 연결된 앱 소비자 시크릿이 포함되어야 합니다.

   1. 참고: AWS Glue에서 연결당 시크릿을 생성해야 합니다.

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

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

   1. 연결하려는 Zendesk의 INSTANCE\$1URL을 제공합니다.

   1. Zendesk 환경을 제공합니다.

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

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

**사전 조건**

읽으려는 Zendesk 객체. 다음 표에 언급된 대로 티켓, 사용자 또는 문서와 같은 객체 이름이 필요합니다.


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| 티켓 | Y | Y | Y | Y | N | 
| User | Y | Y | Y | Y | N | 
| Organization | Y | Y | Y | Y | N | 
| Article | Y | Y | N | Y | N | 
| 티켓 이벤트 | Y | Y | N | Y | N | 
| 티켓 지표 이벤트 | Y | Y | N | Y | N | 
| 티켓 설명 | Y | Y | Y | Y | N | 
| 티켓 필드 | Y | Y | N | Y | N | 
| 티켓 지표 | Y | Y | N | Y | N | 
| 티켓 활동 | Y | Y | N | Y | N | 
| 티켓 건너뛰기 | N | Y | N | Y | N | 
| 그룹 | Y | Y | Y | Y | N | 
| 그룹 멤버십 | N | Y | Y | Y | N | 
| 만족도 등급 | Y | Y | N | Y | N | 
| 보기 | Y | Y | Y | Y | N | 
| 트리거 | Y | Y | Y | Y | N | 
| 트리거 카테고리 | N | Y | Y | Y | N | 
| 매크로 | Y | Y | Y | Y | N | 
| 자동화 | N | Y | Y | Y | N | 

**예시:**

```
Zendesk_read = glueContext.create_dynamic_frame.from_options(
    connection_type="Zendesk",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "Account",
        "API_VERSION": "v2"
    }
```

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

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

**참고**  
구조체 및 목록 데이터 유형은 커넥터의 응답에서 문자열 데이터 유형으로 변환됩니다.

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

파티션은 Zendesk에서 지원되지 않습니다.

# Zendesk 연결 옵션
<a name="zendesk-connection-options"></a>

다음은 Zendesk의 연결 옵션입니다.
+ `ENTITY_NAME`(문자열) - (필수) 읽기에 사용됩니다. Zendesk에서 객체 이름.
+ `API_VERSION`(문자열) - (필수) 읽기에 사용됩니다. 사용하려는 Zendesk Rest API 버전. 예: v2.
+ `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 객체에 대해 선택할 열. 예: id, name, url, created\$1at
+ `FILTER_PREDICATE`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다. 예: group\$1id = 100
+ `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리. 예: "SELECT id,url FROM users WHERE role=\$1"end-user\$1""
+ `PARTITION_FIELD`(문자열) - 읽기에 사용됩니다. 쿼리 분할에 사용할 필드입니다. 기본 필드는 증분 내보내기 API를 지원하는 엔터티의 경우 `update_at`입니다(`ticket-events`의 경우 `created_at`, `ticket-metric-events`의 경우 `time`).
+ `LOWER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 하한 값(경계 포함).
+ `UPPER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 상한 값(경계 제외). 선택 사항으로, 이 옵션은 작업 옵션에 제공되지 않은 경우 커넥터에서 처리됩니다. 기본값 - '2024-05-01T20:55:02.000Z
+ `NUM_PARTITIONS`(정수) - 기본값: 1. 읽기에 사용됩니다. 읽을 파티션 수. 선택 사항으로, 이 옵션은 작업 옵션에 제공되지 않은 경우 커넥터에서 처리됩니다. 기본값: 1.
+ `IMPORT_DELETED_RECORDS`(문자열) - 기본값: FALSE. 읽기에 사용됩니다. 쿼리하는 동안 삭제 레코드를 가져오려면 다음을 수행합니다.
+ `ACCESS_TOKEN` - 요청에 사용할 액세스 토큰.
+ `INSTANCE_URL` - 사용자가 작업을 실행하려는 인스턴스의 URL. 예: https://\$1subdomain\$1/.zendesk.com

# 제한 사항
<a name="zendesk-limitations"></a>

다음은 Zendesk 커넥터의 제한 사항입니다.
+ 오프셋 기반 페이지 매김은 가져올 수 있는 페이지 수를 100개로 제한하지만 가져올 수 있는 총 레코드 수가 10,000개이므로 권장되지 않습니다. 그러나 Zendesk 커넥터에 대해 구현된 커서 기반 페이지 매김은 이러한 제한을 극복합니다. EQUAL\$1TO 필터 연산자만 Zendesk API를 통해 지원됩니다.

  이 제한 사항으로 인해 Zendesk 커넥터에 대해 파티셔닝은 지원되지 않습니다.
+ '티켓 이벤트' 엔터티의 경우 사용량 제한은 분당 요청 10개입니다. AWS Glue ETL 작업을 실행하는 동안 429(요청이 너무 많음) 오류가 발생할 수 있습니다.

# 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개입니다.
    + 여러 줄 텍스트 필드의 필터링/기준은 지원되지 않습니다.

# Zoom Meetings에 연결
<a name="connecting-to-data-zoom-meetings"></a>

Zoom Meetings는 화상 회의, 오디오 회의, 웨비나, 회의 녹화, 라이브 채팅에 사용할 수 있는 클라우드 기반 화상 회의 플랫폼입니다.

**Topics**
+ [AWS Glue의 Zoom Meetings 지원](zoom-meetings-support.md)
+ [연결을 생성하고 사용하기 위한 API 작업이 포함된 정책](zoom-meetings-configuring-iam-permissions.md)
+ [Zoom Meetings 구성](zoom-meetings-configuring.md)
+ [Zoom Meetings 클라이언트 앱 구성](zoom-meetings-configuring-client-app.md)
+ [Zoom Meetings 연결 구성](zoom-meetings-configuring-connections.md)
+ [Zoom Meetings 엔터티에서 읽기](zoom-meetings-reading-from-entities.md)
+ [Zoom Meetings 연결 옵션](zoom-meetings-connection-options.md)
+ [Zoom Meetings 제한 사항](zoom-meetings-limitations.md)

# AWS Glue의 Zoom Meetings 지원
<a name="zoom-meetings-support"></a>

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

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

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

**지원되는 Zoom Meetings API 버전**  
다음 Zoom Meetings API 버전이 지원됩니다.
+ v2

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

# Zoom Meetings 구성
<a name="zoom-meetings-configuring"></a>

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

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

다음은 최소 요구 사항입니다.
+ Zoom Meetings 계정이 있습니다.
+ Zoom 계정이 API 액세스에 대해 활성화되어 있습니다.
+ Zoom Meetings 계정에서 OAuth2 앱을 생성했습니다. 이 통합에서는 계정에 대해 인증된 직접 호출을 수행하는 경우 AWS Glue에서 데이터에 안전하게 액세스하는 데 사용하는 자격 증명을 제공합니다. 자세한 내용은 [Zoom Meetings 클라이언트 앱 구성](zoom-meetings-configuring-client-app.md) 섹션을 참조하세요.

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

# Zoom Meetings 클라이언트 앱 구성
<a name="zoom-meetings-configuring-client-app"></a>

1. Zoom App Marketplace에 로그인합니다.

1. **개발** > **앱 빌드**를 선택합니다.

1. OAuth 2.0 기반 앱의 **일반 앱**을 선택합니다.

1. **기본 정보** 페이지에서 앱 이름, 앱 관리 방식, 앱 자격 증명, OAuth 정보와 같은 앱에 대한 정보를 추가하거나 업데이트합니다.

1. **앱 관리 방식 선택** 섹션에서 앱 관리 방식을 확인합니다.

   1. **관리자 관리형**: 계정 관리자가 앱을 추가하고 관리합니다.

   1. **사용자 관리형**: 개별 사용자가 앱을 추가하고 관리합니다. 앱은 사용자의 승인된 데이터에만 액세스할 수 있습니다.

1. **앱 자격 증명**: 빌드 흐름은 앱에 대한 앱 자격 증명(클라이언트 ID 및 클라이언트 보안 암호)을 자동으로 생성합니다.

1. OAuth 정보 섹션에서 앱에 대한 OAuth를 설정합니다.

   1. **OAuth 리디렉션 URL**(필수): 리디렉션 URL 또는 엔드포인트를 입력하여 앱과 Zoom 간에 OAuth를 설정합니다.

   1. **엄격 모드 URL 사용**(선택 사항)

   1. **하위 도메인 확인**(선택 사항)

   1. **OAuth 허용 목록**(필수): Zoom이 OAuth 흐름에 유효한 리디렉션으로 허용해야 하는 고유한 URL을 추가합니다.

1. **범위** 페이지에서 앱이 직접적으로 호출할 수 있는 Zoom API 메서드를 선택합니다. 범위는 사용자가 사용할 수 있는 정보와 기능을 정의합니다. 다음과 같은 세분화된 범위를 선택합니다.
   + user:read:list\$1users:admin
   + zoom\$1rooms:read:list\$1rooms:admin
   + group:read:list\$1members:admin
   + group:read:administrator:admin
   + group:read:list\$1groups:admin
   + report:read:admin
   + role:read:list\$1roles, role:read:list\$1roles:admin

   범위가 추가되면 **계속**을 선택하고 앱을 사용할 준비가 된 것입니다.

OAuth 2.0 설정에 대한 자세한 내용은 [Integrations(OAuth apps)](https://developers.zoom.us/docs/integrations/)를 참조하세요.

# Zoom Meetings 연결 구성
<a name="zoom-meetings-configuring-connections"></a>

Zoom Meetings에서는 OAuth2에 대한 AUTHORIZATION\$1CODE 권한 부여 유형을 지원합니다. 권한 부여 유형은 AWS Glue에서 Zoom Meetings과 통신하여 데이터에 대한 액세스를 요청하는 방법을 결정합니다.
+ 이 권한 부여 유형은 사용자를 인증하기 위해 사용자를 서드파티 권한 부여 서버로 리디렉션하는 방식에 의존하므로 '3각' OAuth로 간주됩니다. AWS Glue 콘솔을 통해 연결을 생성할 때 사용됩니다. 연결을 생성하는 사용자는 Zoom Meetings 클라이언트 애플리케이션에 대한 클라이언트 ID 및 클라이언트 보안 암호와 같은 OAuth 관련 정보를 제공해야 합니다. AWS Glue 콘솔은 사용자를 Zoom으로 리디렉션합니다. 사용자가 로그인하고 Zoom Meetings 인스턴스에 액세스하도록 요청된 권한을 AWS Glue에 허용해야 합니다.
+ 사용자는 여전히 AWS Glue 콘솔을 통해 연결을 생성할 때에도 Zoom Meetings에서 자체 연결된 앱을 생성하고 자체 클라이언트 ID와 클라이언트 보안 암호를 제공하기로 선택할 수 있습니다. 이 시나리오에서는 여전히 Zoom Meetings으로 리디렉션되어 로그인하고 리소스에 액세스할 수 있는 권한을 AWS Glue에 부여합니다.
+ 이 권한 부여 유형은 새로 고침 토큰과 액세스 토큰을 생성합니다. 액세스 토큰은 수명이 짧으며 새로 고침 토큰을 사용하여 사용자 상호 작용 없이 자동으로 새로 고칠 수 있습니다.
+ 권한 부여 코드 OAuth 흐름을 위한 연결된 앱 생성에 대한 퍼블릭 Zoom Meetings 설명서는 [Using OAuth 2.0](https://developers.zoom.us/docs/api/using-zoom-apis/#using-oauth-20)을 참조하세요.

Zoom Meetings 연결을 구성하는 방법:

1. AWS Secrets Manager에서 다음 세부 정보로 보안 암호를 생성합니다.

   1. 고객 관리형 연결된 앱의 경우 보안 암호는 키 역할을 하는 `USER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET`과 함께 연결된 앱 소비자 보안 암호를 포함해야 합니다.

   1. 참고: AWS Glue에서 연결의 보안 암호를 생성해야 합니다.

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

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

   1. 연결하려는 Zoom Meetings 환경을 제공합니다.

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

# Zoom Meetings 엔터티에서 읽기
<a name="zoom-meetings-reading-from-entities"></a>

**사전 조건**

읽으려는 Zoom Meetings 객체입니다. 객체 이름(예: `Group` 또는 `Zoom Rooms`)이 필요합니다.

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


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| Zoom Rooms | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| 그룹 | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Group Member | 예 | 예 | 아니요 | 예 | 아니요 | 
| Group Admin | 아니요 | 예 | 아니요 | 예 | 아니요 | 
| Report(daily) | 예 | 아니요 | 아니요 | 예 | 아니요 | 
| Roles | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 
| Users | 예 | 예 | 아니요 | 예 | 아니요 | 

**예시:**

```
zoom_read = glueContext.create_dynamic_frame.from_options(
    connection_type="zoom",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "organization",
        "API_VERSION": "v2"
    }
)
```

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

Zoom Meetings에서는 선택한 엔터티 아래에서 사용 가능한 필드를 동적으로 로드합니다. 필드의 데이터 유형에 따라 다음 필터 연산자를 지원합니다.

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

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

Zoom Meetings는 필터 기반 분할 또는 레코드 기반 분할을 지원하지 않습니다.

# Zoom Meetings 연결 옵션
<a name="zoom-meetings-connection-options"></a>

다음은 Zoom Meetings의 연결 옵션입니다.
+ `ENTITY_NAME`(문자열) - (필수) 읽기에 사용됩니다. Zoom Meetings 엔터티의 이름입니다. 예를 들어 `group`입니다.
+ `API_VERSION`(문자열) - (필수) 읽기에 사용됩니다. 사용하려는 Zoom Meetings Rest API 버전입니다. Zoom Meetings에서는 현재 버전 v2만 지원하므로 값은 `v2`입니다.
+ `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 선택한 엔터티에 대해 선택할 열의 쉼표로 구분된 목록입니다.
+ `FILTER_PREDICATE`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.
+ `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리.

# Zoom Meetings 제한 사항
<a name="zoom-meetings-limitations"></a>

다음은 Zoom Meetings의 제한 사항 또는 참고 사항입니다.
+ Zoom Meetings는 orderby를 지원하지 않습니다.
+ 필요한 기준을 충족할 수 있는 필드가 없으므로 Zoom Meetings는 필터 기반 분할을 지원하지 않습니다.
+ 페이지 매김 제한 및 오프셋 기반 페이지 매김이 지원되지 않으므로 Zoom Meetings는 레코드 기반 분할을 지원하지 않습니다.

# 자체 JDBC 드라이버를 사용하여 JDBC 연결 추가
<a name="console-connections-jdbc-drivers"></a>

 JDBC 연결을 사용할 때 자체 JDBC 드라이버를 사용할 수 있습니다. AWS Glue 크롤러가 사용하는 기본 드라이버에서 데이터베이스에 연결할 수 없는 경우 자체 JDBC 드라이버를 사용할 수 있습니다. 예를 들어 Postgres 데이터베이스에서 SHA-256을 사용하려고 하지만 이전 Postgres 드라이버에서 이를 지원하지 않는 경우 자체 JDBC 드라이버를 사용할 수 있습니다.

## 지원되는 데이터 소스
<a name="w2aac25c27d135b5"></a>


| 지원되는 데이터 소스 | 지원되지 않는 데이터 소스 | 
| --- | --- | 
| MySQL | Snowflake | 
| Postgres |  | 
| Oracle |  | 
| Redshift |  | 
| SQL Server |  | 
| Aurora\$1 |  | 

 \$1기본 JDBC 드라이버를 사용하는 경우 지원됩니다. 일부 드라이버 기능은 사용할 수 없습니다.

## JDBC 연결에 JDBC 드라이버 추가
<a name="w2aac25c27d135b9"></a>

**참고**  
 자체 JDBC 드라이버 버전을 가져오기로 선택한 경우 AWS Glue 크롤러는 AWS Glue작업 및 Amazon S3 버킷의 리소스를 소비하여 제공된 드라이버가 사용자 환경에서 실행되도록 합니다. 리소스의 추가 사용량은 계정에 반영됩니다. AWS Glue 크롤러 및 작업 비용은 청구에서 AWS Glue 카테고리에 속합니다. 또한 자체 JDBC 드라이버를 제공한다고 해서 크롤러가 해당 드라이버의 모든 기능을 사용할 수 있는 것은 아닙니다.

**JDBC 연결에 자체 JDBC 드라이버를 추가하려면:**

1.  JDBC 드라이버 파일을 Amazon S3 위치에 추가합니다. 버킷 및/또는 폴더를 생성하거나 기존 버킷 및/또는 폴더를 사용할 수 있습니다.

1.  AWS Glue 콘솔의 왼쪽 메뉴에서 **데이터 카탈로그** 아래 **연결**을 선택한 다음 새 연결을 생성합니다.

1.  **연결 속성** 필드를 작성하고 **연결 유형**으로 JDBC를 선택합니다.

1.  **연결 액세스**에서 **JDBC URL** 및 **JDBC** 드라이버 클래스 - *선택 사항*을 입력합니다. 드라이버 클래스 이름은 AWS Glue 크롤러에서 지원하는 데이터 소스의 이름이어야 합니다.  
![\[스크린샷은 데이터 소스 추가 창에서 JDBC가 선택된 데이터 소스 및 연결을 보여줍니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/add-connection-connection-access.png)

1.  **JDBC 드라이버 Amazon S3 경로** - *선택 사항* 필드에서 JDBC 드라이버가 있는 Amazon S3 경로를 선택합니다.

1.  사용자 이름과 암호 또는 보안 암호를 입력하는 경우 보안 인증 유형 필드를 작성합니다. 완료되면 **연결 생성**을 선택합니다.
**참고**  
 현재 테스트 연결은 지원되지 않습니다. 사용자가 제공한 JDBC 드라이버로 데이터 소스를 크롤링하는 경우 크롤러는 이 단계를 건너뛰습니다.

1.  새로 생성된 연결을 크롤러에 추가합니다. AWS Glue 콘솔 왼쪽 메뉴에서 **데이터 카탈로그** 아래 **크롤러**를 선택한 다음 새 크롤러를 생성합니다.

1.  **크롤러 추가** 마법사의 2단계에서 **데이터 소스 추가**를 선택합니다.  
![\[스크린샷은 데이터 소스 추가 창에서 JDBC가 선택된 데이터 소스 및 연결을 보여줍니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/add-crawler-add-data-source.png)

1.  **JDBC**를 데이터 소스로 선택하고 이전 단계에서 생성한 연결을 선택합니다. 완료 

1.  AWS Glue 크롤러와 함께 자체 JDBC 드라이버를 사용하려면 크롤러가 사용하는 역할에 다음 권한을 추가합니다.
   +  `CreateJob`, `DeleteJob`, `GetJob`, `GetJobRun`, `StartJobRun` 작업에 대한 권한을 부여합니다.
   +  IAM 작업, `iam:PassRole`에 대한 권한 부여 
   +  Amazon S3 작업, `s3:DeleteObjects`, `s3:GetObject`, `s3:ListBucket`, `s3:PutObject`에 대한 권한을 부여합니다.
   +  서비스 보안 주체에 IAM 정책의 버킷 및 폴더에 대한 액세스 권한을 부여합니다.

    IAM 정책 예제: 

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "VisualEditor0",
         "Effect": "Allow",
         "Action": [
           "s3:PutObject",
           "s3:GetObject",
           "s3:ListBucket",
           "s3:DeleteObject"
         ],
         "Resource": [
           "arn:aws:s3:::amzn-s3-demo-bucket/driver-parent-folder/driver.jar",
           "arn:aws:s3:::amzn-s3-demo-bucket"
         ]
       }
     ]
   }
   ```

------

    AWS Glue 크롤러는 \$1glue\$1job\$1crawler 및 \$1crawler라는 두 개의 폴더를 생성합니다.

   드라이버 jar이 `s3://amzn-s3-demo-bucket/driver.jar"` 폴더에 있는 경우 다음 리소스를 추가하세요.

   ```
   "Resource": [
                   "arn:aws:s3:::amzn-s3-demo-bucket/_glue_job_crawler/*",
     		 "arn:aws:s3:::amzn-s3-demo-bucket/_crawler/*"
               ]
   ```

   드라이버 jar이 `s3://amzn-s3-demo-bucket/tmp/driver/subfolder/driver.jar"` 폴더에 있는 경우 다음 리소스를 추가하세요.

   ```
   "Resource": [
                  "arn:aws:s3:::amzn-s3-demo-bucket/tmp/_glue_job_crawler/*",
     		"arn:aws:s3:::amzn-s3-demo-bucket/tmp/_crawler/*"
               ]
   ```

1.  VPC를 사용하는 경우 인터페이스 엔드포인트를 생성하여 AWS Glue 엔드포인트에 대한 액세스를 허용하고 이를 라우팅 테이블에 추가해야 합니다. 자세한 내용은 [AWS Glue에 대한 인터페이스 VPC 엔드포인트 생성](https://docs.aws.amazon.com/glue/latest/dg/vpc-interface-endpoints.html#vpc-endpoint-create)을 참조하세요.

1.  데이터 카탈로그에서 암호화를 사용하는 경우 AWS KMS 인터페이스 엔드포인트를 생성하고 이를 라우팅 테이블에 추가합니다. 자세한 내용은 [AWS KMS용 VPC 엔드포인트 생성](https://docs.aws.amazon.com/kms/latest/developerguide/kms-vpc-endpoint.html#vpce-create-endpoint)을 참조하세요.