Salesforce CRM을 기업 내에서 보호되는 Cloud Functions와 통합

이 가이드에서는 Google Cloud 외부에서 호스팅된 서비스에서 호출되는 Cloud Functions 보안 지원에 대한 접근 방식을 보여줍니다. 일반적인 사용 사례로는 고객 관계 관리(CRM) 시스템, 파트너 시스템 또는 소비자용 웹 앱과 같은 Software as a service(SaaS) 앱에서의 Cloud Functions 호출이 있습니다.

이 가이드는 설계자, 제품 소유자, IT 전문가를 대상으로 합니다. 외부 소스에서 Cloud 함수를 호출하는 방법을 설명하고, Cloud Functions 사용 관련 일반적인 사용 사례도 다룹니다.

이 가이드에서는 사용자가 Cloud Functions, Salesforce, Node.js, REST API에 익숙하다고 가정합니다.

목표

  • 외부 서비스에서 호출할 수 있는 Cloud 함수 배포
  • ID 및 액세스 관리(IAM) 권한을 사용하여 함수에 대한 액세스를 제어합니다.
  • JSON 웹 토큰(JWT) 요청을 작성한 후 외부 서비스의 ID 토큰을 사용하여 Cloud 함수 호출
  • 승인된 서비스만 보호된 함수에 액세스할 수 있는지 확인

비용

이 가이드에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

  • Cloud Functions

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

시작하기 전에

  1. Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
  2. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

  3. Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다. 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요.

  4. Cloud Functions API를 사용 설정합니다.

    API 사용 설정

소개

Cloud Functions는 Google Cloud에서 코드를 실행하고 요청 시 또는 이벤트에 대한 응답으로 함수를 호출할 수 있는 방법을 제공합니다.

기업이 기술 생태계에서 다양한 플랫폼과 앱을 보유하고 있을 때가 많습니다. 이러한 플랫폼이 보유하는 비즈니스 데이터와 해당 플랫폼을 통합하는 것이 일반적으로 비즈니스 민첩성의 핵심입니다. 앱 간에 데이터 이동과 기업 데이터를 보안 설정하고 보호하는 것은 조직에 매우 중요합니다. 엔터프라이즈 앱(예: Salesforce CRM)을 Cloud Functions와 통합하는 경우 함수 호출 방식과 함수 호출자를 제어하려면 함수 호출을 보호하는 단계를 거쳐야 합니다.

잘 설계된 액세스 제어 메커니즘에는 많은 이점이 있습니다. 공격 영역을 줄이는 데 도움이 되며, 최소 권한 원칙을 사용합니다. 또한 보안 및 제어 메커니즘을 설정하고 허용 가능한 호출자 목록을 제한할 수 있으므로 비용 예측이 더 쉬워집니다.

Cloud Functions에 대한 액세스 제어 추가 방법을 알아보려면 이 가이드에서 Salesforce CRM의 Cloud 함수 호출 방법을 참조하세요. 이 함수는 Salesforce CRM 플랫폼에서 신규 고객 레코드가 생성되고 처리되기 위해 Google Cloud의 기록된 시스템(고객 마스터)에서 게시될 때 호출됩니다. 이 가이드에서는 Salesforce CRM 사용에 중점을 두고 있으나 이 솔루션에서 사용된 접근 방식은 다른 SaaS 앱에서 Cloud Functions를 호출하는 데 적용될 수 있습니다.

사용하는 Cloud 함수는 편의상 GitHub 저장소에서 제공됩니다.

아키텍처

다음 그림은 외부 서비스에서 보호된 Cloud 함수를 호출하기 위한 아키텍처 및 주요 단계를 설명합니다. 승인된 사용자와 서비스만 이러한 함수를 호출할 수 있도록 Cloud 함수의 인스턴스를 비공개로 배포할 수 있습니다.

인증을 가져오고 Cloud 함수를 호출하는 단계를 표시하는 이 접근 방식의 아키텍처

다이어그램에 나온 단계는 다음과 같습니다.

  1. 외부 Salesforce 서비스는 서명된 JWT를 사용하여 ID 토큰을 요청합니다.
  2. JWT가 유효할 경우 서명된 ID 토큰이 Google 승인 서버에서 반환됩니다.
  3. Salesforce 서비스는 ID 토큰을 사용하여 보호된 Cloud 함수에 API를 요청합니다.
  4. Cloud 함수 컨테이너는 Salesforce 서비스에서 Authorization Bearer 헤더에 전송된 Authorization Bearer ID 토큰을 내부적으로 검증합니다.
  5. Cloud 함수는 토큰의 유효 여부에 따라 실행됩니다.
    • 토큰이 유효하는 경우 Cloud 함수 코드가 실행되고, 성공 응답이 호출 서비스에 반환됩니다. 필요에 따라 Cloud 함수에서 다른 Google Cloud 서비스를 호출할 수 있습니다.
    • 토큰이 유효하지 않는 경우 HTTP 401 또는 403 상태 코드 응답이 반환되고, Cloud 함수 코드가 실행되지 않습니다.

이 가이드의 목적에 맞게 Cloud 함수를 호출하는 외부 클라우드 서비스는 Salesforce 플랫폼에 호스팅됩니다. Salesforce CRM에서 고객 레코드를 만들면 파이프라인이 트리거되고 다이어그램에 설명된 단계가 호출됩니다. Salesforce CRM은 Google Cloud 서비스 계정 비공개 키를 보유하고 있으며 다이어그램에 설명된 단계를 수행하여 보호된 클라우드 함수를 호출합니다. 이를 위해 Salesforce Apex 클래스를 사용합니다.

Salesforce CRM에서 고객 레코드가 생성될 때, Apex 트리거는 Apex 클래스(GCPManageCustomersService)에서 대기열 생성 가능 작업이 비동기적으로 실행되도록 합니다.

보호된 Cloud Functions 호출의 일반적인 사용 사례

Cloud Functions를 생태계에 통합하여 엔드 투 엔드 엔터프라이즈 비즈니스 프로세스의 구성요소로 활용할 수 있습니다. 다음과 같은 작업에 Cloud Functions를 사용할 수 있습니다.

  • 프런트엔드 CRM 시스템의 고객 레코드와 같은 스토리지 및 분석 처리를 위해 Google Cloud에 비즈니스 데이터 삽입

  • Firestore 및 Cloud SQL과 같은 백업 저장소가 고객 마스터(즉, 기록된 시스템) 역할을 수행하는 경우 이러한 저장소에 보관된 고객 데이터를 만들거나 업데이트

  • Google Cloud의 데이터 저장소에서 주문, 서비스 요청, 서비스 예약, 제품 세부정보 등의 트랜잭션 데이터 가져오기. 이렇게 하면 Salesforce와 같은 SaaS 플랫폼에서 고객 360도 뷰를 만들 수 있습니다.

  • 파싱 및 처리한 뒤 Google Cloud의 데이터 레이크 또는 데이터웨어 하우스에 로드해야 하는 데이터 파일(파트너 조직에서 받음) 변환

  • BigQuery 및 BigQuery ML을 사용하여 통계를 생성하기 위해 양식 제출, 이미지 또는 웹사이트에 문서 업로드 등의 소비자 상호작용 데이터 파싱

이 가이드에서는 Google Cloud에 비즈니스 데이터를 삽입하는 첫 번째 사용 사례를 구현합니다. Salesforce CRM에서 고객 데이터가 생성되면 이는 보호된 Cloud 함수 호출을 통해 Google Cloud로 전송됩니다.

Google Cloud에서 필요에 따라 신규 고객 레코드를 처리할 수 있습니다. 일반적인 일부 패턴은 Cloud SQL, Firestore 또는 BigQuery와 같은 분석 처리를 위해 고객 마스터에 고객 레코드를 삽입하는 것입니다. 이 가이드는 이러한 레코드를 처리하는 방법에 대한 섹션을 포함하지 않습니다.

환경 초기화

  1. Cloud Console에서 Cloud Shell 활성화를 클릭합니다.

    Cloud Shell 열기

    이 가이드의 모든 터미널 명령어에 Cloud Shell을 사용합니다.

  2. Cloud Shell에서 기본 프로젝트로 만들거나 선택한 프로젝트를 설정합니다. project-id를 Cloud 프로젝트 ID로 바꿉니다.

    gcloud config set project project-id
    
  3. 리전 및 영역의 기본 설정을 할당합니다.

    gcloud config set run/region us-central1
    gcloud config set compute/zone us-central1-a
    

    이 가이드에서는 us-central1을 기본 리전으로 us-central1-a를 기본 영역으로 사용합니다.

보호된 Cloud 함수 만들기

첫 번째 단계에서는 나중에 호출할 Cloud 함수를 만듭니다.

소스 저장소 클론

  1. Cloud Shell에서 샘플 Cloud 함수 및 Salesforce 아티팩트가 포함된 GitHub 저장소를 클론합니다.

    git clone https://github.com/GoogleCloudPlatform/salesforce-cloud-functions-crm-tutorial
    
  2. 저장소를 클론하여 만든 디렉터리로 변경합니다.

    cd salesforce-cloudfunc-integration
    

디렉터리의 코드 검토

디렉터리에는 salesforce라는 디렉터리와 manage-customer-func라는 두 디렉터리가 있습니다. salesforce 디렉터리에는 다음과 같은 Salesforce Apex 코드 파일이 있습니다.

  • CustomerAccounts.trigger 파일. 이 파일은 신규 고객 계정이 생성될 때 GCPManageCustomersService 클래스에서 큐에 추가될 수 있는 작업을 트리거하는 코드를 포함합니다.
  • GCPManageCustomersService 클래스. 이 파일은 생성된 JWT에 대한 대가로 Google ID 토큰을 요청하는 코드를 포함하고 Cloud 함수를 호출합니다.
  • Salesforce XML 메타데이터 파일

manage-customer-func 디렉터리에는 Cloud 함수의 종속 항목을 설명하는 패키징 파일과 함께 secureFunction이라는 Cloud 함수의 Node.js 코드 파일이 있습니다.

함수를 호출하기 위한 외부 Salesforce 서비스의 서비스 계정 만들기

최소 권한 원칙에 따라 Google Cloud에 배포된 서비스 및 리소스에 대한 액세스를 엄격하게 관리하는 것이 좋습니다. 이 섹션에서는 Cloud 함수에 액세스하는 외부 SaaS 서비스의 서비스 계정을 만듭니다.

Console

  1. Cloud Console에서 서비스 계정 페이지로 이동합니다.

    서비스 계정 페이지로 이동

  2. 프로젝트 선택을 클릭하고 이 가이드에서 만든 프로젝트를 선택합니다.

  3. 서비스 계정 만들기를 클릭합니다.

  4. 서비스 계정 이름 function-invoker-sa를 입력합니다.

  5. 만들기를 클릭합니다.

  6. 이 서비스 계정의 Cloud Functions 호출자 역할을 선택하고 저장을 클릭합니다.

  7. 계속을 클릭합니다.

  8. 키 만들기를 클릭하고, 키 유형으로 P12를 선택한 다음 만들기를 클릭합니다.

    P12 키 파일이 로컬 디스크에 다운로드됩니다.

    Google Cloud에서 생성한 기본 비밀번호를 기록해 둡니다(일반적으로 notasecret).

  9. 완료를 클릭하여 서비스 계정 만들기를 완료합니다.

  10. Cloud Shell에서 더보기 를 클릭하고 파일 업로드를 선택합니다.

  11. Cloud Shell에 파일을 업로드하려면 이전에 다운로드한 project-id-NNNNNN.p12 키 파일을 선택하고 열기를 클릭합니다. (NNNNNN 문자열은 키 파일 이름의 일환으로 생성되는 일련의 숫자 집합입니다.)

  12. Cloud Shell에서 홈 디렉터리로 이동합니다.

    cd $HOME
    
  13. 나중에 가이드에서 사용할 수 있는 친숙한 이름으로 방금 업로드한 키 파일의 이름을 변경합니다.

    mv ${DEVSHELL_PROJECT_ID}-NNNNNN.p12 external-service-invoker-sa.p12
    

gcloud

  1. 홈 디렉터리로 이동합니다.

    cd $HOME
    
  2. 만드려는 서비스 계정의 이름을 가질 환경 변수를 만듭니다.

    export SERVICE_ACCOUNT_NAME=function-invoker-sa
    
  3. 서비스 계정을 만듭니다.

    gcloud beta iam service-accounts create ${SERVICE_ACCOUNT_NAME} \
        --display-name ${SERVICE_ACCOUNT_NAME}
    
  4. 서비스 계정의 P12 키를 생성하고 다운로드합니다.

    gcloud iam service-accounts keys create ~/external-service-invoker-sa.p12 \
        --key-file-type p12 \
        --iam-account ${SERVICE_ACCOUNT_NAME}@${DEVSHELL_PROJECT_ID}.iam.gserviceaccount.com
    

    P12 키는 Cloud Shell의 홈($HOME) 디렉터리에 다운로드됩니다. Cloud Shell에 표시되는 출력은 키가 다운로드되는 위치도 보여줍니다.\

Cloud 함수 배포

Cloud 함수를 보호된 함수로 배포합니다. 액세스 권한이 부여된 사용자 및 서비스 계정만 함수를 호출할 수 있습니다. 다음 단계에서 IAM 액세스를 설정하여 권한을 설정합니다.

  1. Cloud Shell에서 manage-customer-func 디렉터리로 변경합니다.

    cd manage-customer-func
    
  2. 함수를 배포합니다.

    gcloud functions deploy secureFunction \
        --runtime nodejs8 \
        --trigger-http
    
  3. 함수 배포에 성공했는지 확인합니다.

    gcloud functions describe secureFunction
    

    배포에 성공하면 준비 상태가 다음과 같이 표시됩니다.

    status:  ACTIVE
    timeout:  60s
    httpsTrigger:
      url: https://us-central1-[PROJECT_ID].cloudfunctions.net/secureFunction
    

    나중에 필요하므로 httpsTrigger URL을 기록해 둡니다.

배포된 함수에 대한 액세스 권한 부여

그런 다음 secureFunction Cloud 함수에 액세스하기 위해 만든 서비스 계정에 적절한 역할을 할당합니다. 자동으로 추가된 allUsers 계정도 삭제합니다. 이렇게 하면 해당 서비스 계정만 Cloud 함수를 호출할 수 있습니다.

Console

  1. Cloud Console에서 Cloud Functions 페이지를 엽니다.

    Cloud Functions 페이지로 이동

  2. 함수 목록에서 secureFunction을 선택합니다.

  3. 정보 패널이 열려 있지 않는 경우 툴바에서 정보 패널 표시를 클릭합니다.

  4. 권한 탭에서 구성원 추가를 클릭합니다.

  5. 새 구성원 상자에 function-invoker-sa를 입력하여 함수에 대한 액세스를 필요로 하는 서비스 계정을 검색한 뒤 해당 서비스 계정을 선택합니다.

  6. 역할 선택 목록에서 Cloud Functions를 선택한 다음 Cloud Functions 호출자 역할을 선택합니다.

  7. 저장을 클릭합니다.

  8. 권한 탭에서 Cloud Functions 호출자 역할을 확장합니다.

  9. allUsers 구성원 행에서 삭제 버튼을 클릭한 다음 삭제를 클릭하여 확인합니다. 이렇게 하면 이 함수에서 공개 액세스가 삭제됩니다.

gcloud

  1. 배포된 함수에 액세스할 수 있도록 만든 서비스 계정에 Cloud Function 호출자 역할을 할당합니다.

    gcloud beta functions add-iam-policy-binding secureFunction \
        --member=serviceAccount:${SERVICE_ACCOUNT_NAME}@${DEVSHELL_PROJECT_ID}.iam.gserviceaccount.com \
        --role=roles/cloudfunctions.invoker
    
  2. Cloud Functions 호출자 역할에서 allUsers 구성원을 삭제합니다.

    gcloud beta functions remove-iam-policy-binding secureFunction \
        --member=allUsers \
        --role=roles/cloudfunctions.invoker
    

보호된 함수를 호출하는 Salesforce 서비스 생성

Salesforce org에서 비즈니스 프로세스 흐름을 호출하는 데 필요한 Apex 코드를 설정해야 합니다. Salesforce CLI(SFDX)를 사용하여 Salesforce 코드와 필수 구성을 scratch org에 배포합니다. 원하는 경우 향후 이러한 배포된 변경사항을 프로덕션 환경에 승격할 수 있습니다.

다음 목록에는 Salesforce org에서 수행해야 하는 작업이 요약되어 있습니다. 이 섹션의 상세한 안내에서는 각 태스크를 설명합니다.

  1. Salesforce CLI를 설정합니다.
  2. scratch org를 만들고 클론된 저장소의 코드를 해당 org로 푸시합니다.
  3. 내보낸 Google Cloud 서비스 계정의 P12 키에서 자바 키 저장소(JKS) 키를 만들고 JKS 키를 Salesforce 서비스로 가져옵니다.
  4. 맞춤 메타데이터 유형 객체를 Google Cloud 설정과 관련된 데이터로 채웁니다. 여기에는 호출할 함수의 엔드포인트, 서비스 계정 이메일, Salesforce 서비스가 ID 토큰을 요청하는 데 사용할 수 있는 토큰 엔드포인트가 포함됩니다.
  5. 생성된 APex 클래스를 검토하고 커스텀 메타데이터 유형의 필드 이름과 JKS 키 이름이 Apex 코드에서 올바르게 참조되는지 확인합니다.
  6. Salesforce CRM에서 고객 레코드를 만듭니다. 그러면 CustomerAccounts.trigger 코드가 호출되어 신규 고객 레코드 데이터가 Google Cloud로 전송됩니다.

Salesforce CLI 설정

이 섹션에서는 Salesforce CLI를 설치하고 승인을 설정합니다.

Salesforce CLI 설치

  1. Cloud Shell에서 홈 디렉터리로 이동합니다.

    cd $HOME
    
  2. Cloud Shell 세션에 Salesforce CLI를 설치합니다.

    wget https://developer.salesforce.com/media/salesforce-cli/sfdx-linux-amd64.tar.xz
    
  3. 다운로드한 tar 파일의 압축을 풉니다.

    tar -xvf sfdx-linux-amd64.tar.xz
    
  4. 경로에 Salesforce 바이너리를 추가합니다.

    export PATH="$PATH:${HOME}/sfdx-cli-v7.8.1-8f830784cc-linux-x64/bin"
    

    이제 Salesforce CLI를 사용하여 명령어를 실행할 수 있습니다.

  5. CLI가 올바르게 설정되었는지 확인합니다.

    sfdx
    

    출력은 다음과 같습니다.

    버전, 사용량, 명령어, 주제를 포함한 sfdx 명령어의 출력을 보여주는 터미널 목록입니다.

    버전 정보와 명령어 목록이 표시됩니다.

  6. Salesforce org의 Setup(설정)에서 Quick Find(빠른 찾기) 상자에 Dev Hub를 입력한 다음 Dev Hub를 선택합니다.

    Salesforce 대시보드에서 'Dev' 검색

  7. Dev Hub를 사용 설정합니다.

    'Dev Hub' 전환 스위치를 사용한 Dev Hub 사용 설정

    이 단계에서는 가이드에 코드를 배포하도록 scratch org를 설정할 수 있습니다.

  8. Cloud Shell에서 인증서와 키 쌍을 생성하여 SFDX CLI에서 Salesforce org에 인증합니다.

    openssl req -x509 -sha256 -nodes -days 36500 -newkey \
       rsa:2048 -keyout salesforce.key -out \
       salesforce.crt
    

    인증서를 식별하기 위한 세부정보를 입력하라는 메시지가 표시됩니다. 이 가이드에서는 이러한 값이 중요하지 않으므로 Enter 키를 눌러 기본값을 사용합니다.

  9. Cloud Shell에서 더보기 를 클릭하고 파일 다운로드를 선택합니다.

  10. 정규화된 파일 경로 상자에 다음과 같은 파일 이름을 입력한 다음 다운로드를 클릭합니다.

    salesforce.crt
    

    이렇게 하면 생성된 인증서가 로컬 머신에 다운로드됩니다. 다음 절차에서 인증서를 Salesforce org에 업로드합니다.

Salesforce (Dev Hub) org에서 연결 앱을 만들어 Salesforce CLI를 승인합니다.

  1. Salesforce org 버전에 따라 다음 단계 중 하나를 사용하여 연결된 앱을 만듭니다.

    • Lightning Experience에서 앱 관리자를 사용하여 연결된 앱을 만듭니다. Salesforce org의 Setup(설정)에서 Quick Find(빠른 찾기) 상자에 App을 입력한 다음 App Manager(앱 관리자)를 선택합니다. 새로 연결된 앱을 클릭합니다.
    • Salesforce Classic에서 Salesforce org의 Setup(설정)에서 Quick Find(빠른 찾기) 상자에 Apps를 입력한 다음 아래에서 Apps(앱)(Build(빌드)Create(만들기) 아래)를 선택합니다. Connected Apps(연결된 앱) 창에서 New(새로 만들기)를 클릭합니다.
  2. 연락처 이메일 정보와 앱에 적합한 기타 정보를 입력합니다.

  3. Enable OAuth Settings(OAuth 설정 사용)를 선택합니다.

  4. Callback URL(콜백 URL) 값에 http://localhost:1717/OauthRedirect를 입력합니다.

  5. 디지털 서명 사용 옵션을 사용 설정하려면 Choose File(파일 선택)을 클릭한 다음 이전에 다운로드한 salesforce.crt 인증서 파일을 선택합니다.

    이 인증서는 Cloud Shell 세션에서 실행 중인 SFDX 클라이언트를 Salesforce Dev Hub org에 인증하고 연결하는 데 사용되는 공개 키 역할을 합니다.

  6. 다음 OAuth 범위를 클릭하여 Selected OAuth Scopes(선택한 OAuth 범위)에 추가한 다음 Add(추가) 화살표를 클릭하여 선택합니다.

    • Selected OAuth Scopes(api)(데이터 액세스 및 관리)
    • Perform requests on your behalf at any time(refresh_token, offline_access)(사용자를 대신하여 언제든지 요청 수행)
    • Provide access to your data via the web(web)(웹을 통한 데이터 액세스 제공)

      Salesforce 대시보드에서 선택한 OAuth 범위

  7. Save(저장)를 클릭합니다.

  8. 표시된 소비자 키를 기록해 둡니다.

  9. Manage(관리)를 클릭한 다음 Edit Policies(정책 수정)를 클릭하여 OAuth 정책을 변경합니다.

  10. Permitted users(허용된 사용자)Admin Approved Users are Pre-Authorized(관리자가 승인한 사용자는 사전 승인 처리됨)로 설정하고 선택을 확인합니다.

  11. IP 완화를 Relax IP Restrictions(IP 제한사항 완화)로 설정합니다.

  12. Save(저장)를 클릭합니다.

  13. Manage Profiles(프로필 관리)를 클릭하고 System Administrator(시스템 관리자) 프로필을 추가합니다.

    이렇게 하면 이 프로필을 사용하는 사용자가 SFDX CLI에 로그인할 수 있습니다.

  14. Save(저장)를 클릭합니다.

Salesforce CLI의 승인 단계 완료

  1. Cloud Shell에서 이전 단계의 연결된 앱에서 만든 소비자 키를 저장할 환경 변수를 만듭니다.

    export CONSUMER_KEY=your-consumer-key
    

    your-consumer-key를 고객 키로 바꿉니다.

  2. 이 가이드의 앞부분에서 만든 Salesforce org의 사용자 이름을 갖는 환경 변수를 만듭니다.

    export SALESFORCE_USERNAME=your-salesforce-username
    

    your-salesforce-username을 Salesforce 사용자 이름으로 바꿉니다.

  3. Cloud Shell에서 JWT 권한을 사용하여 Salesforce org에 인증합니다.

    sfdx force:auth:jwt:grant \
        -u ${SALESFORCE_USERNAME} \
        -f $(pwd)/salesforce.key -i ${CONSUMER_KEY}
    

    승인되었다는 메시지가 표시됩니다.

    JWT 기반 흐름을 사용하여 org를 승인하는 방법에 대한 자세한 내용은 Salesforce 문서의 JWT 기반 흐름을 사용하여 Org 승인을 참조하세요.

Salesforce 메타데이터를 scratch org로 푸시

  1. Cloud Shell에서 클론된 저장소의 디렉터리로 이동합니다.

    cd salesforce-cloudfunc-integration
    
  2. 이 가이드를 위해 클론한 저장소를 테스트할 scratch org를 만듭니다.

    sfdx force:org:create \
        --setdefaultusername \
        --definitionfile salesforce/config/project-scratch-def.json \
        --targetdevhubusername ${SALESFORCE_USERNAME} \
        --setalias gcp-func-test-scratch-org
    

    이 목적으로 scratch org를 사용하여 새 패키지 및 클론된 저장소를 테스트할 수 있는 안전한 공간을 제공하는 것이 좋습니다.

  3. salesforce 하위 디렉터리로 이동합니다.

    cd salesforce
    
  4. 메타데이터와 코드를 scratch org로 푸시합니다.

    sfdx force:source:push
    
  5. scratch org의 URL을 생성합니다.

    sfdx force:org:open
    
  6. 생성된 URL을 클릭하여 브라우저의 scratch org로 이동합니다.

내보낸 P12 키를 포함하는 JKS 키 저장소 파일 만들기

Salesforce 인증서와 키 쌍은 Salesforce 서비스와 외부 웹 사이트 및 서버 간의 인증된 SSL 통신에 사용됩니다. Salesforce 서비스는 이 가이드의 앞부분에서 만든 Google Cloud 서비스 계정 P12 키를 안전하게 저장해야 합니다. Salesforce 서비스 키는 JKS(자바 키 저장소) 형식으로 저장되어야 합니다.

  1. Cloud Shell에서 P12 키를 홈 디렉터리의 salesforce.jks라는 JKS 키 저장소 파일에 추가합니다.

    keytool \
        -importkeystore \
        -srckeystore $HOME/external-service-invoker-sa.p12 \
        -destkeystore $HOME/salesforce.jks \
        -srcstoretype pkcs12 \
        -srcstorepass notasecret \
        -deststorepass notasecret \
        -deststoretype jks \
        -destalias google_cloud \
        -srcalias privatekey
    
  2. Cloud Shell에서 더보기 를 클릭한 다음 파일 다운로드를 클릭합니다.

  3. 정규화된 파일 경로 상자에 다음과 같은 파일 이름을 입력한 다음 다운로드를 클릭합니다.

    salesforce.jks
    

    이렇게 하면 생성한 키 저장소가 로컬 컴퓨터에 다운로드됩니다.

Salesforce scratch org로 JKS 파일 가져오기

이제 Salesforce.com ID 공급업체를 사용 설정하고 JKS 키를 업로드하는 단계를 완료할 수 있습니다.

  1. Salesforce org의 Setup(설정)에서 Quick Find(빠른 찾기) 상자에 Identity를 입력한 다음 Identity Provider(ID 공급업체)를 클릭하여 ID 공급업체 설정 페이지로 이동합니다.

    Salesforce 대시보드에서 ID 공급업체 설정 페이지로 이동

  2. Enable Identity Provider(ID 공급업체 사용 설정)를 클릭한 다음 Save(저장)를 클릭하여 인증서를 수락합니다.

  3. Setup(설정)Quick Find(빠른 찾기) 상자에 Certificate을 입력한 다음 Certificate and Key Management(인증서 및 키 관리)를 선택합니다.

    Salesforce 대시보드에서 인증 및 키 관리 페이지로 이동

  4. Import from Keystore(키 저장소에서 가져오기)를 클릭합니다.

  5. Choose File(파일 선택)을 클릭하고 이전에 다운로드한 JKS 파일을 선택합니다.

  6. Keystore Password(키 저장소 비밀번호) 상자에 notasecret를 입력합니다.

  7. Save(저장)를 클릭합니다.

  8. 인증서 라벨이 google_cloud인지 확인합니다. 이 이름을 사용하여 인증서를 참조하기 때문에 라벨은 매우 중요합니다.

맞춤 메타데이터 유형 객체 레코드 생성

Salesforce CLI를 사용하여 저장소를 푸시하면 커스텀 메타데이터 유형 객체가 생성됩니다. 이 섹션에 표시된 대로 레코드를 만들고 해당 객체의 세부정보를 채워야 합니다. 레코드는 APEX 클래스에서 참조되며 Salesforce 서비스에서 호출하는 Cloud 함수에 관련된 메타데이터를 매핑하는 데 사용됩니다.

  1. Salesforce scratch org의 Setup(설정)에서 Quick Find(빠른 찾기) 상자에 Custom metadata를 입력한 다음 Custom Metadata Types(커스텀 메타데이터 유형)를 선택합니다.

    GCP 키라는 커스텀 메타데이터 유형이 표시됩니다.

  2. GCP 키 옆의 Manage Records(레코드 관리)를 클릭합니다.

  3. New(새로 만들기)를 클릭하여 새 레코드를 만든 후 다음을 입력합니다.

    1. Label(라벨). GCP Function Invoker를 입력합니다.
    2. Client Email(고객 이메일). 만든 서비스 계정 주소를 다음 형식으로 입력합니다.

      function-invoker-sa@project-id.iam.gserviceaccount.com

      project-id를 이 가이드의 Cloud 프로젝트 ID로 바꿉니다.

    3. Function Audience Endpoint(함수 잠재고객 엔드포인트). Cloud 함수의 httpsTrigger 엔드포인트 URL을 입력합니다.

      https://us-central1-project-id.cloudfunctions.net/secureFunction
      
    4. Token Endpoint(토큰 엔드포인트). https://www.googleapis.com/oauth2/v4/token을 입력합니다.

      Salesforce 대시보드에서 토큰 엔드포인트 설정

  4. Save(저장)를 클릭합니다.

Salesforce scratch org에서 원격 사이트 설정 만들기

원격 사이트 설정을 추가하여 Salesforce scratch org에서 Google Cloud Cloud 함수 및 토큰 엔드포인트에 대한 Adex 콜아웃을 만듭니다.

  1. Salesforce org의 Setup(설정)에서 Quick Find(빠른 찾기) 상자에 Remote를 입력한 다음 Remote Site Settings(원격 사이트 설정)를 선택합니다.
  2. Remote Site Settings(새 원격 사이트)를 클릭합니다.
  3. Remote Site Name(원격 사이트 이름)GCPCloudFunction을 입력합니다.
  4. Remote Site URL(원격 사이트 URL)에 Cloud 함수의 httpsTrigger 엔드포인트를 입력합니다.

    https://us-central1-project-id.cloudfunctions.net/secureFunction
    
  5. Save(저장)를 클릭합니다.

  6. New Remote Site(새 원격 사이트)를 클릭하여 다른 원격 사이트 설정을 만듭니다.

  7. Remote Site Name(원격 사이트 이름)GCPToken을 입력합니다.

  8. Remote Site URL(원격 사이트 URL)https://www.googleapis.com을 입력합니다.

    Salesforce 대시보드에서 원격 사이트 이름 및 URL 설정

  9. Save(저장)를 클릭합니다.

Cloud 함수 테스트

Cloud 함수를 테스트하려면 다음 두 가지 테스트를 실행해야 합니다.

  • Salesforce 서비스를 트리거하여 유효한 토큰을 사용하여 Cloud 함수를 호출합니다.
  • 토큰 없이 Google Cloud Cloud 함수를 호출합니다. 이렇게 하면 인증하지 않는 한 Cloud 함수가 호출되지 않는지 확인합니다.

유효한 ID 토큰을 사용하여 Salesforce 서비스에서 Cloud 함수 호출

  1. Salesforce org에서 App Launcher(앱 런처) 아이콘을 클릭합니다.

    Salesforce 대시보드에서 앱 런처를 시작합니다.

  2. 검색 창에서 Accounts를 검색합니다.

  3. 결과에서 Accounts(계정)를 클릭합니다.

  4. New(새로 만들기)를 클릭하여 새 계정을 만듭니다.

  5. Name(이름)Test Account(테스트 계정)를 입력합니다.

  6. Save(저장)를 클릭합니다.

    계정을 만들면 secureFunction Cloud 함수를 호출하는 Apex 클래스가 트리거됩니다.

Cloud 함수가 호출되었는지 확인

Cloud Logging 로그를 검토하여 Cloud 함수에서 레코드를 성공적으로 수신했는지 확인합니다.

  • Cloud Shell에서 secureFunction Cloud 함수로 생성된 로그를 확인합니다.

    gcloud functions logs read secureFunction
    

    Cloud 함수가 호출된 경우 Salesforce 서비스에서 만든 고객 이름 Test Account가 로그에 표시됩니다.

토큰 없이 Cloud 함수 호출

이제 인증 및 승인된 사용자만 Cloud 함수에 액세스할 수 있는지 확인할 수 있습니다.

  1. Cloud 함수에 대한 인증되지 않은 요청을 실행합니다.

    curl https://us-central1-${DEVSHELL_PROJECT_ID}.cloudfunctions.net/secureFunction
    

    응답은 액세스가 거부되었음을 확인하는 HTTP 403 Forbidden 상태 코드입니다.

    <html><head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8">
    <title>403 Forbidden</title>
    </head>
    <body text=#000000 bgcolor=#ffffff>
    <h1>Error: Forbidden</h1>
    <h2>Your client does not have permission to get URL <code>/secureFunction</code> from this server.</h2>
    <h2></h2>
    </body></html>
    

정리

청구되지 않도록 하는 가장 쉬운 방법은 가이드에서 만든 프로젝트를 삭제하는 것입니다.

프로젝트 삭제

  1. Cloud Console에서 리소스 관리 페이지로 이동합니다.

    리소스 관리로 이동

  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
  3. 대화상자에서 프로젝트 ID를 입력한 후 종료를 클릭하여 프로젝트를 삭제합니다.

Salesforce 리소스 삭제

Salesforce Developer Edition org와 이 가이드에서 만든 관련 scratch org도 삭제해야 합니다.

Developer Edition org 비활성화

  1. Salesforce (Dev Hub) org 설정에서 Quick Find(빠른 찾기) 상자에 Company를 입력한 다음 Company Information(회사 정보)을 선택합니다.
  2. Company Information(회사 정보)을 클릭합니다.
  3. Deactivate Org(Org 비활성화) 버튼을 클릭합니다.

    Salesforce 설정 페이지의 Org 비활성화 버튼

scratch org 삭제

  • Cloud Shell에서 다음 명령어를 실행하여 Salesforce scratch org를 삭제합니다.

    sfdx force:org:delete -u gcp-func-test-scratch-org
    

다음 단계