Serverless Frameworkを使ってlambdaとAPI GatewayでGoで書かれた簡単なAPIを作る

ごあいさつ

エンジニアのうぃすきー(@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のマネージドサービスと連携することも可能なので本格的なこともできそうです。 また試すにあたりこちらのブログを大いに参考にさせていただきました。