前回までのまとめ 前回 、bqコマンドを使ってデータセットを管理できることを確認しました。今回はcloud functionsを使ってエンドポイントを実装する予定でしたが、いろいろあってAWSを利用することになりました。その中でKinesis Data FirehoseからS3にデータをPUTする前にAWS Lambdaでデータを整形する必要が出てきました。その時に気づいた(当たり前かもしれない)ことを記載します。
関数の作成 まずはじめに関数を作成します。
AWSコンソール画面からAWS Lambdaを選択して、関数の作成をクリックします。
設計図の使用を選び、設計図の検索フォームにはFirehoseと入力して検索します。すると、kinesis-firehose-process-recordという設計図が出てくるので、こちらを選択します。
関数名に適切な名前を入力し、画面右下にある関数の作成ボタンをクリックします。これでLambda関数が作成できました。
コードの確認 設計図から作成されたコードは以下のようになっていました。
1 2 3 4 5 6 7 8 9 10 11 12 13 console.log('Loading function'); exports.handler = async (event, context) => { /* Process the list of records and transform them */ const output = event.records.map((record) => ({ /* This transformation is the "identity" transformation, the data is left intact */ recordId: record.recordId, result: 'Ok', data: record.data, })); console.log(`Processing completed. Successful records ${output.length}.`); return { records: output }; };
event.recordsでストリームデータにアクセスできるようです。map内のコールバック関数で各データにアクセスができます。今回はrecord.dataを整形して返せばよさそうです。
データ構造がわからずハマる 実装を始めようと思い、record.dataをいろいろいじって見たのですが、どうにもうまくいきません。そもそもどういうデータなのかわかっていなかったのがよくなかったです…
いろいろ調べていると以下のページが見つかりました。https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-kinesis-example.html
このサンプルに
1 //console.log(JSON.stringify(event, null, 2));
と書かれていて、嗚呼、最初にこれを実行すればよかったんだと気づきました。
eventを確認して実装する eventは以下のようになっていました
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 { "invocationId": "354ca9e9-7e83-4b8a-8415-7efddfd276a1", "deliveryStreamArn": "arn:aws:firehose:ap-northeast-1:000000000:deliverystream/sample-stream", "region": "ap-northeast-1", "records": [ { "recordId": "49612424225054340516134952530760216311574238310848004098000000", "approximateArrivalTimestamp": 1605063330351, "data": "eyJjb250YWluZXJfaWQiOiJhYmYzYjJkZGQyNWJlYWQzMjIwZjU1MTliYTM0MzZlZjhmNDNhN2QwYzg1MTdjZDhmNGViN2M2NDIyZjY4NzVmIiwiY29udGFpbmVyX25hbWUiOiIvZWNzLWFkZmFpci1hbmFseXRpY3MtZmFyZ2F0ZS10YXNrLTEzLWFkZmFpci1hbmFseXRpY3MtYXAtZGNiMWRiOWY4OWEyZTBlOGQzMDEiLCJlY3NfY2x1c3RlciI6ImFybjphd3M6ZWNzOmFwLW5vcnRoZWFzdC0xOjQ5MzkwNTA5Njc0NTpjbHVzdGVyL2FkZmFpci1hbmFseXRpY3MtZmFyZ2F0ZS1jbHVzdGVyIiwiZWNzX3Rhc2tfYXJuIjoiYXJuOmF3czplY3M6YXAtbm9ydGhlYXN0LTE6NDkzOTA1MDk2NzQ1OnRhc2svYWRmYWlyLWFuYWx5dGljcy1mYXJnYXRlLWNsdXN0ZXIvZDVjM2U3Yzg0ODNlNDQwNDk4ZjhjYjVhZTQ2MmUyNTYiLCJlY3NfdGFza19kZWZpbml0aW9uIjoiYWRmYWlyLWFuYWx5dGljcy1mYXJnYXRlLXRhc2s6MTMiLCJsb2ciOiJ7XCJhXCI6XCJiXCIsXCJjXCI6XCJkXCJ9Iiwic291cmNlIjoic3Rkb3V0In0K" }, { "recordId": "49612424225054340516134952530761425237393852940022710274000000", "approximateArrivalTimestamp": 1605063330354, "data": "eyJjb250YWluZXJfaWQiOiJhYmYzYjJkZGQyNWJlYWQzMjIwZjU1MTliYTM0MzZlZjhmNDNhN2QwYzg1MTdjZDhmNGViN2M2NDIyZjY4NzVmIiwiY29udGFpbmVyX25hbWUiOiIvZWNzLWFkZmFpci1hbmFseXRpY3MtZmFyZ2F0ZS10YXNrLTEzLWFkZmFpci1hbmFseXRpY3MtYXAtZGNiMWRiOWY4OWEyZTBlOGQzMDEiLCJlY3NfY2x1c3RlciI6ImFybjphd3M6ZWNzOmFwLW5vcnRoZWFzdC0xOjQ5MzkwNTA5Njc0NTpjbHVzdGVyL2FkZmFpci1hbmFseXRpY3MtZmFyZ2F0ZS1jbHVzdGVyIiwiZWNzX3Rhc2tfYXJuIjoiYXJuOmF3czplY3M6YXAtbm9ydGhlYXN0LTE6NDkzOTA1MDk2NzQ1OnRhc2svYWRmYWlyLWFuYWx5dGljcy1mYXJnYXRlLWNsdXN0ZXIvZDVjM2U3Yzg0ODNlNDQwNDk4ZjhjYjVhZTQ2MmUyNTYiLCJlY3NfdGFza19kZWZpbml0aW9uIjoiYWRmYWlyLWFuYWx5dGljcy1mYXJnYXRlLXRhc2s6MTMiLCJsb2ciOiJ7XCJhXCI6XCJiXCIsXCJjXCI6XCJkXCJ9Iiwic291cmNlIjoic3Rkb3V0In0K" }, { "recordId": "49612424225054340516134952530762634163213467569197416450000000", "approximateArrivalTimestamp": 1605063330354, "data": "eyJjb250YWluZXJfaWQiOiJhYmYzYjJkZGQyNWJlYWQzMjIwZjU1MTliYTM0MzZlZjhmNDNhN2QwYzg1MTdjZDhmNGViN2M2NDIyZjY4NzVmIiwiY29udGFpbmVyX25hbWUiOiIvZWNzLWFkZmFpci1hbmFseXRpY3MtZmFyZ2F0ZS10YXNrLTEzLWFkZmFpci1hbmFseXRpY3MtYXAtZGNiMWRiOWY4OWEyZTBlOGQzMDEiLCJlY3NfY2x1c3RlciI6ImFybjphd3M6ZWNzOmFwLW5vcnRoZWFzdC0xOjQ5MzkwNTA5Njc0NTpjbHVzdGVyL2FkZmFpci1hbmFseXRpY3MtZmFyZ2F0ZS1jbHVzdGVyIiwiZWNzX3Rhc2tfYXJuIjoiYXJuOmF3czplY3M6YXAtbm9ydGhlYXN0LTE6NDkzOTA1MDk2NzQ1OnRhc2svYWRmYWlyLWFuYWx5dGljcy1mYXJnYXRlLWNsdXN0ZXIvZDVjM2U3Yzg0ODNlNDQwNDk4ZjhjYjVhZTQ2MmUyNTYiLCJlY3NfdGFza19kZWZpbml0aW9uIjoiYWRmYWlyLWFuYWx5dGljcy1mYXJnYXRlLXRhc2s6MTMiLCJsb2ciOiJ7XCJhXCI6XCJiXCIsXCJjXCI6XCJkXCJ9Iiwic291cmNlIjoic3Rkb3V0In0K" } ] }
record.dataはbase64エンコードされたデータということがわかりました。これでやっと実装ができそうです。
まとめ Lambdaを実装するときはまずeventの中身を確認するようにしましょう。
次回はAWS Lambdaのデプロイについて記載しようと思います。