LoginSignup
3
4

More than 3 years have passed since last update.

AWS Chaliceの開発環境をdockerで構築し、超高速でサーバーレスアプリケーションをデプロイしてみた

Last updated at Posted at 2020-10-06

AWS Chaliceの開発環境をdockerで構築し、超高速でサーバーレスアプリケーションをデプロイしてみた

ChaliceもLambdaも初めてですが、
初めてのサーバーレスアプリケーションに興奮したので書きます

ソースコード naokit-dev/python3_chalice_on_docker

Chalice (チャリス?)

AWSが提供するPythonフレームワーク
Lambdaを使ったサーバーレスアプリケーションを簡単にデプロイできる
Documentation — AWS Chalice

環境

  • macOS Catalina
  • VS Code
  • Docker Desktop
docker --version
Docker version 19.03.13, build 4484c46d9d
docker-compose --version
docker-compose version 1.27.4, build 40524192

その他、AWSのアクセスキーが必要になります

準備運動

Docker Hubで使用するイメージを確認します
python - Docker Hub

AWS ChaliceはLambdaでサポートされているすべてのpythonが使用できるが3系が推奨とのこと

AWS Chalice supports all versions of python supported by AWS Lambda, which includes python2.7, python3.6, python3.7, python3.8. We recommend you use a version of Python 3.
Quickstart — AWS Chalice

ここでは、3.8-alpineを使用してみます

VS Codeで新規ワークスペースを作成
"python3_chalice_on_docker"としました

(次の手順は必要ないのですが、pythonが動く最小構成として試してみました)

Docker HubのイメージをPullしてコンテナを起動します

  • -it 標準入力にアタッチ
  • --rm コンテナ終了時にコンテナを削除
  • -v : host_pathをボリュームとしてマウント
docker run -it --rm -v $PWD:/python python:3.8-alpine /bin/sh

(-v .:/pythonのように相対パスでマウントしようとするとエラーとなるが、環境変数$PWDが使えるようで-v $PWD:/pythonなら問題ない | Volume相対パス指定でもdocker runがしたい! - Qiita)

# python --version
Python 3.8.6

Dockerfileを作成

先程作成したワークスペースでの作業になります

Dockerfileを作成
pip install chaliceでchaliceをインストールします

touch Dockerfile
FROM python:3.8-alpine

WORKDIR /app

RUN pip install chalice

CMD [ "/bin/sh"]

つぎにdocker-compose.ymlを作成
ポートマッピング、ボリューム作成のほか、.envに記述した環境変数をコンテナ内で扱えるようにしています

touch docker-compose.yml
version: "3.8"
services:
  app:
    build: .
    ports:
      - "80:8000"
    volumes:
      - .:/app
    command: chalice local --host=0.0.0.0 --port=8000
    tty: true
    stdin_open: true
    working_dir: "${APP_PATH}"
    environment:
      - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}
      - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}
      - AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION}

.envを作成
ここに環境変数を定義します
APP_NAMEはいまはブランクのまま
ほかも今はそのままで構いませんが、AWSにデプロイするために必要なcredentialsを記述することになります

touch .env
APP_NAME=
APP_PATH=/app/${APP_NAME}
AWS_ACCESS_KEY_ID=[YOUR_ACCESS_KEY_ID]
AWS_SECRET_ACCESS_KEY=[YOUR_SECRET_ACCESS_KEY]
AWS_DEFAULT_REGION=ap-northeast-1

端末にAWSのcredentialsが保存されている場合
以下で確認できます

cat ~/.aws/credentials

chalice projectを作成

chalice new-project <project_name>で新規プロジェクトを作成します

docker-compose run app chalice new-project test_chalice

以下のような構成になります

.
├── .env
├── Dockerfile
├── docker-compose.yml
└── test_chalice
    ├── .chalice
    │   └── config.json
    ├── .gitignore
    ├── app.py
    └── requirements.txt

環境変数を定義

.envを編集します
APP_NAMEに先程のプロジェクト名を、AWS_ACCESS_KEY_IDおよびAWS_SECRET_ACCESS_KEYもここに記述します
Regionはap-northeast-1に設定してありますが適宜変更してください

APP_NAME=test_chalice
APP_PATH=/app/${APP_NAME}
AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxxxx
AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxx
AWS_DEFAULT_REGION=ap-northeast-1

ローカルサーバーをたてる

ローカルサーバーを起動

docker-compose up

docker-compose.ymlでcommand: chalice local --host=0.0.0.0 --port=8000としてコマンドを上書きしてあるので、docker-compose up時にchalice localが実行されます

ports: - "80:8000"でホスト側のport 80をコンテナ内のport 8000にマッピングしてあるので、ホストからlocalhostにアクセスすると、chaliceのlocal serverにポートフォワーディングされます

curl localhost
{"hello":"world"}%

"hello world"が返ってきました

test_chalice/app.pyをみてみます
以下のコメントアウトされている部分を、コメントアウト解除します

# @app.route('/hello/{name}')
# def hello_name(name):
#    # '/hello/james' -> {"hello": "james"}
#    return {'hello': name}

/hello/chaliceにアクセスしてみると

curl localhost/hello/chalice
{"hello":"chalice"}%

"hello chalice"が返ってきました
RESTfulな挙動が確認できます

ローカルサーバーを停止

docker-compose down

デプロイしてみる

chalice deployでAWS Lambda関数としてデプロイされます

docker-compose run app chalice deploy

Creating deployment package.
Creating IAM role: test_chalice-dev
Creating lambda function: test_chalice-dev
Creating Rest API
Resources deployed:
  - Lambda ARN: arn:aws:lambda:ap-northeast-1:xxxxxxxxxxxx:function:test_chalice-dev
  - Rest API URL: https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/api/

Rest API URLにアクセスしてみます

curl https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/api/
{"hello":"world"}%

curl https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/api/hello/lambda
{"hello":"lambda"}%

chaliceがコードを解析し、
必要なIAM roleを付与してLambda関数としてデプロイしてくれるそうです

次は少し実用的なアプリに挑戦してみたいと思います

Ref.

Documentation — AWS Chalice

3
4
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
4