API Gateway+LambdaをCloudFormationでサクリとつくる

API Gateway + Lambda + CloudFormation

サーバーレス(サーバレス? どっち?)でやるときにおなじみのこのサービス二つの組み合わせなのですが、 API Gateway周りの設定がけっこう面倒なんですよね…… なので一回テンプレートとしてCloudFormationでつくっておくと拡張性もあって便利便利という話です。

今回は単純に、/helloにGETするとHello WorldするAPIを作ります。

構成

CloudFormationで定義するリソース一覧です。 中にはコンソール上でポチポチやっているとAWSが裏で自動でつくってくれるものもあるので、リストにすると結構長くなります。

API Gateway

  • Rest APIAPI Gatewayの基本構成単位。コンソール上でAPI Gatewayのトップページにいってまず作るやつ)
  • Stage(ステージ)
  • Model(リクエストなどの構造を表す)
  • Resource(リソース。パス(/hello等)をここで定義)
  • Method(リソースごとのメソッドの定義)
  • UsagePlan(使用量やクオータなどの定義)
  • Deployment(デプロイ)

Lambda

IAM

  • Role(Lambda Functionに割り当てるIAM Role)

CloudFormationテンプレート

こちら(Github)

これをCloudFormationの新規スタックとして作成し、 できたAPI GatewayのリソースURL(https://foobar.execute-api.ap-northeast-1.amazonaws.com/dev/hello)にアクセスすると「Hello World」と表示されるはずです。

最小構成なので、適宜必要なリソースを加えることで望みの構成ができるかと思います。 (APIキーを追加したい場合はAPIKeyとUsagePlanKeyを加えるなど)

はまりどころ(はまったところ)

  • API Gateway MethodのIntegrationHttpMethodは、HTTPメソッドがGETでもPOSTにしなければならない
  • 今回はやっていませんが、Lambdaのエイリアスを使ってステージごとに呼ぶFunctionのバージョンを分ける場合は、LambdaPermissionのARNにエイリアスを付与しないといけない