My Note

自己理解のためのブログ

Google App Engine(Go)とechoを使ってAPIを作ってみた ( 結果の可視化はMackerelで )

はじめに

Goとechoを使って簡易的なAPIサーバを作ってみました。今後、echoを使ってやってみたい事があるので、ますは使ってみる! という感じのものです。 以前のブログで貴金属の価格をGoでスクレイピングしてMackerelで可視化したものを拡張しました。

yhidetoshi.hatenablog.com

この記事では、Lambdaで貴金属の価格掲載サイトにスクレイピングしてその値をMackerelに投げてグラフ化しています。 echoを使ってAPIサーバを作ってみたかったので、まずは、貴金属の価格の結果をjsonで返すAPIサーバをGAEで動かすことにしました。

アーキテクチャとフロー

f:id:yhidetoshi:20190926081543p:plain

  1. cloudwatch-eventで定期実行させる
  2. Lambda ( Go ) で GAEの ( API ) エンドポイントにGETリクエストを投げる
  3. echo ( Go ) で貴金属の価格掲載サイトにスクレイピングする
  4. スクレイピングで取得したデータをJSONに整形する
  5. LambdaからのリクエストにJSONで返す
  6. Mackerelのサービスメトリクスに投稿する

Lambda ( Go )のクライアントについて

GAEのエンドポイントに対して /metal でGETリクエストをする と金とプラチナの情報のjsonを返すようにしています。 そのjsonをパースして、Mackerelのサービスメトリクスに投稿します。 その記事に関してはこちらに記載しています。

yhidetoshi.hatenablog.com

  • jsonレスポンスの例
{
    "time": "2019-09-22T09:51:57.440183+09:00",
    "Gold": {
        "retailTax": 5674,
        "purchaseTax": 5588
    },
    "Platinum": {
        "retailTax": 5674,
        "purchaseTax": 5588
    }
}

*) timeに関しては、最終的にMackerelにメトリクスを投げるときに利用できるようにこの形式にしています。

main.goのソースコードは以下です。

github.com

デプロイについて

LambdaやCloudwatch-EventなどはServerlessFrameworkを利用してデプロイしています。 serverlessFrameworkのコードも先ほどのGitHubにあります。

GoogleAppEngine ( Go ) について

今回のブログで残しておきたいのはこのGAEの方です。 Macローカルにgo echoをインストールしてコーディングしてからGAEにデプロイしました。

github.com

echoについて

echoについて、インストール方法などはこちらに。

echo.labstack.com

echoでやっていること

  1. Basic認証
  2. 貴金属の価格掲載サイトに対してスクレイピング
  3. jsonに整形

Basic認証

今回、接続元を制限していないのでスクレイピング先に迷惑がかからないようにBasic認証をかけています。

  • ./authentication/basic.go
package authentication

import (
    "github.com/labstack/echo"
    "github.com/labstack/echo/middleware"
    "os"
)

var (
    id = os.Getenv("ID")
    pw = os.Getenv("PW")
)

func BasicAuth() echo.MiddlewareFunc  {
    return middleware.BasicAuth(func(username string, password string, context echo.Context) (bool, error) {
        if username == id && password == pw {
            return true,nil
        }
        return false,nil
    })
}
  • main.go
func main() {
・・・
    // Basic Auth
    e.Use(authentication.BasicAuth())
・・・
}

スクレイピングjson生成

ここで、対象サイトにスクレイピングしてレスポンス結果を利用してjsonを生成してクライアントに返す処理を定義しています。

{
    "time": "2019-09-22T09:51:57.440183+09:00",
    "Gold": {
        "retailTax": 5674,
        "purchaseTax": 5588
    },
    "Platinum": {
        "retailTax": 5674,
        "purchaseTax": 5588
    }
}

こんなjsonを返します。

GAEへのデプロイについて

gcloudコマンドを使ってデプロイをします。

  • デプロイコマンド
  • gcloud auth login
  • gcloud app deploy --project ${PROJECT-ID}?

デプロイするために、ディレクトリ直下に app.yaml を作ります。

runtime: go112
handlers:
- url: /.*
  script: auto
includes:
- secret.yaml

環境変数として ベーシック認証のID/PWを渡す必要があるので secret.yaml をincludeするようにしています。

  • secret.yaml
env_variables:
  ID: 'XXX'
  PW: 'XXX'

app.yamlについてのリファレンス

cloud.google.com

結果

  • GAE
    • クライアント側のLambdaを1時間毎に実行させた結果

f:id:yhidetoshi:20190928084002p:plain

  • Mackerelのサービスメトリクス
    • LambdaでGAEにapiコールして取得した結果を反映させた結果

f:id:yhidetoshi:20190928084417p:plain

さいごに

今回はじめてechoをつかってみました。まずは使ってみるというところでGETリクエストでjsonを返してその結果を可視化するというテーマでやりました。 自分用APIサーバとしてGAEを使ってGo開発するのもよさそうです。無料枠もあって今のところ無料で使えています。