연습 - Durable Functions를 사용하여 워크플로 만들기

완료됨

이 연습에서는 이전 단원의 예제 시나리오를 통해 Durable Functions를 사용하여 Azure Portal에서 승인 워크플로를 만드는 방법을 알아봅니다.

함수 앱 만들기

  1. 샌드박스를 활성화하는 데 사용한 동일한 계정으로 Azure Portal에 로그인합니다.

  2. Azure Portal 메뉴 또는 페이지의 Azure 서비스에서 리소스 만들기를 선택합니다. 리소스 만들기 창이 나타납니다.

  3. 함수 앱을 검색하여 선택합니다. 소비를 선택한 다음 선택 단추를 선택합니다. 함수 앱 만들기 창이 나타납니다.

  4. 기본 탭에서 각 설정에 다음 값을 입력합니다.

    설정 설명
    프로젝트 세부 정보
    구독 컨시어지 구독 이 새 함수 앱이 만들어질 구독을 지정합니다.
    리소스 그룹 드롭다운 목록에서 [샌드박스 리소스 그룹 이름]을 선택합니다. 함수 앱을 만들 리소스 그룹의 이름을 지정합니다. [샌드박스 리소스 그룹 이름] 샌드박스를 활성화할 때 할당된 샌드박스 리소스 그룹에서 함수 앱을 만들겠습니다.
    인스턴스 세부 정보
    함수 앱 이름 [전역적으로 고유한 이름] 새 함수 앱을 식별하는 이름을 지정합니다. 유효한 문자는 a-z, 0-9-입니다.
    게시 ‘코드’ 함수가 컨테이너 대신 코드를 사용하도록 지정합니다.
    런타임 스택 Node.js 이 모듈의 샘플 코드가 JavaScript로 작성되도록 지정합니다.
    버전 20 LTS 런타임 스택의 버전을 지정합니다.
    지역 [이 섹션 다음 목록에서 선택] 다음의 허용되는 샌드박스 지역 중 하나이면서 가장 가까운 지역을 선택하세요.
    운영 체제
    운영 체제 Windows 함수 앱을 호스트하는 운영 체제를 지정합니다.
    계획

    무료 샌드박스를 사용하면 Azure 글로벌 지역의 일부 하위 지역에 리소스를 만들 수 있습니다. 리소스를 만들 때 다음 목록에서 지역을 선택합니다.

    • 미국 서부 2
    • 미국 중남부
    • 미국 중부
    • 미국 동부
    • 서유럽
    • 동남 아시아
    • 일본 동부
    • 브라질 남부
    • 오스트레일리아 남동부
    • 인도 중부
  5. 다음: 스토리지를 선택합니다.

  6. 보안 탭에서 각 설정에 다음 값을 입력합니다.

    설정 설명
    스토리지
    스토리지 계정 [전역적으로 고유한 이름] 함수 앱에서 사용하는 새 스토리지 계정의 이름을 지정합니다(함수에 대해 지정한 전역적으로 고유한 이름과 일치하지 않아도 됨). 스토리지 계정 이름은 3자에서 24자 사이여야 하고 숫자 및 소문자만 포함할 수도 있습니다. 이 대화 상자는 동적으로 생성되는 고유 이름을 필드에 자동으로 채웁니다. 하지만 다른 이름이나 기존 계정을 사용해도 됩니다.
  7. 다음: 네트워킹을 선택합니다. 기본값을 그대로 적용합니다.

  8. 다음: 모니터링을 선택합니다.

  9. 모니터링 탭에서 설정에 다음 값을 입력합니다.

    설정 Description
    Application Insights
    Application Insights 사용 문제 이 모듈에 대해 Application Insights를 사용하지 않도록 지정합니다.
  10. 검토 + 만들기를 선택하고 구성한 옵션을 검토합니다. 옵션에 만족하는 경우 만들기를 선택하여 함수 앱을 프로비저닝하고 배포합니다.

배포가 완료될 때까지 기다린 후 계속합니다. 배포에는 몇 분 정도 걸릴 수 있습니다.

durable-functions npm 패키지 설치

JavaScript Durable Functions를 만들려고 하므로 durable-functions npm 패키지를 설치해야 합니다. 그렇게 하려면 다음 단계를 수행합니다.

  1. 리소스로 이동을 선택하여 함수 앱을 선택합니다. 함수 앱 창이 나타납니다.

  2. 왼쪽 메뉴 창의 개발 도구에서 App Service 편집기(미리 보기)를 선택한 후 편집기 열기을 선택합니다. App Service 편집기 빠른 시작 창이 새 브라우저 창에 나타납니다.

  3. 왼쪽 메뉴 창에서 WWWROOT 폴더를 강조 표시합니다.

  4. 왼쪽 도구 모음 메뉴에서 콘솔 열기를 선택합니다.

    그러면 콘솔이 시작됩니다. 이 콘솔을 사용하여 함수를 호스팅하는 웹 서버에 액세스하고, 함수에 대한 코드를 작성할 수 있습니다.

  5. package.json 파일을 만듭니다.

    • 콘솔에서 다음 명령을 실행하여 새 JSON 파일을 만들고 편집기에서 엽니다.

      touch package.json
      open package.json
      
    • 다음 코드를 추가합니다.

      {
        "name": "example",
        "version": "1.0.0"
      }
      

      example을 패키지의 이름으로 바꿉니다. 예를 들어 이전에 함수에 대해 지정한 전역적으로 고유한 이름을 사용할 수 있습니다.

  6. Ctrl+S를 선택하여 파일을 저장한 다음 Ctrl+Q를 선택하여 문서를 닫습니다.

  7. Azure Portal로 다시 전환합니다.

  8. 왼쪽 메뉴 모음의 개발 도구에서 콘솔을 선택합니다. 함수 앱에 대한 콘솔 창이 나타납니다.

  9. 다음 명령을 실행합니다.

    npm install durable-functions
    

    이 명령은 노드 패키지 관리자에게 durable-functions 패키지와 필요한 모든 종속성을 설치하도록 지시합니다. 설치를 완료하는 데 몇 분 정도 걸릴 수 있으며, 노드 패키지 관리자가 일부 경고를 표시하는 경우 무시해도 됩니다.

    참고 항목

    최신 버전의 npm을 설치하라는 메시지가 표시되면 오류에 지정된 명령을 사용하여 최신 버전을 설치한 다음, 새 버전이 설치되면 durable-functions 패키지를 설치합니다.

    모든 패키지 설치가 완료될 때까지 기다립니다.

  10. 왼쪽 메뉴 창에서 위로 스크롤하여 개요를 선택한 다음 위쪽 메뉴 모음에서 다시 시작을 선택하고, 다시 시작하라는 메시지가 표시되면 를 선택합니다.

    계속하기 전에 다시 시작이 완료될 때까지 기다립니다.

디자인 제안서를 제출하기 위한 클라이언트 함수 만들기

  1. Azure Portal 메뉴 또는 페이지의 최근 리소스에서 모두 보기를 선택한 후 함수 앱을 선택합니다. 함수 앱 창이 나타납니다.

  2. 개요 페이지에서 화면 가운데에 있는 함수 탭을 선택합니다.

  3. Azure Portal에서 만들기 단추를 선택합니다. 함수 만들기 창이 나타납니다.

  4. 템플릿 선택 아래의 필터 상자에 Durable Functions HTTP starter를 입력하고 목록에서 해당 템플릿을 선택합니다. 이 템플릿은 HTTP 요청에 대한 응답으로 실행되는 지속성 함수를 만듭니다.

  5. 템플릿 세부 정보에서 새 함수 필드에 함수 이름으로 HttpStart를 입력하고 권한 부여 수준 필드에 함수를 선택한 다음, 만들기를 선택합니다. 함수에 대한 HttpStart 창이 나타납니다.

  6. 왼쪽 탐색 창의 개발자에서 코드 + 테스트를 선택합니다. 함수의 코드+ 테스트 창이 나타납니다.

    index.js 파일의 코드가 편집기에 표시됩니다. 파일은 다음 예제와 비슷할 것입니다.

    const df = require("durable-functions");
    
    module.exports = async function (context, req) {
        const client = df.getClient(context);
        const instanceId = await client.startNew(req.params.functionName, undefined, req.body);
    
        context.log(`Started orchestration with ID = '${instanceId}'.`);
    
        return client.createCheckStatusResponse(context.bindingData.req, instanceId);
    };
    
  7. 함수 내 파일에 대한 드롭다운 목록에서 function.json을 선택하여 새 함수와 연결된 바인딩을 확인합니다. 이 정보는 함수를 트리거할 수 있는 HTTP 메서드와 함께 인증 요구 사항을 지정합니다. 또한 이 파일은 함수가 오케스트레이션 프로세스를 시작하는 클라이언트임을 지정합니다. 파일은 다음 예제와 비슷할 것입니다.

    {
      "bindings": [
        {
          "authLevel": "function",
          "name": "req",
          "type": "httpTrigger",
          "direction": "in",
          "route": "orchestrators/{functionName}",
          "methods": [
            "post",
            "get"
          ]
        },
        {
          "name": "$return",
          "type": "http",
          "direction": "out"
        },
        {
          "name": "starter",
          "type": "orchestrationClient",
          "direction": "in"
        }
      ]
    }
    

    참고 항목

    바인딩은 리소스 및 다른 항목을 트리거와 연결합니다. 이는 사용자의 코드에 있는 다른 서비스 및 함수에 대한 참조를 하드코딩할 필요를 없애주는 선언적 메커니즘입니다.

오케스트레이터 함수 만들기

  1. Azure Portal 메뉴 또는 페이지의 최근 리소스에서 모두 보기를 선택한 후 함수 앱을 선택합니다. 함수 앱 창이 나타납니다.

  2. 개요 페이지에서 화면 가운데에 있는 함수 탭을 선택합니다.

  3. 함수 메뉴 모음에서 만들기를 선택합니다. 함수 만들기 창이 나타납니다.

  4. 템플릿 선택 아래의 필터 상자에 Durable Functions 오케스트레이터를 입력하고 목록에서 해당 템플릿을 선택합니다. 이 템플릿은 함수의 실행을 오케스트레이션하는 지속성 함수를 만듭니다.

  5. 템플릿 세부 정보에서 새 함수 필드에 함수 이름으로 OrchFunction을 입력한 다음 만들기를 선택합니다. OrchFunction 함수 창이 나타납니다.

  6. 왼쪽 탐색 창의 개발자에서 코드 + 테스트를 선택합니다. 함수의 코드+ 테스트 창이 나타납니다.

    index.js 파일의 코드가 편집기에 표시됩니다.

  7. 기존 코드를 다음 코드로 바꿉니다.

    const df = require("durable-functions");
    
    module.exports = df.orchestrator(function* (context) {
        const outputs = [];
    
        /*
        * We will call the approval activity with a reject and an approved to simulate both
        */
    
        outputs.push(yield context.df.callActivity("Approval", "Approved"));
        outputs.push(yield context.df.callActivity("Approval", "Rejected"));
    
        return outputs;
    });
    

    이 코드는 곧 만들게 될 승인이라는 활동 함수를 호출합니다. 오케스트레이터 함수의 코드는 Approval 함수를 두 번 호출합니다. 처음에는 제안 수락을 시뮬레이션하고 두 번째는 제안 거부 논리를 테스트합니다.

    각 호출이 반환하는 값이 결합되고 다시 클라이언트 함수로 전달됩니다. 프로덕션 환경에서 오케스트레이션 함수는 수락/거부 결정을 만드는 일련의 활동 함수를 호출하고 이러한 활동의 결과를 반환합니다.

  8. 위쪽 메뉴 모음에서 저장을 선택하여 새 함수를 저장합니다.

활동 함수 만들기

  1. Azure Portal 메뉴 또는 페이지의 최근 리소스에서 모두 보기를 선택한 후 함수 앱을 선택합니다. 함수 앱 창이 나타납니다.

  2. 개요 페이지에서 화면 가운데에 있는 함수 탭을 선택합니다.

  3. 함수 메뉴 모음에서 만들기를 선택합니다. 함수 만들기 창이 나타납니다.

  4. 템플릿 선택 아래의 필터 상자에 Durable Functions activity를 입력하고 목록에서 해당 템플릿을 선택합니다. 이 템플릿은 오케스트레이터 함수에 의해 작업이 호출될 때 실행되는 지속성 함수를 만듭니다.

  5. 템플릿 세부 정보에서 새 함수 필드에 함수 이름으로 Approval을 입력한 다음 만들기를 선택합니다. 함수 앱에 대한 승인 창이 나타납니다.

  6. 왼쪽 탐색 창의 개발자에서 코드 + 테스트를 선택합니다. 함수의 코드+ 테스트 창이 나타납니다.

    index.js 파일의 코드가 편집기에 표시됩니다.

  7. 기존 코드를 다음 코드로 바꿉니다.

    module.exports = async function (context) {
        return `Your project design proposal has been -  ${context.bindings.name}!`;
    };
    

    이 함수가 제안서의 상태를 나타내는 메시지를 반환합니다. context.bindings.name 식은 오케스트레이터에서 함수에 전달된 매개 변수에 따라 Accepted 또는 Rejected 중 하나가 됩니다. 실제 시나리오에서는 작업의 수락 또는 거부를 처리하는 논리를 이 함수에 추가하게 됩니다.

  8. 위쪽 메뉴 모음에서 저장을 선택하여 새 함수를 저장합니다.

Durable Functions 워크플로가 시작되는지 확인

  1. Azure Portal 메뉴 또는 페이지의 최근 리소스에서 모두 보기를 선택한 후 함수 앱을 선택합니다. 함수 앱 창이 나타납니다.

  2. 페이지 가운데에 있는 함수 탭을 선택합니다.

  3. HttpStart 함수를 선택합니다. 함수에 대한 HttpStart 창이 나타납니다.

  4. 위쪽 메뉴 모음에서 함수 URL 가져오기를 선택하고 URL을 복사합니다. URL은 다음 예제와 비슷할 것입니다.

    https://example.azurewebsites.net/api/orchestrators/{functionName}?code=AbCdEfGhIjKlMnOpQrStUvWxYz==
    

    이 URL을 사용하여 함수를 실행합니다.

  5. 새 브라우저 창을 열고 복사한 URL로 이동합니다. URL에서 다음 예와 비슷하게 {functionName} 자리 표시자를 OrchFunction으로 바꿉니다.

    https://example.azurewebsites.net/api/orchestrators/OrchFunction?code=AbCdEfGhIjKlMnOpQrStUvWxYz==
    

    응답 메시지에는 실행을 모니터링하고 관리하기 위해 사용할 수 있는 URI 엔드포인트 세트가 포함되어 있으며, 다음 예제와 비슷할 것입니다.

    {
      "id": "f0e1d2c3b4a5968778695a4b3c2d1e0f",
      "statusQueryGetUri": "https://example.azurewebsites.net/...",
      "sendEventPostUri": "https://example.azurewebsites.net/...",
      "terminatePostUri": "https://example.azurewebsites.net/...",
      "rewindPostUri": "https://example.azurewebsites.net/...",
      "purgeHistoryDeleteUri": "https://example.azurewebsites.net/..."
    }
    
  6. statusQueryGetUri 값을 복사하고 웹 브라우저를 사용하여 이 URL로 이동합니다. 다음 예제와 비슷한 응답 메시지가 표시됩니다.

    {
      "name": "OrchFunction",
      "instanceId": "f0e1d2c3b4a5968778695a4b3c2d1e0f",
      "runtimeStatus": "Completed",
      "input": null,
      "customStatus": null,
      "output": [
        "Your project design proposal has been -  Approved!",
        "Your project design proposal has been -  Rejected!"
      ],
      "createdTime": "2019-04-16T15:23:03Z",
      "lastUpdatedTime": "2019-04-16T15:23:35Z"
    }
    

    오케스트레이션 함수가 활동 함수를 두 번 실행한다는 점을 기억하세요. 처음에는 작업 함수가 프로젝트 제안이 수락되었음을 나타냅니다. 두 번째에는 제안이 거부됩니다. 오케스트레이션 함수는 두 함수 호출의 메시지를 결합하여 클라이언트 함수로 반환합니다.