DLP API를 사용한 SAP의 데이터 보호

이 문서에서는 ABAP SDK for Google Cloud의 SAP BTP 버전과 함께 Cloud Data Loss Prevention(DLP) API를 사용하여 SAP의 민감한 기업 데이터를 보호하기 위한 참조 아키텍처를 설명합니다.

SAP에 저장하는 개인 식별 정보(PII)와 같은 민감한 엔터프라이즈 데이터를 보호하는 것이 중요합니다. SAP의 민감한 엔터프라이즈 데이터를 잘못된 사용자 또는 시스템과 공유하면 회사의 평판이 훼손되고 금전적 손실이 발생할 수 있습니다. DLP API는 민감한 정보에 대한 보호 레이어를 추가하는 강력하고 유연한 방법을 제공합니다. 이 API는 민감한 정보가 SAP에 저장되거나 SAP에서 전송되기 전에 이를 탐색, 분류, 익명처리할 수 있습니다. 기밀 정보를 선제적으로 식별하고 보호하여 데이터 유출 위험을 줄이고 개인 정보 보호 규정을 준수할 수 있도록 도와줍니다.

이 문서의 주요 대상에는 데이터 보안, 데이터 처리, 데이터 분석 등을 담당하는 ABAP 개발자, SAP 솔루션 설계자, 클라우드 설계자가 포함됩니다. 이 문서에서는 사용자가 데이터 처리 및 데이터 개인 정보 보호, Sensitive Data Protection 및 관련 개념(예: InfoTypes 및 infoType 감지기)에 익숙하다고 가정합니다.

아키텍처

다음 다이어그램은 SAP BTP ABAP 환경 및 Google Cloud의 구성요소를 포함하는 DLP 솔루션의 참조 아키텍처를 보여줍니다.

SAP의 데이터 보호를 위한 DLP 솔루션

이 DLP 솔루션 아키텍처에는 다음 구성요소가 포함됩니다.

구성요소 하위 시스템 세부정보
1 입력 소스 데이터의 진입점 역할을 합니다.
2 클라이언트 서비스 다른 모든 구성요소와 상호작용하는 ABAP 클래스입니다. 소스 데이터를 수신하고, 처리를 위해 ABAP SDK for Google Cloud를 통해 DLP API로 데이터를 전송하고, 처리된 데이터를 SAP Datastore에 저장합니다.
3 ABAP SDK for Google Cloud DLP API에 액세스하기 위한 ABAP SDK for Google Cloud의 SAP BTP 버전입니다.
4 DLP API DLP API는 PII 익명화를 위한 다양한 변환 방법을 제공합니다.
5 대상 데이터 스토어 클라우드 또는 온프레미스에서 실행되는 SAP ERP 시스템으로, PII가 처리되고 익명화된 후 데이터가 저장됩니다.

사용 제품

이 참조 아키텍처에는 다음과 같은 Google Cloud 제품이 사용됩니다.

사용 사례

이 섹션에서는 DLP API를 사용하여 SAP의 민감한 기업 데이터를 보호할 수 있는 사용 사례의 예를 제공합니다.

데이터 개인 정보 보호 규정 준수

조직은 종종 민감한 정보를 익명처리해야 하는 경우가 있습니다. GDPR 및 DPDP와 같은 여러 정부 정책에서는 특정 조건에 따라 PII를 저장하지 않도록 규정하고 있습니다.

비용

DLP API에서 사용하는 Google Cloud 리소스의 예상 비용은 Google Cloud 가격 계산기에서 사전 계산된 예상 비용을 참조하세요.

설계 대안

이 문서에서는 ABAP SDK for Google Cloud의 SAP BTP 버전에 중점을 두고 있지만 ABAP SDK for Google Cloud의 온프레미스 또는 모든 클라우드 버전을 사용하여 유사한 결과를 얻을 수 있습니다. 이 설정에서는 처리되고 익명처리된 민감한 정보(PII)를 온프레미스 SAP 시스템 내에 저장할 수 있습니다.

배포

이 섹션에서는 SAP 시스템에서 비즈니스 파트너(사람)를 만드는 동안 민감한 정보를 보호하는 솔루션을 배포하는 방법을 보여줍니다. 이 솔루션은 조직에서 설정한 구성에 따라 데이터를 수정하거나, 익명화하거나, 익명처리할 수 있습니다.

시작하기 전에

이 참조 아키텍처를 기반으로 솔루션을 구현하기 전에 다음 기본 요건을 완료했는지 확인하세요.

PII 익명화를 위한 클라이언트 서비스 구현

데이터 소스의 입력은 SAP BTP ABAP 환경 내에서 구현하는 클라이언트 서비스에서 처리됩니다. 이 클라이언트 서비스는 다음 하위 구성요소로 구성될 수 있습니다.

  • 규칙 구성: 다양한 종류의 PII 관련 필드에 적용해야 하는 비즈니스 규칙을 저장합니다.
  • DLP 프록시 모듈: ABAP SDK for Google Cloud의 SAP BTP 버전을 통해 DLP API를 호출합니다.

규칙 구성

SAP BTP ABAP 환경에서 구성 테이블을 만들어 다양한 종류의 PII 관련 필드에 적용해야 하는 변환 규칙을 유지합니다. 프로덕션 환경에서는 SAP Fiori와 같은 도구를 사용하여 이 테이블의 데이터를 유지할 수 있습니다.

다음 샘플 규칙을 구현할 수 있습니다.

  • 이메일 주소가 있는 모든 필드는 더미 값으로 대체해야 합니다.
  • 전화번호가 포함된 모든 필드는 마스킹해야 합니다.
  • 주석, 메모 또는 비고가 있는 모든 필드에는 이메일 주소와 관련된 정보를 포함해서는 안 됩니다.
  • 은행 계좌 세부정보가 포함된 모든 필드는 암호화 기반의 비식별화 방법을 사용하여 토큰화해야 합니다.

다음은 샘플 구성 테이블의 정의입니다.

define table zgoog_dlp_config {
 key client         : abap.clnt not null;
 key keyword        : abap.char(60) not null;
 key infotype       : abap.char(60) not null;
 surrogate_infotype : abap.char(60);
 common_alphabhet   : abap.char(20);
 masking_char       : abap.char(1);
 number_to_mask     : int4;
}

다음 예는 샘플 변환 규칙을 보여줍니다.

   lt_dlp_config = VALUE #(
      ( client = sy-mandt keyword  = 'EMAIL' infotype = 'EMAIL_ADDRESS'  )
      ( client = sy-mandt keyword  = 'PHONE NUMBER' infotype = 'PHONE_NUMBER' number_to_mask = 5 masking_char = '*' )
      ( client = sy-mandt keyword  = 'REMARKS' infotype = 'EMAIL_ADDRESS'  )
      ( client = sy-mandt keyword  = 'REMARKS' infotype = 'PHONE_NUMBER'  )
      ( client = sy-mandt keyword  = 'BANK ACCOUNT' infotype = 'FINANCIAL_ACCOUNT_NUMBER' surrogate_infotype = 'ACCOUNT' common_alphabhet = 'ALPHA_NUMERIC' )
    ).

DLP 프록시 모듈

DLP 프록시 모듈이라는 전용 하위 구성요소를 만들 수 있습니다. 이 모듈은 ABAP 클래스 또는 REST 서비스일 수 있습니다. 이 함수의 기본 기능은 이전에 정의한 변환 규칙을 사용하여 PII를 익명화하는 것입니다.

DLP 프록시 모듈은 ABAP SDK for Google Cloud의 SAP BTP 버전 내 /GOOG/CL_DLP_V2 클래스의 DEIDENTIFY_CONTENT 메서드를 사용합니다.

다음 섹션에서는 다양한 시나리오에서 PII 익명화를 위해 DLP 프록시 모듈을 사용하는 방법의 샘플 구현을 보여줍니다.

대체: 감지된 민감한 값을 지정된 서로게이트 값으로 바꿉니다.

감지된 이메일 ID를 일반 값으로 바꾸려면 다음 단계를 수행합니다.

  1. /GOOG/CL_DLP_V2 클래스의 클라이언트 객체를 만듭니다.

  2. 구성 표를 사용하여 적용할 변환 유형을 결정합니다.

  3. 이메일 ID를 마스킹하려면 EMAIL_ID@EXAMPLE.COM과 같은 대체 값으로 대체합니다.

  4. DLP API를 호출합니다.

  5. 대체 값을 비롯한 모든 관련 매개변수와 함께 DEIDENTIFY_CONTENT 메서드를 사용하고 클라이언트 서비스에 출력을 반환합니다.

다음 코드 샘플은 위의 단계를 보여줍니다.

DATA:    ls_input           TYPE /goog/cl_dlp_v2=>ty_055,
         ls_transformations TYPE /goog/cl_dlp_v2=>ty_100.

TRY.
   DATA(lo_client) = NEW /goog/cl_dlp_v2( iv_key_name = 'CLIENT_KEY' ).
   DATA(lv_p_projects_id) = CONV string( lo_client->gv_project_id ).

   "As a developer, you need to read the configuration into mt_dlp_config
   TRY.
   "As a developer, you need to read the configuration
    DATA(ls_dlp_config) = mt_dlp_config[ keyword = iv_input_type ].
        "Populate the input parameters to DLP API for replacement
INSERT VALUE #( name = ls_dlp_config-infotype ) INTO TABLE ls_input-inspect_config-info_types.ls_transformations-primitive_transformation-replace_config-new_value-string_value  = 'REPLACEMENT_VALUE'.
INSERT ls_transformations INTO TABLE ls_input-deidentify_config-info_type_transformations-transformations.
        ls_input-item-value = iv_input_value.
        "Call DLP API client stub
        TRY.
            lo_client->deidentify_content(
               EXPORTING
                   iv_p_projects_id = lv_p_projects_id
                   is_input         = ls_input
               IMPORTING
                   es_output        = DATA(ls_output)
                   ev_ret_code      = DATA(lv_ret_code)
                   ev_err_text      = DATA(lv_err_text)
                ).
        CATCH /goog/cx_sdk INTO DATA(lx_sdk_exception).
             ev_message = lx_sdk_exception->get_text( ).
        ENDTRY.
        IF lo_client->is_success( lv_ret_code ).
             ev_message = lv_err_text.
        ELSE.
            ev_output_value = ls_output-item-value.
        ENDIF.
    CATCH cx_sy_itab_line_not_found INTO DATA(lx_not_found).
        ev_output_value = iv_input_value.
    ENDTRY.
"Close the http client
lo_client->close_http_client( ).
CATCH /goog/cx_sdk INTO DATA(lx_sdk).
   ev_message = lx_sdk->get_text(  ).
ENDTRY.

다음을 바꿉니다.

  • CLIENT_KEY: 인증을 위해 구성된 클라이언트 키입니다.
  • REPLACEMENT_VALUE: 대체 값입니다(예: EMAIL_ID@EXAMPLE.COM).
수정: 감지된 민감한 값의 전체 또는 일부를 삭제합니다.

감지된 민감한 값의 전체 또는 일부를 삭제하려면 다음 단계를 수행합니다.

  1. /GOOG/CL_DLP_V2 클래스의 클라이언트 객체를 만듭니다.

  2. 구성 표를 사용하여 적용할 변환 유형을 결정합니다.

  3. 감지된 민감한 값의 전체 또는 일부를 삭제하도록 지정합니다.

  4. DLP API를 호출합니다.

  5. 모든 관련 매개변수와 함께 DEIDENTIFY_CONTENT 메서드를 사용하고 클라이언트 서비스에 출력을 반환합니다.

DATA:    ls_input           TYPE /goog/cl_dlp_v2=>ty_055,
         ls_transformations TYPE /goog/cl_dlp_v2=>ty_100,
 lo_redact          TYPE REF TO data.

   DATA(lo_client) = NEW /goog/cl_dlp_v2( iv_key_name = 'CLIENT_KEY' ).
   DATA(lv_p_projects_id) = CONV string( lo_client->gv_project_id ).

   "As a developer, you need to read the configuration into mt_dlp_config
   TRY.
        "Read the configuration
DATA(ls_dlp_config) = mt_dlp_config[ keyword = iv_input_type ].
        "Populate the input parameters to DLP API for redaction
CREATE DATA lo_redact TYPE REF TO string.
INSERT VALUE #( name = ls_dlp_config-infotype ) INTO TABLE ls_input-inspect_config-info_types.
INSERT VALUE #( name = ls_dlp_config-infotype ) INTO TABLE ls_transformations-info_types.
        ls_transformations-primitive_transformation-redact_config = lo_redact.
INSERT ls_transformations INTO TABLE ls_input-deidentify_config-info_type_transformations-transformations.
        ls_input-item-value = iv_input_value.
        "Call DLP API client stub
        TRY.
lo_client->deidentify_content(
                        EXPORTING
                                iv_p_projects_id = lv_p_projects_id
                            is_input         = ls_input
                        IMPORTING
                            es_output        = DATA(ls_output)
                            ev_ret_code      = DATA(lv_ret_code)
                            ev_err_text      = DATA(lv_err_text)
                 ).
CATCH /goog/cx_sdk INTO lx_sdk_exception.
              ev_message = lx_sdk_exception->get_text( ).
        ENDTRY.
     IF lo_client->is_success( lv_ret_code ).
           ev_message = lv_err_text.
        ELSE.
          ev_output_value = ls_output-item-value.
        ENDIF.
  CATCH cx_sy_itab_line_not_found INTO lx_not_found.
      ev_output_value = iv_input_value.
  ENDTRY.

  "Close the http client
     lo_client->close_http_client( ).
CATCH /goog/cx_sdk INTO DATA(lx_sdk).
   ev_message = lx_sdk->get_text(  ).
ENDTRY.

CLIENT_KEY를 인증에 구성된 클라이언트 키로 바꿉니다.

마스킹: 민감한 값의 문자 수를 해시(#) 또는 별표(*)와 같은 지정된 문자로 바꿉니다.

값을 지정된 문자로 바꾸려면 다음 단계를 따르세요.

  1. /GOOG/CL_DLP_V2 클래스의 클라이언트 객체를 만듭니다.

  2. 구성 표를 사용하여 적용할 변환 유형을 결정합니다.

  3. 구성 표에 따라 마스킹할 문자 및 문자 수를 설정합니다.

  4. DLP API를 호출합니다.

  5. 대체 값을 비롯한 모든 관련 매개변수와 함께 DEIDENTIFY_CONTENT 메서드를 사용하고 출력을 클라이언트 서비스로 반환합니다.

DATA:    ls_input           TYPE /goog/cl_dlp_v2=>ty_055,
         ls_transformations TYPE /goog/cl_dlp_v2=>ty_100.
TRY.
   DATA(lo_client) = NEW /goog/cl_dlp_v2( iv_key_name = 'CLIENT_KEY' ).
   DATA(lv_p_projects_id) = CONV string( lo_client->gv_project_id ).

   "As a developer, you need to read the configuration into mt_dlp_config
   TRY.
"Read the configuration
        DATA(ls_dlp_config) = mt_dlp_config[ keyword = iv_input_type ].
    "Populate the input parameters to DLP API for masking
INSERT VALUE #( name = ls_dlp_config-infotype ) INTO TABLE ls_input-inspect_config-info_types.
ls_transformations-primitive_transformation-character_mask_config-number_to_mask =  ls_dlp_config-number_to_mask.
ls_transformations-primitive_transformation-character_mask_config-masking_character = ls_dlp_config-masking_char.
INSERT ls_transformations INTO TABLE ls_input-deidentify_config-info_type_transformations-transformations.
        ls_input-item-value = iv_input_value.
        "Call DLP API client stub
         TRY.
                   lo_client->deidentify_content(
                       EXPORTING
                         iv_p_projects_id = lv_p_projects_id
                         is_input         = ls_input
                       IMPORTING
                         es_output        = DATA(ls_output)
                         ev_ret_code      = DATA(lv_ret_code)
                         ev_err_text      = DATA(lv_err_text)
                     ).
              CATCH /goog/cx_sdk INTO lx_sdk_exception.
                   ev_message = lx_sdk_exception->get_text( ).
              ENDTRY.
              IF lo_client->is_success( lv_ret_code ).
                 ev_message = lv_err_text.
              ELSE.
                 ev_output_value = ls_output-item-value.
              ENDIF.
      CATCH cx_sy_itab_line_not_found INTO lx_not_found.
         ev_output_value = iv_input_value.
      ENDTRY.
   "Close the http client
     lo_client->close_http_client( ).
CATCH /goog/cx_sdk INTO DATA(lx_sdk).
   ev_message = lx_sdk->get_text(  ).
ENDTRY.

CLIENT_KEY를 인증에 구성된 클라이언트 키로 바꿉니다.

암호화 기반 토큰화: 암호화 키를 사용하여 원래의 민감한 정보 값을 암호화합니다.

암호화 기반 토큰화의 경우 암호화 키와 래핑된 키를 만들어야 합니다. 이 가이드에서는 형식 보존 암호화를 사용합니다. 이 메서드는 원래 입력 값과 동일한 길이와 문자를 가진 토큰을 만듭니다.

암호화 해시 매핑을 사용하여 민감한 정보 값을 익명화하려면 다음 단계를 따르세요.

  1. /GOOG/CL_DLP_V2 클래스의 클라이언트 객체를 만듭니다.

  2. 구성 표를 사용하여 적용할 변환 유형을 결정합니다.

  3. 이전에 만든 암호화 키와 래핑된 키를 설정합니다.

  4. DLP API를 호출합니다.

  5. 암호화 암호화에 관한 모든 관련 매개변수와 함께 DEIDENTIFY_CONTENT 메서드를 사용하고 클라이언트 서비스에 출력을 반환합니다.

DATA:    ls_input               TYPE /goog/cl_dlp_v2=>ty_055,
         ls_transformations     TYPE /goog/cl_dlp_v2=>ty_100,
         ls_kms_wrapped_key     TYPE /goog/cl_dlp_v2=>ty_123,
         ls_crypto_key          TYPE /goog/cl_dlp_v2=>ty_040,
         ls_crypto_hash_config  TYPE /goog/cl_dlp_v2=>ty_039.

TRY.
   DATA(lo_client) = NEW /goog/cl_dlp_v2( iv_key_name = 'CLIENT_KEY' ).
   DATA(lv_p_projects_id) = CONV string( lo_client->gv_project_id ).

   "As a developer, you need to read the configuration into lt_dlp_config
   "As a developer, you need to populate the crypto key name and wrapped key

   ls_kms_wrapped_key-crypto_key_name = 'CRYPTO_KEY_NAME'. "Crypto_key_name.
   ls_kms_wrapped_key-wrapped_key = 'WRAPPED_KEY_NAME'. "Wrapped_key.
   ls_crypto_key-kms_wrapped = ls_kms_wrapped_key.
   ls_crypto_hash_config-crypto_key = ls_crypto_key.
   TRY.
"Read the configuration
        DATA(ls_dlp_config) = mt_dlp_config[ keyword = iv_input_type ].
    "Populate the input parameters to DLP API for cryptographic encryption
INSERT VALUE #( name = ls_dlp_config-infotype ) INTO TABLE ls_input-inspect_config-info_types.
INSERT VALUE #( name = ls_dlp_config-infotype ) INTO TABLE ls_transformations-info_types.             ls_transformations-primitive_transformation-crypto_replace_ffx_fpe_config-crypto_key-kms_wrapped = ls_kms_wrapped_key.             ls_transformations-primitive_transformation-crypto_replace_ffx_fpe_config-surrogate_info_type-name = ls_dlp_config-surrogate_infotype.          ls_transformations-primitive_transformation-crypto_replace_ffx_fpe_config-common_alphabet = ls_dlp_config-common_alphabhet.
INSERT ls_transformations INTO TABLE ls_input-deidentify_config-info_type_transformations-transformations.
        ls_input-item-value = iv_input_value.
    "Add the info type identification string to map the subsequent value to relevant infotype
CONCATENATE 'Bank Account' ls_input-item-value INTO ls_input-item-value SEPARATED BY space.
"Call DLP API client stub
TRY.
                lo_client->deidentify_content(
                        EXPORTING
                            iv_p_projects_id = lv_p_projects_id
                            is_input         = ls_input
                        IMPORTING
                            es_output        = DATA(ls_output)
                            ev_ret_code      = DATA(lv_ret_code)
                            ev_err_text      = DATA(lv_err_text)
                 ).
CATCH /goog/cx_sdk INTO DATA(lx_sdk_exception).
                        ev_message = lx_sdk_exception->get_text( ).
                ENDTRY.
         IF lo_client->is_success( lv_ret_code ).
            ev_message = lv_err_text.
         ELSE.
"Removing the info type identification string added earlier and keeping only the encrypted value
    REPLACE ALL OCCURRENCES OF SUBSTRING 'Bank Account' IN ls_output-item-value WITH ''.
    REPLACE ALL OCCURRENCES OF SUBSTRING 'ACCOUNT(10):' IN ls_output-item-value WITH ''.
        ev_output_value  = ls_output-item-value.
        ENDIF.
      CATCH cx_sy_itab_line_not_found INTO lx_not_found.
         ev_output_value = iv_input_value.
      ENDTRY.
 "Close the http client
   lo_client->close_http_client( ).
CATCH /goog/cx_sdk INTO DATA(lx_sdk).
   ev_message = lx_sdk->get_text(  ).
ENDTRY.

다음을 바꿉니다.

  • CLIENT_KEY: 인증을 위해 구성된 클라이언트 키입니다.
  • CRYPTO_KEY_NAME: 암호화 키 이름입니다.
  • WRAPPED_KEY_NAME: 래핑된 키 이름입니다.

입력 데이터를 클라이언트 서비스로 전송

입력 소스 시스템에서 클라이언트 서비스로 데이터를 전송합니다. API 호출, 프런트엔드 UI 애플리케이션, 로컬 파일, 서드 파티 애플리케이션 또는 기타 소스를 사용하여 데이터를 전송할 수 있습니다.

SAP Fiori 앱 빌드에 관한 자세한 내용은 ABAP RESTful 애플리케이션 프로그래밍 모델을 사용하여 SAP Fiori 앱 빌드를 참고하세요.

DLP 프록시 모듈 호출

소스 입력을 수신하는 클라이언트 서비스에서 DLP 프록시 모듈을 호출합니다.

다음 코드 샘플은 클라이언트 서비스에서 DLP 프록시 모듈을 호출하는 방법을 보여줍니다.

 DATA : lv_input  TYPE string,
            lv_output TYPE String.

"As a developer, you need to populate input data into relevant fields
"Redaction: Deletes all or part of a detected sensitive value
" - Remarks
lv_input = lv_email_address.
zgoog_cl_dlp_proxy=>call_dlp( EXPORTING iv_input_value  = lv_input iv_input_type = 'EMAIL'
                              IMPORTING ev_output_value = lv_output ev_message = ev_message ).
ls_bupa_email_address-email_address = lv_output.

"Masking: Replaces a number of characters of a sensitive value with a specified surrogate character, such as a hash (#) or asterisk (*).
" - Phone Number
lv_input = lv_phone_number.
zgoog_cl_dlp_proxy=>call_dlp( EXPORTING iv_input_value = lv_input iv_input_type = 'PHONE NUMBER'
                              IMPORTING ev_output_value = lv_output ev_message = ev_message ).
ls_bupa_phone_number-phone_number = lv_output.

"Replacement: Replaces a detected sensitive value with a specified surrogate value.
" - Email ID
lv_input = lv_address_comm_remarks.
zgoog_cl_dlp_proxy=>call_dlp( EXPORTING iv_input_value  = lv_input iv_input_type = 'REMARKS'
                              IMPORTING ev_output_value = lv_output ev_message = ev_message ).
ls_bupa_email_address-address_comm_remarks = lv_output.

"Crypto-based tokenization: Encrypts the original sensitive data value by using a cryptographic key. Sensitive Data Protection supports several types of tokenization,
"including transformations that can be reversed, or "re-identified."
" - Bank account number
lv_input = lv_bank_account.
zgoog_cl_dlp_proxy=>call_dlp( EXPORTING iv_input_value  = lv_input iv_input_type = 'BANK ACCOUNT'
                              IMPORTING ev_output_value = lv_output ev_message = ev_message ).
ls_bupa_bank_details-bank_account = lv_output.

SAP ERP 시스템에 데이터 저장

관련 필드의 익명화된 후 클라이언트 서비스에서 데이터를 대상 저장소에 저장하는 로직을 구현합니다. Cloud Storage 서비스 또는 온프레미스 SAP 시스템일 수 있습니다.

다음 단계

  • 이 가이드에 설명된 예시 솔루션을 최소한의 노력으로 배포하려면 GitHub에 제공된 코드 샘플을 사용하세요.

  • DLP API에서 사용할 수 있는 다양한 변환 방법을 살펴보고 특정 비즈니스 요구사항에 가장 적합한 방법을 찾으세요.

  • ABAP SDK for Google Cloud에 대해 알아보려면 ABAP SDK for Google Cloud 개요를 참고하세요.

  • ABAP SDK for Google Cloud 문제를 해결하는 데 도움이 필요한 경우 다음을 수행하세요.

참여자

저자: Sanchita Mohta | SAP 애플리케이션 엔지니어

기타 참여자: Vikash Kumar | 기술 문서 작성자