Clouldwatch клиент модуля boto3 - PullRequest
0 голосов
/ 12 марта 2020
import boto3
from datetime import timedelta
from datetime import datetime

def lambda_handler(event, context):
    # TODO implement
    region = 'us-east-1'
    cwWindow = 60
    cloudwatch = boto3.client('cloudwatch', region_name='us-east-1')

# List metrics through the pagination interface
    response = cloudwatch.get_metric_statistics(
    Namespace='AWS/EC2',
    MetricName='CPUUtilization',
    Dimensions=[
        {
            'Name': 'InstanceId',
            'Value': 'i-09deabee19c5fc46d'
        },
    ],
    StartTime=datetime.utcnow() - timedelta(minutes = 60),
    EndTime=datetime.utcnow(),
    Period=300,
    Statistics=['Average', 'Maximum'],
    Unit='Percent'
)

    return response

мы написали функцию для получения метрики CPUUtilization c моего экземпляра ec2, но я получаю ошибку ниже "datetime.datetime (2020, 3, 11, 12, 3, tzinfo = tzlocal ()) is not JSON serializable ":

Response
{
    "errorType": "TypeError",
    "errorMessage": "datetime.datetime(2020, 3, 11, 12, 3, tzinfo=tzlocal()) is not JSON serializable",
    "stackTrace": [
        "  File \"/var/lang/lib/python3.6/json/__init__.py\", line 238, in dumps\n    **kw).encode(obj)\n",
        "  File \"/var/lang/lib/python3.6/json/encoder.py\", line 199, in encode\n    chunks = self.iterencode(o, _one_shot=True)\n",
        "  File \"/var/lang/lib/python3.6/json/encoder.py\", line 257, in iterencode\n    return _iterencode(o, 0)\n",
        "  File \"/var/runtime/awslambda/bootstrap.py\", line 149, in decimal_serializer\n    raise TypeError(repr(o) + \" is not JSON serializable\")\n"
    ]
}

Function Logs
An error occurred during JSON serialization of response: datetime.datetime(2020, 3, 11, 12, 3, tzinfo=tzlocal()) is not JSON serializable
Traceback (most recent call last):
  File "/var/lang/lib/python3.6/json/__init__.py", line 238, in dumps
    **kw).encode(obj)
  File "/var/lang/lib/python3.6/json/encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/var/lang/lib/python3.6/json/encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "/var/runtime/awslambda/bootstrap.py", line 149, in decimal_serializer
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: datetime.datetime(2020, 3, 11, 12, 3, tzinfo=tzlocal()) is not JSON serializable

Request ID
057aa5a4-74f6-1881-a024-74f6c2134125

Мы используем тот же формат, который указан в документации по boto3, но все еще получаем ошибку. Если у кого-то есть опыт работы в облаке, клиент из boto3. Нужна помощь.

Ответы [ 2 ]

0 голосов
/ 13 марта 2020

Проблема не в вашем бото-коде, а в том, что вы возвращаете ответ от лямбды. Ответ не сериализуем.

Зачем вам лямбда, чтобы вернуть ответ? Пусть лямбда сделает то, что ей нужно, и вернет «ОК» или что-то в этом роде.

0 голосов
/ 12 марта 2020

Ваш фрагмент работает. Я просто изменил его на свой идентификатор экземпляра. Пример вывода ниже.

{
   "Label":"CPUUtilization",
   "Datapoints":[
      {
         "Timestamp":datetime.datetime(2020,
         3,
         12,
         6,
         2,
         "tzinfo=tzutc())",
         "Average":0.06612021857923481,
         "Maximum":0.166666666666666,
         "Unit":"Percent"
      },
      {
         "Timestamp":datetime.datetime(2020,
         3,
         12,
         5,
         32,
         "tzinfo=tzutc())",
         "Average":0.112052730696798,
         "Maximum":0.169491525423728,
         "Unit":"Percent"
      },
      {
         "Timestamp":datetime.datetime(2020,
         3,
         12,
         6,
         7,
         "tzinfo=tzutc())",
         "Average":0.0672316384180794,
         "Maximum":0.169491525423731,
         "Unit":"Percent"
      },
      {
         "Timestamp":datetime.datetime(2020,
         3,
         12,
         5,
         37,
         "tzinfo=tzutc())",
         "Average":0.06668519033064779,
         "Maximum":0.169491525423728,
         "Unit":"Percent"
      },
      {
         "Timestamp":datetime.datetime(2020,
         3,
         12,
         6,
         12,
         "tzinfo=tzutc())",
         "Average":0.06559139784946219,
         "Maximum":0.166666666666666,
         "Unit":"Percent"
      },
      {
         "Timestamp":datetime.datetime(2020,
         3,
         12,
         5,
         42,
         "tzinfo=tzutc())",
         "Average":0.06612021857923481,
         "Maximum":0.166666666666666,
         "Unit":"Percent"
      },
      {
         "Timestamp":datetime.datetime(2020,
         3,
         12,
         5,
         47,
         "tzinfo=tzutc())",
         "Average":0.09890710382513698,
         "Maximum":0.166666666666666,
         "Unit":"Percent"
      },
      {
         "Timestamp":datetime.datetime(2020,
         3,
         12,
         5,
         52,
         "tzinfo=tzutc())",
         "Average":0.0344827586206896,
         "Maximum":0.172413793103448,
         "Unit":"Percent"
      },
      {
         "Timestamp":datetime.datetime(2020,
         3,
         12,
         5,
         57,
         "tzinfo=tzutc())",
         "Average":0.1328054089098826,
         "Maximum":0.169491525423728,
         "Unit":"Percent"
      }
   ],
   "ResponseMetadata":{
      "RequestId":"f69967e9-be32-49eb-8442-f06000e7e842",
      "HTTPStatusCode":200,
      "HTTPHeaders":{
         "x-amzn-requestid":"f69967e9-be32-49eb-8442-f06000e7e842",
         "content-type":"text/xml",
         "content-length":"2185",
         "vary":"accept-encoding",
         "date":"Thu, 12 Mar 2020 06:19:39 GMT"
      },
      "RetryAttempts":0
   }
}

Мой код:

import boto3
from datetime import timedelta
from datetime import datetime

dev = boto3.session.Session(profile_name='la')

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


response = cloudwatch.get_metric_statistics(
    Namespace='AWS/EC2',
    MetricName='CPUUtilization',
    Dimensions=[
        {
            'Name': 'InstanceId',
            'Value': 'i-0b2762b6610c73e02'
        },
    ],
    StartTime=datetime.utcnow() - timedelta(minutes = 60),
    EndTime=datetime.utcnow(),
    Period=300,
    Statistics=['Average', 'Maximum'],
    Unit='Percent'
)

print(response)
...