API Gatewayから大量のデータを投入し、これらのデータを解析および蓄積する場合には、API GatewayからLambdaに直接データを渡すのではなく、大規模データストリームサービスのKinesisを介した方が、バックエンドのシステムが高負荷に晒されずに安定的に稼働させられる場合がある。
API Gatewayとバックエンドのエンドポイントとの接続は、API Gateway内の統合リクエスト 機能を用いて行い、統合リクエストは下の5つの統合タイプを用意している。
Lambda関数
HTTP
Mock
AWSサービス
VPCリンク
Mockは、バックエンドと接続せずにレスポンスを返す統合タイプで、テストを行う際や、CROSのプリフライトリクエストの返答などに用いる。
統合リクエスト
Kinesisと接続する場合は、POST メソッドを作成し、上記のうちの「AWSサービス 」を選択して以下のように各欄に必要事項を入力する。Kinesisへデータ投入する際には、Kinesis側で用意されているputRecord メソッドを使用する。
項目
入力内容
備考
統合タイプ
AWSサービス
AWS リージョン
当該Kinesisのリージョン
AWS サービス
Kinesis
AWS サブドメイン
空欄
HTTP メソッド
POST
アクション
PutRecord
実行ロール
KinesisへのputRecordをAPI Gatewayに許可するIAMロール
arn:aws:iam::account-id:role/iam-role-name
IAMロールについては、KinesisへのputRecordをAPI Gatewayに許可する記述が必要で、IAM上で以下の内容を含んだIAMロールを作成する。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"kinesis:PutRecord",
"kinesis:PutRecords"
],
"Resource": "arn:aws:kinesis:*:*:stream/*"
}
]
}
データマッピング
API GatewayからKinesisにデータを投入する場合は、クライアントから受信したデータをKinesisが規定するデータフォマットに変換する必要がある。これに対応するのがデータマッピング 機能で、Velocity Template Language を用いて記述することができる。
よく使われる関数および使用例を以下に挙げる。
記述
内容
#set($param = ”)
変数の定義
#if(評価式) #end
if文
$context.requestTimeEpoch
データの受信時刻
$input.path(‘$.param’)
入力データ内の指定タグの値
$input.path(‘$.param’).size
入力データ内の指定タグの数
$input.params().header.get(”)
ヘッダ内の指定タグの値
$input.json(‘$.param’)
入力データ内の指定タグJSONデータ
$util.urlDecode($input.path(‘$’))
入力データをURLデコード
$util.escapeJavaScript(data)
文字をエスケープ
$util.base64Encode(data)
文字をBASE64エンコード
また、これらを使用してデータマッピングを記述すると以下となる。
#set($allParams = $input.params())
{
"params" : {
#foreach($type in $allParams.keySet())
#set($params = $allParams.get($type))
"$type" : {
#foreach($paramName in $params.keySet())
"$paramName" : "$util.escapeJavaScript($params.get($paramName))"
#if($foreach.hasNext),#end
#end
}
#if($foreach.hasNext),#end
#end
}
}