AWS

[AWS] AWS 사용요금을 매일 문자로 받아보기

Sean 션 2023. 11. 30. 15:00

서비스 아키텍처

 

AWS 소모임에 참가하여 두가지 실습을 진행했는데, 그 중 MonthlyUsageSNS 서비스를 만들어 Budget을 문자로 받아볼 수 있는 서비스가 마음에 들어 디벨롭해봤다.

 

1. MonthlyUsageSNS Lambda Function

import json
import boto3
from datetime import datetime
from dateutil.relativedelta import *

def lambda_handler(event, context):
    client = boto3.client('ce')
    
    today = datetime.today()
    this_month_first_day = datetime(today.year, today.month, 1)
    
    str_today = str(today.strftime('%Y-%m-%d'))
    str_first_day = this_month_first_day.strftime('%Y-%m-%d')
    
    #Cost Expolorer
    result = client.get_cost_and_usage(
        Granularity= 'MONTHLY',
        TimePeriod={
        'Start': str_first_day,
        'End': str_today
        },
        Metrics=[ 'UnblendedCost',] 
    )
    
    #Send Message with Amazon SNS
    sns = boto3.client('sns', region_name='ap-northeast-1')
    cost = float(result['ResultsByTime'][0]['Total']['UnblendedCost']['Amount'])
    cost_round = round(cost, 2)
    str_cost = str(cost_round)
    
    message_content  = "금일 %s 일 기준 이번 달 사용 금액은 %s 달러입니다."%(str_today, str_cost)
    
    #Change phone number 
    sns.publish(PhoneNumber="+821012345678", Message=message_content ) 
    
    return {
        'statusCode': 200,
        'body': json.dumps('Message was sent successfully!')
    }
  • boto3 를 사용하여 AWS 서비스에 접근
    • boto3는 python용 AWS SDK이다.
    • boto를 통해 cost explorer에 접근해 budget 정보를 긁어오고, sns로 문자 발송을 명령한다.
    • AWS SDK가 생소하게 느껴질 수 있지만, 우리가 보통 aws cli 를 사용하는데 이게 AWS SDK를 사용하기 때문에.. 클라우드쪽 좀 만져봤다면 다들 이미 해본거라고 볼 수 있다.
    • 결과적으로 message_content  = "금일 %s 일 기준 이번 달 사용 금액은 %s 달러입니다."%(str_today, str_cost) 라는 메세지를 보내고,
    • sns.publish()를 통해 문자를 보낸다. (이 때 번호를 본인 번호로 설정해야 한다)

 

물론 정상 작동하려면 추가적인 설정이 필요하다.

 

1. Lambda 함수의 IAM 역할에서 두가지 권한을 부여:

  1. "sns:Publish" : sns publish 기능에 대한 권한
  2. "ce:GetCostAndUsage" : cost explorer 에서 cost and usage를 get하는 권한
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "VisualEditor0",
			"Effect": "Allow",
			"Action": [
				"sns:Publish",
				"ce:GetCostAndUsage"
			],
			"Resource": "*"
		}
	]
}

 

 

2. SNS 도쿄 리전에서 문자메세지 샌드박스 대상 전화번호에 내 번호 등록

도쿄 리전인 이유 : 서울에선 아직 해당 기능을 지원하진 않는다 ( 뚫는 방법이 있다곤 하는데 돈이 든다고 한다 )

전화번호 추가시 주의사항:

올바르게 입력한 경우

010-1234-5678 의 번호를 등록하는 경우, +821012345678 으로 등록해야 하는데,

다음과 같이 파싱이 이상하게 되니까 저런다고 +82 010 1234 5678 으로 입력하지 마라

 

설정을 마치고 람다함수 Test를 실행하자. (형식 상관 없이 아무거나 보내서 trigger 시키면 된다.)

다음과 같이 문자가 오는걸 볼 수 있다.

 

근데 내가 직접 함수 호출시켜서 확인할거면 이걸 쓸 이유가 없으니, 스케줄러를 넣어서 주기적으로 실행될 수 있게 해보자.

 

나는 EventBridge의 Scheduler를 사용했다.

 

예시

요런식으로 크론 설정하고 나서 호출하는걸 우리가 만든 람다함수로 등록해주면 된다.

Next 10 trigger dates를 확인하면 내가 잘 설정했는지 확인할 수 있다.

UTC 시간으로 나오니까 잘 생각하고 설정하면 되겠다.

 

짜잔

이런식으로 알림이 온다.

근데 이거 자체로 돈이 쪼끔 나오니까 유의하길 바란다. (얼마 안나옴) 

지금 저 사진에 보면 돈이 꽤 나오는걸 확인할 수 있는데, 저거는 다른 문제니까 무시하길 바란다.

(실제로 저거 덕분에 돈 많이 나오기 전에 문제 해결했다.)