Доступ только для чтения AWS CLI к строго метрикам выставления счетов CloudWatch

Мне нужно предоставить кому-то ТОЛЬКО доступ через интерфейс командной строки AWS для чтения к нашим метрикам выставления счетов CloudWatch. Я не знаю, как это сделать, поскольку у CloudWatch нет конкретных ресурсов, доступ к которым можно контролировать. Это означает, что в политике IAM нет ARN, которые можно указать, и в результате любое обозначение ресурса в политике равно «*». Дополнительную информацию об ограничениях CloudWatch ARN можно найти здесь. Я изучил использование пространства имен, но я считаю, что пространство имен "aws-portal" предназначено для консоли. Любое направление или идеи приветствуются.

С текущими ограничениями CloudWatch ARN политика IAM будет выглядеть примерно так.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "cloudwatch:DescribeMetricData",
        "cloudwatch:GetMetricData"
      ],
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}

person displayname    schedule 17.07.2018    source источник


Ответы (1)


Как вы говорите, вы не сможете добиться этого в CloudWatch. Согласно документам:

У CloudWatch нет никаких конкретных ресурсов, к которым вы могли бы управлять доступом... Например, вы не можете предоставить пользователю доступ к данным CloudWatch только для определенного набора инстансов EC2 или определенного балансировщика нагрузки. Разрешения, предоставляемые с помощью IAM, распространяются на все облачные ресурсы, которые вы используете или отслеживаете с помощью CloudWatch.

Альтернативным вариантом может быть:

  1. Используйте запланированные события в лямбда-функции, чтобы периодически экспортировать соответствующие метрики выставления счетов из Cloudwatch в корзину S3. Например, при использовании Python SDK лямбда-выражение может выглядеть примерно так:

    import boto3
    from datetime import datetime, timedelta
    def lambda_handler(event, context):
        try:
            bucket_name = "so-billing-metrics"
            filename = '-'.join(['billing', datetime.now().strftime("%Y-%m-%d-%H")])
            region_name = "us-east-1"
            dimensions = {'Name': 'Currency', 'Value':'USD'}
            metric_name = 'EstimatedCharges'
            namespace = 'AWS/Billing'
            start_time = datetime.now() - timedelta(hours = 1)
            end_time = datetime.now()
    
            # Create CloudWatch client
            cloudwatch = boto3.client('cloudwatch', region_name=region_name)  
    
            # Get billing metrics for the last hour
            metrics = cloudwatch.get_metric_statistics(
                Dimensions=[dimensions], 
                MetricName=metric_name, 
                Namespace=namespace,
                StartTime=start_time,
                EndTime=end_time,
                Period=60,
                Statistics=['Sum'])
    
            # Save data to temp file
            with open('/tmp/billingmetrics', 'wb') as f:
                # Write header and data
                f.write("Timestamp, Cost")
                for entry in metrics['Datapoints']:
                    f.write(",".join([entry['Timestamp'].strftime('%Y-%m-%d %H:%M:%S'), str(entry['Sum']), entry['Unit']]))
    
            # Upload temp file to S3
            s3 = boto3.client('s3')
            with open('/tmp/billingmetrics', 'rb') as data:
                s3.upload_fileobj(data, bucket_name, filename)
    
        except Exception as e:
            print str(e)
            return 0
        return 1
    

    Примечание. Вам необходимо убедиться, что у функции Lambda есть соответствующие разрешения на запись в S3 и чтение из cloudwatch.

  2. Ограничьте пользователя/роль IAM доступом только для чтения к корзине S3.

person moebius    schedule 09.08.2018