Help us understand the problem. What is going on with this article?

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

icchi_h
都内のメディア企業で働く高専出身エンジニア
https://icchi.me
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした