はじめに
サーバーレス勉強する際に、いろいろ試したメモ、
つまずいた点や、解決法など、主に自分用のメモになります。
他の方の参考にもなれば嬉しいです。
やること
- DynamoDBでテーブル作成
- IAMでDynamoDB用のロール作成
- Lambda上でDynamoDBに値を挿入
- Lambda上でDynamoDBから値を取得
- API Gatewayの設定
- S3にウェブアプリケーションをアップし、公開する
- 公開されたアプリケーションでDynamoDBを操作する
DynamoDBでテーブル作成
テーブルの作成
をクリックしてください。テーブル名
とプライマリキー
を入力します、プライマリキー
のタイプは数値
を選んでください。
デフォルト設定の使用
のチェックを外します、今回はテストのため、性能は最低限のもので良いです。
設定が終わったら作成
をクリックします、しばらくしたらテーブルが作成されるはずです。
IAMでDynamoDB用のロール作成
権限なしではLambdaがDynamoDB操作できません、Lambda作成する前にまずロールを作ります。AWSサービス
のLambda
を選び、次のステップ
を押してください。
Dynamoを検索して、AmazonDynamoDBFullAccess
とAWSLambdaDynamoDBExecutionRole
にチェック入れてください。
タグの追加に関しては、わかりやすいkeyとvalueでいいと思います。
ロール名も用途が分かりやすいもので良いです、作成完了したら、Lambdaの方に入ります。
Lambda上でDynamoDBに値を挿入
関数を作ります。関数の作成
をクリック。一から作成
を選択、関数名は用途が分かりやすいものにします。
言語は今回Node.js
にします。アクセス権限
は先ほど作って置いたロールを使用します。
設定が終わったら、関数を作成します。
関数の内容はリクエストからmessage
を受け取って、DynamonDBに保存するというシンプルな内容でした。
"use strict"console.log("loading function");varAWS=require("aws-sdk");AWS.config.region="ap-northeast-1";vardocClient=newAWS.DynamoDB.DocumentClient();exports.handler=function(event,context,callback){varparams={Item:{data:Date.now(),message:event.message},TableName:"Lambda-DynamoDB-Write-Read",};docClient.scan(params,function(err,data){if(err){console.log("Fail to write into DynamoDB");callback(err,null);}else{console.log("Successfully write into AWS DynamoDB");callback(null,data);}});};
Lambda上でDynamoDBから値を取得
設定は値挿入時と同じです。
今回はデータの読み取りなので、関数名はLambda-DynamoDB-read-test
にします。
"use strict"console.log("loading function");constAWS=require("aws-sdk");AWS.config.region="ap-northeast-1"vardocClient=newAWS.DynamoDB.DocumentClient();exports.handler=function(event,context,callback){varparams={TableName:"Lambda-DynamoDB-Write-Read",Limit:100};docClient.scan(params,function(err,data){if(err){console.log("Fail to read from AWS DynamoDB");callback(err,null);}else{console.log("Successfully Read from AWS DynamoDB table");Reflect.set(data,"headers",{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Credentials":"true"});Reflect.set(data,"responseCode",200);context.succeed(data);}});}
API Gatewayの設定
APIを作成します。REST API
を選択します。
API名と説明を入力して、作成します。
作成完了後、メニューのアクション
から、メソッドの作成
を選択して、GET
とPOST
を作ります。
GET
Lambda関数
にチェックを入れて、
Lambda関数の所に先程作った、DynamoDBから値を取得用のLambda関数名を入れます。Lambda 関数に権限を追加する
のダイアログが出てきますが、ok
を選択します。CORS
を有効化します、アクション
からCORS の有効化
にしてください。アクション
から、APIのデプロイ
を行ないます。新しいステージ
を選択して、ステージ名*
、ステージの説明
、デプロイメントの説明
を入力します。
デプロイ完成したら、スタージでメソッド確認できます。
POST
手順はGET時と基本同じです。
先程作った値を挿入用のLambda関数を使用します。
作った後、統合リクエスト
を選択します。
マッピングテンプレート
にapplication/json
をContent-Type
に追加します。
デプロイする際に、先程作ったステージを選択します。
完了後のステージはこんな感じになります。
S3にウェブアプリケーションをアップし、公開する
使用するウェブアプリのソースは以下になります。
Jqueryのmin.jsを同じディレクトリに置いてあります。
機能はajax使用して、ApiGatewayにGETとPOSTのリクエストを送り、
DynamoDBにデータ挿入、また取得します。
<htmllang="en"><head><metacharset="UTF-8"><title>Title1</title><script type="text/javascript"src="./jquery-2.1.4.min.js"></script></head><body><divid="entries"></div><h1>Write new comment</h1><form><labelfor="message">Message</label><textareaid="message"></textarea><buttonid="submitbutton">submit</button></form><script type="text/javascript">varAPI_Gateway_URL="APIのURL";$(document).ready(()=>{$.ajax({type:"GET",url:API_Gateway_URL,success:(data)=>{$("#entries").html("");data.Items.forEach((getcomments)=>{$("#entries").append("<p>"+getcomments.message+"</p>");})}});});$(function(){$("#submitbutton").click(()=>{console.log($("#message").val());$.ajax({url:API_Gateway_URL,type:"POST",data:JSON.stringify({"message":$("#message").val()}),contentType:'application/json',success:function(data){location.reload();}});returnfalse;})})</script></body></html>
S3のパケット作ります
パケット名
を入力し、リージョンは東京を使用します。作成
でパケットを作ります。フォルダ
を作ります。
ウェブアプリのファイルとjqueryのmin.jsを同じフォルダーにアップロードします。
アップロードされたファイル(HtmlをJqueryのmin.js)にチェック入れて、アクション
から公開します。