はじめに
naritomoと申します。
本職はインフラエンジニアを行っています。
これまで作成していたJSONパーサーAPIを、AWSのLambda,APIGatewayを使用して立ち上げみました。
いろいろアドバイスいただけると嬉しいです。
開発概要
以下の仕様とします。
- API稼働フレームワークはLambda(Python)+API Gatewaayを使用する
- API入力は、以下のものを入力する
- URLにクエリでJSONキーを指定する。(?key=key1)
- POSTボディーにJSONデータを入れる
- API出力は以下のものとする
- クエリで指定したJSONキーに対応した値をプレーンテキストで出力する
事前準備
AWSアカウントを作成していること。
*本システムでしたらかかっても1日あたり0.01ドルですみます。
API構築方法
Lambda関数作成
AWSのメニューからLanbdaコンソールに入る。
関数の作成をクリックし、以下の設定を行って関数を作成する。
- 一から選択を選ぶ
- 関数名は任意の名前を選択する
- ランタイムは"Python3.xx"を選択する
- アーキテクチャは"x86_64"を選択する
コードソースに移動して
以下関数内容を入力して、"Deploy"をクリックする。
"Test"は行わなくてよい。
import json
def lambda_handler(event, context):
try:
# POSTで送られてくるJSONデータをパースする
body = json.loads(event['body'])
# URLクエリパラメータからキーを取得する
query_key = event['queryStringParameters']['key']
# キーに対応する値を取得する
value = body.get(query_key, 'Key not found in JSON')
return {
'statusCode': 200,
'headers': {'Content-Type': 'text/plain'},
'body': str(value)
}
except Exception as e:
return {
'statusCode': 500,
'headers': {'Content-Type': 'text/plain'},
'body': str(e)
}
APIGateway設定
AWSのメニューからAPI Gatewayコンソールに入る
1.サービスから「API Gateway」を選択します
2.HTTP APIボタンの構築をクリックします
3.統合に「Lambda」、Lambda関数に先程作成した関数を指定する
4.API名を設定し「次へ」をクリックする
5.ルート設定画面にて、任意のリソースパスを設定し、「次へ」をクリックする
6.ステージを定義画面で「次へ」をクリックする
7.「Review and Create」画面で設定を確認し、「作成」をクリックしてAPIを作成します
8.API一覧から作成したAPIを選択する
9.左のメニューからRouteをクリックして、ルート詳細の編集をクリックする
10.ルートとメソッド画面にて"POST"を選択し、保存をクリックする
ここまでで、APIは完成しますが、独自ドメイン+SSLを使用したい場合は以下の手順を参照してください
事前に独自ドメインを入手し、Route53でパブリックホストゾーンを作成してください
AWS Certificate ManagerでSSL証明書を取得する
-
AWS Management Consoleにサインインし、「AWSCertificate Manager」サービスを選択します
-
「証明書をリクエスト」をクリックします
3.パブリック証明書をリクエストを選択し、次へをクリックする
4.パブリック証明書をリクエスト画面にてAPIに使用するドメイン名を設定する
5.画面の一番下に移動して、リクエストをクリックする
6.対象証明書のドメイン設定箇所で、Route53でレコード作成をクリックする
7.右下のレコード作成をクリックする
8.証明書一覧に戻り、ステータスが発行済となっていることを確認する
API Gatewayでカスタムドメインを作成する
1.AWS Management Consoleで「API Gateway」サービスを選択します
2.左側のナビゲーションパネルで「Custom Domains」をクリックします
3.SSL証明書を作成する際に使用したドメイン名を設定する
4.エンドポイントはリージョンを選択し、ACM証明書は先ほど作成したものを指定し、ドメイン名を作成をクリックする
カスタムドメインにAPIをマッピングする
1.左側のカスタムドメイン名設定をクリックします
2.「API マッピング」タブをクリックし、「APIマッピングを設定」をクリックします
3.新しいマッピングをクリックする
4.APIマッピングを設定に、以下の情報を入力し、保存をクリックする
- 「API」: 作成したAPIを選択します
- 「Stage」: デプロイされているAPIのステージを選択します(通常は「$default」)
- 「Path」:空白にします
Route 53でDNSレコードを設定する
1.AWS Management Consoleで「Route 53」サービスを選択し、ホストゾーンをクリックします
2.パブリックドメインに対応するホストゾーン名をクリックします
3.「レコードを作成」をクリックし、以下の情報を入力します
- 「Record name」: SSL証明書で指定したドメイン名を入れます
- 「Record type」: 「A - IPv4 address」を選択します
- 「エイリアス」: 有効化にします
- トラフィックについて、作成したAPIGatewayを指定します
4.右下の「レコードを作成」をクリックして、DNSレコードを作成します
これで、Route 53で持っているドメインとAPI Gatewayが連携し、独自ドメインでAPIにアクセスできるようになります
動作確認
ターミナルを立ち上げ、以下のコマンドを入力する
({ドメイン名}、{パス名}を実際のAPI GatewayのURLに置き換えてください)
curl -X POST -H "Content-Type: application/json" -d '{"name": "John", "age": "30"}' "https://{API_URL}/{パス名}?key=age"
30という値が返ってくること
おわりに
AWS Lambda+APIGatewayでのアプリ開発第一歩として、JSONパーサーAPIを構築してみました
この記事がAWS上でのサーバーレスAPIを作ってみたい方の助けになればと思います