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

あーした