GAE/Go1.9 시행(0: 퀵 스타트)

12609 단어 5GAEgcp

제목



GAE(Google App Engine)를 이해하기 위해, 실제로 스스로 앱 만들어 태워 본다.
Java 버전은 일에서 사용했기 때문에 조금은 알고 왔다. (마감 레벨이지만) 몇 가지 기사도 썼다.
향후는 Golang판으로 시험해 본다.
우선은, 결정의 퀵 스타트를 시험해 본다.

개발 환경



#OS


$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="17.10 (Artful Aardvark)"

# Golang


$ go version
go version go1.9.7 linux/amd64

버전의 전환은 goenv 로 실시하고 있다.

#gcloud


$ gcloud version
Google Cloud SDK 224.0.0

전제



  • 표준 환경에서 개발한다.
  • GCP 프로젝트가 생성되었습니다.
  • gcloud 명령이 설치되었습니다.

  • 실천



    순서는 ↓에 따라하면서, 관계하는 파일의 내용을 확인해 간다.
    h tps : // c ぉ d. 오, ぇ. 코 m / 아펜 기네 / 드 cs / s 단지 rd / 고 / 쿠이 cks rt? hl = 그럼

    ■ 샘플 프로젝트 취득



    절차대로.
    $ go get -u -d github.com/GoogleCloudPlatform/golang-samples/appengine/helloworld/...
    $
    $ ll golang-samples/appengine/helloworld/
    合計 16K
    -rw-r--r-- 1 koge koge   69 11月 12 02:51 app.yaml
    -rw-r--r-- 1 koge koge  391 11月 12 02:51 hello.go
    

    hello.go


    package main
    
    import (
        "fmt"
        "net/http"
    
        "google.golang.org/appengine"
    )
    
    func main() {
        http.HandleFunc("/", handle)
        appengine.Main()
    }
    
    func handle(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintln(w, "Hello, world!")
    }
    
    http 패키지를 사용해, 「 / 」 액세스시의 거동을 정의하는 것은 Golang에서 웹 앱 작성하는데 기본.
    통상은, 그 후에, 「http.ListenAndServe(":8080", nil)」로서 지정 포트로 대기하는 서버 기동 로직을 쓰는데, 대신에 「appengine.Main()」라고 쓴다.
    (글쎄, 내부에서 감싸고 있을거야)

    일단, 확인.

    [google.golang.org/appengine/appengine.go]
    func Main() {
        internal.Main()
    }
    

    [google.golang.org/appengine/internal/main_vm.go]
    func Main() {
        installHealthChecker(http.DefaultServeMux)
    
        port := "8080"
        if s := os.Getenv("PORT"); s != "" {
            port = s
        }
    
        host := ""
        if IsDevAppServer() {
            host = "127.0.0.1"
        }
        if err := http.ListenAndServe(host+":"+port, http.HandlerFunc(handleHTTP)); err != nil {
            log.Fatalf("http.ListenAndServe: %v", err)
        }
    }
    
    func installHealthChecker(mux *http.ServeMux) {
        // If no health check handler has been installed by this point, add a trivial one.
        const healthPath = "/_ah/health"
        hreq := &http.Request{
            Method: "GET",
            URL: &url.URL{
                Path: healthPath,
            },
        }
        if _, pat := mux.Handler(hreq); pat != healthPath {
            mux.HandleFunc(healthPath, func(w http.ResponseWriter, r *http.Request) {
                io.WriteString(w, "ok")
            })
        }
    }
    

    그래, 역시.
    헬스 체크의 입(AppEngine에서는, 왠지 「/_ah/ 」라고 하는 패스로부터 시작된다)를 추가해, (환경 변수로 호스트와 포트 지정이 있으면 채용하면서, 서버 기동하게 되어 있다.

    app.yaml



    App Engine의 동작을 결정하는 구성 파일.
    어떤 요소를 정의하는지는 ↓에 기재되어 있다.
    htps : // c ぉ d. 오, ぇ. 코 m/아페기네/도 cs/s 단지 rd/고/콘후ぃg/아 뿌레 f? hl = 그럼
    runtime: go
    api_version: go1
    
    handlers:
    - url: /.*
      script: _go_app
    

    퀵 스타트 용 app.yaml에서는 필요한 최소한의 정의가 있습니다.


    요소
    설명
    비고


    런타임
    GAE 앱을 실행하기 위한 실행 환경을 지정합니다.
    필수 요소

    api_version
    runtime API 버전. go1를 지정하면 앱 배포마다 최신 지원되는 런타임 환경이 사용됩니다 (현재 go1.9). 명시적으로 한다면 go1.9 라고 적는다.
    필수 요소

    handlers
    URL 패턴 목록과 처리 방법에 대한 설명. GAE는, 앱 코드의 실행, 또는, 정적 파일의 호스팅에 의해, 지정의 URL 액세스시의 거동을 제어할 수 있다.
    필수 요소

    handlers/url
    어떤 패스에 액세스했을 때에 핸들링 처리를 발동할까.
    handlers 지정시 필수 요소

    handlers/script
    GAE 앱 루트의 스크립트 경로를 지정합니다. 그러나 Go 앱의 경우 항상 _go_app이어야합니다.
    임의 요소


    ■ 로컬 부팅



    로컬로 기동할 때는, 기동 스크립트가 Python같다.
    $ dev_appserver.py app.yaml
    INFO     2018-11-11 19:03:00,371 devappserver2.py:224] Using Cloud Datastore Emulator.
    We are gradually rolling out the emulator as the default datastore implementation of dev_appserver.
       〜〜〜
    INFO     2018-11-11 19:03:02,127 dispatcher.py:256] Starting module "default" running at: http://localhost:8080
    INFO     2018-11-11 19:03:02,129 admin_server.py:152] Starting admin server at: http://localhost:8000
    INFO     2018-11-11 19:03:04,904 instance.py:294] Instance PID: 11917
    

    그래, 시작 OK.


    ■ 배포



    ※당연히, 「gcloud init」나 「gcloud auth login」는 끝나고 있는 전제.
    $ gcloud app deploy
    Services to deploy:
    
    descriptor:      [/work/src/golang/src/github.com/GoogleCloudPlatform/golang-samples/appengine/helloworld/app.yaml]
    source:          [/work/src/golang/src/github.com/GoogleCloudPlatform/golang-samples/appengine/helloworld]
    target project:  [【プロジェクトID】]
    target service:  [default]
    target version:  [20181112t042229]
    target url:      [https://【プロジェクトID】.appspot.com]
    
    
    Do you want to continue (Y/n)?  y
    
    Beginning deployment of service [default]...
    ╔════════════════════════════════════════════════════════════╗
    ╠═ Uploading 87 files to Google Cloud Storage               ═╣
    ╚════════════════════════════════════════════════════════════╝
    File upload done.
    Updating service [default]...done.                                                                                                                                                                         
    Setting traffic split for service [default]...done.                                                                                                                                                        
    Deployed service [default] to [https://【プロジェクトID】.appspot.com]
    
    You can stream logs from the command line by running:
      $ gcloud app logs tail -s default
    
    To view your application in the web browser run:
      $ gcloud app browse
    

    배포 OK.


    GCP 콘솔에서도 런타임 'go'의 인스턴스가 배포되었는지 확인합니다.


    요약



    GAE를 사용하면 준비한 앱을 GCP에 탈 때까지가 빠르다.
    과거에 GKE + go의 조합은 한 적이 있지만, GAE의 제약에 탑승하는 것으로, 얼마나 편해지거나, 융통의 효능에 싫어지거나 하는지, 여러가지 시험해 보자.

    좋은 웹페이지 즐겨찾기