kakakakakku blog

Weekly Tech Blog: Keep on Learning!

LocalStack で Lambda の Errors メトリクスを SNS 経由でアラートする

LocalStack を使って AWS Lambda 関数の Errors メトリクスをモニタリングして Amazon CloudWatch Alarm と Amazon SNS でアラートするアーキテクチャを試してみた❗️LocalStack(無料版)ですべて試せる〜 \( 'ω')/

アーキテクチャ図

Webhook.site

今回は Amazon SNS からアラートを受け取るお手軽な環境として Webhook.site を使う.検証用途などに使える一時的な Webhook URL を発行できて,Amazon SNS の HTTPS エンドポイントとしてサブスクライブできる👌ウェブサイトにアクセスして Your unique URL に表示されている URL をコピーしておく.

webhook.site

デプロイ

まずは AWS SAM (AWS CloudFormation) で LocalStack 上に検証環境をデプロイする.

AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::Serverless-2016-10-31

Parameters:
  WEBHOOK:
    Type: String
    AllowedPattern: https://webhook.site/.*

Resources:
  Function:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: sandbox
      CodeUri: ./src
      Handler: app.lambda_handler
      Runtime: python3.12
      Architectures:
        - x86_64
  Alarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmName: function-errors
      MetricName: Errors
      Namespace: AWS/Lambda
      ComparisonOperator: GreaterThanOrEqualToThreshold
      EvaluationPeriods: 1
      Period: 60
      Statistic: Sum
      Threshold: 1
      AlarmActions:
        - !Ref Topic
      Dimensions:
        - Name: FunctionName
          Value: !Ref Function
  Topic:
    Type: AWS::SNS::Topic
    Properties:
      DisplayName: alerts
      Subscription:
        - Protocol: https
          Endpoint: !Ref WEBHOOK

そして samlocal コマンドを使ってデプロイする.なお,デプロイ時の WEBHOOK パラメータには取得した Webhook.site の URL を設定しておく.

$ samlocal build
$ samlocal deploy --parameter-overrides WEBHOOK=https://webhook.site/64e8d8c6-3fa2-4d68-a2a2-a87409553fff

すると Webhook.site に SubscriptionConfirmation の通知が届くので,SubscribeURL にアクセスしてサブスクライブを承認しておく❗️これで準備 OK〜

SubscriptionConfirmation の通知が届いた

AWS Lambda 関数を実行する

今回はサンプルとして必ずエラーになる AWS Lambda 関数 (Python) をデプロイした💡

def lambda_handler(event, context):
    raise Exception('Always an error!')

さっそく awslocal コマンドを使って AWS Lambda 関数を実行する.

$ awslocal lambda invoke --function-name sandbox outputs.json
{
    "StatusCode": 200,
    "FunctionError": "Unhandled",
    "ExecutedVersion": "$LATEST"
}

すると Webhook.site にアラートが届いた👌

Webhook.site にアラートが届いた

LocalStack Resource Browser

LocalStack Resource Browser で Amazon CloudWatch の Alarms を開くと,期待通りに AWS Lambda 関数 sandbox の Errors メトリクスが 1 になっていた❗️

Errors メトリクス

お掃除

念のため Webhook.site の More メニューで Delete URL を実行しておくと安心かなと思う👌