카테고리 없음

Lambda함수 기반 지출요금 이메일 알림 서비스

GTC 2021. 2. 17. 11:55

"SES" 서비스를 이용하여 사용자에게 이메일 알림을 보내는 실습을 해보자

"SES" 서비스는 미국 동부(버지니아 북부), 미국 서부(오레곤), EU(아일랜드) 3곳에서만 가능하므로 리전을 세 곳 중에 한곳으로 선택한다 

 

 

SES 대시보드로 와서 좌측에 "Email Addresses" 메뉴를 클릭한다 

수신받을 이메일 주소를 입력하고 "Verify This Email Address"를 클릭한다 

 

 

인증받을 이메일의 수신함에 오면 아래와 같이 AWS에서 이메일 인증 요청을 보내온 것을 확인할 수 있다

링크를 클릭하면 자격증명을 받을 수 있다

 

 

좌측 [정책] 메뉴를 클릭하고 [정책 생성]을 선택한다

 

 

검색창에 "Cost Explorer Service"를 입력하고 클릭한다

작업 탭에서 "모든 Cost Explorer Service 작업"을 체크한다

"SES" 권한도 추가해야하므로 우측 아래의 [권한 추가]를 클릭한다

 

 

검색창에 "SES" 서비스를 입력하고 클릭한다 

 

 

액세스 레벨 메뉴에서 "쓰기"를 체크한다

[▶ 리소스]를 클릭한다

 

 

"모든 리소스"를 체크하고 [다음:태그]를 클릭한다 

 

 

정책 이름을 입력하고(여기서는 policy_for_lambda_biling_email) 설정한 권한들이 제대로 추가되었는지 확인한다

 

 

정책에 연결할 역할을 만들어보자

[역할 만들기]를 클릭한다

 

 

사용 사례 선택에서 "Lambda"를 선택하고 [다음:권한]을 클릭한다

ㅈㅈ

 

 

앞서 만든 "policy_for_lambda_biling_email" 정책을 입력창에 입력하고 선택한다

 

 

역할 이름을 입력하고(여기서는 role_for_lambda_to_biling_email) [역할 만들기]를 클릭한다

 

 

 

역할이 잘 만들어졌는지 확인한다

 

 

Lambda함수 대시보드에 와서 [함수 생성]을 클릭한다

함수 이름을 입력하고 [▼기본 실행 역할 변경]을 클릭한다 

 

 

[기존 역할 사용]을 체크하고 [기존 역할]에 role_for_lambda_to_biling_email"을 선택한다

 

 

함수가 만들어졌으면 함수 대시보드에 들어와서 [테스트 이벤트 구성]을 설정한다

 

 

"sender"(발신자)에는 SES 대시보드에서 인증받은 이메일을 입력하고, "receiver"에는 메일을 수신할 이메일을 입력한다(발신자와 수신자가 같아도 상관없다) 

 

 

테스트 이벤트 구성이 끝났으면 아래의 소스코드를 복사한다

/* AWS SDK 를 가져옵니다.*/
var AWS = require('aws-sdk');
/* 이메일 서비스를 이용하기 위해 SDK의 지역을 버지니아로 설정합니다. */
AWS.config.update({region: 'us-east-1'});


/* Event는 우리가 위에서 입력한 JSON 데이터를 가지고있습니다.*/
/* 함수가 끝날때 오류가 없다면 callback(null) 오류가 있다면 callback("에러 메세지")를 리턴합니다.*/
/* 일반적으로 return과 같은 역활을 합니다. */
exports.handler = function(event, context,callback){

    /* Date 객체를 생성합니다. 인자를 주지 않으면 오늘 데이터를 가져옵니다.*/
    var today = new Date();

    /* Date객체를 문자열로 바꾸어줍니다.*/
    var todayISOString = today.toISOString();

    /* 연도, 월, 날짜를 생성자로주어 new Date(year,month,day)를 통해 Date 객체를 만들 수 있습니다. */
    /* 오늘 날짜에서 -1을 주어 어제 데이터를 가져온 후 문자열로 바꾸어줍니다.*/

    var yesterdayISOString = new Date(today.getFullYear(), today.getMonth(), today.getDate() - 1).toISOString();

    /* 아래 문자열은 2018-12-22T21:42:27.218Z와 같이 날짜정보와 시간정보 그리고 타임존정보도 같이 가져오게됩니다. */
    console.log("firstDayOfMonth:" + todayISOString);
    console.log("firstDayOfNextMonth:" + yesterdayISOString);

    console.log("================= slice string =====================");

    /* 뒤쪽의 필요없는 텍스트를 자르고 YYYY-MM-DD 포맷으로 텍스트를 가져옵니다.*/
    todayISOString = todayISOString.slice(0, 10);
    yesterdayISOString = yesterdayISOString.slice(0, 10);

    console.log("firstDayOfMonth:" + todayISOString);
    console.log("firstDayOfNextMonth:" + yesterdayISOString);


    /* 시작일을 어제로 그리고 끝나는날을 오늘로 설정합니다.*/
    /* End로 설정된 날은 포함되어지지 않습니다. */
    /* 가격정보 기준은 Daily로 설정합니다. */
    var costParams = {
        TimePeriod: {
            Start: yesterdayISOString,
            End: todayISOString,
        },
        Granularity: 'DAILY', Metrics: ['UnblendedCost'],
    };

    /* AWS Cost Explorer를 통해 가격정보를 가져옵니다. */
    new AWS.CostExplorer().getCostAndUsage(costParams, function (err, costResult) {
        if (err) callback(err);

        console.log(JSON.stringify(costResult))
        /*가격정보를 yesterdayBilling 변수로 선언합니다.  */
        /* ResultsByTime은 가격정보를 배열로 가지고있기떄문에 가장 최근데이터인 index 0번 데이터를 가져옵니다. */
        var yesterdayBilling
        try{
          /* 만약 어제의 데이터가 없다면 이부분에서 에러가 발생합니다.*/
          yesterdayBilling = costResult.ResultsByTime[0].Total.UnblendedCost.Amount;
        }catch(e){
          console.log(e)
          console.log("데이터가 존재하지않아 0으로 대체합니다.")
          yesterdayBilling = 0
        }

        var params = {
            Destination: {
                ToAddresses: [event.sender],
            },
            Message: {
                Body: {
                    Text: {
                        Data: "AWS Price: " + yesterdayBilling + "$",
                    },
                },
                Subject: {
                    Data: yesterdayISOString + " AWS Billing",
                },
            },
            Source: event.reciever,
        };

        new AWS.SES().sendEmail(params,function(err,result){
            if(err) callback(err);
            else(callback(null))
        })

    });

};

 

 

복사한 소스코드를 "함수 코드"에 붙여넣는다

좌측 폴더 메뉴에 있는 "index.js" 파일에 작성한다

작성 후 [Deploy]를 반드시 클릭해야 입력 및 수정사항이 적용된다

 

 

[테스트]를 클릭하고 인증받은 이메일 수신함에 가면 요금 알림이 와있을 것이다(어제까지의 요금합계)