【AWS】サーバーレス入門、掲示板システムをつくる〜Schoo生放送のメモ〜
環境構築
1.掲示板アプリの構成を考える
関数は2つ、読み込み用と書き込み用を作る必要がある。
2.Lambda実行用のIAMロールをつくる
・基本的な権限
AWSLambdaBasicExecutionRole
・DynamoDBへのアクセス権
AmazonDynamoDBFullAccess
→権限強いため、開発終わり次第縛りを強くしていく。
コンソールより、
IAM>ロール>作成>Lambda>ポリシーを上記の二つにする>ロール名を任意(exlambdarole)に入力して決定。
メモ
課金が怖いなら、EC2上にLambdaエミュレータを作ってEC2上でテストしたほうがいいかも。
3.DynamoDBのテーブルをつくる
DynamoDBの特徴
・キーバリューストア型のDB
・プライマリーキーの項目だけ設定すれば使える。
・Lambdaから使いやすい。
・日付、時刻の型がない→数値か文字列で記録する。
数値ならタイムスタンプ、文字列はISO8601にて。
・事前に列名(項目)を決めなくてもその場で決められる。
・データ(レコード)ごとに持つ項目が違っても構わない。
コンソールにて、
テーブル名:keijiban
プライマリーキー:id 、数値を選択して作成
4.テスト用の掲示板データを書き込む
項目の作成>idに1を入力
続いて
Append>String>
name:山田太郎
msg:この投稿はテストです
postat:2018-03-25 13:00:00
保存。
DynamoDBのその他のタブの説明
トリガー
投稿があったら通知するなど
レコード変更あったらLambdaを読み込んで、RDSに書き込まれるなど。
容量
読み書きの容量ユニットをいじると変更できるが、課金額も変わる。
DynamoDBの課金は
同時アクセス数とデータの読み書き量/秒である
DynamoDBからデータを読み込む
環境構築が終わったので実際にデータを読み込んでみる。
DynamoDBからデータを読み込む
環境構築が終わったので実際にデータを読み込んでみる。
event,context
eventは入力された値などがはいる。メアドなど。
context
API GatewayとLamdaの仕組み
Lambdaプロキシ統合①
WEBから受信したデータを自動でLambdaに渡したり、
逆にLambdaからきたデータを自動で整形してWEBに返したりする仕組み。
Lambdaプロキシ統合②
Lambda関数からの戻り値はJSON
HTMLデータを戻す場合
{
statusCode:200,
headers:{
content-type:text/html
},
body:
}
これがAPIにわたされてブラウザに表示されることになる。
設計図からAPI GatewayとLamda関数を作る
API GatewayとLambdaを同時に作成するのが簡単。
コンソールより
Lambda>関数の作成>設計図>「microservice」と入力して検索>microservice-http-endpoint-python3を選択>設定
・ロール
名前:keijibanread
ロール:既存から選択
既存のロール:exlambdarole
・API Gateway
新規API作成
API名:keijibanread
デプロイされるステージ:prod(テスト、本番などの名前をつけられる)
セキュリティ:オープン(
AWS IAMがないと実行できない、
オープン:誰でも実行、
アクセスキー使用:パスワードを発行して承認されないと実行できない)
関数の作成
1から作成:白紙から作る
設計図から:テンプレから選ぶ(簡単)
サーバーレスアプリケーションのレポジトリ:Lambda関数のレポジトリから作る
名前はmicroserviceで登録されている
3つ出てくるが、プログラミング言語の違いしかない。
今回はPython3で作る。
左がイベント、
真ん中が作った関数
→がどんな権限なのかの設定
このままだとmicroserviceのテンプレなので、この後プログラムをかく。
DynamoDBから掲示板データを参照するプログラムを書く
ここは規約上授業内でしか利用出来ない為掲載できません。。。sorry..
書いたら保存。
動作テスト
コンソールのLamda、保存の横にあるドロップダウンボタンを押して
テストイベントの設定>イベントテンプレート(API Gateway AWS Proxy)が選択されているはずなので、そのままでイベント名をtestとかにして作成。
続けてテストを押す。
画面上部に成功と結果が出てくるので、詳細を押すと下記。
{ "statusCode": "200", "body": "<html><meta charset=\"UTF-8\"><body><h1>掲示板</h1><table><tr><th>投稿者</th><td>山田太郎</td></tr><tr><th>投稿日時</th><td>2018-03-25 13:00:00</td></tr><tr><th>メッセージ</th><td>この投稿はテストです</td></tr></table></body></html>", "headers": { "Content-Type": "text/html" } }
DynamoDBに入力したものが取り出せている。
ブラウザでアクセス
Lambdaで一番下に行くとAPI Gatewayの欄があり、詳細を押すと
URLの呼び出しというところにURLが作られている。
それをコピペするとHTMLのデータがブラウザで確認できる。
https://xxxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/prod/keijibanread
実際のプログラミング部分の勉強方法は?
どんなサービスをつくるにしろ、流れは大体変わらないだろうし簡単だが、
実際にどんなプログラムを作るかってところが大事。
AWSでは今の所node.js、Pythonなどが対応していてPHPなどは対応してない為、何かしら勉強しないといけない。
Pythonも悪くはないが、JavaScriptの方が馴染みは多少あるので、node.jsで作りたいと思っている。
ただ、node.jsそのものを書くというよりかはnode.jsはあくまで基本だけでよく、どっちかというとDynamoDBの書き方みたいなものになるので、AWSの本の方がいいみたい。
AWSが用意しているサンプルもあるので、サンプルを真似した方がいいとのこと。
参考資料など
いくつか参考になりそうなものが紹介されていたので貼っておきます。
CodeCommit
Amazon CodeCommit(安全でスケーラブルなマネージド型ソースコントロールサービス) | AWS
→本家Amazonなのでたぶんこれが一番間違いはないんだろうな。。
Lambda実践ガイド インプレス
→この本の著者が紹介してたのでまあ当然ではあるけど講義内容も分かりやすかったのでいい気がする。
cloudpackサーバーレス開発ホワイトペーパー クラウドパック
cloudpackサーバーレス開発ホワイトペーパー|AWS専業のcloudpack
→無料だしサンプルもあるらしいのでよさげ。