【サーバーレス Lambda】Apexを使ってデプロイ環境を整備する
Lambdaとは
公式によると
AWS Lambda はサーバーをプロビジョニングしたり管理しなくてもコードを実行できるコンピューティングサービスです。AWS Lambda は必要に応じてコードを実行し、1 日あたり数個のリクエストから 1 秒あたり数千のリクエストまで自動的にスケーリングします。使用したコンピューティング時間に対してのみお支払いいただきます- コードが実行中でなければ料金はかかりません。 ...以下、略
と書いてあります。
難しすぎますね。。
個人的に重要な点
個人的にLambdaの重要なところは以下の3点だと思います。
Lambdaの利点
前述したように、サーバー構築を一回でもやったことがある人なら認識あるかもしれないんですが、 新しいインスタンスやVPSを立ち上げるのって結構だるいです。
Lambda を使えば環境構築も整備してくれて、すぐに実行出来ます。
そして、AWSのサービス群である CloudWatch
やAPIGateway
を使えば
cron job や 面倒なAPIを作成することが出来ます!
Lambda 面倒な点?
まずはじめにLambda実行方法をあげてから面倒な点を述べます。
Lambdaの実行方法(GUI)形式で乗っ取ると以下のような手順を踏まえます。 注) 以下、python を想定
面倒なのは2と3の実行手順です。標準外のライブラリをダウンロードして ZIP化、さらには実行環境設定などをいちいち設定しなくてはいけません。
Apexとは
Apexは上述した、Lambdaの面倒な点をサポートするデプロイツールです。 Apex公式
利点
利点は以下の通りです。
- プロジェクトごとに共通の設定を持たせることが出来る
- プログラムファイルは自動でZIP化し、デプロイ
- エイリアスを用いることが出来るので、ロールバックやアップデートも楽
- Go言語が使用可 (デフォルト使用言語: Node C# JAVA Python)
利用方法
想定言語:python(ローカルでパッケージ管理ツール pip がインストール)
apex環境構築
# IAMで access key と secret access keyを取得しておくこと # コマンドラインでAWSを操作出来るパッケージインストール $ pip install awscli $ aws help # install 確認 $ aws configure # 以下を入力 # AWS Access Key ID [**********]: # AWS Secret Access Key [**********]: # Default region name [ap-northeast-1]: # Default output format [json]:
apex install
# apex install curl https://raw.githubusercontent.com/apex/apex/master/install.sh | sh apex version # install確認
apex 実行
$ mkdir apex-test $ cd apex-test/ $ apex init #project name descriptionを記入
apex init
を実行すると以下のようなプロジェクトフォルダが作成されます。
初期設定はjsになるようです。。
.apex-test │ ├── functions │ └── hello │ └── index.js └── project.json # プロジェクトの固有設定
ので、python仕様と説明用に以下のようにしておきます。
.apex-test │ ├── functions │ └── hello │ │── function.json # function固有の設定(←デプロイされるプログラムの設定) │ └── main.py # デプロイプログラム └── project.json # プロジェクトの固有設定
project.json
{ "name": "blog-test", "description": "test", "memory": 128, # 使用メモリ、CPUと連動 "timeout": 5, # 秒 "role": "[AWS-ROLE]", "environment": {} # 環境変数設定 pythonの場合、os.environ["#####"]で取得可 }
ここでは各プロジェクトの共通設定を記述しています。
function.json
用途:各ファンクション固有の環境設定を記載する。 なお、project.jsonの内容は継承されます。
{ "description": "python functions", "runtime": "python3.6", # 実行環境 "memory": 128, "timeout": 20, "hooks": { "build": "pip install -r requirements.txt -t ./", # デプロイ前の処理 "clean": "rm -rf */" # デプロイ後の処理 }, "environment": { "????_API_KEY":"######", "URL":"https://hoge.com" } }
このようにLambdaファンクション固有の設定を記述することが出来ます。
なお、hooks
の内容は
- build(deploy前):記述内容はlambdaデプロイ時に標準外パッケージをインストールし、デプロイ
- clean(deploy後):buildでインストールした標準外パッケージを削除
となります。
上記のようなjsonファイルを作成することで、lambdaの面倒な点
- 1.プログラム、標準外ライブラリをフォルダに一式入れる処理)
- 2.実行環境設定 (メモリ、実行時間など)
を自動化することが出来ます。
apex コマンド
少し長くなってしまったので、個人的に有用だと思うコマンドをまとめておきます。
# 新規プロジェクトを作る apex init # 当該プロジェクト内のファンクションをデプロイ apex deploy # 当該プロジェクト内の特定のファンクションをデプロイ apex deploy {FunctionName} # invoke: deploy後の実行結果をローカルで試す。 apex invoke {FunctionName} # event の受け渡し apex invoke {FunctionName} < event.json # エイリアス作成 apex alias {AliasName} {FunctionName} # エイリアスのデプロイ apex deploy -a {AliasName} apex rollback -v n # n:数字 apex rollback # 一個前に戻す apex rollback -a {AliasName} # エイリアスロールバック
最後に
最近、Lambdaをはじめたのですが、面白いのでApexを用いて がしがし有用なプログラム作っていきたいです\(^o^)/