각 서비스에 대한 AWS 요금 청구 및 Slack(Python) 알림

8056 단어 AWSPython

왜 썼어요?

  • AWS에 대한 비용 통지에 많은 사람들이 기사를 썼다
  • 서비스당 비용을 받는 파이톤 스크립트가 좋은 느낌으로 복사되지 못함
  • 그렇게 노력하는 코드가 아니기 때문에 복제에 완전히 사용
  • 컨디션

    $ python -V
    Python 3.6.5 # >=3.4 であれば動くはず
    $ pip install requests boto3
    

    코드

    import os, json
    from datetime import datetime, timedelta
    
    import requests, boto3
    
    SLACK_ENDPOINT = "your-incoming-webhook-url"
    # Please add services you want to know metrics.
    SERVICES = ["AmazonEC2", "AmazonRoute53", "AmazonS3", "AWSLambda", "All"]
    
    def notify_invoice():
        # Prepare to get metrics
        client = boto3.client("cloudwatch", region_name="us-east-1")
    
        seconds_in_1day = 86400
        fields = []
        today = datetime.today()
        yesterday = today - timedelta(days=1)
    
        for service in SERVICES:
            # Setup dimensions
            dimensions = [{"Name": "Currency", "Value": "USD"}] 
            if service != "All":
                dimensions.append({"Name": "ServiceName", "Value": service})
    
            # Get metrics
            res = client.get_metric_statistics(
                Namespace="AWS/Billing",
                MetricName="EstimatedCharges",
                Dimensions=dimensions,
                StartTime=yesterday,
                EndTime=today,
                Period=seconds_in_1day,
                Statistics=["Average"]
            )
    
            # Continue if response wouldn't have data
            if len(res["Datapoints"]) == 0:
                continue
    
            # Append result to fields list
            invoice = res["Datapoints"][0].get("Average", "")
            field = {"title": service, "value": "{} USD".format(invoice)}
            fields.append(field)
    
        # Prepare to send the message 
        payload = {
            "text": "Your invoice untill yesterday",
            "username": "Invoice Notificater",
            "icon_emoji": ":moneybag:",
            "attachments": [{"fields": fields}]
        }
    
        # Send message
        requests.post(SLACK_ENDPOINT, data=json.dumps(payload))
    
    
    if __name__ == "__main__":
        notify_invoice()
    

    결실



    감상

  • 누가 봐도 30분 만에 쓴 코드인데 쓰는 게 아니라 그냥 이렇게 하면 돼
  • 좋은 웹페이지 즐겨찾기