1단계: Portal에서 원격 서비스(Azure 함수) 만들기
1단계: Portal에서 원격 서비스(Azure 함수) 만들기
이 문서는 외부 함수의 원격 서비스로 사용할 Azure Function을 만드는 방법을 자세히 설명해요. JavaScript 함수로 구현된 원격 서비스를 만들고, HTTP 트리거 함수를 추가하고, Azure AD 인증을 설정하는 흐름을 따라가요.
본문
이 주제는 외부 함수의 원격 서비스로 사용할 Azure Function을 만드는 상세 지침을 제공해요.
이전 단계
Azure용 외부 함수 계획하기
Azure functions 앱 만들기
원격 서비스를 만드는 방법은 여러 가지가 있어요. 이 섹션은 JavaScript 함수로 구현된 원격 서비스를 만드는 방법을 보여줘요.
이 외부 함수는 동기(synchronous) 방식이에요. 비동기(asynchronous) 외부 함수를 만드는 방법은 "Azure에서 비동기 함수 만들기"를 참고해요.
나중에 만들 함수들의 컨테이너로 사용할 Azure Functions 앱을 만들어요.
-
아직 하지 않았다면 Azure Portal에 로그인해요.
-
Microsoft 문서 "Azure Functions App"의 지침을 따라 Azure Functions 앱을 만들어요. 지침을 따르면서 다음을 기억하세요.
- Function App Name 필드에 이름을 입력할 때, 그 이름을 추적 워크시트의
Azure Function app name필드에도 기록해요.
- Function App Name 필드에 이름을 입력할 때, 그 이름을 추적 워크시트의
-
Publish 방법을 선택하라는 요청이 오면 Code를 선택해요.
-
같은 리소스 그룹에 여러 앱을 만들 때는 몇 가지 제한 사항이 적용돼요. 자세한 내용은 Microsoft 문서 "Azure app service"를 참고해요.
Snowflake는 Node.js로 된 샘플 "echo" 함수를 제공해요. 이 샘플 함수로 시작하려면:
-
Runtime stack을 요청받으면 Node.js를 선택해요. -
Node.js 버전을 요청받으면 버전 12를 선택해요.
-
함수를 실행할 OS를 요청받으면 "Windows" 또는 "Linux"를 선택해요.
데모 함수만 만드는 경우 Snowflake는 "Windows"를 선택할 것을 권장해요. Linux Function Apps는 Azure Portal에서 편집할 수 없어요. 사용자는 Visual Studio Code 인터페이스를 통해 코드를 게시해야 해요.
-
Azure Function을 Microsoft Windows가 아니라 Linux에서 실행하고 싶다면 Microsoft 문서 "Azure Functions"를 참고해요. Azure Functions에서 "Consumption" 가격 플랜을 사용할 때는 Linux에서 Azure AD 인증을 사용할 수 없어요. Azure AD로 인증하려면 "App Service" 가격 플랜이나 "Premium" 가격 플랜을 사용해야 해요. 자세한 내용은 Microsoft 문서 "Azure AD"를 참고해요.
HTTP 트리거 Azure 함수 만들기
Azure Functions 앱(컨테이너)을 만든 후에는 컨테이너 안에 Azure Function을 만들어야 해요. 이 함수가 원격 서비스 역할을 해요.
Microsoft는 Azure Functions를 여러 방식으로 호출("트리거")할 수 있게 해요. Snowflake 외부 함수는 HTTP POST 명령을 통해 원격 서비스를 호출하므로, 만드는 Azure Function은 "HTTP-triggered function"(HTTP 트리거 함수)이어야 해요.
팁
Microsoft가 제공하는 지침을 사용해 HTTP 트리거 함수를 만들 수 있어요.
- Create an app portal
- Create an Azure function
하지만 Snowflake는 추가 세부 사항과 샘플 코드를 포함하고 Microsoft와 다른 권한 부여 수준을 제안하는 커스텀 지침을 제공해요. Microsoft 지침 대신 커스텀 지침을 사용할 것을 권장해요.
함수 만들기
이 섹션에 설명된 작업을 수행하려면 Azure Portal의 Function App 화면에 있어야 해요. Azure Functions 앱의 이름이 보통 화면 왼쪽 위 근처에 표시돼야 해요.
HTTP 트리거 함수를 만들려면:
-
왼쪽 메뉴 트리에서 Functions라는 섹션을 찾아요. 그 섹션에서 Functions라고 표시된 항목을 클릭해 함수를 추가해요.
-
- Add 버튼을 클릭해요.
-
오른쪽의 가능한 트리거 목록에서 HTTP trigger를 선택해요.
-
HTTP 트리거 함수에 사용할 이름을 입력해요. 이 이름을 추적 워크시트의
HTTP-Triggered Function name필드에 기록해요. -
Authorization level(권한 부여 수준)을 입력해요. Snowflake는 권한 부여 수준으로 Function을 선택할 것을 권장해요. 가능한 권한 부여 수준에 대한 자세한 내용은 Microsoft 문서 "HTTP-triggered functions"를 참고해요.
-
Add라는 버튼을 클릭해요. 함수 이름과 그 아래에 Function이라는 단어가 표시되는 화면으로 이동해요.
-
왼쪽 트리 메뉴에서 Code + Test를 클릭해요.
-
기본 코드를 자신의 코드로 바꿔요.
JavaScript "echo" 함수용 샘플 코드가 아래에 제공돼요. 이 함수는 각 행을 읽은 다음 행을 출력(결과)으로 복사해요. 행 번호도 출력에 포함돼요. 출력은 다단계 사전(multi-level dictionary)의 일부로 반환돼요.
이 함수는 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."
};
}
};
- 코드 위의 Save 버튼을 클릭해요.
함수 테스트하기
방금 만든 HTTP 트리거 Azure Function을 테스트하려면 다음 샘플 데이터를 Body 필드에 붙여넣고 Test/Run 버튼을 클릭해요:
{
"data": [ [ 0, 43, "page" ], [ 1, 42, "life, the universe, and everything" ] ]
}
출력 내용은 다음처럼 보여야 해요:
{ "data":
[
[ 0, [ 0, 43, "page" ] ],
[ 1, [ 1, 42, "life, the universe, and everything" ] ]
]
}
서식은 위에 표시된 것과 다를 수 있어요.
Azure functions 앱의 권한 부여 요구 사항 설정하기
외부 함수가 호출되면 Snowflake는 프록시 서비스(예: Azure API Management 서비스)에 HTTP POST 명령을 보내고, 프록시 서비스는 POST를 원격 서비스(예: Azure Function)로 중계해요.
이 두 단계 각각에 권한 부여 요구 사항이 있어야 하므로, 보통 다음을 지정해요.
-
API Management 서비스를 호출하는 데 필요한 권한 부여.
-
Azure Function을 포함한 Azure Functions 앱에서 함수를 호출하는 데 필요한 권한 부여.
이 섹션은 Azure Functions 앱에 인증을 요구하는 방법을 설명해요. API Management 서비스는 나중에 만들어지므로 그 권한 부여 요구 사항도 나중에 지정해요.
Snowflake가 Azure Functions 앱과 인증할 때 Snowflake는 Azure AD와 함께 OAuth 클라이언트 자격 증명 부여 흐름(client credential grant flow)을 사용해요.
클라이언트 자격 증명 부여 흐름에 대한 자세한 내용은 Microsoft 문서 "client credential"을 참고해요: https://docs.microsoft.com/en-us/azure/active-directory/azuread-dev/v1-oauth2-client-creds-grant-flow
이 클라이언트 자격 증명 흐름에는 Azure Functions 앱을 나타내는 Azure AD 앱 등록이 필요해요.
이 섹션은 Azure Functions 앱용 Azure AD 앱 등록을 만드는 지침을 포함해요. 예를 들어 Azure Functions 앱이 Azure AD 인증을 요구하도록 설정할 수 있어요. Azure AD를 통한 권한 부여를 구성하려면 다음을 해야 해요:
-
Azure AD 앱 등록을 만들어요. 이는 보호하려는 대상(identity 또는 resource identifier)을 나타내는 Azure AD 기반 엔터티예요.
-
Azure AD 앱 등록을 인증을 요구하려는 Azure Functions 앱과 연결해요.
주의
Azure Functions의 경우 Azure AD 앱 등록을 만드는 가장 빠른 방법은 아래에 설명된 대로 서비스에 대해 Azure AD 인증을 활성화하는 거예요. Azure Function이 아닌 다른 원격 서비스를 사용하는 경우, App registrations 페이지를 사용해 원격 서비스용 새 Azure AD 앱 등록을 만들어요.
앱 등록에 대한 자세한 내용은 Microsoft 문서 "app registration documentation"을 참고해요: https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-register-app
Azure functions 앱에서 앱 서비스 인증 활성화하기
아래 단계를 실행하기 전에 Azure Functions 앱의 Function App 화면에 있어야 해요.
-
왼쪽 메뉴 창에서 Settings라는 섹션을 찾아 Authentication을 클릭해요. 왼쪽 여백에 Developer 메뉴(Code + Test, Integration 등)가 보이고 화면 아래에 스크롤 막대가 있다면, 스크롤 막대를 왼쪽으로 밀어 Function App 또는 App Service 섹션으로 돌아간 다음 Settings를 찾아요.
-
Add identity provider 버튼을 클릭해요.
-
Identity provider 드롭다운 메뉴에서 Microsoft를 선택해요.
-
App registration type에서 Create new app registration을 선택해요.
-
Name 필드에 앱 이름을 입력해요.
-
Supported account types에서 Current tenant - Single tenant를 선택해요.
-
Restrict access에서 Require authentication을 선택해요.
-
Unauthenticated requests에서 HTTP 401 Unauthorized를 선택해요.
-
Next: Permissions를 클릭해요. 권한을 검토해요.
-
Add를 클릭해요. 새 Azure AD 애플리케이션이 만들어지고 애플리케이션 페이지가 표시돼요.
-
애플리케이션 이름을 보여주는 링크를 클릭해 Azure AD 애플리케이션 페이지로 이동해요.
-
Application (client) ID 필드를 찾아요.
이 ID를 추적 워크시트의 Azure Function App AD Application ID 필드에 기록해요.
중요
ID를 복사해야 하지 Azure AD 애플리케이션 이름을 복사하면 안 돼요. ID에는 UUID가 포함되어야 해요.
다음 단계
2단계: Portal에서 프록시 서비스(Azure API Management 서비스) 만들기