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