Google App Engine(Go)とechoを使ってAPIを作ってみた ( 結果の可視化はMackerelで )
はじめに
Goとechoを使って簡易的なAPIサーバを作ってみました。今後、echoを使ってやってみたい事があるので、ますは使ってみる! という感じのものです。 以前のブログで貴金属の価格をGoでスクレイピングしてMackerelで可視化したものを拡張しました。
この記事では、Lambdaで貴金属の価格掲載サイトにスクレイピングしてその値をMackerelに投げてグラフ化しています。 echoを使ってAPIサーバを作ってみたかったので、まずは、貴金属の価格の結果をjsonで返すAPIサーバをGAEで動かすことにしました。
アーキテクチャとフロー
- cloudwatch-eventで定期実行させる
- Lambda ( Go ) で GAEの ( API ) エンドポイントにGETリクエストを投げる
- echo ( Go ) で貴金属の価格掲載サイトにスクレイピングする
- スクレイピングで取得したデータをJSONに整形する
- LambdaからのリクエストにJSONで返す
- Mackerelのサービスメトリクスに投稿する
Lambda ( Go )のクライアントについて
GAEのエンドポイントに対して /metal
でGETリクエストをする と金とプラチナの情報のjsonを返すようにしています。
そのjsonをパースして、Mackerelのサービスメトリクスに投稿します。
その記事に関してはこちらに記載しています。
- jsonレスポンスの例
{ "time": "2019-09-22T09:51:57.440183+09:00", "Gold": { "retailTax": 5674, "purchaseTax": 5588 }, "Platinum": { "retailTax": 5674, "purchaseTax": 5588 } }
*) timeに関しては、最終的にMackerelにメトリクスを投げるときに利用できるようにこの形式にしています。
main.goのソースコードは以下です。
デプロイについて
LambdaやCloudwatch-EventなどはServerlessFrameworkを利用してデプロイしています。 serverlessFrameworkのコードも先ほどのGitHubにあります。
GoogleAppEngine ( Go ) について
今回のブログで残しておきたいのはこのGAEの方です。 Macローカルにgo echoをインストールしてコーディングしてからGAEにデプロイしました。
echoについて
echoについて、インストール方法などはこちらに。
echoでやっていること
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を生成してクライアントに返す処理を定義しています。
./handler/metal.go
{ "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についてのリファレンス
結果
- GAE
- クライアント側のLambdaを1時間毎に実行させた結果
- Mackerelのサービスメトリクス
- LambdaでGAEにapiコールして取得した結果を反映させた結果
さいごに
今回はじめてechoをつかってみました。まずは使ってみるというところでGETリクエストでjsonを返してその結果を可視化するというテーマでやりました。 自分用APIサーバとしてGAEを使ってGo開発するのもよさそうです。無料枠もあって今のところ無料で使えています。