やりたいこと
- API 開発を体験できるハンズオンシステムを作る
- ハンズオンの動作環境を提供するだけなので、ソースコードは単一ファイルで良い
- プログラミング初学者を対象にしたいので、なるべく簡単な操作でデプロイしたい
- 開発体験のために、デプロイ時間を極力減らしたい
考えた実現方法
- AWS Lambda + Lambda Web Adapter で動かす
- Docker イメージはハンズオンに参加する人全部共通
- ソースコードは S3 にアップロードする
- S3 にアップロードして、Lambda の更新をすると変更が反映される
解決するべき問題
- 共通の Docker イメージで環境変数を指定することで関数の動きを変えることが出来るか?
作成したもの
start.sh で S3 からファイルをダウンロードして動かす。Lambda は /tmp
以外は書き込めないのでその点だけ注意。
これで、Lambda の環境変数に S3 のパスを指定すると任意のプログラムを動かすことが出来る。
Dockerfile
FROM python:3.11.2-slim as base
WORKDIR /app
COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.7.1 /lambda-adapter /opt/extensions/lambda-adapter
RUN --mount=type=cache,target=/root/.cache/pip \
--mount=type=bind,source=requirements.txt,target=requirements.txt \
python -m pip install -r requirements.txt
COPY start.sh ./start.sh
EXPOSE 8080
CMD ["./start.sh"]
start.sh
#!/bin/bash
# S3 から main.py をダウンロード
aws s3 cp "$S3_PATH/main.py" /tmp/main.py
# main.py を実行
flask --app /tmp/main run --host=0.0.0.0 --port=8080
requirements.txt
awscli
Flask
main.py
from flask import (Flask, jsonify)
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def hello():
return jsonify(status=200, message='hello world')
まとめ
開発体験の良いハンズオンシステムを作るための技術的な課題はクリアできた。
このシステムについてはまた別途記事を作成する予定。