NEWS ABOUT Solution WORKS TEAM BLOG お問い合わせ JP EN

サーバレスでお問い合わせフォームを実装してみる(1)

こんにちは、システムエンジニアの今井です。

前回のブログ「サーバーレスとは本当にサーバーがないこと?」でサーバーレスのしくみについて概要を紹介しました。今回からは全 4回に分けて「サーバーレスでお問い合わせフォームを実装する方法」について解説します。

→(1)サーバーレスでお問い合わせフォームを実装してみる(フォームとAPIの作成)
(2)サーバーレスでお問い合わせフォームを実装してみる(フォームからAPIへ値の送信)
(3)サーバレスでお問い合わせフォームに記載された内容をDBに保存してみる1
(4)サーバレスでお問い合わせフォームに記載された内容をDBに保存してみる2

「サーバーレスお問い合わせフォーム」の全体像
スライド2

今回は「ユーザーがお問い合わせをするフォーム」と「リクエストを受けてレスポンスを返すAPI」をそれぞれ動作させてみます。
スライド3

 

1. S3にバケットを作成

S3とはSimple Storage Serviceの略称で、HDDやSSDのようなストレージを提供するサービスです。Web制作の現場では「FTPのようなファイル置き場」と言ったほうがわかりやすいかもしれません。

S3ではバケット(バケツ)というフォルダのようなものにファイル(オブジェクト)を格納します。バケットごとにアクセス制御ができるため、必要に応じて公開範囲を変更することができます。

それでは実際にS3にHTMLファイルを載せるためのバケットを作成します。

(1)Amazon S3のページを開きます。

https://s3.console.aws.amazon.com/s3/
2-1-1_バケットを作成

 

(2)バケットを作成をクリックします。
2-1-2__バケットを作成

 

(3)バケット名に「contact-example」と入力します。(その他の設定はデフォルトのままにしておきます)
def210129_1812

(4)デフォルトでは外部からのアクセスをすべて遮断する「パブリック・アクセスをすべてブロック」設定になっているため、チェックを外して公開設定に変更します。
def210202_1899_2

(5)スクロールして「バケットを作成」をクリックして確定します。
def210129_1813

 

バケットが作成されました。
def210129_1814

 

2. HTMLファイルをバケットにアップロード

次に、バケットにフォームを記述したHTMLファイルをアップロードします。

(1)さきほど作成したバケット「contact-example」をクリックして開きます。
def210129_1814

(2)バケットの詳細画面が開きます。
def210129_1815

(3)アップロードをクリックします。
def210129_1815_2

(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>

ファイルを範囲にドラッグアンドドロップします。
def210129_1816

(5)ファイルが追加されました。(まだ保存されていません)
def210129_1817

(6)「アップロード」をクリックして確定します。
def210129_1818

ファイルがアップロードできました。
def210129_1819

アップロードしたhtmlファイルにアクセスしてみます。
「index.html」をクリックします。
def210201_1891
詳細ページで「オブジェクトURL」をクリックします。
def210201_1892
htmlファイルが開きますが、アクセスが拒否されてしまいます。
def210201_1894
デフォルトではアップロードしたhtmlは非公開になっているため、アクセス許可を設定する必要があります。
「アクセス許可」をクリックします。
def210201_1892_2

全員(公開アクセス)の「読み込み」をチェックします。
def210201_1897_2

「変更の保存」をクリックします。
def210201_1898_2

再度、htmlファイルにアクセスするとフォームが表示されるようになりました。
def210202_1902

3. Lambda用のロールを作成

Lambdaとは、サーバーレスで機能を実現する際の中心的なしくみで、サーバーを用意しなくてもコードを実行できるサービスです。(サーバーレスやLambdaの概要については、前回の記事に詳しく書いてありますので、参考にしてみてください)

AWSでは細かなセキュリティ・アクセス制御がされているため、Lambdaの作成前にロール(権限)を準備する必要があります。

今回は「Lambdaを実行するための権限を付与したロール」が必要になるため作成していきます。ロールの作成は「IAM(あいあむ)」というアクセスコントロールのサービス上で行います。

(1)IAM のページを開きます。
https://console.aws.amazon.com/iam/home

def210129_1820

(2)ロールをクリックします。
def210129_18202

(3)ロールの作成をクリックします。
def210129_1821_2

(4)一覧からLambdaを選択します。
def210129_1822

(5)「次のステップ:アクセス権限」をクリックします。
def210129_1823

(6)フィルタに「lambdabasicexec」と入力してポリシーの候補を絞り込みます。
def210129_1824

(7)「AWSLambdaBasicExecutionRole」にチェックを入れます。
def210129_1825

(8)「次のステップ:タグ」をクリックします。
def210129_1825

(9)今回はタグは追加せずに「次のステップ:確認」をクリックします。
def210129_1826

(10)ロール名に「contact-example-role」と入力し「ロールの作成」をクリックします。
def210129_1827

Lambdaの実行に必要なロールが作成できました。
def210129_1828

4. Lambda関数の作成

サーバーレスで実際に処理を行う箇所となるLambdaの関数を作成します。
まずは、簡単なレスポンスを返すだけの処理を追加してみます。

(1)Lambda のページを開きます。
https://ap-northeast-1.console.aws.amazon.com/lambda/home

def210129_1829

(2)関数の作成をクリックします。
def210129_1829

今回はhttpアクセスをトリガーに実行したいので、「APIGateway」を追加します。
設計図(便利なテンプレート)があるので、そこから一番近い構成を選びます。

(3)「設計図の使用」をクリックします。
def210130_1841_2

(4)フィルタに「microservice-http-endpoint-python」と入力し、該当の設計図を選択します。
def210212_1908_2

(5)「設定」をクリックします。
def210212_1909_2

(6)関数名に「ContactSend」と入力します。
def210129_1832

(7)実行ロールで「既存のロールを使用する」をクリックします。
def210129_1833

(8)先に作成しておいた「contact-example-role」を選択します。
def210129_1833

(9)API GatewayトリガーについてAPIは「APIを作成する」、APIタイプは「HTTP API」、セキュリティは「オープン」を選択します。
def210129_1834

(10)スクロールして「関数の作成」をクリックします。
def210212_1910_2

「Lambda」と「API Gateway」が作成できました。
def210129_1836_2

5. API Gateway のURLの確認

最後に作成したLambdaが動作するか確認してみます。

(1)「API Gateway」をクリックします。
def210129_1837

(2)API Gatewayの「詳細」をクリックします。
def210129_1838

(3)APIエンドポイントをクリックします。
def210130_1842_2

リクエストを待ち受けているAPIのページが新しいタブで開きます。
def210212_1912

「{“message”:”Internal Server Error”}」とエラーメッセージが出ますが、リクエストに対してエラーメッセージを返すことが出来ているため「API Gateway」自体は動作させることができています。

ここまでの手順でフォームとAPIをそれぞれ動作させることができました。

次回ですが、今回作成したフォームとAPIを使って「最低限のお問い合わせ機能を実現する方法」について解説します。

今井 健一朗
ひとつ前の投稿 ひとつ前の投稿
ひとつ前の投稿 ひとつ前の投稿 サーバーレスとは本当にサーバーがないこと?