AWS Lambdaを実装するときは最初にeventを確認すべき

前回までのまとめ

前回、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のデプロイについて記載しようと思います。