golang
CloudWatch
ElasticBeanstalk
Typetalk
ServerlessFramework

ElasticBeanstalkアプリケーションのエラーログをTypetalkに流したかったときの作業ログ

Typetalk使いに向けてざっくりとのこしておく

前提

  • ElasticBeanstalkアプリケーションがデプロイ済み
  • Serverless Frameworkもインストール済み
  • Golang及びDepもインストール済み

1. ElasticBeanstalkのCloudWatch ログストリーミングを有効にした

マネジメントコンソールから対象のEnvironmentを開き、 設定 > ソフトウェア設定 を開く

ログのストリーミングを有効にして適用する

スクリーンショット 2018-01-30 15.36.19.png

CloudWatchにログストリームが作成され、Environmentで出力されたログが送信されてくる
スクリーンショット 2018-01-30 15.36.36.png

2. CloudWatchログをTypetalkにPOSTする関数をつくって登録した

せっかくなのでちょっと前にサポートされた go と serverless frameworkで
ありがたいテンプレートを使った 感謝

    sls create -u https://github.com/serverless/serverless-golang/-p goserverless

そしてありがたいライブラリを使う
aws-lambda-go-eventはめんどくさいStructの定義をしてくれてる感謝
go-typetalkも面倒なPOST部分を簡単にかける感謝

    import(
        "github.com/aws/aws-lambda-go/lambda"
        "github.com/nulab/go-typetalk/typetalk"
        "github.com/eawsy/aws-lambda-go-event/service/lambda/runtime/event/cloudwatchlogsevt"
    )

適当にメッセージを組み立ててPOSTする部分を実装 かんたん

    messages := make([]string, len(event.Records))
    for i, record := range event.Records {
       messages[i] = record.LogEvent.Message
    }

    // TypetalkのPOSTサイズ上限があるので長い分は抜く
    r := []rune(strings.Join(messages, "\n"))
    message := fmt.Sprintf("```\n%s\n```", string(r[0:3900]))

    // 追いかけやすいように便利なまとめ機能にもいれる
    options := typetalk.PostMessageOptions{}
    options.TalkIds = []int{talkId}

    client := typetalk.NewClient(nil).SetTypetalkToken(token)

    client.Messages.PostMessage(ctx, topicId, message, &options)

ビルドしてAWSにデプロイ

    sls deploy

3. CloudWatchログをLambda関数へストリーミングさせた

ここからLambdaサービスへのストリーミング開始を選んで設定

スクリーンショット 2018-01-30 15.36.58.png

Lambda 関数 : さっきデプロイした関数
ログ形式 : とりあえずその他

4. TypetalkにログがPOSTされた

ストリーミングが開始されると、Lambda関数が実行され、Typetalkにアプリケーションのログが流れた

実際に動かしているものはもう少し小細工してあるけど、そこらへんを簡潔にしてコードを置いたのでTypetalk使い達の参考になれば。
https://github.com/katsut/typetalk-awslogs

流すだけならわりとかんたんにできた