Estoy trabajando en un script de Python 3 diseñado para obtener estadísticas de utilización del espacio S3 de AWS CloudFront mediante la biblioteca Boto3.
Empecé con la CLI de AWS y descubrí que podía obtener lo que buscaba con un comando como este:
aws cloudwatch get-metric-statistics --metric-name BucketSizeBytes --namespace AWS/S3 --start-time 2017-03-06T00:00:00Z --end-time 2017-03-07T00:00:00Z --statistics Average --unit Bytes --region us-west-2 --dimensions Name=BucketName,Value=foo-bar Name=StorageType,Value=StandardStorage --period 86400 --output jsonEsto devuelve los datos que esperaría. Ahora me gustaría hacer lo mismo en Python 3/Boto3. Mi código hasta ahora es:
from datetime import datetime, timedelta import boto3 seconds_in_one_day = 86400 # used for granularity cloudwatch = boto3.client('cloudwatch') response = cloudwatch.get_metric_statistics( Namespace='AWS/S3', Dimensions=[ { 'Name': 'BucketName', 'Value': 'foo-bar' }, { 'Name': 'StorageType', 'Value': 'StandardStorage' } ], MetricName='BucketSizeBytes', StartTime=datetime.now() - timedelta(days=7), EndTime=datetime.now(), Period=seconds_in_one_day, Statistics=[ 'Average' ], Unit='Bytes' ) print(response)Cuando ejecuto esto, obtengo una respuesta válida pero no hay puntos de datos (es una matriz vacía). Parecen ser idénticos, excepto que el método de Python no parece tener un lugar para la región, donde la línea de comando lo requiere.
Una cosa más que probé: mi código está calculando las fechas de la última fecha en comparación con la línea de comando donde están codificadas. Intenté codificar la fecha para ver si recuperaba los datos y el resultado fue el mismo.
Entonces mis preguntas son estas:
¿El método que estoy usando en Boto/Python es equivalente a la línea de comandos? Suponiendo que lo sean, ¿qué me podría estar perdiendo?
Aquí hay un muy buen ejemplo para obtener datos de cloudwatch en python usando boto3. Tuve que pasar algunas horas para que funcionara, pero debería ser fácil de referir ahora.
def get_req_count(region, lb_name): client = boto3.client('cloudwatch', region_name=region) count = 0 response = client.get_metric_statistics( Namespace="AWS/ApplicationELB", MetricName="RequestCount", Dimensions=[ { "Name": "LoadBalancer", "Value": lb_name }, ], StartTime=str_yesterday, EndTime=str_today, Period=86460, Statistics=[ "Sum", ] ) #print(response2) for r in response['Datapoints']: count = (r['Sum']) return countEsto es lo que he hecho:
client = boto3.client(service_name='cloudwatch', region_name='us-east-1') response = client.get_metric_statistics( Namespace = 'AWS/EC2', Period = 300, StartTime = datetime.utcnow() - timedelta(seconds = 600), EndTime = datetime.utcnow(), MetricName = metricVar, Statistics=['Average'], Unit='Percent', Dimensions = [ {'Name': 'InstanceId', 'Value': asgName} ])No veo nada obviamente malo en su código, por lo que la región parece ser el principal sospechoso aquí.
Puede configurarlo al crear el cliente con:
cloudwatch = boto3.client('cloudwatch', region_name='us-west-2') Si esto no está configurado, boto intentará obtener la región de la variable de AWS_DEFAULT_REGION primero y luego el archivo de configuración ~/.aws/config . Intente verificarlos para ver cuál es el conjunto de regiones predeterminado.