sumikko engineer blog

すみっこが落ち着くエンジニアのブログです。

AWS cloudwatchlogsのサブスクリプションフィルターのlambdaテスト

AWSのcloudwatchlogsのサブスクリプションフィルターから呼び出されるlambdaをテストするときにやりにくかったのでメモ。

  • 本家マニュアルのお言葉
サブスクリプションフィルタを介して宛先サービスに送信されるログは、Base64 でエンコードされ、gzip 形式で圧縮されます。
  • lambdaでテストするときに出てくるcloudwatchlogsの形式
{
  "awslogs": {
    "data": "BASE64ENCODED_GZIP_COMPRESSED_DATA"
  } 
}

gzipした後にbase64エンコーディングする。messageの箇所にエラーメッセージを入れる。

require 'base64'
require 'zlib'

str = <<JSON
{"messageType":"DATA_MESSAGE","owner":"123456789123","logGroup":"testLogGroup","logStream":"testLogStream","subscriptionFilters":["testFilter"],"logEvents":[{"id":"eventId1","timestamp":1440442987000,"message":"hogehogeエラーメッセージ"}]}
JSON

# gzip作成
Zlib::GzipWriter.open('./gzip/gzip.gz') {|gz|
  gz.write str
}

# base64でエンコード
cloudwatchlogs_params = Base64.encode64(File.read('./gzip/gzip.gz'))
p cloudwatchlogs_params
  • dataに標準出力された値を入力してテストデータを作成
{
  "awslogs": {
    "data": "H4sIAJTHuWAAA0VPOwrCQBDtPcbUKRJdjdoFjCJoFTsRiTrEhSQbdldFgk32\nJHZ6A0FvsxdxEhWLgffjzUwJGSoVJ7g4FwhDGAWLYD0PoyiYhOCAOOUoSfba\nHdbt+f0BAZJTkUykOBTkaFR69qONE2mJcfa3vtwBddioreSF5iIf81SjVDBc\nNrEPhVVTEB4x17VVAt9RD9Z8uvOoQnM6V8cZbfYYcxlrD/q+67rO7w2K70WC\n9djqZs3dmpc1V2uMrZ41rh5wWV1ab4fCX2T4AAAA\n"
  }
}