콜백 및 Google Sheets를 사용하여 워크플로 일시중지 및 재개


Google Sheets는 실시간 공동작업을 지원하고 데이터를 시각화, 처리, 소통하는 도구를 제공하는 클라우드 기반의 스프레드시트 솔루션입니다.

이 튜토리얼에서는 콜백 엔드포인트(또는 웹훅)를 만들고, Google Sheets에 콜백 URL을 저장하고, 실행을 일시중지한 후 Sheets 스프레드시트를 통해 사용자의 승인을 기다려 워크플로를 다시 시작하는 워크플로를 만들어 배포하는 방법을 보여 줍니다. 콜백 사용에 대해 자세히 알아보세요.

목표

이 가이드에서는 다음 단계를 진행합니다.

  1. Google Drive에 새 폴더를 만듭니다. 이 폴더는 스프레드시트를 저장하는 데 사용되며 워크플로를 스프레드시트에 쓸 수 있습니다.
  2. 승인을 캡처하고 워크플로에 대한 콜백을 시작할 Google Sheets 스프레드시트를 만듭니다.
  3. 클라우드 기반 자바스크립트 플랫폼인 Google Apps Script를 사용하여 프로그래매틱 방식으로 Google Workspace 제품을 생성, 읽기, 수정하여 스프레드시트 업데이트를 통해 요청이 승인될 때마다 일시 중지된 워크플로의 재개를 트리거합니다.
  4. Google Sheets API 커넥터를 호출하여 스프레드시트에 데이터를 추가하는 워크플로를 만들고 배포합니다. 스프레드시트를 통해 콜백이 승인되면 워크플로가 실행되고 일시 중지된 다음 재개됩니다. 워크플로 커넥터 자세히 알아보기
  5. 전체 프로세스를 테스트하고 워크플로가 예상대로 진행되는지 확인합니다.

비용

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

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

이 튜토리얼에서는 Google Workspace도 사용합니다. Google의 무료 소비자 앱에 포함되지 않은 비즈니스급 서비스는 비용이 청구됩니다.

시작하기 전에

Google Cloud 콘솔에서 또는 터미널이나 Cloud Shell에서 Google Cloud CLI를 사용하여 다음 명령어의 일부를 실행할 수 있습니다.

조직에서 정의한 보안 제약조건으로 인해 다음 단계를 완료하지 못할 수 있습니다. 문제 해결 정보는 제한된 Google Cloud 환경에서 애플리케이션 개발을 참조하세요.

콘솔

  1. Google Cloud 콘솔의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 만들거나 선택합니다.

    프로젝트 선택기로 이동

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

  3. Compute Engine, Sheets, Workflows API를 사용 설정합니다.

    API 사용 설정

  4. 테스트 목적으로 이 튜토리얼의 워크플로와 연결할 것이므로 Compute Engine 기본 서비스 계정을 기록해 두세요. Compute Engine API가 사용 설정된 새 프로젝트에는 IAM 기본 편집자 역할 및 다음 이메일 형식으로 생성된 이 서비스 계정이 포함됩니다.

    PROJECT_NUMBER-compute@developer.gserviceaccount.com

    프로젝트 번호는 Google Cloud 콘솔의 시작 페이지에서 찾을 수 있습니다.

    프로덕션 환경의 경우 새 서비스 계정을 만들고 해당 계정에 필요한 최소한의 권한을 포함하고 최소 권한 원칙을 따르는 하나 이상의 IAM 역할을 부여하는 것을 강력하게 추천합니다.

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

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

  3. Compute Engine, Sheets, Workflows API를 사용 설정합니다.

    gcloud services enable \
        compute.googleapis.com \
        sheets.googleapis.com \
        workflows.googleapis.com
    
  4. 테스트 목적으로 이 튜토리얼의 워크플로와 연결할 것이므로 Compute Engine 기본 서비스 계정을 기록해 두세요. Compute Engine API가 사용 설정된 새 프로젝트에는 IAM 기본 편집자 역할 및 다음 이메일 형식으로 생성된 이 서비스 계정이 포함됩니다.

    PROJECT_NUMBER-compute@developer.gserviceaccount.com

    다음과 같이 프로젝트 번호를 검색할 수 있습니다.

    gcloud projects describe PROJECT_ID
    

    프로덕션 환경의 경우 새 서비스 계정을 만들고 해당 계정에 필요한 최소한의 권한을 포함하고 최소 권한 원칙을 따르는 하나 이상의 IAM 역할을 부여하는 것을 강력하게 추천합니다.

Google Drive에 새 폴더 만들기

Google Drive에 새 폴더를 만듭니다. 이 폴더는 스프레드시트를 저장하는 데 사용됩니다. 공유 폴더에 대한 권한을 설정하면 워크플로에서 스프레드시트에 쓸 수 있습니다.

  1. drive.google.com으로 이동합니다.
  2. 새로 만들기 > 새 폴더를 클릭합니다.
  3. 폴더의 이름을 입력합니다.
  4. 만들기를 클릭합니다.
  5. 새 폴더를 마우스 오른쪽 버튼으로 클릭하고 공유를 선택합니다.
  6. Compute Engine 기본 서비스 계정의 이메일 주소를 추가합니다.

    이렇게 하면 서비스 계정에서 폴더에 액세스할 수 있습니다. 워크플로에 서비스 계정을 연결하면 폴더의 모든 파일에 대해 수정 액세스 권한이 워크플로에 포함됩니다. 파일, 폴더, 드라이브 공유에 대해 자세히 알아보세요.

  7. 편집자 역할을 선택합니다.

  8. 사용자에게 알림 체크박스를 선택 취소합니다.

  9. 공유를 클릭합니다.

Google Sheets를 사용하여 스프레드시트 만들기

Google Sheets를 통해 스프레드시트를 만들면 Google Drive에 저장됩니다. 기본적으로 스프레드시트는 Drive의 루트 폴더에 저장됩니다. Google Sheets API를 사용하여 지정된 폴더 내에서 직접 스프레드시트를 만드는 방법은 없습니다. 그러나 이 예시에서와 같이 스프레드시트를 만든 후 특정 폴더로 이동하는 등 다른 대안이 있습니다. 자세한 내용은 Google Drive 폴더 작업을 참조하세요.

  1. sheets.google.com으로 이동합니다.

  2. 새로 만들기 더하기를 클릭합니다.

    그러면 새 스프레드시트가 생성되고 열립니다. 모든 스프레드시트에는 문자, 숫자, 하이픈, 밑줄로 구성된 고유한 spreadsheetId 값이 포함됩니다. Google Sheets URL에서 스프레드시트 ID를 확인할 수 있습니다.

    https://docs.google.com/spreadsheets/d/spreadsheetId/edit#gid=0

  3. 워크플로를 만들 때 필요하므로 이 ID를 기록합니다.

  4. 다음 예시와 일치하도록 열 제목을 추가합니다.

    승인을 기록하는 스프레드시트의 예시

    G 열의 값, 승인 여부는 워크플로에서 콜백을 시작하는 데 사용됩니다.

  5. 스프레드시트를 이전에 만든 Google 드라이브 폴더로 이동합니다.

    1. 스프레드시트에서 파일 > 이동을 선택합니다.
    2. 만든 폴더로 이동합니다.
    3. 이동을 클릭합니다.

Google Sheets API 커넥터를 사용하여 스프레드시트를 만들 수도 있습니다. 커넥터를 사용할 때 spreadsheetIdresp 결과에서 검색할 수 있습니다. 예를 들면 다음과 같습니다.

- create_spreadsheet:
    call: googleapis.sheets.v4.spreadsheets.create
    args:
      body:
      connector_params:
        scopes: ${driveScope}
    result: resp
- assign_sheet_id:
    assign:
      - sheetId: ${resp.spreadsheetId}

Apps Script를 사용하여 Google Sheets 확장

Apps Script를 사용하면 프로그래매틱 방식으로 Google Sheets를 만들고, 읽고, 수정할 수 있습니다. Sheets용으로 설계된 대부분의 스크립트는 배열을 조작하여 스프레드시트의 셀, 행, 열과 상호작용합니다. Google Sheets에서 Apps Script 사용에 대한 안내는 커스텀 함수 빠른 시작을 참조하세요.

  1. Google Sheets에서 Apps Script 프로젝트를 만듭니다.

    1. Sheets 스프레드시트를 엽니다.
    2. 확장 프로그램 > Apps Script를 선택합니다.
    3. 스크립트 편집기에서 제목 없음 프로젝트를 클릭합니다.
    4. 프로젝트 이름을 지정하고 이름 바꾸기를 클릭합니다.

    이제 스크립트는 스프레드시트에 바인딩되어 스크립트가 사용자 인터페이스를 변경하거나 스프레드시트가 열릴 때 응답하는 특별한 기능을 제공합니다.

    스크립트 프로젝트는 Apps Script 파일 및 리소스 컬렉션을 나타냅니다. 스크립트 프로젝트의 코드 파일에는 .gs 확장 프로그램이 있습니다.

  2. Apps Script를 사용하면 기본 제공 함수처럼 Google Sheets에서 사용할 수 있는 커스텀 함수를 작성할 수 있습니다. 커스텀 함수는 표준 JavaScript를 사용하여 생성됩니다. 다음과 같이 함수를 만듭니다.

    1. Apps Script 프로젝트를 엽니다.
    2. 편집기 를 클릭합니다.
    3. 스크립트 파일은 Code.gs라는 프로젝트 파일로 나타납니다. 파일을 수정하기 위해 선택합니다.
    4. 스크립트 편집기의 모든 코드를 스프레드시트의 데이터를 읽고 워크플로 실행에 입력으로 전달하는 다음 코드로 바꿉니다.

      function handleEdit(e) {
        var range = e.range.getA1Notation();
        var sheet = e.source;
      
        if (range.length > 1 && range[0] === 'G') {
          if (e.value == "TRUE") {
            Logger.log("Approved: TRUE");
      
            var row = range.slice(1);
            var url = sheet.getRange('E' + row).getCell(1, 1).getValue();
            var approver = sheet.getRange('F' + row).getCell(1, 1).getValue();
      
            callback(url, approver);
          }
          else {
            Logger.log("Approved: FALSE");
          }
        }
      }
      
      function callback(url, approver) {
        const headers = {
          "Authorization": "Bearer " + ScriptApp.getOAuthToken()
        };
      
        var payload = {
          'approver': approver
        };
      
        const params = {
          "method": 'POST',
          "contentType": 'application/json',
          "headers": headers,
          "payload": JSON.stringify(payload)
        };
      
      
        Logger.log("Workflow callback request to " + url);
        var response = UrlFetchApp.fetch(url, params);
        Logger.log(response);
      }
    5. 저장 를 클릭합니다.

  3. Apps Script 설치 가능한 트리거를 사용하면 스프레드시트를 열거나 수정할 때와 같이 특정 조건이 충족될 때 스크립트 프로젝트에서 지정된 함수를 실행할 수 있습니다. 다음과 같이 트리거를 만듭니다.

    1. Apps Script 프로젝트를 엽니다.
    2. 트리거 을 클릭합니다.
    3. 트리거 추가를 클릭합니다.
    4. YOUR_PROJECT_NAME의 트리거 추가 대화상자에서 트리거를 구성합니다.
      1. 실행할 함수 선택 목록에서 handleEdit을 선택합니다.
      2. 실행할 배포 선택 목록에서 Head를 선택합니다.
      3. 이벤트 소스 선택 목록에서 스프레드시트에서를 선택합니다.
      4. 이벤트 유형 선택 목록에서 수정 시를 선택합니다.
      5. 실패 알림 설정 목록에서 매일 알림을 선택합니다.
    5. 저장을 클릭합니다.
    6. Google 계정을 선택하라는 메시지가 표시되면 적절한 계정을 선택한 다음 허용을 클릭합니다.

      이렇게 하면 Apps Script 프로젝트에서 Google Sheets 스프레드시트를 보고, 수정하고, 만들고, 삭제하고, 외부 서비스에 연결할 수 있습니다.

  4. Apps Script 프로젝트 매니페스트 파일은 Apps Script가 스크립트를 성공적으로 실행하기 위해 필요한 기본 프로젝트 정보를 지정하는 JSON 파일입니다. Apps Script 편집기는 기본적으로 Apps Script 프로젝트 설정을 보호하기 위해 매니페스트 파일을 숨깁니다. 매니페스트 파일을 수정합니다.

    1. Apps Script 프로젝트를 엽니다.
    2. 프로젝트 설정 를 클릭합니다.
    3. 편집기에 'appsscript.json' 매니페스트 파일 표시 체크박스를 선택합니다.
    4. 편집기 를 클릭합니다.
    5. 매니페스트 파일은 appsscript.json라는 프로젝트 파일로 나타납니다. 파일을 수정하기 위해 선택합니다.
    6. oauthScopes 필드는 문자열 배열을 지정합니다. 프로젝트에 사용되는 승인 범위를 설정하기 위해 지원하려는 범위의 배열을 추가합니다. 예를 들면

      {
        "timeZone": "America/Toronto",
        "dependencies": {
        },
        "exceptionLogging": "STACKDRIVER",
        "runtimeVersion": "V8",
        "oauthScopes": [
          "https://www.googleapis.com/auth/script.external_request",
          "https://www.googleapis.com/auth/cloud-platform",
          "https://www.googleapis.com/auth/spreadsheets"
        ]
      }
      입니다.

      이렇게 하면 다음에 대한 명시적 범위가 설정됩니다.

      • 외부 서비스에 연결
      • Google Cloud 데이터 확인, 수정, 구성, 삭제 및 Google 계정 이메일 주소 확인
      • 모든 Google Sheets 스프레드시트 확인, 수정, 생성, 삭제
    7. 저장 를 클릭합니다.

스프레드시트에 쓰고 콜백을 사용하는 워크플로 배포

스프레드시트를 통해 콜백이 승인되면 실행, 일시중지, 재개하는 워크플로를 배포합니다. 이 워크플로는 Google Sheets API 커넥터를 사용하여 Sheets 스프레드시트에 씁니다.

콘솔

  1. Google Cloud 콘솔에서 Workflows 페이지로 이동합니다.

    Workflows로 이동

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

  3. 새 워크플로의 이름 workflows-awaits-callback-sheets를 입력합니다.

  4. 리전 목록에서 us-central1(아이오와)을 선택합니다.

  5. 서비스 계정에 대해 Compute Engine 기본 서비스 계정(PROJECT_NUMBER-compute@developer.gserviceaccount.com)을 선택합니다.

  6. 다음을 클릭합니다.

  7. 워크플로 편집기에서 다음 워크플로 정의를 입력합니다.

    main:
      steps:
        - init:
            assign:
            # Replace with your sheetId and make sure the service account
            # for the workflow has write permissions to the sheet
            - sheetId: "10hieAH6b-oMeIVT_AerSLNxQck14IGhgi8ign-x2x8g"
        - before_sheets_callback:
            call: sys.log
            args:
              severity: INFO
              data: ${"Execute steps here before waiting for callback from sheets"}
        - wait_for_sheets_callback:
            call: await_callback_sheets
            args:
              sheetId: ${sheetId}
            result: await_callback_result
        - after_sheets_callback:
            call: sys.log
            args:
              severity: INFO
              data: ${"Execute steps here after receiving callback from sheets"}
        - returnResult:
            return: ${await_callback_result}
    
    await_callback_sheets:
        params: [sheetId]
        steps:
            - init:
                assign:
                  - project_id: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
                  - location: ${sys.get_env("GOOGLE_CLOUD_LOCATION")}
                  - workflow_id: ${sys.get_env("GOOGLE_CLOUD_WORKFLOW_ID")}
                  - execution_id: ${sys.get_env("GOOGLE_CLOUD_WORKFLOW_EXECUTION_ID")}
            - create_callback:
                call: events.create_callback_endpoint
                args:
                  http_callback_method: POST
                result: callback_details
            - save_callback_to_sheets:
                call: googleapis.sheets.v4.spreadsheets.values.append
                args:
                    range: ${"Sheet1!A1:G1"}
                    spreadsheetId: ${sheetId}
                    valueInputOption: RAW
                    body:
                        majorDimension: "ROWS"
                        values:
                          - ["${project_id}", "${location}", "${workflow_id}", "${execution_id}", "${callback_details.url}", "", "FALSE"]
            - log_and_await_callback:
                try:
                  steps:
                    - log_await_start:
                        call: sys.log
                        args:
                          severity: INFO
                          data: ${"Started waiting for callback from sheet " + sheetId}
                    - await_callback:
                        call: events.await_callback
                        args:
                          callback: ${callback_details}
                          timeout: 3600
                        result: callback_request
                    - log_await_stop:
                        call: sys.log
                        args:
                          severity: INFO
                          data: ${"Stopped waiting for callback from sheet " + sheetId}
                except:
                    as: e
                    steps:
                        - log_error:
                            call: sys.log
                            args:
                                severity: "ERROR"
                                text: ${"Received error " + e.message}
            - check_null_await_result:
                switch:
                  - condition: ${callback_request == null}
                    return: null
            - log_await_result:
                call: sys.log
                args:
                  severity: INFO
                  data: ${"Approved by " + callback_request.http_request.body.approver}
            - return_await_result:
                return: ${callback_request.http_request.body}
  8. 자리표시자 sheetId 값을 spreadsheetId로 바꿔야 합니다.

  9. 배포를 클릭합니다.

gcloud

  1. 워크플로의 소스 코드 파일을 만듭니다.

    touch workflows-awaits-callback-sheets.yaml
    
  2. 텍스트 편집기에서 다음 워크플로를 소스 코드 파일에 복사합니다.

    main:
      steps:
        - init:
            assign:
            # Replace with your sheetId and make sure the service account
            # for the workflow has write permissions to the sheet
            - sheetId: "10hieAH6b-oMeIVT_AerSLNxQck14IGhgi8ign-x2x8g"
        - before_sheets_callback:
            call: sys.log
            args:
              severity: INFO
              data: ${"Execute steps here before waiting for callback from sheets"}
        - wait_for_sheets_callback:
            call: await_callback_sheets
            args:
              sheetId: ${sheetId}
            result: await_callback_result
        - after_sheets_callback:
            call: sys.log
            args:
              severity: INFO
              data: ${"Execute steps here after receiving callback from sheets"}
        - returnResult:
            return: ${await_callback_result}
    
    await_callback_sheets:
        params: [sheetId]
        steps:
            - init:
                assign:
                  - project_id: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
                  - location: ${sys.get_env("GOOGLE_CLOUD_LOCATION")}
                  - workflow_id: ${sys.get_env("GOOGLE_CLOUD_WORKFLOW_ID")}
                  - execution_id: ${sys.get_env("GOOGLE_CLOUD_WORKFLOW_EXECUTION_ID")}
            - create_callback:
                call: events.create_callback_endpoint
                args:
                  http_callback_method: POST
                result: callback_details
            - save_callback_to_sheets:
                call: googleapis.sheets.v4.spreadsheets.values.append
                args:
                    range: ${"Sheet1!A1:G1"}
                    spreadsheetId: ${sheetId}
                    valueInputOption: RAW
                    body:
                        majorDimension: "ROWS"
                        values:
                          - ["${project_id}", "${location}", "${workflow_id}", "${execution_id}", "${callback_details.url}", "", "FALSE"]
            - log_and_await_callback:
                try:
                  steps:
                    - log_await_start:
                        call: sys.log
                        args:
                          severity: INFO
                          data: ${"Started waiting for callback from sheet " + sheetId}
                    - await_callback:
                        call: events.await_callback
                        args:
                          callback: ${callback_details}
                          timeout: 3600
                        result: callback_request
                    - log_await_stop:
                        call: sys.log
                        args:
                          severity: INFO
                          data: ${"Stopped waiting for callback from sheet " + sheetId}
                except:
                    as: e
                    steps:
                        - log_error:
                            call: sys.log
                            args:
                                severity: "ERROR"
                                text: ${"Received error " + e.message}
            - check_null_await_result:
                switch:
                  - condition: ${callback_request == null}
                    return: null
            - log_await_result:
                call: sys.log
                args:
                  severity: INFO
                  data: ${"Approved by " + callback_request.http_request.body.approver}
            - return_await_result:
                return: ${callback_request.http_request.body}
  3. 자리표시자 sheetId 값을 spreadsheetId로 바꿔야 합니다.

  4. 다음 명령어를 입력하여 워크플로를 배포합니다.

    gcloud workflows deploy workflows-awaits-callback-sheets \
        --source=workflows-awaits-callback-sheets.yaml \
        --location=us-central1 \
        --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com

    PROJECT_NUMBER를 Google Cloud 프로젝트 번호로 바꿉니다. 다음과 같이 프로젝트 번호를 검색할 수 있습니다.

    gcloud projects describe PROJECT_ID
    

엔드 투 엔드 흐름 테스트

워크플로를 실행하여 엔드 투 엔드 흐름을 테스트합니다. 워크플로를 실행하면 워크플로와 연결된 현재 워크플로 정의가 실행됩니다.

콘솔

  1. Google Cloud 콘솔에서 Workflows 페이지로 이동합니다.

    Workflows로 이동

  2. Workflows 페이지에서 workflows-awaits-callback-sheets 워크플로를 선택하여 세부정보 페이지로 이동합니다.

  3. 워크플로 세부정보 페이지에서 실행을 클릭합니다.

  4. 실행을 다시 클릭합니다.

    워크플로가 시작되고 실행 상태가 실행 중이어야 합니다. 또한 로그에 워크플로가 일시중지되었고 대기 중이라고 표시됩니다.

    Execute steps here before waiting for callback from sheets
    ...
    Started waiting for callback from sheet 1JlNFFnqs760M_KDqeeeDc_qtrABZDxoalyCmRE39dpM
  5. 워크플로에서 스프레드시트의 행에 콜백 세부정보를 기록했는지 확인합니다.

    예를 들어 실행 ID 열에 워크플로 실행 ID, 콜백 URL 열에 콜백 엔드포인트, 승인 여부 열에 FALSE가 표시됩니다.

  6. 스프레드시트에서 FALSEFALSE로 변경합니다.

    1~2분 후에 실행이 재개되고 실행 상태가 성공으로 완료됩니다.

gcloud

  1. 터미널을 엽니다.

  2. 워크플로를 실행합니다.

      gcloud workflows run workflows-awaits-callback-sheets

    워크플로가 시작되고 출력에 워크플로가 일시중지되고 대기 중인 것으로 표시됩니다.

      Waiting for execution [a8361789-90e0-467f-8bd7-ea1c81977820] to complete...working.

  3. 워크플로에서 스프레드시트의 행에 콜백 세부정보를 기록했는지 확인합니다.

    예를 들어 실행 ID 열에 워크플로 실행 ID, 콜백 URL 열에 콜백 엔드포인트, 승인 여부 열에 FALSE가 표시됩니다.

  4. 스프레드시트에서 FALSEFALSE로 변경합니다.

    1~2분 후에 실행이 재개되고 실행 상태가 SUCCEEDED로 완료됩니다.

삭제

이 튜토리얼용으로 새 프로젝트를 만든 경우 이 프로젝트를 삭제합니다. 기존 프로젝트를 사용한 경우 이 튜토리얼에 추가된 변경사항은 제외하고 보존하려면 튜토리얼용으로 만든 리소스를 삭제합니다.

프로젝트 삭제

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

프로젝트를 삭제하는 방법은 다음과 같습니다.

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

이 튜토리얼에서 만든 리소스 삭제

  1. Google Drive에서 파일 삭제
  2. 워크플로를 삭제합니다.

다음 단계