Lambda函数(Python代码),用于AWS中的每日账单警报

时间:2020-10-15 07:00:35

标签: python-3.x amazon-web-services aws-lambda

我在AWS Lambda中使用以下代码来触发SNS,只要它每天超过$ 85,但在AWS Lambda中测试以下代码时遇到错误

错误:

Function logs:
START RequestId: b33a86aaf5e5205 Version: $LATEST
[ERROR] KeyError: '85'
Traceback (most recent call last):
  File "/var/task/lambda_function.py", line 7, in lambda_handler
    limit = int(event['85'])END RequestId: 87876769896-4f33-a104-6b2aaf5e5205

代码:

import json
import boto3
from datetime import datetime, timedelta

def lambda_handler(event, context):

    limit = int(event['85'])
    sns_topic = event['arn:aws:sns:us-east-1:997656776656445:billing-alarm']

    client = boto3.client('cloudwatch', region_name='us-east-1')

    response = client.get_metric_data(
        MetricDataQueries=[
            {
                "Id": "m1",
                "MetricStat": {
                    "Metric": {
                        "Namespace": "AWS/Billing",
                        "MetricName": "EstimatedCharges",
                        "Dimensions": [
                            {
                                "Name": "Currency",
                                "Value": "USD"
                            }
                        ]
                    },
                    "Period": 3600,
                    "Stat": "Maximum",
                    "Unit": "None"
                }
            }
        ],
        StartTime=datetime.now() - timedelta(hours=24),
        EndTime=datetime.now(),
        ScanBy='TimestampAscending'
    )

    spent = 0

    for results in response["MetricDataResults"]:
        values = results["Values"]
        print("Timestamps of the datapoints")
        print(results["Timestamps"])
        print("Values of the datapoints")
        print(values)
        my_deltas = calculate_deltas(values)
        spent = sum(my_deltas)
        print("Deltas")
        print(my_deltas)
        print("Spent on the period")
        print(spent)

        if spent > limit:
            print("The threshold was breached, sending notification")
            sns_client = boto3.client('sns', region_name='us-east-1')
            message_body = {
                'default': {
                    'body': 'Daily spent limit breached',
                    'limit': limit,
                    'spent': spent
                }
            }
            publish_response = sns_client.publish(
                TargetArn=sns_topic,
                Message=json.dumps({'default': json.dumps(message_body)}),
                MessageStructure='json'
            )
            print(publish_response)



    return {
        'statusCode': 200,
        'body': json.dumps({
            'limit': limit,
            'spent': spent,
        })
    }

def calculate_deltas(values):
    deltas = []
    max_position = len(values)
    for i in range(1, max_position):
        if values[i] < values[i-1]:
            deltas.append(values[i])
        else:
            deltas.append(values[i] - values[i-1])
    return deltas

0 个答案:

没有答案