ごあいさつ
エンジニアのうぃすきー(@Whisky_shusuky)と申します。弊社ではインフラ・バックエンド・フロントエンドとWeb周りを全般的に対応しております。
前回Serverless Frameworkを使ってlambdaでメール用のワーカーをデプロイする記事を書きました。ワーカーだけではなくてlambdaとAPI Gatewayを組み合わせたら簡単なAPIも作成できたので紹介します。
前回のサンプルコードに追記したのでこれに則って記載します。 github.com
構成の紹介
api/main.goに実際にLambdaで実行するコードを置いています。クエリパラメータでparameterの項目を受け取ってその値をそのままjsonにして返す簡単なAPIです。
...
func Handler(ctx context.Context, request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
// queryを取得
parameter := aws.String(request.QueryStringParameters["parameter"])
var resp events.APIGatewayProxyResponse
body := Body{
Parameter: *parameter,
}
jsonData, _ := json.Marshal(body)
resp.StatusCode = 200
resp.Body = string(jsonData)
return resp, nil
}
...
こちらのコードをServerless Frameworkを使ってデプロイしています。
serveless.ymlにこのように記載することによってAPI Gatewayが作成されます。ちょっと詰まった箇所としてはquerystringsにて使用するクエリパラメータparameterを明示的に記述する必要がある点です。
...
api:
name: api
handler: bin/api/main
events:
- http:
path: /sample
method: get
cors: true
# クエリストリングの設定
request:
parameters:
querystrings:
parameter: true
...
この状態でmake deployを実行するとMakefileの内容が実行されてデプロイされます。
するとAPI Gatewayが構築されます。ステージタブを開くとエンドポイントが表示されるのでそれ+/sample(Serverless Frameworkで指定したpath)を叩けば先ほどのAPIが実行されます。

実際はこのエンドポイントを直接使用することは無くてRoute53で管理しているドメインと連携するといった対応をするケースが多いでしょう。その場合Route53側の設定を行う前にAPI Gateway側でカスタムドメインを作成する必要があります。こちらの設定を行うとRoute53側のAレコード設定時に 作成したAPI Gatewayが設定できるようになります。

なお、serverless-domain-managerというpluginを使用すればカスタムドメイン・Route53も一緒に設定できるようです。ただし、インフラがプラグインに依存することになるので使用する際は念頭に置く必要があるでしょう。
結び
このようにして単純なAPIを作成することができました。静的ファイルでは物足りないもののわざわざサーバーを立てるまでもない時に使い所がありそうです。今回は値を返すだけのAPIですが勿論DynamoDBなどAWSのマネージドサービスと連携することも可能なので本格的なこともできそうです。 また試すにあたりこちらのブログを大いに参考にさせていただきました。