AWS Lambda(Scala) + APIGatewayでHTMLを返す
VPC内のLambdaでAPIGatewayから来たユーザのIPを見てコンテンツを出しわける。
Scalaのソースコード
Assemblyで実行可能なjarファイルを作成し、Lambdaにアップロードする。
ソースコード内では第一引数にAPIGatewayで設定したパラメータが入ってくるので、IPアドレスを取得し、一致チェックを行う。
package jp.qri.test
import com.amazonaws.services.lambda.runtime.Context
object Test {
def hello(input: java.util.Map[String, Object], context: Context): String = {
//IPアドレス取得
val ip = input.get("source-ip")
if (ip == null || ip != "yourIP") {
//指定したIPでない場合はIPか「null」を表示
if (ip != null) ip.toString() else "null"
} else {
//指定したIPであればHTMLを表示する。
"<html><head><title>Hello</title></head><body>Hello</body></html>"
}
}
}
Lambdaの設定
Handlerは「jp.qri.test.Test::hello」
VPC内で利用しているが、詳細な設定については下部参考URLを参照のこと。
Lambdaのテストリクエストは下記の通り。
結果としては「testIP」が表示される。
{
"source-ip" : "testIP",
"input" : "test"
}
APIGatewayの設定
APIGatewayの統合リクエスト
リモートIPを取得するため、本文マッピングテンプレートを修正。
{"source-ip" : "$context.identity.sourceIp"}
統合レスポンス
レスポンスが「"」で囲まれていたため、本文マッピングテンプレートで「"」内を取得。
コンテンツタイプ「application/javascript」に下記の内容を定義している。
$input.path('$')
メソッドレスポンス
200のレスポンスモデルにコンテンツタイプ「text/html」モデル「Empty」を追加した。
デプロイ
APIGateway画面からAPIをデプロイするとステージ画面にURLが表示されるので、リンクをクリックする。
IPアドレスが指定したものであればHTMLが表示され、異なるのであれば自身のIPアドレスが表示される。
参考
[AWS]LambdaVPCでScalaからAWS SNSを使ってiOSにJSON形式で通知してみた。
Amazon LambdaでScala
AWS LambdaでHTMLを出力してみた