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
UBICの食材管理APIを作った話
Search
Yuto Takamune
January 30, 2022
Programming
260
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
UBICの食材管理APIを作った話
https://youtu.be/0Et7c5GdodI
Yuto Takamune
January 30, 2022
More Decks by Yuto Takamune
See All by Yuto Takamune
GPT-3.5 Turbo をファインチューニングして自分のクローンを作った話
shinbunbun_
1
380
RustのLINEBot SDKを自作した話
shinbunbun_
0
2.5k
セキュリティキャンプ2023 Y3分散合意ゼミ 最終発表
shinbunbun_
0
4.9k
NixOSでもご自宅k8sがしたい!
shinbunbun_
2
5k
カーネルレベルでTwitterを禁止しよう
shinbunbun_
0
310
CRDTで始めるコンフリクトしないデータ同期
shinbunbun_
0
690
Haskell初心者がHaskellの楽しさについて語る
shinbunbun_
0
230
Rustで楕円曲線暗号の署名アルゴリズムをフルスクラッチ実装してみた話
shinbunbun_
0
2.4k
IEEE802.1X認証を導入してみた
shinbunbun_
0
340
Other Decks in Programming
See All in Programming
壊れたパーサから始める関数型設計と構成的なパーサ #fp_matsuri
raiga0310
2
230
ランチタイムLT会3周年!ランチタイムLT会を3年間続けられたお話
y0hgi
1
140
【やさしく解説 設計編 #0】DDDのコード、読めるのに分からない人へ
panda728
PRO
2
270
分散システム、なんですぐ死んでしまうん?耐障害性を高めたいあなたのためのレジリエンスパターン入門
mshibuya
7
6.2k
共通化で考えるべきは、実装より公開する型だった
codeegg
0
240
どこまでゆるくて許されるのか
tk3fftk
0
490
Generative UI & AI-Assistants for Your Angular Solutions
manfredsteyer
PRO
1
190
AWS CDK を「作」ってみた 〜フルスクラッチで見えた CDK の裏側〜 / aws-cdk-from-scratch
gotok365
3
420
ITヒヤリハットを整理してみた ~ライフサイクルと原因から考える再発防止策~
koukimiura
1
110
ビデオ通話が繋がる0.2秒で何が起きているのか
supurazako
2
150
エンジニアにデザインハーネスを 〜デザインプロセスを規定するためのハーネス〜 / Design harness from an engineer's perspective
rkaga
2
1.5k
【やさしく解説 設計編・中級 #1】一つの車に、運転手は一人 ~ある倉庫システムの事例から~
panda728
PRO
0
180
Featured
See All Featured
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
How to train your dragon (web standard)
notwaldorf
97
6.7k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.3k
30 Presentation Tips
portentint
PRO
1
350
Writing Fast Ruby
sferik
630
63k
Raft: Consensus for Rubyists
vanstee
141
7.6k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.6k
How to Ace a Technical Interview
jacobian
281
24k
The Cost Of JavaScript in 2023
addyosmani
55
10k
A Modern Web Designer's Workflow
chriscoyier
698
190k
Prompt Engineering for Job Search
mfonobong
0
380
[SF Ruby Conf 2025] Rails X
palkan
2
1.2k
Transcript
UBICの食料管理APIを 作った話 会津大学一年 しんぶんぶん
自己紹介 • 人間 • 会津大学学部一年 • LINE API Expert ←
New! • 認証/アイデンティティ管理まわりが好き • 最近はGoでバックエンドを書いてる @shinbunbun_ ¥3993 マイナビ出版 ポートフォリオ(shinbunbun.info)
宣伝 • ZliTechBook V2 • ぎじゅつしょてんで販売中 • 自分はC 言語で実装する LINEBot
入門を書きました • 1冊500円
今回作ったもの • 大学にあるUBICという施設に備蓄してある食料を管理するAPIを 開発した • https://github.com/shinbunbun/ubic-food-management-api-v2
技術スタック • 言語: Go • クラウド: • AWS SAM(Lambda, API
Gateway) • DynamoDB • S3 • 認証: LINEログイン • その他使ったもの • Swagger, GitHub Actions, Mergify, Docker etc…
機能紹介 • Swagger見せます(一番早い) • https://github.com/shinbunbun/ubic-food-management-api-v2/blob/ main/swagger.yml • Postmanでデモします(時間あれば)
使用した技術の紹介
Swagger • OpenAPI Specに則ってRESTfulAPIを設計するためのフレーム ワーク • ymlを書くだけでAPIの仕様書を作ってくれる • Stoplight Studio使えばぽちぽちで作れる(後から知った)
• とても便利
None
AWS SAM • AWSでサーバレスアプリケーションを構築するためのフレーム ワーク • 今回SAMでやったこと • Lambdaの構築 •
Open APIからAPI Gatewayエンドポイント作成 • API Gatewayにドメイン割り当て • Lambda, API Gatewayにアタッチするロールの生成 • Lambda Authorizerの構築(後述) • ローカルでAPIを立ち上げる(後述) • GitHub Actionsからデプロイ
mergify • これは小ネタ • CIが通ると自動でmergeしてくれる便利なやつ
こだわった実装
ローカルでのテスト • Lambda, DynamoDB, S3を全てローカルで動かすことで、いちい ちデプロイしなくてもテストができるようにした • DynamoDBとS3はdocker-composeを書いた • 使用したimage
• DynamoDB: amazon/dynamodb-local • DynamoDB Admin: aaronshaf/dynamodb-admin • S3: localstack/localstack
DynamoDB dynamodb-local: container_name: dynamodb-local image: amazon/dynamodb-local:latest user: root command: -jar
DynamoDBLocal.jar -sharedDb -dbPath /data volumes: - dynamodb-local-data:/data ports: - 8000:8000 networks: - dynamodb-local-network dynamodb-admin: container_name: dynamodb-admin image: aaronshaf/dynamodb-admin:latest environment: - DYNAMO_ENDPOINT=dynamodb-local:8000 ports: - 8001:8001 depends_on: - dynamodb-local networks: - dynamodb-local-network
S3 localstack: container_name: localstack image: localstack/localstack environment: - SERVICES=s3 -
DEFAULT_REGION=ap-northeast-1 - DATA_DIR=/tmp/localstack/data ports: - 4566:4566 networks: - dynamodb-local-network
Lambda sam build sam local start-api --env-vars ./env.json --docker-network docker.internal
• 普通にbuildしてからlocalで実行 • 環境変数はjsonから読み込み • DynamoDB, S3と同じnetworkで立ち上げる
Integration test • (ほぼ)全てのAPIに対してテストを書いた • DynamoDBの操作もテストしたかったので、テスト用のダミーデー タをPutするシェルスクリプトを書いた • 同様の理由からテスト用のdocker-composeを書いた •
これに丸1日くらいかかった
CI/CD • 例の如くGitHub ActionsでCI/CDをまわす • 今回書いたのは以下の通り • pushしたとき • golangci-lint
• go test • sam build • mainにpushしたとき • sam deploy
go testとか結構大変 go-test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 -
name: Up dynamodb & localstack run: docker-compose up -d dynamodb-local localstack working-directory: local_resource - name: Copy aws config run: cp -r ./.aws ~/ working-directory: local_resource - name: Create table run: sh create_table.sh working-directory: local_resource - name: Create bucket run: sh create_bucket.sh working-directory: local_resource - name: Add dummy data run: sh add_dummy_data.sh working-directory: local_resource - name: Run test run: docker-compose run go-test working-directory: local_resource 1. DynamoDBとS3のDockerを立ち上げる 2. ダミーのaws configを配置 3. DynamoDBのテーブルを作成 4. S3のバケットを作成 5. DynamoDBにテスト用のデータをPut 6. ようやくテストがまわせる
LINEログイン • 例の如くJWTの検証とかを楽しく実装 • この辺語り出すと無限に時間がとけるので、また今度ひたすらロ グインについて語るLTをします
Lambda Authorizer • JWTの検証処理をLambda Authorizerに書いた • 認証するかしないかもOpen APIで定義できるのでとても便利
今後の展望 • LINEログイン用のエンドポイントに対してもテストを書きたい • 正常終了以外のAPIテストを書きたい • Unit testちゃんと書きたい • DIしたい
• Lambda関数を適切に切り分けたい • 誰でも使えるOSSの在庫管理ツールにしたい • LINEログインのRPをちゃんとフルスクラッチで実装したい • base64とかsha256とかライブラリ使ってるのが気に食わない • これはC言語でLINEログインRP実装フラグ...?
あーした