PIM 통합을 위한 AEM Assets 이벤트

IMPORTANT
이 자습서에서는 실험적인 AEM as a Cloud Service API를 사용합니다. 이러한 API에 액세스하려면 프리릴리스 소프트웨어 계약에 동의하고 Adobe 엔지니어링을 통해 이러한 API를 사용자 환경에서 수동으로 활성화해야 합니다. 액세스 권한을 요청하려면 Adobe 지원 담당자에게 문의하십시오.

AEM Assets을 PIM(제품 정보 관리) 또는 PLM(제품 라인 관리) 시스템과 같은 서드파티 시스템과 통합하여 자산 메타데이터 기본 AEM IO 이벤트를 사용 ​하는 방법에 대해 알아봅니다. AEM Assets 이벤트를 수신하면 비즈니스 요구 사항에 따라 AEM, PIM 또는 두 시스템 모두에서 에셋 메타데이터를 업데이트할 수 있습니다. 그러나 이 예에서는 AEM에서 자산 메타데이터를 업데이트하는 방법을 보여 줍니다.

자산 메타데이터 업데이트 AEM 외부의 코드 Adobe I/O Runtime을(를) 실행하기 위해 서버를 사용하지 않는 플랫폼이 사용됩니다.

이벤트 처리 플로우는 다음과 같습니다.

PIM 통합을 위한 AEM Assets 이벤트

  1. AEM 작성자 서비스는 자산 업로드가 완료되고 모든 자산 처리 활동이 완료되면 자산 처리 완료됨 이벤트를 트리거합니다. 처리가 완료될 때까지 기다리면 메타데이터 추출과 같은 기본 제공 처리가 완료됩니다.
  2. 이벤트가 Adobe I/O 이벤트 서비스로 전송됩니다.
  3. 이벤트 Adobe I/O 서비스에서 이벤트를 Adobe I/O Runtime 작업에 전달하여 처리합니다.
  4. Adobe I/O Runtime 작업은 PIM 시스템의 API를 호출하여 SKU, 공급자 정보 또는 기타 세부 정보와 같은 추가 메타데이터를 검색합니다.
  5. 그런 다음 PIM에서 검색한 추가 메타데이터는 Assets 작성자 API를 사용하여 AEM Assets에서 업데이트됩니다.

사전 요구 사항

이 자습서를 완료하려면 다음이 필요합니다.

개발 단계

높은 수준의 개발 단계는 다음과 같습니다.

  1. Adobe Developer Console(ADC)에서 프로젝트 만들기
  2. 로컬 개발을 위해 프로젝트 초기화
  3. ADC에서 프로젝트 구성
  4. ADC 프로젝트 통신을 사용하도록 AEM 작성자 서비스 구성
  5. 메타데이터 검색 및 업데이트를 오케스트레이션하는 런타임 작업 개발
  6. 자산을 AEM Author 서비스에 업로드하고 메타데이터가 업데이트되었는지 확인합니다

1-2단계에 대한 자세한 내용은 Adobe I/O Runtime 작업 및 AEM 이벤트 예제를 참조하고 3-6단계에 대한 자세한 내용은 다음 섹션을 참조하십시오.

Adobe Developer Console(ADC)에서 프로젝트 구성

AEM Assets 이벤트를 수신하고 이전 단계에서 만든 Adobe I/O Runtime 작업을 실행하려면 ADC에서 프로젝트를 구성합니다.

  • ADC에서 프로젝트로 이동합니다. 런타임 작업이 배포된 Stage 작업 영역을 선택하십시오.

  • 서비스 추가 단추를 클릭하고 이벤트 옵션을 선택합니다. Experience Cloud 추가 대화 상자에서 이벤트 > AEM Assets ​을 선택하고 다음 ​을 클릭합니다. 추가 구성 단계를 따라 AEMCS 인스턴스, 자산 처리 완료 이벤트, OAuth 서버 간 인증 유형 및 기타 세부 정보를 선택하십시오.

    AEM Assets 이벤트 - 이벤트 추가

  • 마지막으로 이벤트를 받는 방법 단계에서 런타임 작업 옵션을 확장하고 이전 단계에서 만든 일반 작업을 선택합니다. 구성된 이벤트 저장 ​을 클릭합니다.

    AEM Assets 이벤트 - 이벤트 수신

  • 마찬가지로 서비스 추가 단추를 클릭하고 API 옵션을 선택하십시오. API 추가 양식에서 Experience Cloud > AEM as a Cloud Service API ​를 선택하고 다음 ​을 클릭합니다.

    AEM as a Cloud Service API 추가 - 프로젝트 구성

  • 그런 다음 인증 유형으로 OAuth 서버 간 ​을(를) 선택하고 다음 ​을(를) 클릭합니다.

  • 그런 다음 AEM Administrators-XXX 제품 프로필을 선택하고 구성된 API 저장 ​을 클릭합니다. 해당 에셋을 업데이트하려면 선택한 제품 프로필이 이벤트가 생성되는 AEM Assets 환경과 연결되어 있어야 하며 에셋을 업데이트할 수 있는 충분한 액세스 권한이 있어야 합니다.

    AEM as a Cloud Service API 추가 - 프로젝트 구성

ADC 프로젝트 통신을 사용하도록 AEM 작성자 서비스 구성

위의 ADC 프로젝트에서 AEM의 에셋 메타데이터를 업데이트하려면 ADC 프로젝트의 클라이언트 ID로 AEM 작성자 서비스를 구성합니다. 클라이언트 ID ​이(가) Adobe Cloud Manager UI를 사용하여 환경 변수로 추가됩니다.

  • Adobe Cloud Manager에 로그인하고 프로그램 > 환경 > 줄임표 > 세부 정보 보기 > 구성 탭을 선택합니다.

    Cloud Manager Adobe - 환경 구성

  • 그런 다음 구성 추가 단추를 클릭하고 변수 세부 정보를 다음으로 입력하십시오.

    table 0-row-4 1-row-4
    이름 AEM 서비스 유형
    ADOBE 제공 클라이언트 ID <COPY_FROM_ADC_PROJECT_CREDENTIALS> 작성자 변수

    Cloud Manager Adobe - 환경 구성

  • 구성을 추가저장 ​을 클릭합니다.

런타임 작업 개발

메타데이터 검색 및 업데이트를 수행하려면 먼저 src/dx-excshell-1/actions/generic 폴더에서 자동으로 만든 generic 작업 코드를 업데이트합니다.

첨부된 WKND-Assets-PIM-Integration.zip 파일을 참조하여 전체 코드를 확인하십시오. 아래 섹션에서는 주요 파일을 강조 표시합니다.

  • src/dx-excshell-1/actions/generic/mockPIMCommunicator.js 파일은 PIM API 호출을 모방해 SKU 및 공급자 이름과 같은 추가 메타데이터를 검색합니다. 이 파일은 데모용으로 사용됩니다. 전체적인 흐름이 작동하면 이 함수를 실제 PIM 시스템에 대한 호출로 대체하여 에셋에 대한 메타데이터를 검색합니다.

    code language-javascript
    /**
     * Mock PIM API to get the product data such as SKU, Supplier, etc.
     *
     * In a real-world scenario, this function would call the PIM API to get the product data.
     * For this example, we are returning mock data.
     *
     * @param {string} assetId - The assetId to get the product data.
     */
    module.exports = {
        async getPIMData(assetId) {
            if (!assetId) {
            throw new Error('Invalid assetId');
            }
            // Mock response data for demo purposes
            const data = {
            SKUID: 'MockSKU 123',
            SupplierName: 'mock-supplier',
            // ... other product data
            };
            return data;
        },
    };
    
  • src/dx-excshell-1/actions/generic/aemCommunicator.js 파일은 Assets 작성자 API를 사용하여 AEM의 자산 메타데이터를 업데이트합니다.

    code language-javascript
    const fetch = require('node-fetch');
    
    ...
    
    /**
    *  Get IMS Access Token using Client Credentials Flow
    *
    * @param {*} clientId - IMS Client ID from ADC project's OAuth Server-to-Server Integration
    * @param {*} clientSecret - IMS Client Secret from ADC project's OAuth Server-to-Server Integration
    * @param {*} scopes - IMS Meta Scopes from ADC project's OAuth Server-to-Server Integration as comma separated strings
    * @returns {string} - Returns the IMS Access Token
    */
    async function getIMSAccessToken(clientId, clientSecret, scopes) {
      const adobeIMSV3TokenEndpointURL = 'https://ims-na1.adobelogin.com/ims/token/v3';
    
      const options = {
        method: 'POST',
        headers: {
          'Content-Type': 'application/x-www-form-urlencoded',
        },
        body: `grant_type=client_credentials&client_id=${clientId}&client_secret=${clientSecret}&scope=${scopes}`,
      };
    
      const response = await fetch(adobeIMSV3TokenEndpointURL, options);
      const responseJSON = await response.json();
    
      return responseJSON.access_token;
    }
    
    async function updateAEMAssetMetadata(metadataDetails, aemAssetEvent, params) {
      ...
      // Transform the metadata details to JSON Patch format,
      // see https://developer.adobe.com/experience-cloud/experience-manager-apis/api/experimental/assets/author/#operation/patchAssetMetadata
      const transformedMetadata = Object.keys(metadataDetails).map((key) => ({
        op: 'add',
        path: `wknd-${key.toLowerCase()}`,
        value: metadataDetails[key],
      }));
    
      ...
    
      // Get ADC project's OAuth Server-to-Server Integration credentials
      const clientId = params.ADC_CECREDENTIALS_CLIENTID;
      const clientSecret = params.ADC_CECREDENTIALS_CLIENTSECRET;
      const scopes = params.ADC_CECREDENTIALS_METASCOPES;
    
      // Get IMS Access Token using Client Credentials Flow
      const access_token = await getIMSAccessToken(clientId, clientSecret, scopes);
    
      // Call AEM Author service to update the metadata using Assets Author API
      // See https://developer.adobe.com/experience-cloud/experience-manager-apis/api/experimental/assets/author/
      const res = await fetch(`${aemAuthorHost}/adobe/assets/${assetId}/metadata`, {
        method: 'PATCH',
        headers: {
          'Content-Type': 'application/json-patch+json',
          'If-Match': '*',
          'X-Adobe-Accept-Experimental': '1',
          'X-Api-Key': 'aem-assets-management-api', // temporary value
          Authorization: `Bearer ${access_token}`,
        },
        body: JSON.stringify(transformedMetadata),
      });
    
      ...
    }
    
    module.exports = { updateAEMAssetMetadata };
    

    .env 파일은 ADC 프로젝트의 OAuth 서버 간 자격 증명 세부 정보를 저장하며, 이 정보는 ext.config.yaml 파일을 사용하여 작업에 매개 변수로 전달됩니다. 암호 및 작업 매개 변수 관리에 대해서는 App Builder 구성 파일을 참조하세요.

  • src/dx-excshell-1/actions/model 폴더에 aemAssetEvent.jserrors.js 파일이 있습니다. 이 파일은 작업에서 수신된 이벤트를 구문 분석하고 오류를 처리하는 데 각각 사용됩니다.

  • src/dx-excshell-1/actions/generic/index.js 파일은 앞에서 언급한 모듈을 사용하여 메타데이터 검색 및 업데이트를 조정합니다.

    code language-javascript
    ...
    
    let responseMsg;
    // handle the challenge probe request, they are sent by I/O to verify the action is valid
    if (params.challenge) {
      logger.info('Challenge probe request detected');
      responseMsg = JSON.stringify({ challenge: params.challenge });
    } else {
      logger.info('AEM Asset Event request received');
    
      // create AEM Asset Event object from request parameters
      const aemAssetEvent = new AEMAssetEvent(params);
    
      // Call mock PIM API to get the product data such as SKU, Supplier, etc.
      const mockPIMData = await mockPIMAPI.getPIMData(
        aemAssetEvent.getAssetName(),
      );
      logger.info('Mock PIM API response', mockPIMData);
    
      // Update PIM received data in AEM as Asset metadata
      const aemUpdateStatus = await updateAEMAssetMetadata(
        mockPIMData,
        aemAssetEvent,
        params,
      );
      logger.info('AEM Asset metadata update status', aemUpdateStatus);
    
      if (aemUpdateStatus) {
        // create response message
        responseMsg = JSON.stringify({
          message:
            'AEM Asset Event processed successfully, updated the asset metadata with PIM data.',
          assetdata: {
            assetName: aemAssetEvent.getAssetName(),
            assetPath: aemAssetEvent.getAssetPath(),
            assetId: aemAssetEvent.getAssetId(),
            aemHost: aemAssetEvent.getAEMHost(),
            pimdata: mockPIMData,
          },
        });
      }
    
      // response object
      const response = {
        statusCode: 200,
        body: responseMsg,
      };
    
      // Return the response to the caller
      return response;
    
      ...
    }
    

다음 명령을 사용하여 업데이트된 작업을 Adobe I/O Runtime에 배포합니다.

$ aio app deploy

에셋 업로드 및 메타데이터 확인

AEM Assets 및 PIM 통합을 확인하려면 다음 단계를 따르십시오.

  • SKU 및 공급자 이름과 같은 모의 PIM 제공 메타데이터를 보려면 AEM Assets에서 메타데이터 스키마를 만들려면 SKU 및 공급자 이름 메타데이터 속성을 표시하는 메타데이터 스키마를 참조하십시오.

  • AEM Author 서비스에서 에셋을 업로드하고 메타데이터 업데이트를 확인합니다.

    AEM Assets 메타데이터 업데이트

개념 및 주요 특징

엔터프라이즈에서 AEM과 PIM과 같은 다른 시스템 간의 에셋 메타데이터 동기화가 필요한 경우가 많습니다. AEM 이벤트를 사용하면 이러한 요구 사항을 충족할 수 있습니다.

  • 에셋 메타데이터 검색 코드는 AEM 외부에서 실행되므로 AEM Author 서비스에 대한 로드를 방지하여 독립적으로 확장하는 이벤트 기반 아키텍처가 사용됩니다.
  • 새로 도입된 Assets 작성자 API는 AEM에서 에셋 메타데이터를 업데이트하는 데 사용됩니다.
  • API 인증은 OAuth 서버 간(즉, 클라이언트 자격 증명 흐름)을 사용합니다. OAuth 서버 간 자격 증명 구현 안내서를 참조하십시오.
  • Adobe I/O Runtime 작업 대신 다른 웹후크 또는 Amazon EventBridge를 사용하여 AEM Assets 이벤트를 수신하고 메타데이터 업데이트를 처리할 수 있습니다.
  • AEM Eventing을 통한 자산 이벤트는 기업이 중요한 프로세스를 자동화하고 능률화할 수 있도록 지원하여 컨텐츠 에코시스템 전반의 효율성과 일관성을 향상시킵니다.
recommendation-more-help
4859a77c-7971-4ac9-8f5c-4260823c6f69