체인의정석

MS-Azure 사용법 4) Azure Function 구현 본문

개발

MS-Azure 사용법 4) Azure Function 구현

체인의정석 2020. 10. 22. 17:50
728x90
반응형

Azure Functions Core Tools

Azure Functions Core Tools는 로컬 컴퓨터에서 Azure Funtions를 개발 및 테스트하는 데 사용할 수 있는 명령줄 도구 세트 입니다.

 

Core Tools는 다양한 함수 관련 기능을 제공하지만 주요 목적은 다음과 같습니다.

 

1. 로컬 컴퓨터에서 함수를 개발하는 데 필요한 파일 및 폴더 생성

2. 함수를 테스트하고 디버그 할 수 있도록 로컬에서 함수 실행

3. Azure에 함수 게시

 

func를 입력하면 다음과 같이 버전 정보 및 사용 설명서가 표시됩니다. 

 

로컬로 함수 만들기

Azure의 모든 함수는 함수 앱에 속합니다. 또한 앱의 모든 함수는 공통되는 구성 값을 공유하며 모두 동일한 언어 런타임용으로 빌드해야 합니다. 각 함수 앱은 독립적으로 구성 및 관리 할 수 있는 Azure 리소스 입니다.

 

1. func init을 사용하여 새 함수 프로젝트 만들기

새 함수 프로젝트를 만들 때는 func init을 실행합니다.

func init을 실행하면 언어를 선택하게 되고, 선택한 언어마다 다른 파일들이 생성됩니다. 이 때 host.json과 local.settings.json은 항상 제공되게 됩니다. 

 

host.json => 함수 앱에 대해 로깅 옵션과 같은 런타임 구성 값을 저장합니다. 이 파일에 저장된 설정은 로컬 및 Azure에서 함수를 실행할 때 모두 사용됩니다.

local.settings.json => CoreTools를 사용하여 로컬로 실행될 때만 함수 앱에 적용되는 구성 값을 저장합니다. 

 

해당 폴더를 열어서 확인해 보면 다음과 같습니다.

dlcho@Azure:~$ cat host.json
{
  "version": "2.0",
  "logging": {
    "applicationInsights": {
      "samplingSettings": {
        "isEnabled": true,
        "excludedTypes": "Request"
      }
    }
  },
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[1.*, 2.0.0)"
  }

logging옵션등을 확인할 수 있습니다.

wdlcho@Azure:~$ cat local.settings.json
{
  "IsEncrypted": false,
  "Values": {
    "FUNCTIONS_WORKER_RUNTIME": "node",
    "AzureWebJobsStorage": ""
  }
}

Runtime 설정이 node로 된것 과 같이 로컬에 대한 설정값을 볼 수 있습니다.

 

2. func new를 사용하여 새 함수 만들기

wdlcho@Azure:~$ func new
Select a number for template:
1. Azure Blob Storage trigger
2. Azure Cosmos DB trigger
3. Durable Functions activity
4. Durable Functions HTTP starter
5. Durable Functions orchestrator
6. Azure Event Grid trigger
7. Azure Event Hub trigger
8. HTTP trigger
9. IoT Hub (Event Hub)
10. Azure Queue Storage trigger
11. SendGrid
12. Azure Service Bus Queue trigger
13. Azure Service Bus Topic trigger
14. SignalR negotiate HTTP trigger
15. Timer trigger
Choose option: 8
HTTP trigger
Function name: [HttpTrigger] myHttpTriggerdFunction
Writing /home/wdlcho/myHttpTriggerdFunction/index.js
Writing /home/wdlcho/myHttpTriggerdFunction/function.json
The function "myHttpTriggerdFunction" was created successfully from the "HTTP trigger" template.

func new를 실행하면 새 함수 및 개발을 시작하는 데 필요한 모든 파일들이 만들어지게 됩니다.

사용할 함수 트리거의 종류와 이름을 지정하면 선택된 언어로 바로 게시할 수 있는 구현을 생성합니다. 여기서는 node를 사용하였으므로 index.js와 function.json이 생성된 것을 확인할 수 있습니다.

 

로컬로 함수 실행 

함수는 자체적으로 실행할 수 있는 프로그램이 아니며 함수 호스트에서 호스트 되어야 합니다. Azure에서 함수 앱은 시작 시 함수 호스트를 자동으로 실행합니다. 현재 사용중인 Core Tools를 사용하면 클라우드에 게시하기 전에 로컬에서 함수를 사용해 볼 수 있습니다. 

 

func start를 실행하면 

wdlcho@Azure:~$ func start

                  %%%%%%
                 %%%%%%
            @   %%%%%%    @
          @@   %%%%%%      @@
       @@@    %%%%%%%%%%%    @@@
     @@      %%%%%%%%%%        @@
       @@         %%%%       @@
         @@      %%%       @@
           @@    %%      @@
                %%
                %

Azure Functions Core Tools (2.7.2628 Commit hash: 42e149f5313330f1f0a5e721a7e59d9ef7d27e6f)
Function Runtime Version: 2.0.13907.0
AZURE_FUNCTIONS_ENVIRONMENT: Development
[10/22/20 8:47:55 AM] Building host: startup suppressed: 'False', configuration suppressed: 'False', startup operation id: 'd20cb855-3ccb-4c48-b83d-443911fc2210'
[10/22/20 8:47:55 AM] Reading host configuration file '/home/wdlcho/host.json'
.
.
.
Application started. Press Ctrl+C to shut down.

Http Functions:

        myHttpTriggerdFunction: [GET,POST] http://localhost:7071/api/myHttpTriggerdFunction

 

  다음과 같이 함수를 사용하는 데 필요한 url이 제공되게 됩니다. 이를 이용하여 curl과 같이 HTTP 호출을 수행하는 도구나 라이브러리를 사용하면 함수와 상호 작용할 수 있습니다.

 

Core Tools를 사용하여 로컬에서 함수 만들기

mkdir ~/example
cd ~/example

 

wdlcho@Azure:~/example$ func init
Select a number for worker runtime:
1. dotnet
2. node
3. python
4. powershell
Choose option: 2
node
Select a number for language:
1. javascript
2. typescript
Choose option: 1
javascript
Writing package.json
Writing .gitignore
Writing host.json
Writing local.settings.json
Writing /home/wdlcho/example/.vscode/extensions.json
wdlcho@Azure:~/example$ func new
Select a number for template:
1. Azure Blob Storage trigger
2. Azure Cosmos DB trigger
3. Durable Functions activity
4. Durable Functions HTTP starter
5. Durable Functions orchestrator
6. Azure Event Grid trigger
7. Azure Event Hub trigger
8. HTTP trigger
9. IoT Hub (Event Hub)
10. Azure Queue Storage trigger
11. SendGrid
12. Azure Service Bus Queue trigger
13. Azure Service Bus Topic trigger
14. SignalR negotiate HTTP trigger
15. Timer trigger
Choose option: 8
HTTP trigger
Function name: [HttpTrigger] example-function
Writing /home/wdlcho/example/example-function/index.js
Writing /home/wdlcho/example/example-function/function.json
The function "example-function" was created successfully from the "HTTP trigger" template.

다음과 같이 설정을 해주고

code .

와 같이 써주게 되면 다음과 같은 편집창이 생기게 됩니다.

 

 

index.js에서 하나의 함수를 예시로 실행해 보겠습니다.

 

module.exports = async function (context, req) {
    let rq = req.query;
    const first = parseFloat(rq.first);
    const second = parseFloat(rq.second);
    if([first,second].some(isNaN)){
        context.res = { 
            status : 400 ,
            body : "please check first, second string"
        };
            //하나라도 NaN이면 false를 반환
    context.res = { body: first * second};
    }
}

first와 second를 받아서 곱해주는 모듈 입니다.

Ctrl+S를 사용하여 파일을 저장하고 Ctrl+Q를 사용하여 편집기를 닫습니다.

wdlcho@Azure:~/example$ func start &> ~/output.txt &

&는 명령어를 백그라운드로 동작시킬 때 사용합니다. 이제 백그라운드에서 function앱이 실행되며 output.txt에 로그 값이 기록되게 됩니다.

 

wdlcho@Azure:~/example$ curl "http://localhost:7071/api/example-function?first=3&second=12" -w "\n"

다음과 같이 첫번째 값과 두번째 값을 넣은 후 함수를 실행해 줍니다.

이제 해당 요청이 갔는지 확인해 보도록 하겠습니다.

 

pkill func

백그라운드에서 실행중이던 함수 호스트를 중지한 후 (Enter를 치면 중지된 것을 확인할 수 있습니다.)

wdlcho@Azure:~/example$ pkill func
wdlcho@Azure:~/example$
[1]+  Done                    func start &> ~/output.txt

마지막으로 코드 편집기에서 호스트의 로그 출력을 확인해 볼 수 있습니다.

wdlcho@Azure:~/example$ code ~/output.txt
[10/23/20 2:21:32 AM] Executing 'Functions.example-function' (Reason='This function was programmatically called via the host APIs.', Id=7e53f526-8150-4b6f-9d41-b1d418e241ac)
[10/23/20 2:21:32 AM] Executed 'Functions.example-function' (Succeeded, Id=7e53f526-8150-4b6f-9d41-b1d418e241ac)
[10/23/20 2:21:32 AM] Executed HTTP request: {
[10/23/20 2:21:32 AM]   "requestId": "286b8c24-4f89-48c9-a592-9476f892c784",
[10/23/20 2:21:32 AM]   "method": "GET",
[10/23/20 2:21:32 AM]   "uri": "/api/example-function",
[10/23/20 2:21:32 AM]   "identities": [
[10/23/20 2:21:32 AM]     {
[10/23/20 2:21:32 AM]       "type": "WebJobsAuthLevel",
[10/23/20 2:21:32 AM]       "level": "Admin"
[10/23/20 2:21:32 AM]     }
[10/23/20 2:21:32 AM]   ],
[10/23/20 2:21:32 AM]   "status": 200,
[10/23/20 2:21:32 AM]   "duration": 3
[10/23/20 2:21:32 AM] }

 

다음과 같이 요청이 갔음을 확인할 수 있습니다.

Core Tools를 사용하여 Azure에 함수 게시

이제 만든 빌드하고 테스트해본 함수를 azure에 게시할 수 있습니다. 이렇게 하면 웹에서 실행되는 것을 확인할 수 있으며, 동료에게 해당 URL을 제공하여 어디에서든지 호출 방법을 확인하도록 할 수 있습니다.

 

먼저 함수 앱을 만들어야 core tools를 사용하여 프로젝트를 게시할 수 있습니다. 

 

 

wdlcho@Azure:~$ RESOURCEGROUP=learn-3bfda93a-a2b3-45b1-9ad1-a870d8a7ff06
wdlcho@Azure:~$ STORAGEACCT=learnstorage$(openssl rand -hex 5)
wdlcho@Azure:~$ FUNCTIONAPP=learnfunctions$(openssl rand -hex 5)

먼저 리소스 그룹으로 , 샌드박스에서 생성된 그룹을 지정합니다.

이때 스토리지 계정 및 함수 앱 이름은 전역적으로 고유해야 한다는 요구를 충족해야 하기 때문에 $(openssl rand -hex 5)를 포함하여 임의의 5자 문자열을 생성해 줍니다.

az storage account create은 함수 앱에서 사용할 Azure Storage계정을 만듭니다.

az functionapp create은 함수 앱을 만듭니다.

 

이제 함수 앱이 만들어 졌다면 아까 함수를 만들어둔 example 경로로 들어가서

wdlcho@Azure:~/example$ func azure functionapp publish "$FUNCTIONAPP"
Getting site publishing info...
Creating archive for current directory...
Uploading 1.27 KB [#########################################################################]
Upload completed successfully.
Deployment completed successfully.
Syncing triggers...
Functions in learnfunctions3fc1ed34e4:
    example-function - [httpTrigger]
        Invoke url: https://learnfunctions3fc1ed34e4.azurewebsites.net/api/example-function?code=z9b1uV0YguufNz5RWdn2qal0AoNJ7i84aiajLKiwLxwgB1phfZ9mVw==

다음 명령어를 입력해 줍니다.

이제 함수가 Azure에 게시되어 어디에서나 호출할 수 있습니다.

Invoke url을 클릭하여 창을 열어보도록하겠습니다.

 

여기서 url에 변수를 입력하여 주면 해당 함수가 실행되어서 결과 값이 반환됨을 확인할 수 있습니다.

 

728x90
반응형
Comments