Edited at

golang + Lambda + API GatewayでREST APIを作ってみた

More than 1 year has passed since last update.


はじめに

最近、AWS Lambdaがgolangに対応しました。

golangの魅力の1つは実行速度。やはりAPIに利用したいという方は多いのではないでしょうか? これまでもapexを利用することで、Lambda(apex) + API Gateway構成のgolangを使ったREST APIは開発できました。

今回、lambdaがgolangを公式にサポートしたということで、apexを使わずに作ってみました。試しにGETパラメータをオウム返しする仕様です。


1. golang


環境の準備

まだ、goの開発環境が無い方はこのあたりを参照。

http://golang-jp.org/doc/install

必要なライブラリをインストール

$ go get github.com/aws/aws-lambda-go/lambda


lambdaで動かすコードを用意

以下のコードを適当な場所に保存。


api-test.go

package main

import (
"context"
"github.com/aws/aws-lambda-go/lambda"
)

func HandleRequest(ctx context.Context, params interface{}) (interface{}, error) {
// TODO your processing
return params, nil
}

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


lambdaにアップロードするzipファイルを用意。

$ GOOS=linux GOARCH=amd64 go build -o apitest api-test.go

$ zip apitest.zip apitest


2. AWS Lambda

1章で作ったgoバイナリをlambdaにアップロードする。


lambda関数の作成

AWS Lambdaのコンソール→関数の作成

ランタイムにGo 1.xを選択。名前はやロールはお好みで

SS 2018-01-21 21.44.17.jpg

左の項目からAPI Gatewayを選択。画面下に設定項目が表示される。

SS 2018-01-21 21.47.35.jpg

API名は、次の章で作るAPI Gatewayの名前を選択。ステージやセキュリティはお好みで。

SS 2018-01-21 21.48.54.jpg

前の章で作った、apitest.zipをアップロード。ハンドラを先程のハンドラ名apitestと統一(でないと実行時にエラー)

※ 画面右上にある保存を押さないとアップロードファイルが反映されないので注意

SS 2018-01-21 21.52.40.jpg


テスト

次に、今作っているlambda関数をテストする。

まだ、テストイベントが作成されていないので作る。

画面右上の「テスト」ボタン左側の欄→テストイベントの編集

何でもいいんですが、今回はHello Worldを選択。

SS 2018-01-21 21.54.25.jpg

先程作ったテストイベントを選択→「テスト」

SS 2018-01-21 21.54.42.jpg

テストイベントの値がそのまま返ってくることが確認できる。

SS 2018-01-21 21.57.49.jpg


3. API Gateway

2章で作ったlambda関数とAPI Gatewayを繋げる。


リソース・メソッドの作成

API Gatewayコンソール→APIの作成

適当なAPI名を選択。

SS 2018-01-21 22.14.58.jpg

リソースの作成。このリソースがAPIのパスと対応する。

SS 2018-01-21 22.16.07.jpg

SS 2018-01-21 22.23.47.jpg

メソッドの作成。今回はGETを選択。

SS 2018-01-21 22.17.51.jpg

SS 2018-01-21 22.24.10.jpg

2章で選択したlambda関数を選択。途中まで入力すると自動で候補が表示されるはず。

SS 2018-01-21 22.24.51.jpg


リクエストの編集

メソッドが作成されると「メソッドの実行」画面に遷移する。

SS 2018-01-21 22.28.34.jpg

メソッドリクエストに移動し、下図の様にGETパラメータを設定。今回はhogeパラメータを用意。

SS 2018-01-21 22.29.43.jpg

「メソッドの実行」画面に戻り、統合リクエストを選択。

SS 2018-01-21 22.31.50.jpg

本文マッピングのテンプレートのContent-TypeはApplication/json

SS 2018-01-21 22.32.27.jpg

テンプレートの内容はこんな感じ。

#set($inputRoot = $input.path('$'))

{
"hoge" : "$input.params('hoge')"
}


テスト

APIの機能面はこれで出来上がったので、ちゃんと動作するかテスト。

「メソッドの実行」画面の左上にあるテストを選択。

hogeパラメータの中身を入力してテスト。

するとGETパラメータがそのままAPIのレスポンスとして返ってきている。

SS 2018-01-21 22.33.17.jpg


デプロイ

作成したAPIの画面に戻り、アクション→APIのデプロイ

SS 2018-01-21 22.53.24.jpg


終わりに

goでREST APIを作るんだったらEC2上でwebサーバーをたてても良いんですが、やっぱりサーバーレス構成だと保守が楽ですね。