4

我只需要向某人提供对我们的 CloudWatch 计费指标的只读 AWS CLI 访问权限。我不确定如何执行此操作,因为 CloudWatch 没有任何可以控制访问的特定资源。这意味着在 IAM 策略中没有要指定的 ARN,因此,策略中的任何资源指定都是“*”。可以在此处找到有关 CloudWatch ARN 限制的更多信息。我研究过使用命名空间,但我相信“aws-portal”命名空间是用于控制台的。非常感谢任何方向或想法。

在当前 CloudWatch ARN 限制的情况下,IAM 策略看起来像这样。

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

1 回答 1

1

正如您所说,您将无法在 CloudWatch 中实现这一点。根据文档

CloudWatch 没有任何特定资源可供您控制对...的访问... 例如,您不能仅授予用户对特定 EC2 实例集或特定负载均衡器的 CloudWatch 数据的访问权限。使用 IAM 授予的权限涵盖您使用或通过 CloudWatch 监控的所有云资源。

另一种选择可能是:

  1. 使用lambda 函数上的计划事件定期将相关计费指标从 Cloudwatch 导出到 S3 存储桶。例如,使用 Python SDK,lambda 可能看起来像这样:

    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 存储桶的只读访问。

于 2018-08-09T03:32:59.897 回答