Upgrade to Pro — share decks privately, control downloads, hide ads and more …

[JAWS-SG#02] 個人開発やハッカソンで役立つ、便利APIのつくりかた

[JAWS-SG#02] 個人開発やハッカソンで役立つ、便利APIのつくりかた

Keisuke Mori

May 16, 2020
Tweet

More Decks by Keisuke Mori

Other Decks in Programming

Transcript

  1. Keisuke Mori 近畿大学産業理工学部(福岡キャンパス) - 情報学科 4回生 - 暗号技術, ブロックチェーン, プライバシー技術

    - ソフトウェア開発の演習では Cloud9 使ってました @moririn772 サーバーサイド/インフラ系 - Go, Ruby, AWS がお気に入り - JAWS-SG 運営メンバー(今日は配信担当)
  2. A. ͜Μͳײ͡Ͱ࡞Γ·ͨ͠ Application Server Image Hosting Service Client Tag Suggestion

    Service API Gateway Lambda Translate Recognition Cloud SQL ( MySQL ) Cloudfront S3 React (Next) CI/CD etc… GAE ( Go ) Ұ෦ϋοΧιϯظؒ಺ʹऴΘΓ·ͤΜͰͨ͠…
  3. ࠓ೔͸͜͜ͷ࿩Λ͠·͢ʂ Application Server Image Hosting Service Client Tag Suggestion Service

    API Gateway Lambda Translate Recognition Cloud SQL ( MySQL ) Cloudfront S3 React (Next) CI/CD etc… GAE ( Go )
  4. ࢖ͬͨ AWS ͷαʔϏε Amazon API Gateway Amazon Rekognition AWS Lambda

    Amazon Translate ؆୯ʹ API ͷ࡞੒, ެ։, อक, ϞχλϦϯά, อޢΛߦ͏͜ͱ͕ Ͱ͖Δ αʔόʔϨε࣮ߦ؀ڥ ͍ΖΜͳݴޠͰॻ͚Δ Ruby, Go, Python, Java … ػցֶशͷઐ໳஌ࣝΛඞཁͱͤͣ ը૾΍ಈըͷ෺ମ, إ, γʔϯ Λ ಛఆͰ͖ΔɻΧελϜϥϕϧΛɹ ࢖͏ͱɺ෦඼ͷ෼ྨͳͲ΋Մೳ χϡʔϥϧػց຋༁αʔϏε 54 ݴޠʹରԠ
  5. Tag Suggestion Service … Tag Suggestion Service API Gateway Lambda

    Translate Recognition Client 背景に使われている素材(既にS3にPUT済)のURLを、 エンドポイントに投げる https://~~~/default/detect-image-label?image-uri=*************
  6. Tag Suggestion Service … Tag Suggestion Service API Gateway Lambda

    Translate Rekognition Client API Gateway から Lambda に処理を流す。 Lambda関数(handrer.request_handler)を発火させ、 AWS-SDK から Rekognition のAPI を叩く。
  7. Tag Suggestion Service … Tag Suggestion Service API Gateway Lambda

    Translate Rekognition Client Rekognition の “DetectLabels” オペレーションを使用。 画像をもとにラベルが検出され、結果が返る。
  8. Tag Suggestion Service … Tag Suggestion Service API Gateway Lambda

    Translate Rekognition Client タグが英語で返ってきてしまい、UX的によくないので Amazon Translate の "Translate Text" オペレーションを 使用し、タグを 英語→日本語 に翻訳する。
  9. Tag Suggestion Service … Tag Suggestion Service API Gateway Lambda

    Translate Rekognition Client これまでが処理の全貌 あとはクライアント側にレスポンスを返すだけ。 “body” : [ “飛行機”, “輸送”, “航空機”, “旅客機”, “車両” ]
  10. Tag Suggestion Service … Tag Suggestion Service API Gateway Lambda

    Translate Rekognition Client 推測されたタグが表示される。 ユーザーはタグを選択し、テンプレートを公開する。
  11. Ͱ͖·ͨ͠ʂ $ ll > 5 13 10:47 Gemfile > 5

    13 10:17 Gemfile.lock > 5 13 11:18 Readme.md > 5 13 10:49 handler.rb > 5 13 10:17 vendor
  12. Gemfile Λฤूͯ͠ɺbundle install ͠·͢ # frozen_string_literal: true source 'https://rubygems.org' git_source(:github)

    { |repo_name| "https://github.com/#{repo_name}" } gem 'aws-sdk-rekognition' gem 'aws-sdk-translate' Gemfile $ bundle install —path=vendor/bundle
  13. ґଘ gem Λ require ͠·͢ # frozen_string_literal: true require 'net/http'

    require 'json' require 'aws-sdk-rekognition' require 'aws-sdk-translate' require 'base64' require 'open-uri' def request_handler(event:, context:) image_uri = event['queryStringParameters']['image-uri'] resp = detect_label(URI.open(image_uri).read) { statusCode: 200, headers: { 'Content-Type': 'application/json' }, body: JSON.generate(resp) } end handler.rb
  14. ґଘ gem Λ require ͠·͢ # frozen_string_literal: true require 'net/http'

    require 'json' require 'aws-sdk-rekognition' require 'aws-sdk-translate' require 'base64' require 'open-uri' handler.rb
  15. Rekognition ʹϥϕϧΛ͚ͭͯ΋Β͏ؔ਺ def detect_label(data) client = Aws::Rekognition::Client.new attrs = {

    image: { bytes: data }, max_labels: 10 } response = client.detect_labels(attrs) # Filter labels = response.labels.select { |c| c.confidence >= 66 } # Translate tag, Generate response array labels.map { |l| translate(l[:name].downcase) } end handler.rb
  16. ϥϕϧΛ೔ຊޠʹͯ͘͠ΕΔؔ਺ def translate(target) client = Aws::Translate::Client.new resp = client.translate_text( text:

    target, source_language_code: 'en', target_language_code: 'ja' ) resp.translated_text end handler.rb
  17. ϦΫΤετͷϋϯυϥʔؔ਺Λ࣮૷͠·͢ def request_handler(event:, context:) # ΫΤϦύϥϝʔλ͸͜͏΍ͬͯऔΔ image_uri = event['queryStringParameters']['image-uri'] resp

    = detect_label(URI.open(image_uri).read) { statusCode: 200, headers: { 'Content-Type': 'application/json' }, body: JSON.generate(resp) } end handler.rb
  18. DONE !!! def request_handler(event:, context:) # ΫΤϦύϥϝʔλ͸͜͏΍ͬͯऔΔ image_uri = event['queryStringParameters']['image-uri']

    resp = detect_label(URI.open(image_uri).read) { statusCode: 200, headers: { 'Content-Type': 'application/json' }, body: JSON.generate(resp) } end handler.rb