AWS 이달 사용료 일일 알림 slack

15668 단어 AWS

입문


AWS는 AWS의 원가 관계를 관리하고 분석할 수 있는 서비스를 가지고 있는데 이를'CostExplorer'라고 한다.
또한 이 서비스를 통해 현재 AWS 사용료를 확인할 수 있습니다.
개인적으로 많이 해봤기 때문에 이용료를 자주 파악하고 싶은데 확인할 때마다 AWS에 로그인하는 게 귀찮아요.
그래서 저는 매일 slack에 사용료를 통지하기로 했습니다.

하고 싶은 일


Lambda와 EventBridge를 사용하여 월초부터 그날까지의 총 사용료를 매일 0시 slack에 통지합니다

사전 준비

  • 사전 제작 알림 슬랙 채널
  • Incoming Webhook 설정, URL 미리 얻기
    [2020 올해의 판] Slack 알림 Slack App을 사용하는 Incoming Webhooks!설명 방법
  • 해보다


    1. Lambda 함수 만들기


    Lambda 함수를 사용하여 "CostExplorer에서 이달 사용료를 받고 데이터를 slack에 알립니다."를 만듭니다.
    이름과 사용할 언어를 입력하여 Lambda 함수를 만듭니다.

    함수 코드를 편집합니다. 아래와 같습니다.
    from datetime import datetime
    import json
    import os
    import urllib
    
    import boto3
    SLACK_WEBHOOK_URL = "https://hooks.slack.com/services/YYYYYY/XXXXXXXX"      # slackのwebhook url
    SLACK_CHANNEL_NAME = "#notice_aws_cost"     # 通知先のslackチャンネル名
    
    
    def lambda_handler(event, context):
        today = datetime.now()  # UTC時間
    
        # Cost Explorerから今月の使用料を取得
        client = boto3.client('ce')
        response = client.get_cost_and_usage(
            TimePeriod={
                'Start': str(today.strftime('%Y-%m')) + '-01',
                'End': today.strftime('%Y-%m-%d')
            },
            Granularity='MONTHLY',
            Metrics=[
                'AmortizedCost'
            ]
        )
        billing_dollers = response["ResultsByTime"][0]["Total"]["AmortizedCost"]["Amount"]
        msg = f"""{today.strftime("%Y/%m/%d")}時点での今月の合計請求額をお知らせします。
    合計請求額:{billing_dollers} USD"""
        post_slack(msg)
    
    
    def post_slack(msg):
        # メッセージデータを作成
        post_data = {
            "username": "noticeBot",                #ユーザー名
            "icon_emoji": ":money_with_wings:",     #アイコン
            "text": msg,                            #メッセージ(※メンションを付与してる)
            "channel": SLACK_CHANNEL_NAME           #チャンネル
        }
        encode_post_data = ("payload=" + json.dumps(post_data)).encode('utf-8')
        # Request(post)を作成
        request = urllib.request.Request(
            SLACK_WEBHOOK_URL,
            data=encode_post_data,
            method="POST"
        )
        # 送信
        urllib.request.urlopen(request)
    
    다음, 코드 내용 보충 설명
    # Cost Explorerから今月の使用料を取得
    client = boto3.client('ce')
    response = client.get_cost_and_usage(
        TimePeriod={
            'Start': str(today.strftime('%Y-%m')) + '-01',
            'End': today.strftime('%Y-%m-%d')
        },
        Granularity='MONTHLY',
        Metrics=[
            'AmortizedCost'
        ]
    )
    billing_dollers = response["ResultsByTime"][0]["Total"]["AmortizedCost"]["Amount"]
    
    CostExplorer의 GetCost And Usage라는 API를 활용하여 지난 1일부터 오늘까지 총 사용료를 얻었습니다.
    이번에는 월 사용료를 받았고 매일 사용료도 받을 수 있었다.또 서비스의 합계가 아니라 각자의 서비스 이용료 등도 받을 수 있다.
    GetCostAndUsage - AWS Cost Explorer Service
    Serverless를 통해 매일 AWS 비용 계산
    def post_slack(msg):
        # メッセージデータを作成
        post_data = {
            "username": "noticeBot",        #ユーザー名
            "icon_emoji": ":money:",        #アイコン
            "text": msg,                    #メッセージ(※メンションを付与してる)
            "channel": SLACK_CHANNEL_NAME   #チャンネル
        }
        encode_post_data = ("payload=" + json.dumps(send_data)).encode('utf-8')
        # Request(post)を作成
        request = urllib.request.Request(
            SLACK_WEBHOOK_URL,
            data=encode_post_data,
            method="POST"
        )
        # 送信
        urllib.request.urlopen(request)
    
    slack에 메시지를 보내는 함수입니다.SLACK_CHANNEL_NAMESLACK_WEBHOOK_URL 변수에 해당하는 값을 입력하십시오.

    2. IAM Role에 정책 추가


    Lambda를 생성하면 IAM Role도 자동으로 함께 생성됩니다.
    IAM Role은 Cost Explorer의 GetCostAndUsage 사용 권한을 부여하지 않습니다.
    현재 상태에서 람다를 실행하면 오류가 발생하므로 권한을 부여합니다.
    Lambda 액세스 권한 탭을 열고 역할 실행 링크에 액세스

    인라인 정책 추가

    JSON을 설명하고 다음 이름으로 지정합니다.
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "VisualEditor0",
                "Effect": "Allow",
                "Action": "ce:GetCostAndUsage",
                "Resource": "*"
            }
        ]
    }
    

    3. EventBridge 규칙 만들기


    이제 Lambda 함수를 만들어서 사용료를 slack에 알릴 수 있습니다.
    그러나 Lambda는 정기적으로 운행하는 메커니즘이 없기 때문에 매일 0시에 운행할 수 없습니다.
    이를 위해 EventBridge 규칙을 작성합니다.
    간단히 말하면 EventBridge는 어떤 사건이 발생하면 이를 촉발하여 미리 설정된 AWS 자원을 실행하는 서비스이다.
      아마존 이벤트 브릿지
    다음 설정을 통해 이벤트 브리지 규칙 만들기




    이렇게 하면 매일 0시 AWS의 사용료를 slack에 통지할 수 있다.
    주의사항
    cron식에서 지정한 것은 "0**?*"가 아니라 "015**?*"입니다. cron은 도쿄시간(UTC+9)이 아닌 표준시간(UTC+0)에서 실행되기 때문에 장부의 끝을 대조해야 합니다.

    마지막


    사실 이 프로그램은 운행할 때마다 0.01달러를 받는다.
    (CostExplorer의 API를 사용하면 $0.01의 비용이 발생)
    공짜로 비슷한 일을 하고 싶은 사람은 Budgets를 조사해 보세요.

    좋은 웹페이지 즐겨찾기