Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
UBICの食料管理APIを 作った話 会津大学一年 しんぶんぶん
Slide 2
Slide 2 text
自己紹介 • 人間 • 会津大学学部一年 • LINE API Expert ← New! • 認証/アイデンティティ管理まわりが好き • 最近はGoでバックエンドを書いてる @shinbunbun_ ¥3993 マイナビ出版 ポートフォリオ(shinbunbun.info)
Slide 3
Slide 3 text
宣伝 • ZliTechBook V2 • ぎじゅつしょてんで販売中 • 自分はC 言語で実装する LINEBot 入門を書きました • 1冊500円
Slide 4
Slide 4 text
今回作ったもの • 大学にあるUBICという施設に備蓄してある食料を管理するAPIを 開発した • https://github.com/shinbunbun/ubic-food-management-api-v2
Slide 5
Slide 5 text
技術スタック • 言語: Go • クラウド: • AWS SAM(Lambda, API Gateway) • DynamoDB • S3 • 認証: LINEログイン • その他使ったもの • Swagger, GitHub Actions, Mergify, Docker etc…
Slide 6
Slide 6 text
機能紹介 • Swagger見せます(一番早い) • https://github.com/shinbunbun/ubic-food-management-api-v2/blob/ main/swagger.yml • Postmanでデモします(時間あれば)
Slide 7
Slide 7 text
使用した技術の紹介
Slide 8
Slide 8 text
Swagger • OpenAPI Specに則ってRESTfulAPIを設計するためのフレーム ワーク • ymlを書くだけでAPIの仕様書を作ってくれる • Stoplight Studio使えばぽちぽちで作れる(後から知った) • とても便利
Slide 9
Slide 9 text
No content
Slide 10
Slide 10 text
AWS SAM • AWSでサーバレスアプリケーションを構築するためのフレーム ワーク • 今回SAMでやったこと • Lambdaの構築 • Open APIからAPI Gatewayエンドポイント作成 • API Gatewayにドメイン割り当て • Lambda, API Gatewayにアタッチするロールの生成 • Lambda Authorizerの構築(後述) • ローカルでAPIを立ち上げる(後述) • GitHub Actionsからデプロイ
Slide 11
Slide 11 text
mergify • これは小ネタ • CIが通ると自動でmergeしてくれる便利なやつ
Slide 12
Slide 12 text
こだわった実装
Slide 13
Slide 13 text
ローカルでのテスト • Lambda, DynamoDB, S3を全てローカルで動かすことで、いちい ちデプロイしなくてもテストができるようにした • DynamoDBとS3はdocker-composeを書いた • 使用したimage • DynamoDB: amazon/dynamodb-local • DynamoDB Admin: aaronshaf/dynamodb-admin • S3: localstack/localstack
Slide 14
Slide 14 text
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
Slide 15
Slide 15 text
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
Slide 16
Slide 16 text
Lambda sam build sam local start-api --env-vars ./env.json --docker-network docker.internal • 普通にbuildしてからlocalで実行 • 環境変数はjsonから読み込み • DynamoDB, S3と同じnetworkで立ち上げる
Slide 17
Slide 17 text
Integration test • (ほぼ)全てのAPIに対してテストを書いた • DynamoDBの操作もテストしたかったので、テスト用のダミーデー タをPutするシェルスクリプトを書いた • 同様の理由からテスト用のdocker-composeを書いた • これに丸1日くらいかかった
Slide 18
Slide 18 text
CI/CD • 例の如くGitHub ActionsでCI/CDをまわす • 今回書いたのは以下の通り • pushしたとき • golangci-lint • go test • sam build • mainにpushしたとき • sam deploy
Slide 19
Slide 19 text
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. ようやくテストがまわせる
Slide 20
Slide 20 text
LINEログイン • 例の如くJWTの検証とかを楽しく実装 • この辺語り出すと無限に時間がとけるので、また今度ひたすらロ グインについて語るLTをします
Slide 21
Slide 21 text
Lambda Authorizer • JWTの検証処理をLambda Authorizerに書いた • 認証するかしないかもOpen APIで定義できるのでとても便利
Slide 22
Slide 22 text
今後の展望 • LINEログイン用のエンドポイントに対してもテストを書きたい • 正常終了以外のAPIテストを書きたい • Unit testちゃんと書きたい • DIしたい • Lambda関数を適切に切り分けたい • 誰でも使えるOSSの在庫管理ツールにしたい • LINEログインのRPをちゃんとフルスクラッチで実装したい • base64とかsha256とかライブラリ使ってるのが気に食わない • これはC言語でLINEログインRP実装フラグ...?
Slide 23
Slide 23 text
あーした