API Gateway と Lambdaでお問い合わせフォームを作る

  • 9
    いいね
  • 0
    コメント

Gaiax Advent Calender 2016の25日目の記事です。AIRY事業部の三井です。

少し前に製品サイトの環境構築に携わりました。静的コンテンツのホスティングだけであればS3だけでよいと思うのですが、お問い合わせフォームを設けたかったのでサーバ立ててまっさらな状態から構築しました。しかし最近では動的コンテンツもAPI GatewayとLambdaを使うとサーバレスで実現できるそうなので試してみました。
今回は手元のお問い合わせフォームから送信した情報をAPI GatewayとLambdaを使ってS3に保存してみます。

公式のLambda 関数を公開するための API を作成するを参考に進めています。

構成

AWS Design.png
ユーザのリクエストをAPI Gatewayが受けて、それをトリガーにLamdaの関数が実行され、S3にデータが保存されるようにします。

Lambda関数の作成

スクリーンショット_2016-12-25_10_34_54.png
Lambdaの管理画面で「Get Started Now」をクリックします。

スクリーンショット_2016-12-25_10_44_14.png
左の「Configure function」をクリックします。
Nameに関数名を入力します。今回はcreateProposalとしました。
テキストエリアに処理の内容を記述します。Lambda上ではaws-sdkというnode向けのSDKが使え、それでS3を操作します。ちなみにリファレンスはこちらです。http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html

'use strict';

console.log('Loading function');

const AWS = require('aws-sdk');
AWS.config.update({
  accessKeyId: 'xxx',
  secretAccessKey: 'yyy',
  region: 'ap-northeast-1'
});

const s3 = new AWS.S3({ apiVersion: '2006-03-01' });

exports.handler = (event, context, callback) => {
  const params = {
    Bucket: 'Bucket Name',
    Key: 'File Name',
    Body: JSON.stringify(event),
    ACL: 'public-read'
  };

  s3.putObject(params, (err, data) => {
    if (err) {
      callback(null, { status: 'NG' });
    } else {
      callback(null, { status: 'OK' });
    }
  });
};

スクリーンショット_2016-12-25_11_08_59.png

下にスクロールしてRoleの設定をします。マニュアルに倣って以下の値にしました。
Role: Create new role from template(s)
Role Name: execute_my_lambda

「Next」をクリックすると確認画面に遷移するので「Create Function」をクリックするとLambda関数が作成されます。

API Gateway作成

スクリーンショット_2016-12-25_11_20_52.png
API Gatewayの管理画面で「今すぐ始める」をクリック。

スクリーンショット_2016-12-25_11_21_20.png
「新しいAPI」を選択し、「API名」を入力、「APIの作成」をクリック。これでAPIが作成されるので、リソースとメソッドを追加し、Lambda関数とひも付けていきます。

スクリーンショット_2016-12-25_11_28_12.png
「アクション」をクリックして、リソースの作成をクリックします。

スクリーンショット_2016-12-25_11_28_37.png
「リソース名」と「リソースパス」を入力し、「リソースの作成」をクリックします。

スクリーンショット_2016-12-25_11_29_12.png
リソースを追加したときと同様に「アクション」から「メソッドの作成」をクリックします。申し込み内容を保存するAPIなのでPOSTを選択し、右のチェックボタンをクリックします。

スクリーンショット_2016-12-25_11_39_15.png
「アクション」から「APIをデプロイ」をクリックするとダイアログが立ち上がるので「ステージ名」を入力して「デプロイ」をクリック。

スクリーンショット_2016-12-25_12_32_15.png
「ステージ」をクリックすると、作成したステージが表示されており、公開URLを確認できます。

お問い合わせフォーム作成

<script>
  $(function() {
    $('#form').on('submit', function(event) {
      event.preventDefault();

      var params = {};
      $($(this).serializeArray()).each(function(i, v) {
          params[v.name] = v.value;
      });

      $.ajax({
        url: "https://xxx.execute-api.ap-northeast-1.amazonaws.com/v1/proposal",
        method: "POST",
        data: JSON.stringify(params),
        success: function (res) { console.log(res) },
      });
    });
  });
</script>

スクリーンショット 2016-12-25 12.53.20.png
こんな感じで作ってみました。送信をクリックすると

スクリーンショット 2016-12-25 12.54.24.png
S3にファイルが作られていました。

{"company":"ガイアックス","name":"田中太郎","email":"sample@example.com","proposal":"メリークリスマス"}

中身はこんな感じで、送信されたデータを保存することができました。

感想

本番で使うとなると、更に細かく設定を見ていかないといけないと思うのですが、とても簡単にお申し込みフォームを作ることができました。アプリもこれでいいんじゃないかなと思いました。

それでは皆様一年間お疲れ様でした!よいお年を〜

参考

http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-create-resource-and-methods.html
http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/getting-started.html#getting-started-new-api
http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html

この投稿は Gaiax Advent Calendar 201625日目の記事です。