【サーバーレス Lambda】Apexを使ってデプロイ環境を整備する

Lambdaとは

公式によると 

AWS Lambda はサーバーをプロビジョニングしたり管理しなくてもコードを実行できるコンピューティングサービスです。AWS Lambda は必要に応じてコードを実行し、1 日あたり数個のリクエストから 1 秒あたり数千のリクエストまで自動的にスケーリングします。使用したコンピューティング時間に対してのみお支払いいただきます- コードが実行中でなければ料金はかかりません。 ...以下、略

と書いてあります。

難しすぎますね。。

個人的に重要な点

個人的にLambdaの重要なところは以下の3点だと思います。

  • 1.サーバー管理、言語環境設定などをせず、コードを実行出来る
  • 2.他のAWSサービスと連携がしやすい
  • 3.使用言語: Node C# JAVA Python

Lambdaの利点

前述したように、サーバー構築を一回でもやったことがある人なら認識あるかもしれないんですが、 新しいインスタンスVPSを立ち上げるのって結構だるいです。

Lambda を使えば環境構築も整備してくれて、すぐに実行出来ます。 そして、AWSのサービス群である CloudWatchAPIGatewayを使えば cron job や 面倒なAPIを作成することが出来ます!

Lambda 面倒な点?

まずはじめにLambda実行方法をあげてから面倒な点を述べます。

Lambdaの実行方法(GUI)形式で乗っ取ると以下のような手順を踏まえます。 注) 以下、python を想定

  • 1 python プログラム作成
  • 2 python プログラム、標準外ライブラリをフォルダに一式入れてZIP化、アップロード
  • 3 実行環境設定 (メモリ、実行時間など)

面倒なのは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^)/