AWS API Gateway v2 の Terraform構成

AWS には API Gateway っていう、その名の通り API を作るのに便利なサービスがあるのですが、最近ちょっと用事があって利用しようとしたら、v2 としてHTTP対応されていたので飛びついてみました。

今回はそれをTerraformで構築したのですが、どうも v2 に関してあまり情報がまとまっていなかったので、まずはベースとなるリソースのコードを記載して、次回にどんな感じで扱ったかという中身について触れていければと思います。



API Gateway とは

この辺を読んでおくとよいと思います。私のとこは実戦叩き上げ野郎によるコピペ用コードがウリなので、細かい説明はすっ飛ばして他に任せるスタイルです。



目的

大きく2つあり、
  • 任意のFQDNでAPIにアクセスしたい
  • 簡単な認証をつけたい

  • 今回は1つ目の、任意のFQDNでアクセス確認できればOKって内容になります。

    FQDN 設計例

    例えば、こんな感じのFQDNが登場するということにしておきます。

  • *.example.com : ACMで指定するワイルドカード用
  • api.example.com : APIアクセス用
  • lb.example.com : ALBアクセス用(今回は登場しません。イメージです)
  • cdn.example.com : CloudFrontアクセス用(同上)

  • こんな感じで、少なくとも3箇所で証明書が必要になる想定なので、ワイルドカードにしてやりくりするとよいでしょう。(ゆーても CloudFrontは us-east-1 で別ACMになるけど)


    ACM作成

    とりあえず、証明書が必要なのでACMを作ります。これについては過去記事にあるので冗長を避けるためにリンク貼っておきます。ちょっとコード記法が古臭いのは勘弁してください。



    API用DNS登録

    この辺から若干ややこしくて、管理画面とにらめっこしてもリソースの関係性がいまいちピンとこなくて、管理画面とTerraformドキュメントとBBSの雑談を拾ってきてなんとかなりました。

    まず、APIで使うFQDNを宣言し、ACMと紐付けます。

    このリソースを作ることで、例えば “d-01234abcde.execute-api.ap-northeast-1.amazonaws.com” みたいなAWS臭いFQDNが割り当てられるので、DNSレコードでエイリアスとして任意の運用FQDNと紐付けます。



    Lambda作成

    コードは次記事で軽く書きますが、いったん適当な lambda を作ったことにします。
    return {“statusCode”: 200, “body”: “OK”}
    だけの lambda_handler だけで全然OK。

    environment は次回使うので書いてますが、いらんです。


    API作成

    ここから関連付くので1つ1つ記述しますが、まずLambdaに紐づくAPI本体を作ります。name はわかりやすいからFQDNと同名にしてるだけです。

    API Gateway から実行のお許しをLambdaにもらいます。

    APIと任意のFQDNを結びつけて完成です。


    動作確認

    ここまでTerraform突っ込んで、いきなりAPIのURLぶっ叩いて確認してもよいのですが、シンプルなようでわかりづらいので1つ1つ丁寧に、Terraform と管理画面を追って理解したほうがよいと思います。

    その上で、リソースを全部作り終わった後に、

    API Domain に割り振られた AWS用FQDN の名前解決をしてみて、

    任意で割り当てたFQDNでも名前解決してみて、

    API にアクセスしてみます。

    lambda で書いた return値が返れば成功ですし、もしダメなら CloudWatchLogs の lambda ログに何か残っているかもしれません。ログすらなければ、そもそもアクセスすら届いていないでしょう。

    成功したら、def lambda_handler(event, context): の event をガバっと print して、どんな項目が扱えるのか確認していくと、どういう風に設計するか浮かんでくると思います。



    この土台さえやっちまえば、あとは楽しいPythonコーディング!って思えば、微妙な面倒くささも吹っ飛ぶぜ:-9

    てことで、もうちょっとだけ続くんじゃ
    To Be Continued ⇨