2019/01/29 Fukuoka.rb #167 - 新年LT大会!
Ruby on Jets + Cognitoで認証付きAPIサーバを5分でデプロイする2019/01/29 Fukuoka.rb #167 - 新年LT⼤会︕株式会社Fusic 岡嵜雄平
View Slide
͚͓͋Ί
⾃⼰紹介岡嵜 雄平(@Y_uuu)RubyKaigi 2019 ローカルオーガナイザー今年の⽬標︓Ruby on Jetsをガンガン使う。⾃⼰紹介
最近のお仕事• IoTサーバへデバイスの代わりにデータ送信• さまざまな⽅法でテストデータを⾃動⽣成• 各種クラウドサービス(AWS, GCP, Azure)やSORACOMと連携IoTのテストを⽀援するmockmockhttps://bit.ly/37tA9bfで検索
Ruby on JetsとはAWS上で動作するサーバレスアプリケーションをRubyで書くためのフレームワーク
Ruby on Jetsとは• ORMがRailsと同じActiveRecord• MVCやルーティングの書き⽅(メソッド)が同じ• ⼀部のGemが使えるRuby on Railsと同じように実装できる
Ruby on Jetsとは1コマンドでAWSへデプロイできる
今⽇紹介することサーバレスな認証付きAPIサーバを5分で作ってデプロイする⽅法
仕様• Fukuoka.rb API• 開催⽇時、connpassのURLを登録・取得
-FUbTUSZ
Jetsのインストールアプリケーションを作成する❯ ruby -vruby 2.5.7p206 (2019-10-01 revision 67816) [x86_64-darwin19]❯ gem install jetsSuccessfully installed jets-2.3.12❯ jets new fukuoka_rb_api --mode api --no-databaseCongrats You have successfully created a Jets project.
jets generate scaffoldScaffoldする❯ cd fukuoka_rb_api❯ jets generate scaffold Ev title:string url:string --no-migration
΄΅3BJMTͱಉ͡
DynamoDBに対応(モデル)デフォルトRDB向けの実装になっているので修正class Ev < ApplicationItem #ApplicationRecordcolumn :id, :title, :url # 追記end
DynamoDBに対応(コントローラ)デフォルトRDB向けの実装になっているので修正def index@evs = Ev.scan #Ev.allrender json: @evsend
DynamoDBに対応(コントローラ)デフォルトRDB向けの実装になっているので修正def create@ev = Ev.new #Ev.new(ev_params)if @ev.replace(ev_params) #ev.saverender json: @ev, status: :createdelserender json: @ev.errors, status: :unprocessable_entityendend
DynamoDBに対応(Config)IAM PolicyにDynamoDBを追加Jets.application.configure do# 省略config.iam_policy = [ʻdynamodbʼ]end
jets dynamodb:migrateマイグレーションする❯ docker run -p 8000:8000 amazon/dynamodb-local❯ jets dynamodb:generate evs❯ jets dynamodb:migrate dynamodb/migrate/*
jets serverローカルサーバを起動❯ jets server
イベントを登録してみる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/","created_at":"2020-01-25T19:41:00Z","updated_at":"2020-01-25T19:41:00Z"}%
イベントを取得してみるJSONをGET❯ curl http://localhost:8888/evs[{"created_at":"2020-01-25T19:41:00Z","id":"f97b50fd7d6330728ea3eea61ef6889a5035e2bb","title":" Fukuoka.rb #167 - 新年LT⼤会︕","updated_at":"2020-01-25T19:41:00Z","url":"https://fukuokarb.connpass.com/event/162983/"}]
ϩʔΧϧڥͰಈ͍ͨ
Cognitoユーザープールを作成詳細は以下を参照チュートリアル: ユーザープールの作成 - Amazon Cognitohttps://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/tutorial-create-user-pool.html諸々デフォルトでOK
Cognitoアプリクライアントを作成後で使うのでメモチェック
Authorizerを作成app/authorizers/main_authorizer.rbを作成class MainAuthorizer < Jets::Authorizer::Baseauthorizer(name: ʻMyCognitoʼ, identity_source: ʻAuthorizationʼ,type: :cognito_user_pools,provider_arns: [ʻ(CognitoのARNを記載)'],)end
Authorizerを有効にするconfig/routes.rbに追記resources :evs, authorizer: ʻmain#my_cognitoʼ
デプロイAWSでCloudFormationが⾛る❯ JETS_ENV=production jets dynamodb:migrate dynamodb/migrate/*❯ jets deploy production
JWT Tokenを取得aws-cliでcognitoにログイン❯ aws cognito-idp initiate-auth --auth-flowUSER_PASSWORD_AUTH --client-id6nvis8bu0ehri8tsk6d3qkimef --auth-parametersUSERNAME=(ユーザ名),PASSWORD=(パスワード){"ChallengeParameters": {}, "AuthenticationResult":{”IdToken": ”xxxxx",
イベントを登録してみる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/","created_at":"2020-01-25T20:46:45Z","updated_at":"2020-01-25T20:46:45Z"}%
イベントを取得してみる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":"14ff588afe141e6121238214725d0e3db51c9eca","url":"https://fukuokarb.connpass.com/event/162983/","title":" Fukuoka.rb #167 - 新年LT⼤会︕"}]%
まとめ• Ruby on Jetsを使ってAPIサーバを簡単に構築できた• Cognitoを使って簡単に認証機能を実現できた• RubyはRailsだけじゃない、まだまだ死なない︕
Thank you!Fusicは技術が好きなエンジニアを募集しています