はじめに
AWSの基本的な知識や操作方法、Dockerの知識については解説しません。
chaliceとは
サーバレスアプリケーションを作成できるフレームワークで、簡単にLambda+APIGatewayを使ってREST APIを作成できます。
公式のクイックスタートではpython3.7で説明されてますが、python3.12までサポートしているようです。
動作環境
M2 macmini(MacOS Sequoia)
私はpython3.12をインストールしているので3.12で進めます。
仮想環境の作成
python3 -m venv venv
cd venv
source bin/activate
chalice install
python3 -m pip install chalice
Credentials(AWS認証情報)
AWS コンソールにサインインしてIAMでポリシーを作成する(最低限の権限)
アクセスキーの作成
アクセスキーidとシークレットアクセスキーが必要です。
作成時にcsvでダウンロードするかweb上から情報をコピペするか選べます。
認証情報の更新
アクセスキーidとシークレットアクセスキーを設定する
aws configure
プロジェクトの作成
chalice new-project helloworld
デプロイ
cd helloworld
chalice deploy
Creating deployment package.
Creating IAM role: helloworld-dev
Creating lambda function: helloworld-dev
Creating Rest API
Resources deployed:
- Lambda ARN: arn:aws:lambda:us-west-2:12345:function:helloworld-dev
- Rest API URL: https://abcd.execute-api.us-west-2.amazonaws.com/api/
curlコマンドで確認
curl https://qxea58oupc.execute-api.us-west-2.amazonaws.com/api/
URLの確認
chalice url
エラー情報
An error occurred (InvalidClientTokenId) when calling the GetCallerIdentity operation: The security token included in the request is invalid.
認証情報が古いか間違っている可能性があるので、認証情報を更新して再設定してみる。
AWSコンソールから確認(編集中)
- IAMロールが作成れているか確認
Dockerによる環境構築
VSCode + Dockerでの環境構築
- dockerfileの作成
# ベースイメージとしてUbuntuの最新安定版を使用
FROM ubuntu:22.04
# 環境変数を設定: ビルド中のインタラクティブなプロンプトを無効化
ENV DEBIAN_FRONTEND=noninteractive
# システムを更新し、必要なパッケージをインストール
RUN apt-get update && apt-get install -y \
software-properties-common \
curl \
build-essential \
libssl-dev \
zlib1g-dev \
libbz2-dev \
libreadline-dev \
libsqlite3-dev \
wget \
llvm \
libncurses5-dev \
libncursesw5-dev \
xz-utils \
tk-dev \
libffi-dev \
liblzma-dev \
git \
--no-install-recommends \
&& rm -rf /var/lib/apt/lists/* \
&& apt-get update && apt-get install -y net-tools
# Python 3.12のソースコードをダウンロードしてビルド
WORKDIR /tmp
RUN wget https://www.python.org/ftp/python/3.12.1/Python-3.12.1.tgz \
&& tar -xf Python-3.12.1.tgz \
&& cd Python-3.12.1 \
&& ./configure --enable-optimizations \
&& make -j$(nproc) \
&& make altinstall \
&& cd .. \
&& rm -rf Python-3.12.1 Python-3.12.1.tgz
# シンボリックリンクを作成して「python」と「python3」コマンドをPython 3.12に設定
RUN ln -s /usr/local/bin/python3.12 /usr/local/bin/python \
&& ln -s /usr/local/bin/python3.12 /usr/local/bin/python3 \
&& ln -s /usr/local/bin/pip3.12 /usr/local/bin/pip \
&& ln -s /usr/local/bin/pip3.12 /usr/local/bin/pip3
# pipをアップグレード
RUN pip install --upgrade pip
# 作業ディレクトリを設定
WORKDIR /app
# Chaliceをインストール
RUN pip install chalice \
&& chalice new-project blog
# デフォルトコマンドを設定
CMD ["/bin/bash"]
- docker-compose.ymlの作成
services:
app:
build:
context: .
dockerfile: Dockerfile
volumes:
# ホストのカレントディレクトリを/appにマウント
# ./ホスト側相対パス:/コンテナ側のパス
- ./app:/app
ports:
- "8000:8000"
environment:
- DEBIAN_FRONTEND=noninteractive
working_dir: /app/blog
# Chaliceローカルサーバーを起動
command: chalice local --host=0.0.0.0 --port=8000
tty: true
stdin_open: true
- docker compose upの実行
docker compose up
- 実行結果
[+] Running 2/1o docker.io/library/chalice-app 0.0s
✔ Service app Built 2.2s
✔ Container chalice-app-1 Recreated 0.1s
Attaching to app-1
app-1 | Serving on http://0.0.0.0:8000
- コンテナに入る
chalice/で実行する
docker-compose exec app bash
AWS認証情報の更新
aws configure
デプロイ
chalice deploy
Creating deployment package.
Creating IAM role: blog-dev
Creating lambda function: blog-dev
Creating Rest API
Resources deployed:
- Lambda ARN: arn:aws:lambda:us-west-2:12345:function:blog-dev
- Rest API URL: https://abcd.execute-api.us-west-2.amazonaws.com/api/