インフラ

CDKでCloudwatchLogsのエラーログをSlack通知するLambdaを作る

cdk

こんにちは、ちゃりおです。

LambdaのBlueprintの「cloudwatch-alarm-to-slack-python」をCDKでデプロイします。

このBlueprintは、SlackのチャンネルごとにLambdaを作成する必要があります。

毎回手動でLambdaを作るのも面倒だし、フィルターをコード化して管理したいためCDKで作成します。

Contents

完成形

github cdk-cwlogs-to-slack

以下を書き換えたあとに、cdkでデプロイします。

  • SlackCahnnelID
  • SlackWebhook
  • Cloudwatchロググループ名
  • フィルターパターン
$ cdk deploy

コードについての解説

今回使用したコードについて解説します。

Lamabdaの変更したところ

シンプルにしたかったため、KMSを使わずWebhookURLは平文のまま環境変数に設定しました。

# HOOK_URL = "https://" + boto3.client('kms').decrypt(
#     CiphertextBlob=b64decode(ENCRYPTED_HOOK_URL),
#     EncryptionContext={'LambdaFunctionName': os.environ['AWS_LAMBDA_FUNCTION_NAME']}
# )['Plaintext'].decode('utf-8')

# 今回はKMSを使用しない
HOOK_URL = os.environ['slackHookUrl']

他は、Blueprintの内容をコピペです。

CDK

CDKについてです。

lib/cdk-cwlogs-to-slack-stack.ts

const fn = new lambda.Function(this, "lambda-function", {
      runtime: lambda.Runtime.PYTHON_3_8,
      code: lambda.Code.fromAsset('lambda'),
      handler: 'index.lambda_handler',
      environment: {
        "slackHookUrl": slackHookUrl,
        "slackChannel": slackChannel
      }
    })

Lambdaの関数を作成しています。
コードは、lambdaフォルダ配下にあるためfromAssetで指定して取得しています。

ローカルから上げる際は、zip圧縮したりする必要があります。
CDKではファイルをおいておくだけで、よしなにやってくて楽です。

new logs.SubscriptionFilter(this, "subscription", {
      logGroup: logGroup,
      destination: new logsDestinations.LambdaDestination(fn),
      filterPattern: filterPattern
    })

最後にサブスクリプションフィルターの設定です。
こちらの設定は、CloudwatchLogs側に行う設定です。
こちらのフィルターを通って、Lambdaにログが送られます。

まとめ

CDKでコード化したため、複数作るときに楽そうです。
記事中では使っていませんが、Lambda Layerを使うと複数関数で同じコードを書かなくてよいので良さそうです。

Blueprintの内容をDocker化して、runするときに環境変数渡すのもいいかもしれません。

Amzonで「AWS」の本を見てみる

楽天で「AWS」の本をみてみる!!

AWSの勉強を始めるならSAAを取得してみるのがおすすめな理由こんにちは、ちゃりおです。 「AWS使えるようになりたけど、何から始めればよいかわからない」 という方向けの記事です。 AWSソリュ...
cloudwatchagent too many file
CloudWatch Logs Insights でApacheのアクセスログを使ってアクセス数の集計をするこんにちは、ちゃりおです。 Cloudwatch Logs Insights便利ですね。 Apacheのアクセスログを見て、アクセス数...
cdk
CDKの始め方 ワークショップではまらないためにこんにちは、ちゃりおです。 先日、社内向けに「CDKの始め方」をテーマに勉強会を行いました。 本記事では、内容をブログ向けにまとめまし...