1단계: Portal에서 원격 서비스(Azure 함수) 만들기

이 항목에서는 외부 함수에 대한 원격 서비스로 사용할 Azure 함수를 만들기 위한 자세한 지침을 제공합니다.

이 항목의 내용:

Azure Functions 앱 만들기

원격 서비스를 만들 수 있는 방법은 여러 가지가 있습니다. 이 섹션에서는 JavaScript 함수로 구현되는 원격 서비스를 만드는 방법을 보여줍니다.

이 외부 함수는 동기식입니다. 비동기 외부 함수를 만드는 방법에 대한 자세한 내용은 Azure에서 비동기 함수 만들기 를 참조하십시오.

나중에 만드는 함수의 컨테이너 역할을 할 Azure Functions 앱을 만듭니다.

  1. Azure Portal에 아직 로그인하지 않았다면 로그인하십시오.

  2. Microsoft 설명서: Azure Functions App 의 지침에 따라 Azure Functions 앱을 만듭니다.

    지침을 따를 때 다음 사항을 기억하십시오.

    • Function App Name 필드에 이름을 입력할 때 추적 워크시트의 Azure Function app name 필드에도 해당 이름을 기록합니다.

    • Publish 방법을 선택하라는 메시지가 표시되면 Code 를 선택합니다.

    • 같은 리소스 그룹에서 여러 앱을 만들 때 몇 가지 제한 사항이 적용됩니다. 자세한 내용은 Microsoft 설명서: Azure 앱 서비스 를 참조하십시오.

    Snowflake는 Node.js에서 샘플 《echo》 함수를 제공합니다. 이 샘플 함수를 사용하여 시작하는 방법은 다음과 같습니다.

    • Runtime stack 을 묻는 메시지가 표시되면 Node.js를 선택합니다.

    • Node.js의 버전을 묻는 메시지가 표시되면 버전 12를 선택합니다.

    • 함수를 실행할 OS를 묻는 메시지가 표시되면 《Windows》 또는 《Linux》를 선택합니다.

      • 데모 함수만 만들 경우에는 《Windows》를 선택하는 것이 좋습니다.

        Azure Portal에서는 Linux 함수 앱을 편집할 수 없습니다. 사용자는 Visual Studio Code 인터페이스를 통해 코드를 게시해야 합니다.

      • Microsoft Windows가 아닌 Linux에서 Azure 함수를 실행하려면 Microsoft 설명서: Azure 함수 를 참조하십시오.

        Azure 함수에 대해 《사용》 가격 계획을 사용할 때는 Linux에서 Azure AD 인증을 사용할 수 없습니다. Azure AD에서 인증하려면 《앱 서비스》 가격 계획 또는 《프리미엄》 가격 계획을 사용해야 합니다.

        자세한 내용은 Microsoft 설명서: Azure AD 를 참조하십시오.

HTTP로 트리거되는 Azure 함수 만들기

Azure Functions 앱(컨테이너)을 만든 후 컨테이너에 Azure Function을 만들어야 합니다. 이 함수는 원격 서비스로 작동합니다.

Microsoft는 Azure 함수를 다양한 방식으로 호출(《트리거》)할 수 있도록 허용합니다. Snowflake 외부 함수는 HTTP POST 명령을 통해 원격 서비스를 호출하므로, 사용자가 만드는 Azure 함수는 《HTTP로 트리거되는 함수》여야 합니다.

Microsoft에서 제공하는 지침에 따라 HTTP로 트리거되는 함수를 만들 수 있습니다.

하지만 Snowflake는 추가 세부 정보와 샘플 코드를 포함한 사용자 지정 지침을 제공하고 Microsoft와 다른 인증 수준을 제안합니다. Microsoft의 지침 대신 사용자 지정 지침을 사용하는 것이 좋습니다.

함수 만들기

이 섹션에 설명된 작업을 수행하려면 Azure Portal의 Function App 화면에 있어야 합니다. Azure Functions 앱의 이름은 일반적으로 화면의 왼쪽 위 모서리 근처에 표시되어야 합니다.

HTTP로 트리거되는 함수를 만드는 방법은 다음과 같습니다.

  1. 왼쪽 메뉴 트리에서 Functions 라는 제목의 섹션을 찾습니다. 그 섹션에서 Functions 레이블이 지정된 항목을 클릭하여 함수를 추가합니다.

  2. + Add 버튼을 클릭합니다.

  3. 오른쪽의 잠재적 트리거 목록에서 HTTP trigger 를 선택합니다.

  4. HTTP로 트리거되는 함수에 사용할 이름을 입력합니다.

    추적 워크시트의 HTTP-Triggered Function name 필드에 이 이름을 기록합니다.

  5. Authorization level 을 입력합니다.

    Function 을 인증 수준으로 선택하는 것이 좋습니다.

    가능한 인증 수준에 대한 자세한 내용은 Microsoft 설명서: HTTP로 트리거되는 함수 를 참조하십시오.

  6. Add 라는 제목의 버튼을 클릭합니다.

    그러면 함수 이름과 그 아래에 Function 이라는 단어가 표시되는 화면으로 이동합니다.

  7. 왼쪽 트리 메뉴에서 Code + Test 를 클릭합니다.

  8. 기본 코드를 자체 코드로 바꿉니다.

    아래에 JavaScript 《echo》 함수의 샘플 코드가 제공됩니다.

    이 함수는 각 행을 읽은 다음, 해당 행을 출력(결과)에 복사합니다. 행 번호도 출력에 포함됩니다. 출력은 다단계 사전의 일부로 반환됩니다.

    이 함수는 Snowflake가 보내고 읽는 것과 똑같은 형식(JSON)의 데이터를 받고 반환합니다. 데이터 타입에 대한 자세한 내용은 원격 서비스 입력 및 출력 데이터 타입 을 참조하십시오.

    일반적으로, 이 함수는 HTTP 코드 200을 반환합니다. 함수로 전달되는 행이 없을 경우(즉, 요청 본문이 비어 있는 경우) 이 함수는 오류 코드 400을 반환합니다.

    module.exports = async function(context, request) {
        context.log('JavaScript HTTP trigger function processed a request.');
    
        if (request.body) {
            var rows = request.body.data;
            var results = [];
            rows.forEach(row => {
                results.push([row[0], row]);
            });
    
            results = {data: results}
            context.res = {
                status: 200,
                body: JSON.stringify(results)
            };
       }
       else {
           context.res = {
               status: 400,
               body: "Please pass data in the request body."
           };
       }
    };
    
    Copy
  9. 코드 위의 Save 버튼을 클릭합니다.

함수 테스트하기

방금 만든 HTTP로 트리거되는 Azure 함수를 테스트하려면 다음 샘플 데이터를 Body 필드에 붙여넣고 Test/Run 버튼을 클릭하십시오.

{
    "data": [ [ 0, 43, "page" ], [ 1, 42, "life, the universe, and everything" ] ]
}
Copy

출력 내용은 다음과 비슷해야 합니다.

{ "data":
    [
        [ 0, [ 0, 43, "page" ] ],
        [ 1, [ 1, 42, "life, the universe, and everything" ]  ]
    ]
}
Copy

형식은 위에 표시된 것과 다를 수 있습니다.

Azure Functions 앱에 대한 권한 부여 요구 사항 설정하기

외부 함수가 호출되면 Snowflake는 HTTP POST 명령을 프록시 서비스(예: Azure API Management 서비스)로 보내고, 이 서비스는 POST를 원격 서비스(예: Azure 함수)로 릴레이합니다.

이 두 단계에는 각각 권한 부여 요구 사항이 있어야 하므로, 일반적으로 다음 사항을 지정합니다.

  • API Management 서비스 호출에 필요한 권한 부여.

  • Azure Function이 포함된 Azure Functions 앱에서 함수 호출에 필요한 권한 부여.

이 섹션에서는 Azure Functions 앱에 대한 권한 부여를 요구하는 방법을 설명합니다. API Management 서비스는 나중에 만들어지므로, 해당 권한 부여 요구 사항 역시 나중에 지정됩니다.

Snowflake는 Azure Functions 앱으로 인증할 때 Azure AD와 함께 OAuth 클라이언트 자격 증명 부여 흐름을 사용합니다.

클라이언트 자격 증명 부여 흐름에 대한 자세한 내용은 Microsoft 설명서: 클라이언트 자격 증명 을 참조하십시오.

이 클라이언트 자격 증명 흐름에서는 Azure Functions 앱을 나타내는 Azure AD 앱 등록이 필요합니다.

이 섹션에는 Azure Functions 앱에 대한 Azure AD 앱 등록을 만드는 지침이 있습니다. 예를 들어, Azure Functions 앱에서 Azure AD 인증을 요구하도록 설정할 수 있습니다. Azure AD를 통해 권한 부여를 구성하려면 다음 작업을 수행해야 합니다.

  • ID 또는 리소스 식별자(즉, 보호하려는 대상)를 나타내는 Azure AD 기반 엔터티인 Azure AD 앱 등록을 만듭니다.

  • Azure AD 앱 등록을 인증을 요구하려는 Azure Functions 앱과 연결합니다.

참고

Azure 함수의 경우, Azure AD 앱 등록을 가장 빠르게 만드는 방법은 아래의 설명과 같이 서비스에 대해 Azure AD 인증을 사용하는 것입니다. Azure 함수 이외의 원격 서비스를 사용하는 경우에는 App registrations 페이지를 사용하여 원격 서비스를 위한 새 Azure AD 앱 등록을 만드십시오.

앱 등록에 대한 자세한 내용은 Microsoft 설명서:

앱 등록 설명서 를 참조하십시오.

Azure Functions 앱의 앱 서비스 인증 사용하기

아래 스테이지를 실행하기 전에 Azure Functions 앱의 Function App 화면에 있어야 합니다.

  1. 왼쪽 메뉴 창에서 Settings 로 명명된 섹션을 찾아 Authentication 을 클릭합니다.

    왼쪽 여백에 (Code + Test, Integration 등과 함께) Developer 메뉴가 표시되고 화면 하단에 스크롤 막대가 있는 경우, 스크롤 막대를 왼쪽으로 밀어 Function App 또는 App Service 섹션으로 돌아간 다음, Settings 를 찾습니다.

  2. Add identity provider 버튼을 클릭합니다.

  3. Identity provider 드롭다운에서 Microsoft 를 선택합니다.

  4. App registration type 에서 Create new app registration 을 선택합니다.

  5. Name 필드에 앱 이름을 입력합니다.

  6. Supported account types 에서 Current tenant - Single tenant 을 선택합니다.

  7. Restrict access 에서 Require authentication 을 선택합니다.

  8. Unauthenticated requests 에서 HTTP 401 Unauthorized 을 선택합니다.

  9. Next: Permissions 를 클릭합니다. 권한을 검토합니다.

  10. Add 를 클릭합니다. 새 Azure AD 애플리케이션이 생성되고 애플리케이션 페이지가 표시됩니다.

  11. Azure AD 애플리케이션 페이지로 이동하려면 애플리케이션 이름을 표시하는 링크를 클릭합니다.

  12. Application (client) ID 필드를 찾습니다.

    추적 워크시트의 Azure Function App AD Application ID 필드에 이 ID를 기록합니다.

    중요

    Azure AD 애플리케이션 이름이 아니라 ID를 복사해야 합니다. ID는 UUID를 포함해야 합니다.