>

GCS 버킷에 새 파일을 업로드 할 때 트리거되는 Cloud Function에서 Dataflow 파이프 라인을 트리거하려고합니다. 파일을 업로드하면 Cloud 기능이 올바르게 트리거되지만 데이터 흐름이 트리거되지 않고 몇 초 후에 시간 초과됩니다. 아래는 제 기능 코드입니다 :

const google = require('googleapis');
const projectId = "iot-fitness-198120";
 
exports.moveDataFromGCStoPubSub = function(event, callback) {
 const file = event.data;
 if (file.resourceState === 'exists' && file.name) {
   google.auth.getApplicationDefault(function (err, authClient, projectId) {
     if (err) {
       throw err;
     }
 
     if (authClient.createScopedRequired && authClient.createScopedRequired()) {
       authClient = authClient.createScoped([
         'https://www.googleapis.com/auth/cloud-platform',
         'https://www.googleapis.com/auth/userinfo.email'
       ]);
     }
     console.log("File exists and client function is authenticated");
     console.log(file);
     
 
     const dataflow = google.dataflow({ version: 'v1b3', auth: authClient });
     console.log(`Incoming data: ${file.name}`);
 
     dataflow.projects.templates.create({
       projectId: projectId,
       resource: {
         parameters: {
           inputFile: `gs://${file.bucket}/${file.name}`,
           outputTopic: `projects/iot-fitness-198120/topics/MemberFitnessData`
         },
         jobName: 'CStoPubSub',
         gcsPath: 'gs://dataflow-templates/latest/GCS_Text_to_Cloud_PubSub',
         staginglocation: 'gs://fitnessanalytics-tmp/tmp'
       }
     }, function(err, response) {
       if (err) {
         console.error("problem running dataflow template, error was: ", err);
       }
       console.log("Dataflow template response: ", response);
       callback();
     });
 
   });
 }
};

실행은 다음 줄을 기록하지도 않습니다. console.log ( "파일이 있고 클라이언트 기능이 인증되었습니다");그것은 그렇게 멀지도 않다고 말해줍니다.

실행 중 로그 출력은 다음과 같습니다.

2018-03-20 04 : 56 : 43.283 GST 데이터 흐름 트리거 기능 52957909906492 함수 실행에 60097ms가 걸렸으며 'timeout'상태로 완료되었습니다.

2018-03-20 04 : 55 : 43.188 GST 데이터 흐름 트리거 기능 52957909906492 기능 실행이 시작되었습니다

왜 Dataflow를 트리거하지 않고 오류 메시지를 발생시키지 않는지 아십니까?


  • 답변 # 1

    마침내 코드를 수정했습니다. GCP 지원으로부터 도움을 받았습니다. 아래는 올바른 구문입니다.

    var {google} = require('googleapis');
    exports.moveDataFromGCStoPubSub = (event, callback) => {
    
    const file = event.data;
    const context = event.context;
    console.log(`Event ${context.eventId}`);
    console.log(`  Event Type: ${context.eventType}`);
    console.log(`  Bucket: ${file.bucket}`);
    console.log(`  File: ${file.name}`);
    console.log(`  Metageneration: ${file.metageneration}`);
    console.log(`  Created: ${file.timeCreated}`);
    console.log(`  Updated: ${file.updated}`);
      google.auth.getApplicationDefault(function (err, authClient, projectId) {
         if (err) {
           throw err;
         }
     console.log(projectId);
     const dataflow = google.dataflow({ version: 'v1b3', auth: authClient });
     console.log(`gs://${file.bucket}/${file.name}`);
     dataflow.projects.templates.create({
      gcsPath: 'gs://dataflow-templates/latest/GCS_Text_to_Cloud_PubSub', 
      projectId: projectId,
       resource: {
        parameters: {
            inputFilePattern: `gs://${file.bucket}/${file.name}`,
            outputTopic: 'projects/iot-fitness-198120/topics/MemberFitnessData2'
          },
        environment: {
          tempLocation: 'gs://fitnessanalytics-tmp/tmp'
        },
          jobName: 'CStoPubSub',
          //gcsPath: 'gs://dataflow-templates/latest/GCS_Text_to_Cloud_PubSub',    
        }
     }, function(err, response) {
       if (err) {
         console.error("problem running dataflow template, error was: ", err);
       }
       console.log("Dataflow template response: ", response);
       callback();
     });
       });
     callback();
    };
    
    

  • 답변 # 2

    클라우드 기능 실행이 실패한다고 생각하면 if 문을 만족시키지 못합니다

    if (file.resourceState === 'exists' && file.name)
    
    

    클라우드 기능 작업을 시작할 때 비슷한 문제가있었습니다. index.js 파일 var {google} = require('googleapis'); 수정  여기 솔루션에 제공된대로

관련 자료

  • 이전 linux - 자기 디스크의 ext4 - 검색 최적화 방식으로 임의의 파일 목록을 처리 할 수 ​​있습니까?
  • 다음 XSLT 10을 사용한 토큰 화 및 정렬