【Chalice】AWS Lambdaで簡単サーバレス環境構築

ITインフラの選択肢が広がる中で、サーバーレスアーキテクチャという言葉を耳にするようになりました。サーバレスは厳密にはサーバが存在して、管理を私たちがせずAmazon AWSGoogle, Microsoftが準備した環境上でプログラムを動作します。

レンタルサーバと同じ?と思いますが1点違いがあります。
サーバレスのシステムはトリガーによる呼び出しをした時に処理を行い、それ以外は停止しているという特徴があります。随時動かさなくて済むため利用料金は時間では無く、処理の呼び出し回数で決まります。

今回サーバレス環境を簡単に作成できるPython Chaliceを試してみます。

Chaliceとは?

ChaliceはAmazon公式のPythonライブラリで、サーバーレスのシステム開発パッケージになります。動作環境はAPI Gateway + AWS Lambda になります。
ローカルモードを使用することで手持ちのPC内で開発することも可能です。

必要な環境・情報

必要な物備考
python2,7 or 3,6 or 3,7 バージョン
AWS CLIアクセスキー、シークレットキーが設定済みが望ましい

開発の流れ

1.Chaliceをインストール

pipコマンドを利用してPythonパッケージのChaliceをインストールします。
コマンドはWindowsはコマンドプロンプト、Macはターミナルで入力します。

pip install chalice

2.Chaliceコマンドで新規プロジェクトを作成

Chaliceをインストールするとコマンドが使えるようになりますのでプロジェクトを新規作成します。コマンドを入力する事でプロジェクト用もディレクトリが生成されます。

chalice new-project [プロジェクト名]

プロジェクト生成で下記ディレクトリ構成が作られます。

[プロジェクト名]
└ app.py
└ requirements.txt
└ .gitignore
└ .chalice (ディレクトリ)

3.app.py の中身をのぞいてみる

プロジェクトを生成すると app.py ファイルがあります。サーバレスのシステム内容はこちらのファイルに記入します。
内容はJsonで hello world と出力されるようになっています。

from chalice import Chalice

app = Chalice(app_name='Chalice')

@app.route('/')
def index():
    return {'hello': 'world'}

4.ローカルモードで動作

本来ChaliceはLambda環境で動作するようになっています。動作試験用にローカルモードがあるので利用してみます。
起動後、表示されるURLにアクセスする事で動作を試すことができます。

cd [プロジェクト生成ディレクトリ]
chalice local

[出力]
Serving on http://127.0.0.1:8000
Restarting local dev server.

5.Lambda環境にデプロイ

AWS Lambda環境にプログラムをデプロイします。
デプロイをする場合、事前にアカウント設定を行う必要があります。
アカウントはAWS IAMのアクセスキー IDシークレットアクセスキーが必要です。

AWS IAMからアクセスキー、シークレットキー取得

AWSのコンソールにログイン後、サービス > IAMに移動してください。
ユーザのメニューを押して先に進み利用するユーザを選択します。
存在しない場合は新規作成を行いアクセスの種類 [ プログラムによるアクセス]を許可したユーザを作成して下さい。

ユーザの認証情報でアクセスキーを新規生成します。

アクセスキー、シークレットキーをPCに設定

取得したアクセスキーとシークレットキーをPCのAWS CLIの設定に追加します。AWS CLIはホームディレクトリ直下に.awsディレクトリを配置して環境変数を保管しています。
.awsディレクトリが存在しない場合は、作成をしてください。

mkdir ~/.aws
vi ~/.aws/config

※下記、入力内容です。
[default]
aws_access_key_id=**[アクセスキー]**
aws_secret_access_key=**[シークレットキー]**
vi ~/.aws/credentials

※下記、入力内容です。
[default]
region=ap-northeast-1
output=json

Lambda環境にデプロイ

AWS CLIの設定が完了後にデプロイコマンドを実行します。
デプロイコマンドはLambdaAPI Gatewayの設定を自動で行ってくれます。
実行結果に表示されるRest API URLでアクセスする事ができます。

chalice deploy

[出力]
Creating deployment package.
Creating IAM role: xxxx-dev
Creating lambda function: xxxx-dev
Creating Rest API
Resources deployed:
  - Lambda ARN: arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXXXXXXXX
  - Rest API URL: https://XXXXXX.execute-api.ap-northeast-1.amazonaws.com/api/

6.Lambda環境のシステム削除

Lambda環境にアップしたシステムを削除します。
お試しの場合はこちらのコマンドで削除してください。

chalice delete

[出力]
Deleting Rest API: XXXXXXXX
Deleting function: arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXXXXXXXX
Deleting IAM role: xxxx-dev

いろいろな処理を試してみた

URLラメータの取得

URLパラメータを受取処理をおこないます。

from chalice import Chalice

app = Chalice(app_name='Chalice')

COUNTRYS = {
    'jp': '日本',
    'us': 'アメリカ合衆国',
}

@app.route('/country/{code}')
def country_name(code):
    return {'name': COUNTRYS[code]}
$ http http://127.0.0.1:8000/country/jp
HTTP/1.1 200 OK

{
    "name": "日本"
}

ラメータのメソッド制限

パラメータ受取時のメソッドを制限することができます。
メソッドは GET, POST, PUT, DELETE の4パターンがあります。

@app.route('/country/{code}', methods=['GET', 'POST', 'PUT', 'DELETE'])
def country_name(code):
    return {'name': COUNTRYS[code]}