こんにちは。DSOC R&Dグループの高橋寛治です。
最近は、「Pythonで書かれたOSSのコードを最適化してPull Requestがマージされるまで」や「キャリブレーション用のEstimatorを作りました」といった、周りの強い人たちのOSS活動に肝を冷やしながら、研究開発に取り組んでおります。
さて、今回は「API GatewayとAWS Lambda PythonでAPI開発」の締めとして(本来は運用がこの先あるはずなのですが……)、デプロイについて紹介します。
AWS Lambdaでのデプロイとは
AWS Lambdaでのデプロイとは、任意のコードをLambda関数としてセットすることです。
大まかに手動と自動の2つとなります。
- 手動
- コードをWeb上でインライン編集
- ZIPファイルをアップロード
- Amazon S3からファイルをアップロード
- AWS CLIからSAMテンプレートによるアップロード
- 自動
- AWSサービスを組み合わせる
今回は少々アナログですが、手動でAmazon S3からファイルをアップロードする方式を紹介します。
Amazon S3を用いた単純なデプロイ方式を採る
自動化はエンジニアリングの醍醐味で、私にとっても夢中になれる取り組みです。とはいえ、自動化するためにはたくさんのサービスの特性を知り、使いこなす必要があります。
現在は以下のような業務の特性上、Amazon S3方式を採っています。
- デプロイの頻度は多くて月数回
- 外部依存が少ない
- 高速かつ正確なデプロイが求められているわけではない
また、動作していたバージョンのZIPファイルを残しておきたいということも、S3を利用している理由の一つです。
新しいバージョンをデプロイしたが、うまく動作しなかった場合などに、動いていたコード群をZIPにまとめているため、ロールバックをすることが非常に簡単です。
S3での管理例ですが、プロジェクトのバケットを作成し、その中に以下のように日付のZIPファイルを配置しています。
ZIPファイルを作り、アップロードする
AWS Lambdaは、ZIPのアップロードサイズが50MBまでという制約があります。そのため不要なファイルをデプロイパッケージに含めることは避けたいです。
以下のシェルスクリプトをプロジェクトのディレクトリーのルートに配置することにより、デプロイパッケージをホームディレクトリーに作成します。
#!/usr/bin/env bash
set -eu
# プロジェクトのルートディレクトリーの絶対パスを取得
cwd=`dirname "${0}"`
PROJECT_ROOT=`(cd "${cwd}" && pwd)`
cd $PROJECT_ROOT
# 今日の日付で、exclude.lstに記載されていない項目をZIPに固める
today=$(date "+%Y%m%d")
zip -r9 ~/hoge_${today}.zip * -x@exclude.lst
echo "~/hoge_${today}.zipが生成されました。"
ZIPに含めないリストである exclude.lst
ですが、以下のような途中生成ファイルなどをリストに加えています。
*.dist-info/*
*.egg-info
*.pyc
exclude.lst
__pycache__
S3へのアップロードは、ブラウザもしくはAWS CLIでのアップロードとなります。
AWS CLIはコマンド一つでアップロードできるため、おすすめです。
$ aws s3 cp ~/hoge_20180405.zip s3://project-hoge/
AWS LambdaにS3からアップロードする
デプロイ対象のファイルのリンクをS3上で取得します。リンクは https://s3-region-name.amazonaws.com/project-hoge/hoge_20180405.zip
のような形式だと思います。
これをAWS Lambdaのコンソールの「関数コード」項目で設定します。
関数コードは以下のもので、コードエントリタイプを「Amazon S3から……」にセットし、S3リンクのURLテキストボックスに、上記のリンクをペーストします。
設定し終わったら、画面右上の「保存」を忘れずに押下しましょう。
これでLambda関数のデプロイ完了です!
試しにAPI Gatewayのエンドポイント、もしくはLambdaコンソールの画面右上のテストから、デプロイした関数の動作確認を行いましょう。
Lambda上でテストを行うと、関数が例外を送出しない場合は、以下のようにテストが成功したことが分かります。
もしデプロイしたにもかかわらず動作が怪しいときは、以前の日付のファイルをLambda関数にS3から再度アップロードすることで、ロールバックしましょう。ログはCloudWatchから閲覧できます。
自らの手を離れ、世に出ることを楽しむ
デプロイの醍醐味は、作ったものが世に出ていくことだと思います。その手順を簡略化したり自動化したりできると、どのようなものを出していくのかに集中できます。
自動化できるということは、デプロイする人がこの記事に書かれた手順を踏む必要がないということです。
そろそろ出したら出しっぱなしではなく、運用についても勉強をしようと思います。
執筆者プロフィール
過去記事
▼第8回 「API GatewayとAWS Lambda PythonでAPI開発」Vol. 3:エラー処理
▼第7回
「API GatewayとAWS Lambda PythonでAPI開発」Vol. 2:ローカルでの開発環境構築
▼第6回
「API GatewayとAWS Lambda PythonでAPI開発」Vol. 1:API GatewayとAWS Lambdaを知る
▼第5回
快適なシェル環境の再構築を自動化する
▼第4回
第16回情報科学技術フォーラム(FIT2017)で登壇
▼第2回
R&D論文読み会勉強会
▼第1回
言語処理100本ノック勉強会
text:DSOC R&Dグループ 高橋寛治