AWS/APIゲートウェイ(独自ドメイン)でPython LambdaスクリプトへHTTPリクエストする。

まずはPythonコードを作成。
PythonコードはLambdaが読みとるlambda_function.pyファイルを始め、以下の構造とする。
※当方のpythonコードは2.7系

get_item_info_by_barcode
 |-conv2itemname.py ・・・利用する独自メソッドの詰め込み
 |-lambda_function.py ・・・Lambdaメイン
 |-test.py ・・・ローカルテスト用(Lambdaでは不要)

def lambda_handler(event, context):
  # APIゲートウェイの統合リクエスト→マッピングテンプレートで、AWSが用意してくれてる
  # "メソッドリクエストのパススルー"の標準ロジックから受け渡されるJSONから
  # リクエストパラメータ"code"を読み取る
  code = event["params"]["querystring"]["code"]
  result = conv2itemname.checkFromJancode(code)
  return {
    'statusCode': 200,
    'body' : {
      "itemname" : result
    }
  }
import urllib2
import xml.etree.ElementTree as ET

def checkFromJancode(jancode):
  # バーコードからの検索にYahoo APIを利用する。
  urlStr = 'http://shopping.yahooapis.jp/ShoppingWebService/V1/itemSearch?appid=[YahooAPIから払いだされたAPIキー]&jan=' + jancode
  res = urllib2.urlopen(urlStr)
  xml1 = res.read()
  xroot = ET.fromstring(xml1)
  ns = {'u':'urn:yahoo:jp:itemSearch'}
  for hitElm in xroot.findall('.//u:Hit', ns):
    nameElm = hitElm.find('u:Name', ns)
    ...
    取得されたデータから目的の文字列へ変換するロジック(今回の本筋ではないので省略)
    nameElm -> nm1へ
    ...
  return jancode + " , " + nm1

これらをzipにまとめて、Lambdaへアップロードする。
(コードエントリタイプ : .zipファイルをアップロード)

APIゲートウェイの作成

REST形式で新しいAPIを作成する。
とりあえずエンドポイントタイプはリージョンとした。
作成したAPIに対して、リソース→アクションから”メソッドの作成”を行う。今回は”GET”を作成する。
作成したGETメソッドを選択してメソッドリクエストの項目に入り、”URL クエリ文字列パラメータ”に今回クエリ文字列としたい”code”を追加し、必須とする。

次に統合リクエストで、統合タイプ:Lambda関数を選択し、Lambda関数テキストボックスに先ほど作成したLambda関数の名前を入力する。
マッピングテンプレートを開き、テンプレートが定義されていない場合 (推奨)を選択した状態でマッピングテンプレートの追加を行う。Content-Typeをapplication/jsonとし、テンプレートの生成でメソッドリクエストのパススルーを選択すると書き出されるコードそのままで保存する。
メソッドの実行へ戻り、テストを行う。
この時のLambda関数の状態は以下。

メソッドの実行→テストを実行し、クエリ文字列にcode=123として、ステータスが200となり目的の結果がレスポンス本文に出力されていることを確認する。

テストが成功した事を確認したらAPIゲートウェイのリソース→アクションからAPIのデプロイを行う。デプロイされるステージに好みの名前(devなど)を付けてデプロイする。

作成されたステージを開いた画面からURL の呼び出しにあるhttp://~~がアクセスポイントとして有効になる。

ルーティングの設定

次に独自ドメインを利用したいため、このAPIゲートウェイに対してRoute53を設定する。
SSL証明書が必要となるのでAWSのCertificate Managerから手持ちのドメインを利用してサブドメイン用の証明書を作成する。
(私の場合はrizworks.netっていうドメインに対してapputil-jp.rizworks.netというサブドメを作成)
Certificate Manager → 証明書のリクエスト(パブリック証明書のリクエスト)を行い、画面の指示に従い、検証完了させる。
※リクエストを出す際、エッジ最適化ではなくRegional指定で、東京リージョンにて作成したAPIゲートウェイに紐づけたい場合は、証明書のリクエストを出す際にログイン状態を東京リージョンに変更しておくこと。でないとRegional指定だとその証明書が選択できなくなる。

Route53に登録する。
レコードセットを追加し、Name(ドメイン名)を証明書のサブドメインに合わせてAliasをYesにして出てくるセレクトコンボボックスで、該当のAPIゲートウェイを選択する。

APIゲートウェイでカスタムドメインを追加する

新しいカスタムドメイン名で、HTTP、ドメイン名をRoute53で登録したサブドメイン名、エッジポイントをエッジ最適化もしくはRegionalにして出てくる証明書を選択する。エッジ最適化はけっこう時間かかるので、テストで作りたい時とかはRegionalがオススメ。登録したらベースパスマッピングを編集する。ここでAPIゲートウェイへのパスを/barcodeとした場合、次のアドレスでアクセスできるはず。
https://[ドメイン名]/barcode/dev?code=123
ベースパスマッピングでデプロイ名まで指定すれば、
https://[ドメイン名]/barcode?code=123
となる。

セキュリティ面が気になる場合はAPIキーをリクエストの必須にすることで堅牢にできる。
1.APIゲートウェイでAPIキー作成
2.使用量プランで作成したAPIと紐づけ
3.APIのメソッドリクエスト→APIキーの必要性をtrueにする。
の3ステップで完了。数秒後に反映される。

クライアントからはHTTPヘッダに、’x-api-key: [APIキー]’を付けてアクセスしないとmessage:Forbiddenが返るようになる。

curl https://apputil-jp.rizworks.net/barcode?code=123 --header 'x-api-key: [APIキー]'

以上

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です