Go로 구현하여 Google Cloud Functions에서 Firestore로 데이터 추가

본 기사의 내용



Google Cloud Functions를 Go로 구현하여 HTTP 요청을 받고 Firestore에 데이터를 추가하는 방법을 알아보세요.

개발 환경


  • Google Cloud Shell 사용
  • 다음 명령 실행
  • $ sudo gcloud components update && gcloud components install beta
    
  • Google Cloud Functions API 활성화
  • Go:1.11

  • 사전 준비



    네이티브 모드 선택



    GCP에서는 Firestore를 사용할 때 동일한 프로젝트 내에서 Datastore 모드와 네이티브 모드를 선택할 수 있습니다.
    Datastore와 호환성을 제공하는 형태의 Firestore 또는 새로운 형태의 Firestore 중 하나입니다.
    자세한 내용은 여기을 확인하십시오.

    본 기사에서는 네이티브 모드를 선택한 경우의 해설을 해 나갈 것입니다.

    구현 및 배포



    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에서는 작동하지 않습니다.

    좋은 웹페이지 즐겨찾기