AWS Lambda で S3 のアップロードログを取る

Why?

  • Lambda の練習用
    • S3 のイベントを拾う
    • ログに書き込む
    • 特に他のサービスと連携しない

Code

  • Handler: logS3.handler
  • Add event source: S3のPutイベントを拾う
  • IAM: Putイベントを拾う対象のReadイベントが必須
console.log('Load Lambda function');
var AWS = require('aws-sdk');

exports.handler = function (event, context) {
  console.log("Received event");
  var bucket = event.Records[0].s3.bucket.name;
  var object = event.Records[0].s3.object.key;
  console.log("bucket name: " + bucket + " / object key: " + object);
  console.log("done");
};

Result

  • Monitor tabでinvoke確認
  • Cloud watch でログを確認
    • ちゃんと出てた
bucket name: for-lambda-test2 / object key: hoge.jpg 

github.com

Lambda の Add event source でエラーになる

What's happen?

  • エラーが出て、event sourceを登録できない
There was an error creating the event source mapping: Configurations overlap. Configurations on the same bucket cannot share a common event type.

原因

  • 英語そのまま
    • イベントの設定が重複しているから、登録できない

解決方法

  • 他のイベントと重複していないか確認する
  • 他のイベントからイベントを削除する(disableにしてるだけじゃだめ) or 違うイベントを設定する

chromeで、はてなと四角の記号に文字化けする

What happen?

  • AWSの日本語ドキュメントや、その他諸々のサイトで日本語が文字化けしまくる。
  • 画像の通りの、はてなと四角の記号?四角の中にはてながある記号?
  • 例えば、

docs.aws.amazon.com

f:id:kz_engineer:20160426015121p:plain

  • バージョン情報
    • OS X El Capitan version 10.11.4
    • Version 49.0.2623.110 (64-bit)

やってだめだったこと

  • コピペしてみたらちゃんと日本語になってる
  • エンコードの問題ではない
    • フォント?

原因

f:id:kz_engineer:20160426015126p:plain

解決方法

追記

参考

AWS Lambda で node.js 実行時に出たエラーと対処方法

What for?

  • Hello world 的なことをしようとしたら引っかかった

Handlerがない

"errorMessage": "Handler 'handler' missing on module 'index'"
  • エラーの意味
    • handlerが見つからないよ
  • 原因と対処
    • handler がタイポってるならタイポをなおせ
    • そもそもちゃんと exports.handler = function(event, context) {を書こう

初期実行で指定したModuleがない

"errorMessage": "Cannot find module 'index'"
  • エラーの意味
    • index module が見つからないよ
  • 原因と対処
    • Lambda上で設定したHandler名とfile名の不一致だから、設定とfile名を合わせよう

特定のModule(ライブラリ)がない

"errorMessage": "Cannot find module 'xxx'"
  • エラーの意味
    • xxx module が見つからないよ
  • 原因と対処
    • プログラムで呼び出しているModuleがzipで一緒にアップロードされてない
    • Moduleのzipの構造が間違っている
      • zipにディレクトリ本体を含めない。
      • $ zip -r tryCallback.zip index.js node_modules

タイムアウトになる

`Process exited before completing request

AWS Lambda を使ってみる

What for?

  • アプリケーションを実行するために、リソースの計画をして、サーバーを立てて、それを監視する必要があるが、それはだるい。
  • リソース管理や監視は全部Lambdaがやってくれるので、アプリケーション開発に集中できる。

どういうことができる?

  • イベントをトリガとして、プログラムを非同期実行できる
    • データ処理、ファイル処理、ストリーム処理、DB抽出、IoTバックエンドetc...
      • 画像のサムネイル作成、ビデオのコード変換、ファイルのインデックス作成、ログの処理、コンテンツの検証、およびリアルタイムでのデータの収集とフィルタリング、アプリケーションのアクティビティの追跡、注文のトランザクション処理、クリックストリーム分析、データクレンジング、メトリックスの生成、ログのフィルタリング、インデックス作成、ソーシャルメディア分析、および IoT デバイスデータのテレメトリと測定などなど
    • イベントにはプルイベント、プッシュイベント、スケジュールイベントがある
      • プルイベント: Lambdaが某のイベント発生をポーリングする
      • プッシュイベント: Lambdaに某がイベントを発行する
      • スケジュールイベント: cronのようなもの
  • API Gatewayを通して、HTTPS経由で同期実行することも可能

  • 言語は、Node.js, Java, Pythonが使える

  • 監視はCloudWatchでモニタリング可能
  • バージョン管理がある。

お値段は?

  • 2016/4/23時点で
    • リクエストのうち毎月最初の 1,000,000 件は無料
    • その後は 0.20 USD/1,000,000 件のリクエスト(0.0000002 USD/秒)

やってみる

  • とりあえずScheduled Eventで走らせてみる

  • Create New function

  • Step 1: Select blueprint はSkip
  • Step 2: Configure function
    • 名前つけて、言語選択して、Edit code inlineにコードを貼り付ける。
    • ロールは Basic execution roleでOK。その他はdefaultで。
  • 設定し終わったら Event source タブから、1分ごとのScheduled Event を設定する

  • Node.js でとりあえず以下のコードで実行してみる

console.log('Hello World');
  • Monitoring タブを確認したら、めっちゃHandler 'handler' missing on module 'index'エラーが出た
exports.handler = function (event, context) {
    context.succeed('Hello World');
};
  • ちゃんと書いた。問題なく1分ごとにlogが吐かれている。
  • 止めるときは、Event sourceをDisableにする

TODO

  • lambda本体はどこで動いてるの?
  • どのくらい調子に乗ると破産するかの肌感覚がほしい
  • プルイベントとプッシュイベントの違いは?
  • 外部サービスとの連携ってできるのかな?
  • なんで、Node.js, Java, Pythonなんだろう?
  • CloudWatch使ったことない
  • バージョン管理でGitあるって聞いた気がする
  • S3とか他のサービスと連携させてみたい
  • Lambda 停止時って、Event sourceの操作でいいの?
  • コードがカジュアルに書き換えられすぎて心配で吐きそう
  • カスタマイズのVPCって何?

Git での Committer と Author の違いは?

Why?

Committer と Author の違い

  • 意味
    • Author: オリジナルのコードを書いた人
    • Committer: コミットをした人
  • なぜ?
    • Git は rebase などで歴史を改変できるので、commit --amend などを行っても、オリジナルのコードを書いたのが誰かがわかるように Author が変更されない
      • $ git commit --amend: これは Committer しか変更されない
      • $ git commit --amend --author="kz-engineer <kz-engineer@example.com>": Author option をつけることで、オリジナルを書いた Author の歴史も改変できる

普段の git log はどっちを表示してる?

  • 通常時: Authorだけの表示
$ git log
commit <sha1>
Author: <author>
Date:   <author date>
  • fuller表示: Committer と Author 両方が表示
$ git log --pretty=fuller
commit <sha1>
Author:     <author>
AuthorDate: <author date>
Commit:     <committer>
CommitDate: <committer date>

TODO List

参考