AWS Lambdaで戯れる

Lambdaが面白そうとずっと言い続けていたが、ようやく少し手を出してみた。

備忘録的な意味合いがとても強い。

 

概要

S3 <-> Lambda <-> DynamoDB

動きは次のように。

  1. S3へファイルアップロード
  2. アップロードを機に、登録しておいたLambdaが実行
  3. LambdaはS3のファイル内容をDynamoDBへアップロード

入れものの準備(全部東京リージョン)

S3

バケットを作成。このバケットにファイルをアップロードする。

DynamoDB

テーブルを作成。プライマリキーも適当に。

(テーブル名はtest, プライマリキーはdata_id[int]とする)

 

Lambdaの作成

目標:eclipseでコードを作成して、eclipse上でアップロードする

ざっと手順。

  1. eclipseで「New AWS Lambda Java Project」
    入力タイプは「S3Event」にする。プロジェクト名、パッケージ名などは適当に。
    作成されたプロジェクトにはUnit Testも含まれておりローカルで実行可能。
    EventのJSONデータも見れるので非常に作りやすい。

  2. コードを書く

    aws_sample/S3PutDynamoWriteDemo.java at master · 5chi/aws_sample · GitHub


    S3Eventにはメタ情報が含まれているので、必要なものを抜き出す。例えばバケット名やキー名。ファイルの内容を読み込むためにはInputStreamオブジェクトを作成して読み取る。
    後はリージョンを間違えない。

  3. Functionを登録する
    プロジェクトを右クリック->Amazon Web サービス->Upload Function~を選択。

f:id:kmgc:20151203212312j:plain

  Select AWS Region:S3のバケットのあるリージョンに。
  Select or create a Lambda function:AWSで管理する名前。適当に決める。
  
  

f:id:kmgc:20151203212701j:plain

  説明:適当に。
  ハンドラー:作成したクラスを指定。
  IAM Role:(あらかじめ用意していない限り)作成。
  ここで作られるIAM Roleはログを出力する権限がついたもの。
  S3 バケツw:は入力元になるバケット名を指定。
  拡張設定:デフォルトのまま。
  完了を押すと、アップロードされる。

 

ここまでが個々の準備。ここからは連携のための設定。

 

S3:イベント通知設定

マネジメントコンソールで用意しておいたバケットを右クリック->プロパティ。

イベントの項目を埋める。重要なのはイベントと送信先

f:id:kmgc:20151203214131j:plain

今回はS3でオブジェクトが生成されたら、Lambda関数を実行するように設定。
必要に応じてプレフィックスとサフィックスは追記。

 

 Lambda:IAMポリシーを編集

マネジメントコンソールから、eclipseで作ったIAM Roleを編集。前述のとおり、ログ出力だけなので、次の2点を追記。

 

これで準備完了。

動作確認

S3のバケットにファイルをアップロード。今回はテキストファイルで。

 

ちょっと待つと、DynamoDBのtestテーブルに適当なキー値とファイルの内容が登録される。

 

感想

  • Lambda@Javaは思いのほか簡単に書ける

作ってみたソースコードはS3やDynamoDBなど、微妙に静的な情報が入っているが、外部ファイルに書き出しておけば、色々使いまわせる。
# さらに抽象化して「入力」->「処理ロジック」->「出力」で綺麗にかけるといいなぁ。

  • IAM Roleの設定を忘れない

Lambdaからどのサービスにアクセスするかは意識しておく。

 

サーバを管理しないで、サーバアプリっぽいものがサクッとできるのは非常に気持ちがいいですな。