Slide 1

Slide 1 text

Ruby on Jets + Cognitoで 認証付きAPIサーバを5分でデプロイする 2019/01/29 Fukuoka.rb #167 - 新年LT⼤会︕ 株式会社Fusic 岡嵜雄平

Slide 2

Slide 2 text

͚͓͋Ί

Slide 3

Slide 3 text

⾃⼰紹介 岡嵜 雄平(@Y_uuu) RubyKaigi 2019 ローカルオーガナイザー 今年の⽬標︓Ruby on Jetsをガンガン使う。 ⾃⼰紹介

Slide 4

Slide 4 text

最近のお仕事 • IoTサーバへデバイスの代わりにデータ送信 • さまざまな⽅法でテストデータを⾃動⽣成 • 各種クラウドサービス(AWS, GCP, Azure)やSORACOMと連携 IoTのテストを⽀援する mockmock https://bit.ly/37tA9bf で検索

Slide 5

Slide 5 text

Ruby on Jetsとは AWS上で動作するサーバレスアプリケーションを Rubyで書くためのフレームワーク

Slide 6

Slide 6 text

Ruby on Jetsとは • ORMがRailsと同じActiveRecord • MVCやルーティングの書き⽅(メソッド)が同じ • ⼀部のGemが使える Ruby on Railsと同じように実装できる

Slide 7

Slide 7 text

Ruby on Jetsとは 1コマンドでAWSへデプロイできる

Slide 8

Slide 8 text

今⽇紹介すること サーバレスな認証付きAPIサーバを 5分で作ってデプロイする⽅法

Slide 9

Slide 9 text

仕様 • Fukuoka.rb API • 開催⽇時、connpassのURLを登録・取得

Slide 10

Slide 10 text

-FUbTUSZ

Slide 11

Slide 11 text

Jetsのインストール アプリケーションを作成する ❯ ruby -v ruby 2.5.7p206 (2019-10-01 revision 67816) [x86_64-darwin19] ❯ gem install jets Successfully installed jets-2.3.12 ❯ jets new fukuoka_rb_api --mode api --no-database Congrats You have successfully created a Jets project.

Slide 12

Slide 12 text

jets generate scaffold Scaffoldする ❯ cd fukuoka_rb_api ❯ jets generate scaffold Ev title:string url:string --no- migration

Slide 13

Slide 13 text

΄΅3BJMTͱಉ͡

Slide 14

Slide 14 text

DynamoDBに対応(モデル) デフォルトRDB向けの実装になっているので修正 class Ev < ApplicationItem #ApplicationRecord column :id, :title, :url # 追記 end

Slide 15

Slide 15 text

DynamoDBに対応(コントローラ) デフォルトRDB向けの実装になっているので修正 def index @evs = Ev.scan #Ev.all render json: @evs end

Slide 16

Slide 16 text

DynamoDBに対応(コントローラ) デフォルトRDB向けの実装になっているので修正 def create @ev = Ev.new #Ev.new(ev_params) if @ev.replace(ev_params) #ev.save render json: @ev, status: :created else render json: @ev.errors, status: :unprocessable_entity end end

Slide 17

Slide 17 text

DynamoDBに対応(Config) IAM PolicyにDynamoDBを追加 Jets.application.configure do # 省略 config.iam_policy = [ʻdynamodbʼ] end

Slide 18

Slide 18 text

jets dynamodb:migrate マイグレーションする ❯ docker run -p 8000:8000 amazon/dynamodb-local ❯ jets dynamodb:generate evs ❯ jets dynamodb:migrate dynamodb/migrate/*

Slide 19

Slide 19 text

jets server ローカルサーバを起動 ❯ jets server

Slide 20

Slide 20 text

イベントを登録してみる JSONをPOST ❯ curl -X POST -H "Content-Type: application/json" -d '{"ev": {"title":" Fukuoka.rb #167 - 新年LT⼤会︕", "url":"https://fukuokarb.connpass.com/event/162983/"}}' http://localhost:8888/evs {"id":"f97b50fd7d6330728ea3eea61ef6889a5035e2bb","title" :" Fukuoka.rb #167 - 新年LT⼤会︕ ","url":"https://fukuokarb.connpass.com/event/162983/","cre ated_at":"2020-01-25T19:41:00Z","updated_at":"2020-01- 25T19:41:00Z"}%

Slide 21

Slide 21 text

イベントを取得してみる JSONをGET ❯ curl http://localhost:8888/evs [{"created_at":"2020-01- 25T19:41:00Z","id":"f97b50fd7d6330728ea3eea61ef6889a50 35e2bb","title":" Fukuoka.rb #167 - 新年LT⼤会︕ ","updated_at":"2020-01- 25T19:41:00Z","url":"https://fukuokarb.connpass.com/event /162983/"}]

Slide 22

Slide 22 text

ϩʔΧϧ؀ڥͰಈ͍ͨ

Slide 23

Slide 23 text

Cognitoユーザープールを作成 詳細は以下を参照 チュートリアル: ユーザープールの作成 - Amazon Cognito https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/ tutorial-create-user-pool.html 諸々デフォルトでOK

Slide 24

Slide 24 text

Cognitoアプリクライアントを作成 後で使うのでメモ チェック

Slide 25

Slide 25 text

Authorizerを作成 app/authorizers/main_authorizer.rbを作成 class MainAuthorizer < Jets::Authorizer::Base authorizer( name: ʻMyCognitoʼ, identity_source: ʻAuthorizationʼ, type: :cognito_user_pools, provider_arns: [ʻ(CognitoのARNを記載)'], ) end

Slide 26

Slide 26 text

Authorizerを有効にする config/routes.rbに追記 resources :evs, authorizer: ʻmain#my_cognitoʼ

Slide 27

Slide 27 text

デプロイ AWSでCloudFormationが⾛る ❯ JETS_ENV=production jets dynamodb:migrate dynamodb/migrate/* ❯ jets deploy production

Slide 28

Slide 28 text

JWT Tokenを取得 aws-cliでcognitoにログイン ❯ aws cognito-idp initiate-auth --auth-flow USER_PASSWORD_AUTH --client-id 6nvis8bu0ehri8tsk6d3qkimef --auth-parameters USERNAME=(ユーザ名),PASSWORD=(パスワード) {"ChallengeParameters": {}, "AuthenticationResult": {”IdToken": ”xxxxx",

Slide 29

Slide 29 text

イベントを登録してみる JSONをPOST ❯ curl -X POST -H "Authorization: xxxxx" -H "Content-Type: application/json" -d '{"ev": {"title":" Fukuoka.rb #167 - 新年LT⼤ 会︕", "url":"https://fukuokarb.connpass.com/event/162983/"}}' https://z6kpk9boza.execute-api.ap-northeast- 1.amazonaws.com/prod/evs {"id":"1fdb21ed1bd9ca05b36b4f5a16fa7acda3ee077e","title":" Fukuoka.rb #167 - 新年LT⼤会︕ ","url":"https://fukuokarb.connpass.com/event/162983/","create d_at":"2020-01-25T20:46:45Z","updated_at":"2020-01- 25T20:46:45Z"}%

Slide 30

Slide 30 text

イベントを取得してみる JSONをGET ❯ curl -H "Authorization: xxxxx" https://z6kpk9boza.execute- api.ap-northeast-1.amazonaws.com/prod/evs [{"updated_at":"2020-01- 25T20:48:20Z","created_at":"2020-01- 25T20:48:20Z","id":"14ff588afe141e6121238214725d0e3db 51c9eca","url":"https://fukuokarb.connpass.com/event/1629 83/","title":" Fukuoka.rb #167 - 新年LT⼤会︕"}]%

Slide 31

Slide 31 text

׬੒

Slide 32

Slide 32 text

まとめ • Ruby on Jetsを使ってAPIサーバを簡単に構築できた • Cognitoを使って簡単に認証機能を実現できた • RubyはRailsだけじゃない、まだまだ死なない︕

Slide 33

Slide 33 text

Thank you! Fusicは技術が好きなエンジニアを 募集しています