Go
golang
lambda
REST-API
APIGateway

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

はじめに

最近、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サーバーをたてても良いんですが、やっぱりサーバーレス構成だと保守が楽ですね。