アラタナエンジニアブログ

aratana Engineer's Blog

こんにちは、Lambdaさん

こんにちは、アラタナの月岡です。

re:Invent2014で発表されたAWSの新サービスのひとつであります。
Lambdaのプレビュー申請がようやく届いたので試してみました。

f:id:ststyle:20141215113654j:plain
「TechCrunch Japan」Amazon、Lambdaをリリース―ステートレスでイベント・ドリブンのコンピューティング・サービス より

Lamda (ラムダ)とは?

クラウド上でコードをイベントドリブンで実行できるプラットフォーム。

となっております。

ふむふむ。実際に動かしてみた方が速いので試してみましょう。

まず最初にAWSコンソールからLamdaを選択して"Get Stated Now" します。
※日本リージョンはまだ未対応なのでUSのリージョンを選んでください。

f:id:ststyle:20141215113949p:plain
「AWS マネジメントコンソール」 より


下図の画面に遷移しましたらLambdaの設定を行います。

f:id:ststyle:20141215115515p:plain
「AWS マネジメントコンソール」 より

簡単に説明。

  • Lamda Function Name
    • Name : Lambdaファンクションと呼ばれるファンクション名を指定します。
    • Description : ファンクションの補足説明を記入してください。
  • Lamda Function Code
    • Edit code inline : コンソール上のコードエディタを利用する場合。
    • Upload a.ZIP file : コードにライブラリー関連を利用する場合にはファイルアップロード。

今回はコードのテンプレートからHelloworldを選択してみます。

  • Handler name
    • イベントハンドラーの名前を指定します。コードの3行目にありますexports.handlerという名前と関連します。
  • Role name

次にLambdaの実行権限におけるIAMのRoleを指定します。
"Create/Select Role"ボタンを押下しますと下図の画面に遷移します。
ポリシーの内容を確認しましたら"Allow"ボタンを押下します。
f:id:ststyle:20141215115846p:plain
「AWS マネジメントコンソール」 より

  • Advanced settings
    • Memory (MB) : Lambdaファンクション実行の処理プロセスに割り当てるメモリ
    • Timeout : タイムアウト設定

以上を設定しましたら"Create Lambda function"ボタンを押下してください。
すると以下のような画面が表示されます。
わーい! おめでとうございます。 無事に作成できましたら"Edit/Test"ボタンを選択します。
コンソール上でコードの編集画面に遷移します。
f:id:ststyle:20141215120654p:plain
「AWS マネジメントコンソール」 より


サンプルで選択しているHello Worldのコード編集画面になります。
"Invoke"ボタンを選択しますとコードの実行が行えます。
コンソールログに変数の値を展開するだけのシンプルなものとなってます。
f:id:ststyle:20141215121150p:plain
「AWS マネジメントコンソール」 より

試しにInvokeを押すと下のように実行結果が表示されます。
きちんと変数の値も展開されて最後に"Hello World"が表示されました。
f:id:ststyle:20141215121543p:plain
「AWS マネジメントコンソール」 より

またCloudWatchにもログの結果は記録されます。
f:id:ststyle:20141215121747p:plain

ハローワールドも無事に動きましたので
次にS3へファイルアップロードを行いそれをトリガーにしてLamdaファンクションを動かしてみます。

まず最初にS3のバケットを作ります。
※ここではOregonリージョンにバケットを作ります。
(S3バケットもラムダが時点で対応しているリージョンである必要があります。)
f:id:ststyle:20141215122630p:plain

続いてLambdaのメニューから"Configure event source"を押下します。
f:id:ststyle:20141215123049p:plain
「AWS マネジメントコンソール」 より

Lambdaイベント用の実行権限を作成付与します。
f:id:ststyle:20141215123158p:plain
「AWS マネジメントコンソール」 より

続いて先程作成したS3のバケットを選択してRoleを選びましたら"Submit"します。
f:id:ststyle:20141215123531p:plain
「AWS マネジメントコンソール」 より

これでS3へのファイルPUTイベントに対するLambdaファンクションの実行準備が整いました。
f:id:ststyle:20141215123723p:plain
「AWS マネジメントコンソール」 より

次に実行時に動かすLambdaファンクションの中身を少し編集します。
せっかくS3にファイルをアップロードするのでログにバケット名とファイル名くらいを出力するようにしてみます。
とりあえずHelloworldのコードを以下のように編集してみました。
aws-sdkの読み込みとバケット名とイベントされたファイル名を出すだけです。

f:id:ststyle:20141215124037p:plain

var AWS = require('aws-sdk');

console.log('Loading event');
exports.handler = function(event, context) {
  var bucket = event.Records[0].s3.bucket.name;
  var key = event.Records[0].s3.object.key;
  console.log("bucket : " + bucket + ", key : " + key);
  context.done(null, 'Hello World');  // SUCCESS with message
};

これで準備が整いましたので早速S3になにかファイルをアップロードしてみます。
tsukioka.txtなるただのテキストファイルをアップロード!!
f:id:ststyle:20141215124330p:plain


どきどき。ちゃんとLambdaファンクションが動かくな?

わーい、わーい!!
期待通りログにアップロードしたファイル名が記録されました!!
f:id:ststyle:20141215124727p:plain

以上 、こんにちは Lambdaでした。
執筆時点ではイベント元にはKinesisやDynamoDBなども扱えるので
イベントからトリガーしてどうゴニョるかなど、いろいろ夢が広がりますね。

では