AWS Lambda超入門

ども。

前々から興味があった「AWS Lambda」を試してみます。

AWS Lambdaとは

Lambda(ラムダ:λ)はギリシャ文字の一つ。
プログラミングの世界ではよく「ラムダ式」と言って、ざっくり「関数を変数として扱う」ことを指します。
// 三角形の面積を求める
let getTriangleArea = function(base, height){
    return base * height / 2;
};

console.log(getTriangleArea(5, 4)); // 10
で、
AWS Lambdaでどんなことができるのかというと。
サーバを使わずに、Java、Node.js、C#、Pythonなどで開発した処理(関数、クラス)を直接登録してサービスとして動かすことができるんですね。

コンピューターリソースを使うのはその処理が呼ばれたタイミングだけで、処理トリガーはAWS内で発生する色々なイベントに紐づけることができます。

このように、関数(機能)を登録するというところがLambda(ラムダ)の名前を冠しているのだと思います。

サーバレスアーキテクチャ

こういった、ある決められた処理に対して、サーバを(利用者から見て)常時起動させてコールされるのを待ち受けるのではなく、それがトリガーされたタイミングで動的にリソースを割り当てて動かすことをサーバレスアーキテクチャと呼びます。

サーバレスのメリット・デメリット

サーバレスのメリットは、
  • 必要になった時しかリソース確保が行われないためサーバリソースの節約になる
  • AWS LambdaではEC2のように起動時間ではなく、処理時間と処理回数によって課金されるため、場合によってはコスト節約になる
  • 必要最低限の処理を記述すればよいため、プログラムコーディング量が減る
逆にデメリットは、
  • ホストできるプログラミング言語が限られている
  • 複雑な処理の実現は難易度が高い
  • 長時間かかる処理には向かない
  • クラウドでしか実現できないアーキテクチャのため、オンプレや他クラウドサービスへの移行に難があり、ベンダーロックインの危険がある。

AWS Lambdaを使ってみる

前置きはこれぐらいにして、それでは実際に使ってみましょう。 AWSダッシュボードからLambdaを選択します。
「関数の作成」を選択します。
「一から作成」を選択し、「基本的な情報」を入力していきます。
関数名、ランタイムと実行するためのIAMロールを選択します。
今回はランタイムに「Node.js 8.10」を指定し、新しくIAMロールを作成します。

選択し終わったら「関数の作成」をクリックします。
関数ができました。
ブラウザからコードも編集できます。
HTTPステータスコード「200:OK」と「Hello from Lambda!」のJSONをレスポンスで返すといった内容ですね。

リクエストパラメータを受け取れるよう、次のように編集します。
exports.handler = async (event) => {
    let body = JSON.stringify('Hello from Lambda!')
             + 'val1=' + event['key1'];
    const response = {
        statusCode: 200,
        body: body,
    };
    return response;
};
右上の「保存」を押します( エディタの保存だけでは、実際の定義に反映されないので注意 )。
さらに横の「テスト」を選択します。

「テストイベントの設定」が開くのでテストイベントを定義します。

「作成」を押してテストイベントを作成します。

前の画面に戻るので、再度「テスト」を押すと。

テストが実行されます。
ログの詳細を開き、期待通りの結果か確認します。

Web APIとして呼んでみる

それでは、実際にトリガーを設定して呼び出してみます。
API Gatewayのトリガーを追加します。
下に「トリガーの設定」が出てくるので、次のように設定します。
「セキュリティ」を「AWS IAM」にするとIAM認証、「オープン」にすると誰でもアクセス可能、「APIキー使用でのオープン」にするとAPIキーでの認証になります。

「追加」を押して、右上の保存を押すと、APIエンドポイントとAPIキーが確認できます。

curlコマンドを使ってローカルから実行してみます。
>curl -s -X GET https://nk1ium5wwi.execute-api.ap-northeast-1.amazonaws.com/default/Hello -H "x-api-key: skkboGLMLRjxfXPzASvo47DXpRFrEck56mUUrKu1"
"Hello from Lambda!"val1=undefined
実行できました!結果もちゃんと戻ってますね。


これなら自前のAPIや簡単なサービスをすぐに公開できそうですね!

他にも、AmazonのスマートスピーカーAmazon Echoのへの声掛けをトリガーして動かしたりもできるみたいなので、AWS Lambdaを使ってそのうち何か作ってみようと思います。

以上でした。