CloudWatch Logs サブスクリプションフィルタの使用 に書かれているように CloudWatch Logs のサブスクリプションフィルタにより Lambda 関数が起動するときのペイロードの Data は Base64 でエンコード + gzip 圧縮されている。

Lambda レコードの Data 属性は、Base64 でエンコードされており、gzip 形式で圧縮されています。Lambda が受け取る実際のペイロードは、{ "awslogs": {"data": "BASE64ENCODED_GZIP_COMPRESSED_DATA"} } の形式になります。raw データは、コマンドラインから次の UNIX コマンドを使用して調べることができます。

これを解く簡単なコードをよく使うのでメモとして残しておく。

const zlib = require('zlib')
const unzip = (b) =>
  new Promise((resolve) => {
    const base64Logs = new Buffer(b, 'base64')
    zlib.gunzip(base64Logs, function (err, bin) {
      if (err != null) throw err
      resolve(bin.toString('ascii'))
    })
  })

exports.handler = async (event) => {
  const logs = await unzip(event['awslogs']['data'])
  const obj = JSON.parse(logs)
  console.log(obj)
  return obj
}

async/await 好き...。

About

ウェブ界隈でエンジニアとして労働活動に励んでいる @gomi_ningen 個人のブログです

Copyright © 53ningen.com