LoginSignup
4
3

More than 5 years have passed since last update.

AWS Lambda(Scala) + APIGatewayでIP制限をかけてHTMLを返す

Last updated at Posted at 2016-11-29

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を出力してみた

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3