17
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

GaiaxAdvent Calendar 2016

Day 25

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

Last updated at Posted at 2016-12-25

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

17
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?