Go로 구현하여 Google Cloud Functions에서 Firestore로 데이터 추가
본 기사의 내용
Google Cloud Functions를 Go로 구현하여 HTTP 요청을 받고 Firestore에 데이터를 추가하는 방법을 알아보세요.
 개발 환경
$ sudo gcloud components update && gcloud components install beta
사전 준비
 네이티브 모드 선택
GCP에서는 Firestore를 사용할 때 동일한 프로젝트 내에서 Datastore 모드와 네이티브 모드를 선택할 수 있습니다.
Datastore와 호환성을 제공하는 형태의 Firestore 또는 새로운 형태의 Firestore 중 하나입니다.
자세한 내용은 여기을 확인하십시오.
본 기사에서는 네이티브 모드를 선택한 경우의 해설을 해 나갈 것입니다.
 구현 및 배포
 Function 프로그램 구현
Functions로 동작시키는 프로그램을 작성해 갑니다.
POST 요청이 전송되었을 때 "name"매개 변수를 검색하여 Firestore로 출력합니다.
GCP에서 제공하는 "cloud.google.com/go/firestore" 라이브러리를 사용하여 Firestore로 출력합니다. 요청 매개 변수 외에도 현재 시간을 부여합니다.
FunctionsToFirestore.gopackage functions
import (
        "context"
        "fmt"
        "log"
        "net/http"
        "os"
        "time"
        //Firestoreの操作に必要なライブ
        "cloud.google.com/go/firestore"
)
//Firestoreにデータを追加するための構造体、タグで変数とキーを紐づける
type Data struct {
        Name     string    `firestore:"NAME"`
        Datetime time.Time `firestore:"DATETIME"`
}
//HTTPトリガーで実行される
func FunctionsToFirestore(w http.ResponseWriter, r *http.Request) {
        switch r.Method {
        case http.MethodPost: //POSTの場合
                //パラメータの"name"から値を取り出す
                name := r.PostFormValue("name")
                //取り出せない場合はエラーとして処理を終了する
                if name == "" {
                        fmt.Fprint(w, "パラメータに\"name\"がありません。\r\n")
                        return
                }
                //Firestoreへ出力する関数を呼び出す
                CreateFirestore(name)
        default: //POST以外の場合はエラー
                http.Error(w, "405 - Method Not Allowed", http.StatusMethodNotAllowed)
        }
}
func CreateFirestore(name string) {
        //流し込むデータを構造へ格納する
        data := Data{}
        data.Name = name
        data.Datetime = time.Now()
        //コンテキストを取得する
        ctx := context.Background()
        //プロジェクトIDを取得する
        projectID := os.Getenv("GCP_PROJECT")
        //Firestoreを操作するクライアントを作成する、エラーの場合はLoggingへ出力する
        client, err := firestore.NewClient(ctx, projectID)
        if err != nil {
                log.Printf("Firestore接続エラー Error:%T message: %v", err, err)
                return
        }
        //確実にクライアントを閉じるようにする
        defer client.Close()
        //現在時刻を構造体へ格納する
        data.Datetime = time.Now()
        //Firestoreの追加を行う、エラーの場合はLoggingへ出力する
        _, _, err = client.Collection("NAMES").Add(ctx, data)
        if err != nil {
                log.Printf("データ書き込みエラー Error:%T message: %v", err, err)
                return
        }
}
 모듈 준비
그런 다음 go.mod를 준비합니다. "cloud.google.com/go/firestore" 를 사용하고 있으므로 필요한 라이브러리에 추가합니다. 버전은 0.36.0 1을 지정합니다.
go.modmodule functions
go 1.11
require cloud.google.com/go v0.36.0
 배포
프로그램 준비가 되면 배포를 합니다.gcloud functions deploy 명령을 실행하면 약 3분 내에 배포가 완료됩니다.
$ gcloud functions deploy FunctionsToFirestore --runtime go111 --trigger-http 
(略)
status: ACTIVE
timeout: 60s
(略)
 테스트
curl 에서 실제로 GET 요청을 보냅니다. 요청을 보내는 엔드포인트는 배포했을 때의 로그에 나와 있으므로 찾습니다.
$ curl https://us-central1-YOUR_PROJECT.cloudfunctions.net/FunctionsToFirestore -X POST -d "name=aaaa"
그런 다음 웹 콘솔에서 데이터가 추가되었는지 확인합니다. WEB 콘솔 메뉴에서 Firestore를 선택합니다. 최상위의 "NAMES" 라는 컬렉션이 완성되고 있어 그 안에 독특한 ID로 컬렉션이 만들어지고 있습니다. 안의 필드에 POST로 보낸 파라미터와 실행 시간이 들어 있으면 테스트 완료입니다.
 
 마지막으로
쉽게 Firestore에 쓸 REST API를 만들 수있었습니다. Firestore는 비교적 새로운 기능이기 때문인가 gcloud 커멘드로 스토어 되고 있는 내용을 확인할 수 없습니다. 향후의 기능의 충실에 기대입니다.
2019/4/14의 기술 서전 6에 "Goで学ぶGoogleCloudFunctions"라는 책을 배포합니다. 흥미있는 사람은 꼭 부디 일어 주세요. 서클 사이트는 여기입니다.
2019/4/1 현재 0.37.1이 최신입니다. Go1.12가 필요하기 때문에 Google Cloud Functions에서는 작동하지 않습니다. ↩
 
                
                    
        
    
    
    
    
    
                
                
                
                
                    
                        
                            
                            
                            Reference
                            
                            이 문제에 관하여(Go로 구현하여 Google Cloud Functions에서 Firestore로 데이터 추가), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
                                
                                https://qiita.com/shuichiro/items/ba9d6989cffcddf4b8b9
                            
                            
                            
                                텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                            
                            
                                
                                
                                 우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                            
                            
                        
                    
                
                
                
            
Function 프로그램 구현
Functions로 동작시키는 프로그램을 작성해 갑니다.
POST 요청이 전송되었을 때 "name"매개 변수를 검색하여 Firestore로 출력합니다.
GCP에서 제공하는
"cloud.google.com/go/firestore" 라이브러리를 사용하여 Firestore로 출력합니다. 요청 매개 변수 외에도 현재 시간을 부여합니다.FunctionsToFirestore.go
package functions
import (
        "context"
        "fmt"
        "log"
        "net/http"
        "os"
        "time"
        //Firestoreの操作に必要なライブ
        "cloud.google.com/go/firestore"
)
//Firestoreにデータを追加するための構造体、タグで変数とキーを紐づける
type Data struct {
        Name     string    `firestore:"NAME"`
        Datetime time.Time `firestore:"DATETIME"`
}
//HTTPトリガーで実行される
func FunctionsToFirestore(w http.ResponseWriter, r *http.Request) {
        switch r.Method {
        case http.MethodPost: //POSTの場合
                //パラメータの"name"から値を取り出す
                name := r.PostFormValue("name")
                //取り出せない場合はエラーとして処理を終了する
                if name == "" {
                        fmt.Fprint(w, "パラメータに\"name\"がありません。\r\n")
                        return
                }
                //Firestoreへ出力する関数を呼び出す
                CreateFirestore(name)
        default: //POST以外の場合はエラー
                http.Error(w, "405 - Method Not Allowed", http.StatusMethodNotAllowed)
        }
}
func CreateFirestore(name string) {
        //流し込むデータを構造へ格納する
        data := Data{}
        data.Name = name
        data.Datetime = time.Now()
        //コンテキストを取得する
        ctx := context.Background()
        //プロジェクトIDを取得する
        projectID := os.Getenv("GCP_PROJECT")
        //Firestoreを操作するクライアントを作成する、エラーの場合はLoggingへ出力する
        client, err := firestore.NewClient(ctx, projectID)
        if err != nil {
                log.Printf("Firestore接続エラー Error:%T message: %v", err, err)
                return
        }
        //確実にクライアントを閉じるようにする
        defer client.Close()
        //現在時刻を構造体へ格納する
        data.Datetime = time.Now()
        //Firestoreの追加を行う、エラーの場合はLoggingへ出力する
        _, _, err = client.Collection("NAMES").Add(ctx, data)
        if err != nil {
                log.Printf("データ書き込みエラー Error:%T message: %v", err, err)
                return
        }
}
모듈 준비
그런 다음 go.mod를 준비합니다.
"cloud.google.com/go/firestore" 를 사용하고 있으므로 필요한 라이브러리에 추가합니다. 버전은 0.36.0 1을 지정합니다.go.mod
module functions
go 1.11
require cloud.google.com/go v0.36.0
배포
프로그램 준비가 되면 배포를 합니다.
gcloud functions deploy 명령을 실행하면 약 3분 내에 배포가 완료됩니다.$ gcloud functions deploy FunctionsToFirestore --runtime go111 --trigger-http 
(略)
status: ACTIVE
timeout: 60s
(略)
테스트
curl 에서 실제로 GET 요청을 보냅니다. 요청을 보내는 엔드포인트는 배포했을 때의 로그에 나와 있으므로 찾습니다.
$ curl https://us-central1-YOUR_PROJECT.cloudfunctions.net/FunctionsToFirestore -X POST -d "name=aaaa"
그런 다음 웹 콘솔에서 데이터가 추가되었는지 확인합니다. WEB 콘솔 메뉴에서 Firestore를 선택합니다. 최상위의 "NAMES" 라는 컬렉션이 완성되고 있어 그 안에 독특한 ID로 컬렉션이 만들어지고 있습니다. 안의 필드에 POST로 보낸 파라미터와 실행 시간이 들어 있으면 테스트 완료입니다.
 
 마지막으로
쉽게 Firestore에 쓸 REST API를 만들 수있었습니다. Firestore는 비교적 새로운 기능이기 때문인가 gcloud 커멘드로 스토어 되고 있는 내용을 확인할 수 없습니다. 향후의 기능의 충실에 기대입니다.
2019/4/14의 기술 서전 6에 "Goで学ぶGoogleCloudFunctions"라는 책을 배포합니다. 흥미있는 사람은 꼭 부디 일어 주세요. 서클 사이트는 여기입니다.
2019/4/1 현재 0.37.1이 최신입니다. Go1.12가 필요하기 때문에 Google Cloud Functions에서는 작동하지 않습니다. ↩
 
                
                    
        
    
    
    
    
    
                
                
                
                
                    
                        
                            
                            
                            Reference
                            
                            이 문제에 관하여(Go로 구현하여 Google Cloud Functions에서 Firestore로 데이터 추가), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
                                
                                https://qiita.com/shuichiro/items/ba9d6989cffcddf4b8b9
                            
                            
                            
                                텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                            
                            
                                
                                
                                 우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                            
                            
                        
                    
                
                
                
            
$ curl https://us-central1-YOUR_PROJECT.cloudfunctions.net/FunctionsToFirestore -X POST -d "name=aaaa"
쉽게 Firestore에 쓸 REST API를 만들 수있었습니다. Firestore는 비교적 새로운 기능이기 때문인가
gcloud 커멘드로 스토어 되고 있는 내용을 확인할 수 없습니다. 향후의 기능의 충실에 기대입니다.2019/4/14의 기술 서전 6에
"Goで学ぶGoogleCloudFunctions"라는 책을 배포합니다. 흥미있는 사람은 꼭 부디 일어 주세요. 서클 사이트는 여기입니다.2019/4/1 현재 0.37.1이 최신입니다. Go1.12가 필요하기 때문에 Google Cloud Functions에서는 작동하지 않습니다. ↩
Reference
이 문제에 관하여(Go로 구현하여 Google Cloud Functions에서 Firestore로 데이터 추가), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/shuichiro/items/ba9d6989cffcddf4b8b9텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)