はじめに
サーバーレス勉強する際に、いろいろ試したメモ、
つまずいた点や、解決法など、主に自分用のメモになります。
他の方の参考にもなれば嬉しいです。
やること
- 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");
var AWS = require("aws-sdk");
AWS.config.region = "ap-northeast-1";
var docClient = new AWS.DynamoDB.DocumentClient();
exports.handler = function(event, context, callback) {
var params = {
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");
const AWS = require("aws-sdk");
AWS.config.region = "ap-northeast-1"
var docClient = new AWS.DynamoDB.DocumentClient();
exports.handler = function(event, context, callback){
var params = {
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にデータ挿入、また取得します。
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title1</title>
<script type="text/javascript" src="./jquery-2.1.4.min.js"></script>
</head>
<body>
<div id="entries">
</div>
<h1>Write new comment</h1>
<form>
<label for="message">Message</label>
<textarea id="message"></textarea>
<button id="submitbutton">submit</button>
</form>
<script type="text/javascript">
var API_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();
}
});
return false;
})
})
</script>
</body>
</html>
S3のパケット作ります
パケット名
を入力し、リージョンは東京を使用します。
作成
でパケットを作ります。
フォルダ
を作ります。
ウェブアプリのファイルとjqueryのmin.jsを同じフォルダーにアップロードします。
アップロードされたファイル(HtmlをJqueryのmin.js)にチェック入れて、
アクション
から公開します。
公開されたアプリケーションでDynamoDBを操作する
公開されたHtmlファイルのurlを開いて、実際操作します。
以上で終わりです。
追記
kinsisでLambdaを呼び出す(追加中)
手順
- 実行ロールのアクセス権限
- Kinesisnのstreamを作成
- lambda関数の作成
- awscli使ってテスト
実行ロールのアクセス権限
コマンドラインからkinesisnにデータを送り、そしてLambdaを呼び出して、
そのデータをDynamoDBに保存するという仕組みを作ります。
以下の権限を既存ロールLambda-DynamoDB-Write-Read
に追加
- kinesis:DescribeStream
- kinesis:DescribeStreamSummary
- kinesis:GetRecords
- kinesis:GetShardIterator
- kinesis:ListShards
- kinesis:ListStreams
- kinesis:SubscribeToShard
参照元
Kinesisnのstreamを作成
lambda関数の作成
作成する際に、ロールも追加します。
"use strict";
console.log("loading function");
var AWS = require("aws-sdk");
var docClient = new AWS.DynamoDB.DocumentClient();
AWS.config.region = 'ap-northeast-1';
exports.handler = (event, context, callback) => {
event.Records.forEach((record)=>{
var payload = Buffer.from(record.kinesis.data,"base64").toString("ascii");
console.log("Decoded payload", payload);
var params = {
Item: {
data : Date.now(),
message: payload,
},
TableName: "Lambda-DynamoDB-Write-Read"
};
docClient.put(params, (err, data)=>{
if(err){
callback(err, null);
}else{
callback(null, data);
}
});
});
};
awscli使ってテスト
aws kinesis put-record \
--stream-name [先程作ったkinesis-stream] \
--data "何か" \
--partition-key shardId-000000000000 \
--region ap-northeast-1
--profile [アカウトprofile]