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 full-size slide

  2. 自己紹介

    人間

    会津大学学部一年

    LINE API Expert ← New!

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  7. 使用した技術の紹介

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  11. こだわった実装

    View full-size slide

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

    View full-size slide

  13. 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 full-size slide

  14. 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 full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  18. 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. ようやくテストがまわせる

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  22. あーした

    View full-size slide