AWS Lambdaの関数URLを使ってGET/POSTの値を取得する簡単サンプル
2023/02/15
2023/03/08
関数URLは便利な機能
pythonでlambdaの関数を作成し実験を行います。WEB CGIプログラムを従来だったならAPI GatewayとLambdaを連携させて作成するところだが昨年2022年関数URL機能が用意されAPI Gatewayを使わなくてもシンプルな使い方であればLambdaだけで簡単フォーム経由でのサーバ登録が行えてしまう。気軽にどのホストに登録したサーバコンテンツからでもAWSのlambdaを使ってCGI的な呼び出しができるのは良いですね。
実験する内容
EC2でWEB起動しindex.htmlのフォームから関数URLをform actionに設定し情報を送って見ましょう。これができるとRDS、auroraで作成したDBにデータを登録できるよね。今回はDBへ送るのはやらないけど容易にできることはわかるはず。関数作成時に設定する下記の箇所をチェックしておこう。
コンテンツフォームの内容
今回はEC2でコンテンツ作成したがオンプレのサーバで実験やってみても問題ない。 関数URLはパブリックに公開しているわけなので本番時にIAMサーバー認証を入れるとベターですね。実験では面倒なので省略します。尚関数コードはGET/POST両方用意するので適宜form methodの箇所をGET/POSTに書き換え、actionには関数URLに書き換えて実験しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>HTML5サンプル</title> </head> <body> <form action="https://xxxxxxxxxxxxxxxxxxx.lambda-url.ap-northeast-1.on.aws/" method="get"> <label>メールアドレス</label><br> <input type="email" name="email-address" value="" placeholder="xxxx@example.com"><br> <label>パスワード</label><br> <input type="password" name="passwd" value="" maxlength="8" placeholder="〜8文字で入力"> <input type="submit" value="SEND"> </form> </body> </html> |
関数コードGET式で実験する場合のコード
下記をlambda_functionのコードパッドに入力してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import json #import requests def lambda_handler(event, context): email = event['queryStringParameters']['email-address'] passwd = event['queryStringParameters']['passwd'] #名前と画像を返すhtmlを作成し、ブラウザに取得値を返却する html = "<html><body>" + email + "<br>" + passwd + "<br>" + "</body></html>" return { 'statusCode': 200, 'headers': { 'Content-Type': 'text/html', }, 'body': html, } |
関数コードPOST式で実験する場合のコード
GET式よりも少し複雑になりましたがそれでも比較的簡単にかけました。 下記をlambda_functionのコードパッドに入力してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
import json import base64 from urllib.parse import unquote,urlencode,urlparse,parse_qs def lambda_handler(event, context): #eventから入力値を取得 data = event["body"] data2 = unquote(base64.b64decode(data).decode()) email = data2.split('&')[0] passwd = data2.split('&')[1] #名前と画像を返すhtmlを作成し、ブラウザに取得値を返却する html = "<html><body>" + email.split('=')[1] + "<br>" + passwd.split('=')[1] + "<br>" + "</body></html>" return { 'statusCode': 200, 'headers': { 'Content-Type': 'text/html', }, 'body': html, } |
実験してみましょう
1 2 3 |
$ ls -l index.html -rw-rw-r--. 1 rocky rocky 543 Feb 9 04:52 index.html $ python3 -m http.server 8000 |
ブラウザーからアクセスしてみましょう。
次のような結果になればOKですね