Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
【第2期】Go Academy LT資料
Search
sugamaan
January 16, 2023
Programming
490
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
【第2期】Go Academy LT資料
sugamaan
January 16, 2023
More Decks by sugamaan
See All by sugamaan
7ヶ月で6名の中途エンジニア採用に対して現場のエンジニアが行ったこと
sugamaan
3
570
終わらないSEO対策と向き合うために ~ Core Web Vitals ・Webパフォーマンス改善 ~
sugamaan
1
1.1k
Other Decks in Programming
See All in Programming
LLM本来の能力を解き放つサンドボックス技術とAI民主化への適用
yukukotani
3
4.1k
AIとASP.NET Coreで雑Webアプリを作った話
mayuki
0
650
Vite+ Unified Toolchain for the Web
naokihaba
0
310
Composerを使ったサプライチェーン攻撃の様子を眺めてみる #phpstudy
o0h
PRO
2
250
[2026年度第1回ORセミナー] 計画最適化ベンチャーと競技プログラミング人材
terryu16
0
270
脅威をエンジニアリングの糧にして――現場編 / Turning Threats into Engineering Fuel — Field Edition
nrslib
0
280
そのテスト、説明できますか?~LWテスト戦略FW~のご紹介
nakahara
0
140
Oxlintのカスタムルールの現況
syumai
6
1.1k
過去最大のMCPアップデート! 2026-07-28 RC版の謎に迫る
licux
6
350
「AIで開発し、AIを届ける」をEvalでつなぐ 〜AIネイティブに始めるプロダクト開発の実践〜 / Connecting "Develop with AI, deliver AI" with Eval
rkaga
4
5.1k
AI時代のUIはどこへ行く?その2!
yusukebe
21
7.2k
A2UI という光を覗いてみる
satohjohn
1
140
Featured
See All Featured
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2k
How to Ace a Technical Interview
jacobian
281
24k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
420
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.3k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.5k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
150
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.5k
Google's AI Overviews - The New Search
badams
0
1k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
150
Making the Leap to Tech Lead
cromwellryan
135
9.9k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
330
How STYLIGHT went responsive
nonsquared
100
6.2k
Transcript
GoとAWSを使い倒す 感染者数取得API・バッチ 株式会社サイバーエージェント 【第2期】Go Academy LT資料
自己紹介 経営管理SaaS KUROTEN. 開発 Go/Python/Vue.js/Nuxt.js/GraphQL/CleanArchitecture #山形出身 #サウナ #ゴルフ #麻雀 #フットサル
開発 その他 09_菅間 伶史(Sugama Reiji) エキサイト株式会社 SaaS事業部 @sugamaan 出典:エキサイト株式会社SaaS事業部紹介資料
01 バッチ
外部APIからS3へ JSONファイル保存 S3からDBへ保存 Slack通知 作成したAWS Lambda - バッチ - 全国の感染者数データをDB
へ保存するバッチ
概要 外部APIからS3へ JSONファイル保存 外部APIから取得したJSONファイルをS3へ 保存するLambda 工夫した点 バケット名は環境変数によって動的に変更 HTTP clientライブラリのgo-resty/restyを導入 し、HTTP
Statusをもとにリトライ処理を実行 Exponential Backoffアルゴリズムにて指数関数 的にリトライ間隔を増やす Restyによるリトライ処理 S3バケット
概要 S3からDBへ保存 S3からJSONファイルを取得しDBへ保存 するLambda 工夫した点 AWS SSM Parameter Storeを使い、DBの 接続情報を環境ごと管理
トランザクションラッパーにて実装とトラ ンザクションを分離し、処理の共通化と RollbackやCommit忘れを防止 SSM パラメータストア トランザクションラッパー
概要 Slack通知 バッチ処理が失敗した際にSlackへ通知するLambda Slack画面 ソースコード
Amazon EventBridge AWS Step Functions Amazon S3 Amazon RDS →
↓ → → → AWS Lambda ← 概要 バッチ処理全体像 EventBridge → Step Functions → Lambda → RDS・S3・Slack AWS Systems Manager → ←
02 API
感染者数取得API 概要 前日までの都道府県ごとの感染者数を取得するAPI URL https://1uehxc9ojh.execute-api.ap-northeast-1.amazonaws.com/Prod/patient/details? start_date=20221201&end_date=20221203&area=青森県 ※開始日時、終了日時、都道府県名を指定してリクエストをすると以下のようにレスポンスを返却 レスポンス例 APIドキュメント
docker-compose-local.yml Docker 開発環境 go 1.19 MySQL 8.0 開発効率 Makefile cosmtrek/air(ホットリロード)
保存時に再ビルド ホットリロード
IDE Linter 保存時にコードのリフォーマットと goimportsを実行 開発効率 golangci/golangci-lintを導入 golangci-lint runコマンドにて kisielk/errcheckなどが確認できる golanggci-lint
runを実行
ロジック ロジック DBから以下の情報を取得 都道府県名 日付ごとの感染者数 合計 平均 工夫した点 並行処理で情報を取得 contextとselectを使って他goroutine
の中断ハンドリングを実装
アノテーションコメント Swagger UI(http://localhost:8081/swagger/index.html) APIドキュメント APIドキュメント swaggo/swagを導入 アノテーションコメントからSwagger Documentationを作成 gin-gonic/gin×gin-swaggerを使いローカルで Swagger
UIを作成 GinでWebサーバー立ち上げ
エラー出力 エラー出力 エラー内容に応じて適切なHTTP ResponseをAPI Gateway経由で返却。 カスタムLambdaエラーを実装し、独自エラーを返却 エラーは呼び出し先でエラーをラップし、呼び出し元で処理 呼び出し先 独自エラーを返却&ロギング 呼び出し元
400エラー場合
ロギング ロギング SQLの構造化ログをsimukti/sqldb-logger × rs/zerolog を使い出力 設定 ログ例
テスト テスト Table Driven Testで記述 テスト並列化 go-cmpでのmap比較 工夫した点 stretchr/testify でアサーションを用意
t.Parallel()でテストを並列化 mapの比較はgoogle/go-cmp
総括 将来的な課題 検索の複雑化とそれに伴うモデルの肥大化 エンドポイントの設計・分割 アーキテクチャの導入の検討 レスポンス速度 プロファイリングから始めるためにAPMやpprofなどのツール導入 コードのリファクタリング Lambda側のエラーハンドリング、ログ、レスポンスなど共通化したものに書き換える 総括
使ったAWSサービス6個、Goのライブラリ23個 AWS、Goともにたくさん書けて満足です。 Goならではの書き方がたくさんあり、とても良い経験になりました! 難しかった点 SAMのIAMロール サービス間連携(Lambda間、LambdaとAPI Gatewayなど) レスポンスの形式、引数、出力 ディレクトリ構成
参考資料 参考資料 内閣官房新型コロナウイルス等感染症対策推進室 https://corona.go.jp/dashboard/ 全国の感染者数オープンデータ https://opendata.corona.go.jp/api/Covid19JapanAll
ご清聴ありがとうございました!