LoginSignup
3
0

AWS Lambda のソースコードを S3 から取得する技術検証

Posted at

やりたいこと

  • 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')

まとめ

開発体験の良いハンズオンシステムを作るための技術的な課題はクリアできた。
このシステムについてはまた別途記事を作成する予定。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0