연습 - 사용자 지정 처리기를 사용하여 앱 빌드

완료됨

이 연습에서는 Go를 사용하여 서버리스 앱을 빌드하고 실행합니다.

앱 스캐폴드

먼저 앱을 스캐폴딩하고, Visual Studio Code에서 Azure Functions 확장을 사용합니다.

  1. >명령 팔레트를 선택합니다.
  2. Azure Functions: Create New Project를 입력합니다.
  3. 폴더를 선택합니다. 일반적으로 현재 폴더입니다.
  4. 언어 선택에서 사용자 지정 처리기를 선택합니다.
  5. 첫 번째 함수의 템플릿 선택에서 HttpTrigger를 선택합니다.
  6. 앱에 hello와 같은 이름을 지정합니다.
  7. 익명의 권한 부여 수준을 선택합니다. 필요한 경우 나중에 이름을 변경할 수 있습니다.

모양이 다음과 같은 프로젝트가 생깁니다.

hello/
  function.json
.funcignore
.gitignore
host.json
local.settings.json
proxies.json

앱 만들기

그 다음 일련의 단계에서 HTTP 트리거에 응답할 수 있는 앱을 만듭니다.

  1. 프로젝트 루트에서 server.go라는 파일을 만듭니다.

  2. server.go에 다음 콘텐츠를 제공합니다.

    package main
    
    import (
     "fmt"
     "io/ioutil"
     "log"
     "net/http"
     "os"
    )
    

    위의 코드는 HTTP 앱을 빌드하고 환경 변수를 조회할 때 필요한 모든 라이브러리를 가져옵니다.

  3. import 문 뒤에 다음 코드를 추가합니다.

    func main() {
      customHandlerPort, exists := os.LookupEnv("FUNCTIONS_CUSTOMHANDLER_PORT")
      if !exists {
        customHandlerPort = "8080"
      }
      mux := http.NewServeMux()
      // mux.HandleFunc("/api/hello", helloHandler)
      fmt.Println("Go server Listening on: ", customHandlerPort)
      log.Fatal(http.ListenAndServe(":"+customHandlerPort, mux))
    }
    

    main() 함수가 자동으로 호출됩니다. 코드의 첫 번째 줄은 FUNCTIONS_CUSTOM_HANDLER_PORT 환경 변수에서 읽어들이는 방식을 명시합니다.

    customHandlerPort, exists := os.LookupEnv("FUNCTIONS_CUSTOMHANDLER_PORT")
    

    그런 다음 이 함수는 포트가 존재 하는지 여부를 확인합니다. 존재하지 않으면 함수에 포트 8080이 할당됩니다.

    if !exists {
      customHandlerPort = "8080"
    }
    

    다음 코드는 HTTP 서버 인스턴스를 인스턴스화합니다.

    mux := http.NewServeMux()
    

    마지막으로 중요한 줄은 특정 포트에 대한 수신 대기를 시작하고 메서드ListenAndServe()를 사용하여 요청을 받을 준비가 되었음을 신호로 보냅니다.

    log.Fatal(http.ListenAndServe(":"+customHandlerPort, mux))
    
  4. 나머지 코드를 추가해 보겠습니다. 먼저, 다음 줄을 찾아 주석 처리를 제거합니다.

    // mux.HandleFunc("/api/hello", helloHandler)
    
  5. import 문과 main() 함수 사이에 다음 코드를 추가합니다.

    func helloHandler(w http.ResponseWriter, r *http.Request) {
      w.Header().Set("Content-Type", "application/json")
      if r.Method == "GET" {
        w.Write([]byte("hello world"))
      } else {
        body, _ := ioutil.ReadAll(r.Body)
        w.Write(body)
      }
    }
    

    helloHandler() 함수는 콘텐츠 형식을 application/json로 설정합니다. ‘hello world’ 또는 게시된 본문(있는 경우)으로 응답합니다.

앱 실행

이제 코드 작성이 완료되었으나 이 시나리오가 작동하려면 일부 구성을 수행해야 합니다. Function 호스트에서 찾을 수 있도록 실행 파일의 위치를 지정해야 합니다. 그리고 경로를 구성하고, 이 앱에서 다른 유형의 빌드는 처리하지 않고 HTTP 트리거만 처리한다고 명시해야 합니다.

  1. 터미널의 프로젝트 루트에서 go build server.go를 실행합니다.

    go build server.go
    

    이 단계에서는 macOS 및 Linux는 server, Windows OS는 server.exe라는 실행 파일을 만듭니다.

  2. host.json 파일을 열고 customHandler 안에서 defaultExecutablePath 요소를 찾습니다. macOS 및 Linux에서는 ./server를, Windows OS에서는 .\server.exe를 지정합니다.

  3. customHandler 요소 밑에 enableForwardingHttpRequest 요소를 추가하고, 값 true를 부여합니다. 이제 customHandler 요소가 다음과 같이 표시됩니다.

    "customHandler": {
     "description": {
       "defaultExecutablePath": "./server",
       "workingDirectory": "",
       "arguments": []
     },
     "enableForwardingHttpRequest" : true
    }
    
  4. 터미널의 프로젝트 루트에서 func start를 실행합니다. 이렇게 하면 Function 앱이 시작됩니다.

    func start
    

    출력이 끝나면 다음과 유사한 출력이 표시됩니다.

    Functions:
    
         hello: [GET,POST] http://localhost:7071/api/hello
    
  5. 브라우저에서 http://localhost:7071/api/hello으로 이동합니다. 출력 "hello world"가 표시되어야 합니다.

축하합니다! 이렇게 Go에서 서버리스 앱을 개발했습니다.