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

UBICの食材管理APIを作った話

 UBICの食材管理APIを作った話

Yuto Takamune

January 30, 2022
Tweet

More Decks by Yuto Takamune

Other Decks in Programming

Transcript

  1. UBICの食料管理APIを
    作った話
    会津大学一年 しんぶんぶん

    View Slide

  2. 自己紹介

    人間

    会津大学学部一年

    LINE API Expert ← New!

    認証/アイデンティティ管理まわりが好き
    • 最近はGoでバックエンドを書いてる
    @shinbunbun_
    ¥3993 マイナビ出版
    ポートフォリオ(shinbunbun.info)

    View Slide

  3. 宣伝
    • ZliTechBook V2
    • ぎじゅつしょてんで販売中
    • 自分はC 言語で実装する LINEBot
    入門を書きました
    • 1冊500円

    View Slide

  4. 今回作ったもの
    • 大学にあるUBICという施設に備蓄してある食料を管理するAPIを
    開発した
    • https://github.com/shinbunbun/ubic-food-management-api-v2

    View Slide

  5. 技術スタック
    • 言語: Go
    • クラウド:
    • AWS SAM(Lambda, API Gateway)
    • DynamoDB
    • S3
    • 認証: LINEログイン
    • その他使ったもの
    • Swagger, GitHub Actions, Mergify, Docker etc…

    View Slide

  6. 機能紹介
    • Swagger見せます(一番早い)
    • https://github.com/shinbunbun/ubic-food-management-api-v2/blob/
    main/swagger.yml
    • Postmanでデモします(時間あれば)

    View Slide

  7. 使用した技術の紹介

    View Slide

  8. Swagger
    • OpenAPI Specに則ってRESTfulAPIを設計するためのフレーム
    ワーク
    • ymlを書くだけでAPIの仕様書を作ってくれる
    • Stoplight Studio使えばぽちぽちで作れる(後から知った)
    • とても便利

    View Slide

  9. View Slide

  10. AWS SAM
    • AWSでサーバレスアプリケーションを構築するためのフレーム
    ワーク
    • 今回SAMでやったこと
    • Lambdaの構築
    • Open APIからAPI Gatewayエンドポイント作成
    • API Gatewayにドメイン割り当て
    • Lambda, API Gatewayにアタッチするロールの生成
    • Lambda Authorizerの構築(後述)
    • ローカルでAPIを立ち上げる(後述)
    • GitHub Actionsからデプロイ

    View Slide

  11. mergify
    • これは小ネタ
    • CIが通ると自動でmergeしてくれる便利なやつ

    View Slide

  12. こだわった実装

    View Slide

  13. ローカルでのテスト
    • Lambda, DynamoDB, S3を全てローカルで動かすことで、いちい
    ちデプロイしなくてもテストができるようにした
    • DynamoDBとS3はdocker-composeを書いた
    • 使用したimage
    • DynamoDB: amazon/dynamodb-local
    • DynamoDB Admin: aaronshaf/dynamodb-admin
    • S3: localstack/localstack

    View Slide

  14. 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

    View Slide

  15. 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

    View Slide

  16. Lambda
    sam build
    sam local start-api --env-vars ./env.json --docker-network docker.internal
    • 普通にbuildしてからlocalで実行
    • 環境変数はjsonから読み込み
    • DynamoDB, S3と同じnetworkで立ち上げる

    View Slide

  17. Integration test
    • (ほぼ)全てのAPIに対してテストを書いた
    • DynamoDBの操作もテストしたかったので、テスト用のダミーデー
    タをPutするシェルスクリプトを書いた
    • 同様の理由からテスト用のdocker-composeを書いた
    • これに丸1日くらいかかった

    View Slide

  18. CI/CD
    • 例の如くGitHub ActionsでCI/CDをまわす
    • 今回書いたのは以下の通り
    • pushしたとき
    • golangci-lint
    • go test
    • sam build
    • mainにpushしたとき
    • sam deploy

    View Slide

  19. go testとか結構大変
    go-test:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/[email protected]
    - 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. ようやくテストがまわせる

    View Slide

  20. LINEログイン
    • 例の如くJWTの検証とかを楽しく実装
    • この辺語り出すと無限に時間がとけるので、また今度ひたすらロ
    グインについて語るLTをします

    View Slide

  21. Lambda Authorizer
    • JWTの検証処理をLambda Authorizerに書いた
    • 認証するかしないかもOpen APIで定義できるのでとても便利

    View Slide

  22. 今後の展望
    • LINEログイン用のエンドポイントに対してもテストを書きたい
    • 正常終了以外のAPIテストを書きたい
    • Unit testちゃんと書きたい
    • DIしたい
    • Lambda関数を適切に切り分けたい
    • 誰でも使えるOSSの在庫管理ツールにしたい
    • LINEログインのRPをちゃんとフルスクラッチで実装したい
    • base64とかsha256とかライブラリ使ってるのが気に食わない
    • これはC言語でLINEログインRP実装フラグ...?

    View Slide

  23. あーした

    View Slide