https://youtu.be/0Et7c5GdodI
UBICの食料管理APIを作った話会津大学一年 しんぶんぶん
View Slide
自己紹介•人間•会津大学学部一年•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使えばぽちぽちで作れる(後から知った)• とても便利
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
DynamoDBdynamodb-local:container_name: dynamodb-localimage: amazon/dynamodb-local:latestuser: rootcommand: -jar DynamoDBLocal.jar -sharedDb -dbPath/datavolumes:- dynamodb-local-data:/dataports:- 8000:8000networks:- dynamodb-local-networkdynamodb-admin:container_name: dynamodb-adminimage: aaronshaf/dynamodb-admin:latestenvironment:- DYNAMO_ENDPOINT=dynamodb-local:8000ports:- 8001:8001depends_on:- dynamodb-localnetworks:- dynamodb-local-network
S3localstack:container_name: localstackimage: localstack/localstackenvironment:- SERVICES=s3- DEFAULT_REGION=ap-northeast-1- DATA_DIR=/tmp/localstack/dataports:- 4566:4566networks:- dynamodb-local-network
Lambdasam buildsam 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-lateststeps:- uses: actions/[email protected]- name: Up dynamodb & localstackrun: docker-compose up -d dynamodb-local localstackworking-directory: local_resource- name: Copy aws configrun: cp -r ./.aws ~/working-directory: local_resource- name: Create tablerun: sh create_table.shworking-directory: local_resource- name: Create bucketrun: sh create_bucket.shworking-directory: local_resource- name: Add dummy datarun: sh add_dummy_data.shworking-directory: local_resource- name: Run testrun: docker-compose run go-testworking-directory: local_resource1. DynamoDBとS3のDockerを立ち上げる2. ダミーのaws configを配置3. DynamoDBのテーブルを作成4. S3のバケットを作成5. DynamoDBにテスト用のデータをPut6. ようやくテストがまわせる
LINEログイン• 例の如くJWTの検証とかを楽しく実装• この辺語り出すと無限に時間がとけるので、また今度ひたすらログインについて語るLTをします
Lambda Authorizer• JWTの検証処理をLambda Authorizerに書いた• 認証するかしないかもOpen APIで定義できるのでとても便利
今後の展望• LINEログイン用のエンドポイントに対してもテストを書きたい• 正常終了以外のAPIテストを書きたい• Unit testちゃんと書きたい• DIしたい• Lambda関数を適切に切り分けたい• 誰でも使えるOSSの在庫管理ツールにしたい• LINEログインのRPをちゃんとフルスクラッチで実装したい• base64とかsha256とかライブラリ使ってるのが気に食わない• これはC言語でLINEログインRP実装フラグ...?
あーした