GAE/Go1.9 시행(0: 퀵 스타트)
제목
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
전제
#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
전제
표준 환경에서 개발한다.
실천
순서는 ↓에 따라하면서, 관계하는 파일의 내용을 확인해 간다.
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의 제약에 탑승하는 것으로, 얼마나 편해지거나, 융통의 효능에 싫어지거나 하는지, 여러가지 시험해 보자.
Reference
이 문제에 관하여(GAE/Go1.9 시행(0: 퀵 스타트)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/sky0621/items/6d5541e5fa7d2ac349e7
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
$ 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
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!")
}
func Main() {
internal.Main()
}
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")
})
}
}
runtime: go
api_version: go1
handlers:
- url: /.*
script: _go_app
$ 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
$ 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
GAE를 사용하면 준비한 앱을 GCP에 탈 때까지가 빠르다.
과거에 GKE + go의 조합은 한 적이 있지만, GAE의 제약에 탑승하는 것으로, 얼마나 편해지거나, 융통의 효능에 싫어지거나 하는지, 여러가지 시험해 보자.
Reference
이 문제에 관하여(GAE/Go1.9 시행(0: 퀵 스타트)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/sky0621/items/6d5541e5fa7d2ac349e7텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)