chalice入門

# はじめに
AWSの基本的な知識や操作方法、Dockerの知識については解説しません。

---
# chaliceとは

サーバレスアプリケーションを作成できるフレームワークで、簡単にLambda+APIGatewayを使ってREST APIを作成できます。

公式のクイックスタートではpython3.7で説明されてますが、python3.12までサポートしているようです。

[公式ドキュメント](https://aws.github.io/chalice/quickstart.html)

---
# 動作環境
M2 macmini(MacOS Sequoia)

---

私はpython3.12をインストールしているので3.12で進めます。

# 仮想環境の作成
```bash
python3 -m venv venv
cd venv
source bin/activate
```

# chalice install

```bash
python3 -m pip install chalice
```

# Credentials（AWS認証情報）

AWS コンソールにサインインしてIAMでポリシーを作成する（最低限の権限）

[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access_policies_create-console.html)

---

# アクセスキーの作成

アクセスキーidとシークレットアクセスキーが必要です。
作成時にcsvでダウンロードするかweb上から情報をコピペするか選べます。

[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/keyspaces/latest/devguide/create.keypair.html)

---

# 認証情報の更新

アクセスキーidとシークレットアクセスキーを設定する
```bash
aws configure
```

# プロジェクトの作成

```bash
chalice new-project helloworld
```

# デプロイ

```bash
cd helloworld
chalice deploy
```

```bash
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コマンドで確認

```bash
curl https://qxea58oupc.execute-api.us-west-2.amazonaws.com/api/
```

# URLの確認

```bash
chalice url
```

# エラー情報

```
An error occurred (InvalidClientTokenId) when calling the GetCallerIdentity operation: The security token included in the request is invalid.
```

認証情報が古いか間違っている可能性があるので、認証情報を更新して再設定してみる。

# AWSコンソールから確認（編集中）

1. IAMロールが作成れているか確認

---
# Dockerによる環境構築

VSCode + Dockerでの環境構築

1. dockerfileの作成

```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"]
```

2. docker-compose.ymlの作成

```bash
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
```

3. docker compose upの実行

```bash
docker compose up
```

4. 実行結果

```bash
[+] 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
```

5. コンテナに入る

chalice/で実行する
```bash
docker-compose exec app bash
```

# AWS認証情報の更新

```bash
aws configure
```
# デプロイ

```bash
chalice deploy
```

```bash
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/
```