概要
AWSデベロッパーアソシエイトを受けていると、API Gatewayの統合タイプとして以下4つの違いを問われることがよくあります。
統合タイプ |
---|
Lambda統合, Lambda非プロキシ統合 |
Lambdaプロキシ統合 |
HTTP統合, HTTP非プロキシ統合 |
HTTPプロキシ統合 |
このうち、Lambda統合とHTTP統合の違いは以下の通りです。Lambda統合はよく構築する機会がありますが、HTTP統合を作る機会が少ないので、今回作ってみようと思います。
- Lambda統合:バックエンドとして、Lambda関数と統合する
- HTTP統合:バックエンドとして、EC2等で自作したAPIと統合する
なお、プロキシ統合と非プロキシ統合の違いについては、以下の記事が大変わかりやすかったので、参考にしてください。
- API Gateway + Lambda プロキシ結合の使用有無による違い
- [初心者向け] Lambda 非プロキシ統合で API Gateway API をビルドする をプロキシ統合にして比較してみる
HTTP統合
まずバックエンドとして、パブリックサブネットに簡易なAPIを作成します。今回はEC2で作ります。
from flask import Flask
from hello import get_hello
app = Flask(__name__)
@app.route('/hello', methods=['GET'])
def local_endpoint():
return get_hello()
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
import json
def get_hello():
message = "Hello, good morning"
return_json = json.dumps({"message": message})
return return_json
上記ソースをEC2に配置して、以下コマンドを打っていけば簡易なAPIが構築できます。
sudo yum install -y python3 # Python3のインストール
sudo pip3 install Flask # Flaskのインストール
chmod 755 *.py # 実行権限の付与
python3 server.py # APIの起動
なお、上記のソースで疎通確認する際には、EC2のセキュリティグループで5000番ポートを許可しましょう。
curl http://XXX.XXX.XXX.XXX:5000/hello # XXXはEC2のパブリックIPアドレス
{"message": "Hello, good morning"}
あとはこのエンドポイントのURLをAPI Gatewayのメソッド作成時に指定します。
これをデプロイしたら、API GatewayのエンドポイントでAPIを呼び出せます。
APIのビジネスロジックをEC2側に寄せて、スロットリング制限等はAPI Gatewayの機能を利用する、といった活用ができるかと思います。
なお、実際はバックエンドにNLBなど挟んでロードバランスする構成が多いようです。
また、プライベートなサブネットに構築したAPIにアクセスする場合には、VPCリンクを活用します。以下の記事が大変参考になります。
API Gateway経由でのみアクセス可能なAPIをECSで構築する
終わりに
デベロッパーアソシエイトを勉強中で違いがよくわからない人は、本記事のように手を動かしてみるとその違いがわかると思います。