サーバレスでお問い合わせフォームを実装してみる(1)
こんにちは、システムエンジニアの今井です。
前回のブログ「サーバーレスとは本当にサーバーがないこと?」でサーバーレスのしくみについて概要を紹介しました。今回からは全 4回に分けて「サーバーレスでお問い合わせフォームを実装する方法」について解説します。
→(1)サーバーレスでお問い合わせフォームを実装してみる(フォームとAPIの作成)
(2)サーバーレスでお問い合わせフォームを実装してみる(フォームからAPIへ値の送信)
(3)サーバレスでお問い合わせフォームに記載された内容をDBに保存してみる1
(4)サーバレスでお問い合わせフォームに記載された内容をDBに保存してみる2
今回は「ユーザーがお問い合わせをするフォーム」と「リクエストを受けてレスポンスを返すAPI」をそれぞれ動作させてみます。
1. S3にバケットを作成
S3とはSimple Storage Serviceの略称で、HDDやSSDのようなストレージを提供するサービスです。Web制作の現場では「FTPのようなファイル置き場」と言ったほうがわかりやすいかもしれません。
S3ではバケット(バケツ)というフォルダのようなものにファイル(オブジェクト)を格納します。バケットごとにアクセス制御ができるため、必要に応じて公開範囲を変更することができます。
それでは実際にS3にHTMLファイルを載せるためのバケットを作成します。
(1)Amazon S3のページを開きます。
https://s3.console.aws.amazon.com/s3/
(3)バケット名に「contact-example」と入力します。(その他の設定はデフォルトのままにしておきます)
(4)デフォルトでは外部からのアクセスをすべて遮断する「パブリック・アクセスをすべてブロック」設定になっているため、チェックを外して公開設定に変更します。
(5)スクロールして「バケットを作成」をクリックして確定します。
2. HTMLファイルをバケットにアップロード
次に、バケットにフォームを記述したHTMLファイルをアップロードします。
(1)さきほど作成したバケット「contact-example」をクリックして開きます。
(4)今回アップロードするのはフォームが記載されたこちらのファイルです。「index.html」
<!doctype html> <html lang="ja"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/> <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no, width=device-width"> <title>test</title> </head> <body> <form id="contact_form"> 会社名:<input type="text" name="company" value="" required /><br/> メールアドレス:<input type="email" name="email" value="" required /><br/> <input type="button" id="send" value="送 信"/> </form> <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> <script> var target_url = ''; $(function(){ $('#send').on('click', function(){ var company = $('#contact_form input[name="company"]').val(); var email = $('#contact_form input[name="email"]').val(); if(window.confirm('入力内容を送信します。よろしいでしょうか?')){ var formdata = { 'company' : company, 'email' : email }; $.ajax({ type: 'POST', url: target_url, dataType: 'json', data: formdata, scriptCharset: 'utf-8', cache: false }).done(function(res) { if (res.result==0) { alert('サーバエラーが発生しました。'); } alert("お問い合わせ、ありがとうございます。\n送信は正常に完了しました。\n\n近日中に担当の者よりご連絡させていただきます。\n\n今後とも何卒よろしくお願いいたします。"); console.log(res); }).fail(function(request, status, err){ alert('error'); console.log({request: request, status: status, err: err}); }); } }); }); </script> </body> </html>
ファイルを範囲にドラッグアンドドロップします。
アップロードしたhtmlファイルにアクセスしてみます。
「index.html」をクリックします。
詳細ページで「オブジェクトURL」をクリックします。
htmlファイルが開きますが、アクセスが拒否されてしまいます。
デフォルトではアップロードしたhtmlは非公開になっているため、アクセス許可を設定する必要があります。
「アクセス許可」をクリックします。
再度、htmlファイルにアクセスするとフォームが表示されるようになりました。
3. Lambda用のロールを作成
Lambdaとは、サーバーレスで機能を実現する際の中心的なしくみで、サーバーを用意しなくてもコードを実行できるサービスです。(サーバーレスやLambdaの概要については、前回の記事に詳しく書いてありますので、参考にしてみてください)
AWSでは細かなセキュリティ・アクセス制御がされているため、Lambdaの作成前にロール(権限)を準備する必要があります。
今回は「Lambdaを実行するための権限を付与したロール」が必要になるため作成していきます。ロールの作成は「IAM(あいあむ)」というアクセスコントロールのサービス上で行います。
(1)IAM のページを開きます。
https://console.aws.amazon.com/iam/home
(6)フィルタに「lambdabasicexec」と入力してポリシーの候補を絞り込みます。
(7)「AWSLambdaBasicExecutionRole」にチェックを入れます。
(8)「次のステップ:タグ」をクリックします。
(9)今回はタグは追加せずに「次のステップ:確認」をクリックします。
(10)ロール名に「contact-example-role」と入力し「ロールの作成」をクリックします。
4. Lambda関数の作成
サーバーレスで実際に処理を行う箇所となるLambdaの関数を作成します。
まずは、簡単なレスポンスを返すだけの処理を追加してみます。
(1)Lambda のページを開きます。
https://ap-northeast-1.console.aws.amazon.com/lambda/home
(2)関数の作成をクリックします。
今回はhttpアクセスをトリガーに実行したいので、「APIGateway」を追加します。
設計図(便利なテンプレート)があるので、そこから一番近い構成を選びます。
(4)フィルタに「microservice-http-endpoint-python」と入力し、該当の設計図を選択します。
(7)実行ロールで「既存のロールを使用する」をクリックします。
(8)先に作成しておいた「contact-example-role」を選択します。
(9)API GatewayトリガーについてAPIは「APIを作成する」、APIタイプは「HTTP API」、セキュリティは「オープン」を選択します。
「Lambda」と「API Gateway」が作成できました。
5. API Gateway のURLの確認
最後に作成したLambdaが動作するか確認してみます。
リクエストを待ち受けているAPIのページが新しいタブで開きます。
「{“message”:”Internal Server Error”}」とエラーメッセージが出ますが、リクエストに対してエラーメッセージを返すことが出来ているため「API Gateway」自体は動作させることができています。
ここまでの手順でフォームとAPIをそれぞれ動作させることができました。
次回ですが、今回作成したフォームとAPIを使って「最低限のお問い合わせ機能を実現する方法」について解説します。