【AWS】API GatewayでプライベートAPIの作成からLambda連携までやってみた!
どうも!ヒグッティ(twitter→ヒグッティ@システムエンジニア)です!
今回はAWSのAPI GatewayのプライベートAPIの作成からLambdaを呼び出す連携までの方法を書きます!!API GatewayはプライベートAPIの機能が変わって特定のVPCなどからアクセスしやすくなったので是非導入を検討してみてはどうでしょうか?ではお楽しみください!!
過去のAWS関連の記事は以下を参照ください。
【AWS】Amazon CloudWatch+Amazon SNSでEC2のリソース監視してみた!本記事で伝えたいこと
- API GatewayでプライベートAPIの構築方法。
- API GatewayとLambdaの連携
やりたいこと
- プライベートAPIの構築
- Lambdaの構築
- VPCエンドポイントの構築
全体の流れ
今回は以下のような構成を組んでいきます。

ec2にアクセスし、curlでAPIを実行しAPI Gateway→Lambdaと実行され、ec2側に実行結果が返される流れになります。プライベートAPIは、特定のVPCからしかアクセスできないようにするのでec2からAPI用のエンドポイント(VPCエンドポイント)にアクセスさせてAPIを呼ぶようにします。
外部に公開したくないけど同じVPC内ではAPIを使いたい場合ってありますよね、、、公開用のAPI、裏ワザ的なAPIを分けている会社またはサービス提供者は多いのではないでしょうか?そんなニーズに応えることができます。今回は以下の順番で構築していきます!
- Lambdaの作成
- API Gatewayの作成
- エンドポイントの作成
API Gateway、Lambdaとは何かは記載しません。AWSの公式ドキュメントなどを参照願います。
Lambdaの作成
Lambdaの作成は簡単なHello Worldをするくらいにしておきます。関数名は「privateAPItoLambda」とします。

コードは必ずステータス200で特定の文字列を返却するようにします。

import json
def lambda_handler(event, context):
# TODO implement
return {
'statusCode': 200,
'body': json.dumps('Hello from privateAPI to Lambda!')
}
実際はLambdaにビジネスロジックなどを記載すると思いますが、今回は質素な感じです。Lambdaの作成は以上になります。
API Gatewayの作成
今回はメインテーマです。プライベートAPIを作成していきましょう!!
まずはAPIの作成です。

REST API プライベートを選択しましょう!次はAPIの設定です。

API名、説明は任意です。エンドポイントタイプは「プライベート」を選択しましょう!!エンドポイントIDは後で設定します。あとで設定するのですが、かなり重要です!!
あとはGETメソッドを作成します。



GETメソッドのセットアップでは結合タイプをLambda関数にしてください。Lambda関数には上記で作成したLambda関数の名前を入力してください。プルダウンで表示されます。入力が終われば保存を押してAPIの作成が完了します。
作成が完了したらAPIのテストをしてみます。メソッドの実行でテストボタンを押下しましょう!!

レスポンス本文にLambda関数で作成した文言が帰ってきています!API→Lambdaの連携は完了です。
※今回はリソースポリシーやデプロイは割愛します。ここでは開発環境用にデプロイしておきます。
エンドポイントの作成
作成したAPIはプライベートなのでどの環境からも実行することができません。なのでエンドポイントを作成する必要があります。今回はec2からAPIを実行できるようにec2の属するVPNにapiのエンドポイントを作成します。
画面としてはVPCです。左のサイドメニューのエンドポイントを押下してください。
画面が縦に長いので分割して説明します。

サービスで「execute-api」を選択してください。これを選択しないとAPIを実行できません。VPCは実行したいec2が属するVPCを選択してください。

サブネットもec2が所属するものを選択してください。セキュリティグループはHTTPSがインバウンドで許可されていればなんでもOKです。

エンドポイントの作成が完了したらエンドポイントIDをコピーしておきましょう!!このエンドポイントIDをAPI Gatewayで作成したAPIに設定します。

APIの設定画面からVPCエンドポイントIDに入力し変更を保存してください。
実際にAPIを実行してみよう!!
APIのURLをコピーし対象のec2からcurlで実行してみます。

このようにAPIが想定通りに値を返却してくれました!!もちろん、このURLをブラウザから叩いてもホストが見つかりませんと言われてしまいます!!
まとめ
今回はプライベートAPIについて構築しLambdaとも連携してみました。やはり簡単に構築できちゃいますね、、さすがはAWS、、私がはまったポイントとしてはエンドポイントの作成でした。VPCの画面でエンドポイントの作成をすることがわからず4時間くらい悩んでいました(笑)。ググっても意外とこのエンドポイントの作成が出てこなかったので今回ブログにまとめました!!
やっぱり手を動かさないとわからないですな~。もし検証してほしいサービスなどがあればtwitterからDMください!!