サーバレスでお問い合わせフォームを実装してみる(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を使って「最低限のお問い合わせ機能を実現する方法」について解説します。






















