Cloud 함수 태스크

Cloud 함수 태스크를 사용하면 통합에서 Cloud Run 함수를 구성하고 실행할 수 있습니다. Cloud Run Functions는 Cloud Functions의 차세대 버전으로, Cloud Run 서버리스 플랫폼을 활용하여 향상된 제어 및 확장성을 갖춘 이벤트 기반 프로그래밍 모델을 제공합니다. Cloud Run Functions는 모든 워크로드 유형에 단일 서버리스 솔루션을 제공합니다.

Cloud Functions 작업은 다음 버전의 Cloud Run Functions를 지원합니다.

Cloud Run Functions 버전 간 차이점에 대한 자세한 내용은 Cloud Functions 비교 가이드를 참고하세요.

시작하기 전에

Cloud 함수 태스크를 구성하기 전에 Google Cloud 프로젝트에서 다음 태스크를 수행해야 합니다.

  1. Cloud Function에 연결하려면 OAuth 2.0 프로필을 만들었거나 통합에 사용자 관리형 서비스 계정을 연결했는지 확인합니다.
    • 통합에 연결된 서비스 계정이 있는 경우 해당 서비스 계정에 Cloud 함수 호출자 IAM 역할을 할당합니다.

      서비스 계정에 역할 부여에 대한 자세한 내용은 서비스 계정에 대한 액세스 관리를 참조하세요.

    • Cloud 함수 태스크에서는 Google OIDC ID 토큰 유형의 인증 프로필만 지원합니다. Cloud 함수 호출자 IAM 역할이 할당된 서비스 계정을 사용하여 Google OIDC ID 토큰 유형의 인증 프로필을 만듭니다. Cloud 함수 태스크에 인증이 필요하지 않으면 태스크 구성 창의 인증 프로필 필드를 비워 둘 수 있습니다.

    통합에 OIDC ID 프로필과 사용자 관리형 서비스 계정이 모두 구성된 경우 기본적으로 OIDC ID 프로필이 인증에 사용됩니다. OIDC ID 프로필 또는 사용자 관리형 서비스 계정이 모두 구성되어 있지 않으면 기본 서비스 계정(service-PROJECT_NUMBER@gcp-sa-integrations.iam.gserviceaccount.com)이 Cloud 함수 태스크를 호출하는 데 사용됩니다.

  2. Google Cloud 프로젝트에서 Application Integration에 VPC 서비스 제어가 설정되지 않았는지 확인합니다.

Cloud 함수 태스크 구성

통합에서 Cloud 함수 태스크를 구성하려면 다음 단계를 수행합니다.

  1. 탐색 메뉴에서 통합을 클릭합니다.

    그러면 Application Integration UI에서 사용 가능한 통합 목록이 열립니다.

  2. 기존 통합을 선택하거나 통합 만들기를 클릭합니다.

    새 통합을 만드는 경우 만들기 대화상자에 이름과 설명을 입력하고 만들기를 클릭합니다.

  3. 태스크 드롭다운에서 Cloud 함수를 클릭하여 통합 편집기에 배치합니다.
  4. 디자이너에서 Cloud 함수 요소를 클릭하여 구성 창을 연 다음 Cloud 함수 구성을 클릭합니다.
  5. 서비스 계정에 권한을 부여하라는 메시지가 표시되면 권한 부여를 클릭합니다.

    Application Integration은 서비스 계정에 필요한 권한을 자동으로 부여합니다.

  6. Cloud 함수 구성 창에서 다음 옵션 중 하나를 선택합니다.
    • 기존 함수 연결: 기존 함수를 통합과 연결하려면 이 옵션을 선택합니다. 통합에서 Cloud Functions (1세대)와 Cloud Functions v2 API로 만든 Cloud Functions를 연결할 수 있습니다.
      • Cloud 함수 트리거 URL 필드에 기존 함수의 트리거 URL을 입력합니다.

        URL은 다음 형식 중 하나를 따라야 합니다.

        # For Cloud Functions (1st gen)
        https://REGION_NAME-PROJECT_ID.cloudfunctions.net/FUNCTION_NAME
        # For Cloud Run functions created using the Cloud Functions v2 API
        https://FUNCTION_NAME-PROJECT_ID.REGION_NAME.run.app

    • 새 함수 만들기: 통합을 위한 새 함수를 만들려면 이 옵션을 선택합니다.
      1. 함수 이름 필드에 새 Cloud Run 함수의 고유한 이름을 입력합니다.
      2. 리전 드롭다운에서 Cloud Run Functions가 배포된 리전을 선택합니다.
      3. 함수 버전 드롭다운에서 원하는 Cloud Run 함수 버전을 선택합니다.
        • Cloud Functions(1세대): .cloudfunctions.net 엔드포인트 형식을 사용하는 Cloud Run Functions의 기존 버전입니다(이전 명칭: Cloud Functions(1세대)).
        • Cloud Functions (최신 세대): Cloud Functions v2 API를 사용하여 만든 Cloud Run Functions의 최신 버전입니다. Cloud Run 및 Eventarc를 기반으로 빌드되었으며, 확장된 요청 제한 시간 (최대 60분)을 지원하고, 동시 실행을 늘리고, .cloudfunctions.net.run.app 엔드포인트 형식을 모두 사용합니다.
        • 두 버전의 차이점에 대한 자세한 내용은 Cloud Functions 비교를 참고하세요.
  7. 저장을 클릭합니다.
  8. Application Integration에서 Cloud 함수 태스크를 구성하면 Google Cloud 프로젝트에서 기본 HTTP 트리거 Cloud Run 함수가 생성됩니다.

Cloud 함수 템플릿

다음 샘플에서는 다양한 언어로 통합에서 Cloud 함수 작업을 사용하는 방법을 보여줍니다.

Python

기존 Cloud Run Functions를 사용하여 Cloud 함수를 구성할 때는 함수의 main.py, task.py, requirements.txt 소스 파일이 다음과 같은 형식이어야 합니다.

task.py

      # Sample Code:
      # print(event.get('task_string_key'))
      # event.set('task_int_array_key', [456, 789]);
      # event.log('some logging')

      def run(event):
        """Actual cloud function custom logic.
        Args:
          event : event object in main.py that contains all parameters.
        """
        return
    

main.py

      """Un-editable platform wrapper which invokes user code."""
    import traceback

    from flask import json
    from flask import jsonify
    from task import run

    VALUE_NAME = [
        'stringValue', 'intValue', 'doubleValue', 'booleanValue', 'protoValue'
    ]
    ARRAY_VALUE_NAME = {
        'stringArray': 'stringValues',
        'intArray': 'intValues',
        'doubleArray': 'doubleValues',
        'booleanArray': 'booleanValues',
        'protoArray': 'protoValues'
    }
    VALUE_TYPE_URL = 'type.googleapis.com/google.protobuf.Value'
    CLOUD_FUNCTION_EXCEPTION_KEY = 'CloudFunctionException'
    CLOUD_FUNCTION_LOGGING_KEY = 'CloudFunctionLogging'


    class _Event(object):
      """Event object."""

      def __init__(self, json_payload):
        self._event_params = json_payload.get('eventParameters', dict())
        self._task_params = json_payload.get('taskParameters', dict())
        self._log = []
        print('Event param is ' + str(self._event_params))
        print('Task param is ' + str(self._task_params))

      def set(self, key, value):
        """Set the event parameters key-value.

        Args:
          key: parameter key.
          value: parameter value.
        """
        new_param = self._create_param(key, value)
        param = self._get_param_by_key(key)
        if param is None:
          if 'parameters' not in self._event_params:
            self._event_params['parameters'] = []
          self._event_params['parameters'].append(new_param)
        else:
          param['value'] = new_param['value']

      def _create_param(self, key, value):
        """Create a new parameter with given key value pair.

        Args:
          key: parameter key.
          value: parameter value.

        Returns:
          parameter.
        """
        new_param = {}
        new_param['key'] = key
        if isinstance(value, str):
          new_param['value'] = {'stringValue': value}
        elif isinstance(value, int):
          new_param['value'] = {'intValue': value}
        elif isinstance(value, float):
          new_param['value'] = {'doubleValue': value}
        elif isinstance(value, bool):
          new_param['value'] = {'booleanValue': value}
        elif isinstance(value, dict):
          if 'type@' in value:
            new_param['value'] = {'protoValue': value}
          else: