

# 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 보유자 토큰**으로 설정합니다.