API GatewayとLambdaを繋げてgoでjsonを返却する

f:id:utr066:20180311145300j:plain

API Gatewayとは

Amazon API Gateway は、規模の大きさに関係なく、開発者が API を作成、配布、保守、監視、保護できる AWS サービスです。

Amazon Lambda と連係させることで、Lambda Function を HTTP 形式の API にできるところに注目が集まっているとか。

サービス呼び出しを仲介して良い感じにしてくれるやつで、認証やエンドポイント集約をしてくれる。正しいキーがないリクエストは拒絶するっていうことがこのAPI Gatewayで行うことができるみたい。

また、こんなメリットがあるらしい。

  • APIバージョン管理」「API認証管理」「APIモニタリン グ」などの多くの作業について、ユーザーが操作を行う必要がない
  • バックエンドで「Lambda」を利用できるため、インフラ管理/運用が不要
  • API GatewayのRESTインタフェースを使用することで、開発工数の大幅削減が可能
  • アプリケーションで使用するさまざまな APIをひとつの形式に統一できる
  • 企業は大規模なエンタープライズアプリケーションをWebサービスに接続可能なラッパーで包むことができる https://www.ossnews.jp/oss_info/Amazon_API_Gateway

ほう。 まあとりあえず今回はlambdaとAPI Gatewayを繋げてjsonを返すことをする。 そのために、まずはLambda関数を作る。

lambda関数を作成する

Go言語でjsonを返却するコードを書きます。

package main

import (
    "fmt"

    "github.com/aws/aws-lambda-go/lambda"
)

type MyEvent struct {
    Name string `json:"What is your name?"`
}

type MyResponse struct {
    Message string `json:"Answer:"`
}

func hello(event MyEvent) (MyResponse, error) {
    return MyResponse{Message: fmt.Sprintf("Hello %s!!", event.Name)}, nil
}

func main() {
    lambda.Start(hello)
}

参考 : AWS Lambda で Go が使えるようになったので試してみた | Developers.IO

上記の記述を書いたmain.goをbuildしてzipにする。

$ env GOOS=linux GOARCH=amd64 go build -o hello

$ zip hello.zip hello

出来上がったzipをあげる。 f:id:utr066:20180308162342p:plain

アップロードをして「保存」したら、テストを設定します。 f:id:utr066:20180308162456p:plain

「作成」ボタンを押したら実行して確認。 f:id:utr066:20180308162535p:plain

良い感じ。 トリガーとして、API Gatewayを設定します。

f:id:utr066:20180308162636p:plain

これでAPI Gatewayの設定は完了。

API Gatewayを使ってみる

f:id:utr066:20180308150205p:plain API Gatewayを検索。

f:id:utr066:20180308150144p:plain 「新しいAPI」を選択。

エンドポイントタイプって何だ・・・

Amazon API Gateway で、REST API およびカスタムドメインの作成時に 2 種類の API エンドポイントから選択できるようになりました。リージョンの API エンドポイントは、REST API をデプロイするのと同じ AWS リージョンからアクセスできる新しいタイプのエンドポイントです。これにより、API リクエストが REST API と同じリージョンから発信される場合に、リクエストのレイテンシーを減らすことができます。さらに、独自の Amazon CloudFront ディストリビューションとリージョンの API エンドポイントの関連付けを選択できるようになりました。API エンドポイントの 2 つ目のタイプは、エッジ最適化 API です。エッジ最適化 API は、API ゲートウェイによって作成および管理される CloudFront ディストリビューション経由でアクセスするエンドポイントです。以前は、エッジ最適化 API は、API ゲートウェイを使用して API を作成する際のデフォルトオプションでした。

ぶっちゃけ何言ってるかわからないけど、以前のデフォルトオプションだったらしい。とりあえずこれを選択しておく。 地域っていうのを設定した場合、同じ地域からリクエストが来る場合、そのレイテンシーを減らすことができるらしい。

入力したら「APIの作成」をクリック。

f:id:utr066:20180308162825p:plain

リソースの作成をクリック。 f:id:utr066:20180308163016p:plain

f:id:utr066:20180308163055p:plain メソッドの作成をクリック。httpメソッドを選択する。

f:id:utr066:20180308163136p:plain

とりあえず、今回はgetで試す。 Lambda リージョンはLambdaを作った画面で確認できる。

f:id:utr066:20180308163326p:plain

Lambda関数は左側に書いてあるやつ。これでいうと「return_json」。

f:id:utr066:20180308163511p:plain

そしたらAPIのデプロイをする。

f:id:utr066:20180308163703p:plain

f:id:utr066:20180308163812p:plain 適当に名前をつけてデプロイ!

URLが表示されるので、そのURLに/helloをつけて実行すれば、期待する結果が返ってきたーーーー。 f:id:utr066:20180308165133p:plain

URLがわからなくなった場合は、ステージから見ることが可能。 f:id:utr066:20180308164928p:plain

まとめ

割と公式のドキュメントが使えるからみて見ると良いと思います。

What Is Amazon API Gateway? - Amazon API Gateway