AWS Loft Tokyo で開催された Hands-on for developers_Hajimete serverless_Tokyo_20190227 - 知っ得ハンズオンシリーズ はじめての Serverless に参加してきたので、そのレポート・メモです。

スケジュール

  • 18:00 - 18:30 受付
  • 18:30 - 19:00 座学セッション
    • ハンズオンの説明
    • Serverless とは
    • AWS におけるサーバレスコンピューティングについて
  • 19:00 - 20:30 ハンズオン (各自黙々とやる感じ)
  • 20:30 - 21:00 質問など

座学セッション

最初は座学セッションということで、今回やるハンズオンの説明と、そもそも Serverless とは?というところから、AWS におけるサーバーレスコンピューティングについてのセッションでした。 私は、サーバーレスという言葉自体はもう既に何度も聞いたことがあるし、内容についてもふんわりとは分かっているという状態。また、実際に AWS Lambda で関数も作ったことがある。そんな人間なので、最初の座学セッションは良い復習になりました。

以下、座学セッションのメモです。

今回やるハンズオンの内容

Step1

  • Cognito, IAM を利用して S3 のバケット操作で権限による挙動の変化を確認する

Step 2

  • API Gateway, Lambda, DynamoDB を利用して REST インターフェースを構築する

Serverless とは

  • サーバ管理は不要
  • 利用状況に応じて自動で拡張
    • 開発・実装において注意点あり
  • 利用していないリソースの支払いは不要
  • 可用性や対障害性は実装済み

AWS におけるサーバレスコンピューティング (と今回使うサービスの概要)

  • API Gateway や S3 へのオブジェクトプットなどのイベントがあったときにコンテナ環境が立ち上がる
  • RDB への接続が苦手
    • コネクションポーリングが使えない
    • だから DynamoDB (NoSQL) を使う
  • 関数単位
    • 細かいセキュリティ設定が可能
    • 開発段階で適当にセキュリティを決めると、後々大変
    • 今回は DynamoDB への書き込み・読み込み の 2 つの関数を作る
  • Lambda の実行は 900 sec 以内
    • それより長くなる場合は Fargate 使う
  • IAM
    • AWS リソースに対するきめ細やかなアクセス制限が可能
    • IAM ユーザ : 人間に付与する管理権限
    • IAM ロール : AWS リソースに付与する管理権限
    • IAM ポリシー : ユーザ、ロールに付与する権限パラメータ (JSON)
    • あくまでも AWS 内のリソースに対する権限
  • Amazon Cognito
    • JavaScript などから起動
    • Cognito 経由でログインした場合に一時的に IAM ロールを付与する形
    • 機能は大きく 2 つ (3 つあるが、1 つは現在非推奨 -> AppSync)
      • User Pools : ID/PWD の管理サービス (認証)
      • Identity Pool: User Pools のユーザに対して権限付与 (認可)
  • Lambda
    • 起動の遅い/速いで言語を選ぶ
    • 数秒で終わる処理ならスクリプト言語、時間のかかる処理の場合はコンパイル言語
    • カスタムランタイムを利用する場合の注意点
      • 実行ライブラリは個人で管理
  • API Gateway
    • Web API の作成・保護・運用
    • リクエストしているユーザが Cognito で認証されているか、もチェック可能

ハンズオン

ハンズオンは Step1 と Step 2 に分かれていましたが、それぞれ (一応) 独立しているのでどちらからやっても OK という形式でした。 ハンズオン用の資料.zip をダウンロードして、その中に含まれる PDF を見ながら、同じく zip 内に含まれるサンプルスクリプトやコピペ用テキストを利用して、各自黙々と進めていき、質問があれば適宜 SA さんに声をかける という形でした。

Step1: Cognito, IAM を利用して S3 のバケット操作で権限による挙動の変化を確認する

実装したサンプルは次のような内容です。

  • Cognito で Sign up / Sign in する
  • Sign up 時に付与したパラメータによって、適用する IAM ロールを変える
    • 今回であれば、attr というカスタム属性が 1 のユーザにだけ、別の IAM ロールを割り当てる という形
  • Sign in したユーザで S3 のオブジェクトにアクセスする
    • IAM ロールで S3 へのアクセス権限を絞る
  • Sign in 時のパラメータによって、S3 オブジェクトへのアクセス可否を確認する

図にするとこんなイメージです。

Handson Cognito

これまでは Cognito ってどうやって使うんや? っていう状態でしたが、今回のハンズオンで少しわかった気がしました。

Cognito は認証・認可基盤のサービスです。AWS では IAM も認証・認可基盤のサービスですが、その違いとしては、IAM は認証・認可する対象が AWS のリソース であるのに対して、Cognito は対象が クライアントアプリ という点です。クライアントアプリから認証を行うことで、その認証に適用されている IAM ロールの権限をもって、AWS リソースにアクセスできる という感じです。

どうでもいいですが、 Cognito は コグニート って読むんですね…。勝手に コグナイト だと思ってました。


ちょっと取っ掛かりにくいサービスではありますが、とりあえず Cognito で何が出来るのか はわかりました。

Step2: API Gateway, Lambda, DynamoDB を利用して REST インターフェースを構築する

実装したサンプルは次のような内容です。

  • DynamoDB に対してデータの Read/Write をする Lambda 関数をそれぞれ作成
  • API Gateway で GET/POST メソッドに対して、それぞれ Read/Write の Lambda 関数が呼ばれるようにする
  • ブラウザから GET のエンドポイントを直接叩いて DynamoDB のデータが取得できるか確認する
  • cURL、Postman などを使って POST のエンドポイントにアクセスして、DynamoDB にデータが登録できるか確認する

図にするとこんなイメージです。

Handon API Gateway

API Gateway については、過去に使ってみようとしたものの、コンソール上の操作がよくわからずに中途半端なところで挫折した という経緯があります..。たが、今回は前述したとおりハンズオンの資料が非常に丁寧だったので、順を追って操作することができました。

ちなみに、ハンズオンの資料内では API Gateway で生成されたエンドポイントを直接叩くところまでしか書いてありませんでしたが、資料内の js ファイルを少し修正すれば、Ajax で実行できるようになっていたようです。

ハンズオンの時間が少し余ったのでそのあたりを試していたのですが、詰まったポイントがあったので書いておきます。

ハンズオンの資料に用意されている html (localhost) から Ajax で API を実行しようとすると、CORS エラーで実行できません。なので、API Gateway で CORS を有効にする必要があります。

API Gateway CORS 1

API Gateway CORS 1

また、有効化したあとは再度デプロイしないと反映されません。そこもハマったポイントでした。

これで localhost からも Ajax で実行できるようになりました。今回はサンプルということで Access-Control-Allow-Origin"*" にしてますが、アクセス元がわかっているなら明示的に指定したほうがよさそうです。


Step2 のハンズオンでは、 API Gateway の他に DynamoDB も使いました。こちらも初めて使いました。 思っていたよりも簡単に使えるのと、なにより料金が安い!個人で使うレベルであれば無料枠内でおさまります。一方、RDS は結構な料金がかかるので、なかなか個人では試せないという印象です。 NoSQL についてはこれまではあまり触ってこなかったんですが、更新の少ないシンプルな REST API では、RDB より断然 NoSQL だなとあらためて感じました。 RDB と NoSQL では用途がぜんぜん違うので単純な比較は難しいですが、これまでは簡単な API ですら RDB を使おうとしていたので、その考え方が変わったのは良かったです。

全体の感想

AWS Loft Tokyo

AWS Loft で開催されるハンズオン、というかハンズオン自体はじめての参加でしたが、以上に充実した時間でした。ハンズオン用の資料も丁寧に作られていて、基本的に手順通りに操作していれば最低限の目的のものは完成するという状態でした。 今回であれば、途中で IAM ポリシーの作成や S3 バケットへの CORS 設定などの手順もありましたが、それらの設定のために必要な文字列、JSON データもハンズオン資料にすべて含まれているため、スムーズに進めることが出来ました。

かと言って、単純なコピペ作業で終わるのではなく、提供された資料に含まれるサンプルコードも、後に自分で何か実装するときには役に立つものだと思いました。今回は Web 上から Cognito で認証したり、S3 バケット内のリストを取得したりファイルをアップロードしたり、また、Ajax で API Gateway のエンドポイントにアクセスしたりする内容でしたが、それらの操作を実現する JavaScript の処理 (.js ファイル) はハンズオン資料にすべて含まれています。なので、これらを見ることで自分で実装するときの参考にできるというわけです。

こんなにも充実したハンズオンが、なんと無料で受けられるなんて驚きですよね。 先週は JAWS DAYS で色んな話を聞いてきましたが、やはり自分で手を動かしてみないとわからない部分は多いと思うので、ハンズオン形式で実際にサービスを触るというのは凄く良いなと思いました。

ちなみに、同じ内容のハンズオンが 326 (火) 18:30-20:30 に開催されるようなので、Cognito, API Gateway, DynamoDB などのサービスを実際に触ってみたい方は参加してみてはいかがでしょうか。

理解したとは言っていない。

comments powered by Disqus