怠惰系エンジニアのメモ帳

勉強した内容をメモしていきます。解説ブログではないので悪しからず。

AWS Lambdaメモ -ハンドラの引数eventの中身-

今回はLambda関数として実行されるハンドラの引数 event についてのメモ。
※Node.jsでLambda関数を作成する場合を想定しています。

間違っている場合はご指摘いただけると幸いです。

event が何者なのか分からない

Lambda関数の作成はNode.jsに落ち着いたのですが、 NodeでLambda関数を作成する場合には以下のような引数を3つ受け取るハンドラを定義する必要があります。

exports.myHandler = (event, context, callback) => {
  // 処理
}

これら3つの引数について、公式では以下のように説明されています。

  • event — AWS Lambda はこのパラメーターを使用してイベントデータをハンドラーに渡します。
  • context — AWS Lambda はこのパラメーターを使用して、実行中の Lambda 関数のランタイム情報をハンドラーに提供します。詳細については、「Context オブジェクト (Node.js)」を参照してください。
  • callback – コールバックオプションは呼び出し元に情報を返すために使用できます。使用しない場合戻り値は null です。詳細については、「コールバックパラメーターを使用する」を参照してください。

Lambda 関数ハンドラー (Node.js) - より引用

「何言ってる分からねぇ...。結局 event って何者。」

静的型付け言語大好きマンなので、正体不明の値が来るのがモヤっとするといいますか...。

結論

先に結論を述べてしまうと、Lambda関数の呼び出し元によって異なる です。
※型としては object 型になるようです。(要は何でも型)

呼び出し元によって異なる、とは

Lambda関数は何かをキッカケにして呼び出されるので、必ず呼び出し元が存在します。
呼び出し元の例で言えば API Gateway であったり、DynamoDB であったり。 (Lambdaでは、これらの呼び出し元を イベントソース と呼んでいるようです)

  • event — AWS Lambda はこのパラメーターを使用してイベントデータをハンドラーに渡します。

イベントソースのから渡されるデータ、なので イベントデータ という解釈をしています。

今回はイベントソースとして API Gateway を例に挙げます。
API Gateway は、RESTful APIを作成するサービスです。

API Gateway の場合に設定される event の中身

イベントソースを API Gateway にした場合、ハンドラの引数 event に設定されるのは API Gateway で定義した「本体マッピングテンプレート」になるようです。

f:id:tk5_21:20180112000146p:plain

上記マッピングテンプレートは

{
  "method": "$context.httpMethod", 
  "pathParams": "$input.params('userId')",
  "body": $input.json('$')
}

と定義しており、

  • 1行目はHTTPメソッド名
  • 2行目はパス・クエリ文字・ヘッダーからパラメータが userId の値を取得
  • 3行目はボディ部のJSONを取得

となっています。

仮にこのAPI/app/{userId} という形式でアクセス可能にし、以下のLambda関数を実行させるとします。

exports.handler = (event, context, callback) => {
    console.log("event type:", typeof event);
    console.log("event JSON:", JSON.stringify(event, null, 2));
    callback(null, 'Hello from Lambda');
};

クライアント側から、上記APIを呼び出します。

  • POSTメソッド。
  • URLは /app/0 とする。
  • 以下のJSONをボディ部に含める。
{
  "name": "Jane",
  "age": 20
}

呼び出した結果のログは以下の通り。

2018-01-11T15:21:14.555Z   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx   event type: object
2018-01-11T15:21:14.559Z   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx   event JSON:
{
    "method": "POST",
    "pathParams": "0",
    "body": {
        "name": "Jane",
        "age": 20
    }
}

ちゃんとテンプレートに定義した形式で eventマッピングされています。

イベントソースによって設定値を調べる必要がある

他にも DynamoDBSNSS3Kinesis などからLambda関数を呼び出すことが可能ですが、 呼び出し元のイベントソースによって event に設定される中身は異なります。 そのため、event にどのような値が設定されるかは都度調べる必要があります。

まとめ

  • event は、イベントソースから渡されるデータが設定される。
  • event は、object 型(何でも型)である。
  • API Gateway の場合には「本体マッピングテンプレート」で定義した内容が設定される。
    • イベントソースが異なれば、event の中身も異なる。(ので都度調べる必要がある)

AWS Lambdaメモ -その1-

今更ながらAWS Lambdaについて勉強しているので、現時点で分かっていることを書き起こしてみようと思います。 とりあえず、今回は概要をツラツラを書くだけで、コードとかは無しです。 今後もLambdaの勉強は継続していくので、メモその1ということで。

記載内容に間違いなどありましたら、ご指摘いただけると幸いです。

AWS Lambdaとは

2014年にリリースされたAmazon Web Serviceのサービスの1つで、 ざっくり言うと 「何かしらのイベントをキッカケに、定義しておいたコード(処理)を実行する環境」を提供しているサービス です。(正直、最初はピンときてませんでした...) 勿論、処理とキッカケ(トリガー)は事前に紐付けしておく必要があります。

公式サイトには以下のように記載されています。

AWS Lambda はサーバーをプロビジョニングしたり管理しなくてもコードを実行できるコンピューティングサービスです。AWS Lambda は必要に応じてコードを実行し、1 日あたり数個のリクエストから 1 秒あたり数千のリクエストまで自動的にスケーリングします。

AWS Lambda とは - AWS Lambda より引用

また、Wikipedia には以下のように記されています。

AWS LambdaはAmazonAmazon Web Servicesの一部として提供する、イベント駆動のサーバーレスコンピューティングプラットフォームです。

※サーバーレスについては後述。

続きを読む

「プロになるためのWeb技術入門」を読んだ

「プロになるためのWeb技術入門」 ――なぜ、あなたはWebシステムを開発できないのか を読んだ。

きっかけ

別の技術書を買いにいったら、偶々目についたので一緒に購入。
Amazonの「欲しいものリスト」にも追加しており、内容的にサクッと読めそうだったので。

物量的には300ページなく、3時間程度で読み終えた。

感想

Webシステムの開発にあたり、知っておくべき知識が分かりやすく記載されており、 1年目の頃に読みたかった1冊。

Amazonでの評価が良いのも納得の内容。
HTTPをはじめ、アーキテクチャやセキュリティなどが歴史的背景なども交えて網羅的に解説されている。

個人的に注釈が丁寧で凄くいいなと思った。

「Webを支える技術」と併せて読むといいかも

自分は1年ほど前に「Webを支える技術」を読んでいたが、先に「プロになるためのWeb技術入門」を読んでから「Webを支える技術」を読むといいかなーという感じ。

今度弊社の新人さんにお勧めしよう。

RandomStringGeneratorでランダムな文字列を生成する

commons-textRandomStringGenerator を使用してランダムな文字列を生成してみた。
というのも、commons-langRandomStringUtils が非推奨になったらしい。

RandomStringUtils (Apache Commons Lang 3.6 API)

確かに @Deprecated ついてる。

(2018/03/16 追記)
3.7 では @Deprecated 取れてますね。

RandomStringGenerator は、より複雑なパターンのランダム文字を生成したい場合に使用する旨が追加されています。

RandomStringUtils is intended for simple use cases. For more advanced use cases consider using commons-text RandomStringGenerator instead.

使い方

今回は半角英数のみで、15文字のランダムな文字列を生成することを目標にする。

import org.apache.commons.text.RandomStringGenerator;

public class Main {

    public static void main(String[] args) {

        for(int i = 1; i <= 10; i++){
            System.out.printf("%02d回目;%s%n", i, generateRandomString(15));
        }

    }

    // ランダムな文字列を生成する
    public static String generateRandomString(final int length) {
        return new RandomStringGenerator.Builder()          // ビルダーを生成
                .withinRange('0', 'z')                      // 生成する文字の範囲を指定
                .filteredBy(Character::isLetterOrDigit)     // 生成される文字を抽出する条件を指定
                .build()                                    // RandomStringGenerator をインスタンス化
                .generate(length);                          // 指定した長さの文字列を取得
    }

}

ビルダーパターンや。
結果

01回目;P04ceP8ZVZbNpZG
02回目;ZijxWRc0vM2kVBR
03回目;HyIloW8PZIq95fQ
04回目;d1RM1PeZ3wyofJH
05回目;tCALG28Gmm6TIhN
06回目;cujJSQ5IHcy7qwW
07回目;uWDEFwg8aoo0jlf
08回目;WVQHbT1Mh7ISMGN
09回目;FYpc5hQIzUV9RtJ
10回目;vCfPe5kyqPJVmtw

ちゃんと半角英数のみで生成されている。

また、filteredBy の引数は CharacterPredicate の可変長引数になっているため、 任意の数の抽出条件を指定することができる。

public interface CharacterPredicate {
    boolean test(int codePoint);
}

org.apache.commons.text.CharacterPredicates に、 アルファベットを抽出する LETTERS と数字を抽出する DIGITS が定義されているので、 それを使用するのも手。(内部的には Character#isLetterCharacter#isDigit が使用されているだけ)

new RandomStringGenerator.Builder()
    .withinRange('0', 'z')
    .filteredBy(CharacterPredicates.LETTERS, CharacterPredicates.DIGITS)
    .build()
    .generate(20);

個人的には Character#isLetterCharacter#isDigit をメソッド参照で渡す方が良いのかなと思った。

RandomStringUtils 使ったことなかったので、使い勝手の比較はできないが、 API見る限りだと RandomStringUtils の方が使いやすそうではある。
なんで非推奨になったのか...。

Ruby触ってみた所感とか

ここ2週間程、Rubyを触っていました。
ある程度Rubyの基礎的な部分は知ることができたので、その所感とか書いてみます。 (見返してみるとメチャクチャ浅い感想...)

きっかけ

最近Wantedlyに登録して企業情報を眺めたりしてるんですが、Ruby(Rails)の求人が多いように見受けられました。
「やっぱり世間的にはRailsなのか…」と思い、視野を広げる目的でRubyを触ってみた次第です。(学生時代もRubyは触ろうとしなかったんですよねぇ…)

Rubyを触ってみて

率直な感想としては 普通に楽しかったです。(語彙力)

新しいこと覚えるのって楽しいですね、単純に。
糖衣構文が多く「如何に開発者が楽にコードが書けるか」という点を重視しているように感じました。
特に制御構文周りは種類が豊富で、色々便利そうだなという感じ。

触っててチョット分からない部分もあるので、もう少し調べてみようと思います。

Railsに関しては「rails new」しただけなので何とも言えませんが、 確かにスピードが速い開発ができそうな気がします。 (ファイルやらディレクトリがゴリゴリ作成されてビビリました。凄い。)

ただやっぱり型が欲しい...。