$30 off During Our Annual Pro Sale. View Details »

Ruby on Jets + Cognitoで認証付きAPIサーバを5分でデプロイする

Y_uuu
January 29, 2020

Ruby on Jets + Cognitoで認証付きAPIサーバを5分でデプロイする

2019/01/29 Fukuoka.rb #167 - 新年LT大会!

Y_uuu

January 29, 2020
Tweet

More Decks by Y_uuu

Other Decks in Programming

Transcript

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

    View Slide

  2. ͚͓͋Ί

    View Slide

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

    ⾃⼰紹介

    View Slide

  4. 最近のお仕事
    • IoTサーバへデバイスの代わりにデータ送信
    • さまざまな⽅法でテストデータを⾃動⽣成
    • 各種クラウドサービス(AWS, GCP, Azure)やSORACOMと連携

    IoTのテストを⽀援する
    mockmock
    https://bit.ly/37tA9bf
    で検索

    View Slide

  5. Ruby on Jetsとは

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

    View Slide

  6. Ruby on Jetsとは

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

    View Slide

  7. Ruby on Jetsとは

    1コマンドでAWSへデプロイできる

    View Slide

  8. 今⽇紹介すること

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

    View Slide

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

    View Slide

  10. -FUbTUSZ

    View Slide

  11. 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.

    View Slide

  12. jets generate scaffold

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

    View Slide

  13. ΄΅3BJMTͱಉ͡

    View Slide

  14. DynamoDBに対応(モデル)

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

    View Slide

  15. DynamoDBに対応(コントローラ)

    デフォルトRDB向けの実装になっているので修正
    def index
    @evs = Ev.scan #Ev.all
    render json: @evs
    end

    View Slide

  16. 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

    View Slide

  17. DynamoDBに対応(Config)

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

    View Slide

  18. jets dynamodb:migrate

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

    View Slide

  19. jets server

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

    View Slide

  20. イベントを登録してみる

    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"}%

    View Slide

  21. イベントを取得してみる

    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/"}]

    View Slide

  22. ϩʔΧϧ؀ڥͰಈ͍ͨ

    View Slide

  23. Cognitoユーザープールを作成

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

    View Slide

  24. Cognitoアプリクライアントを作成

    後で使うのでメモ
    チェック

    View Slide

  25. 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

    View Slide

  26. Authorizerを有効にする

    config/routes.rbに追記
    resources :evs, authorizer: ʻmain#my_cognitoʼ

    View Slide

  27. デプロイ

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

    View Slide

  28. 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",

    View Slide

  29. イベントを登録してみる

    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"}%

    View Slide

  30. イベントを取得してみる

    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⼤会︕"}]%

    View Slide

  31. ׬੒

    View Slide

  32. まとめ

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

    View Slide

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

    View Slide