Lambda 함수 기반 aws 지출 모니터링

김정동·2021년 2월 17일
0

실습

목록 보기
11/19


실습 요약

  • SES 설정
  • SES 서비스 실행 권한을 위한 IAM 정책 설정
  • SES 람다 함수 생성
  • SES 람다 코드 작성
  • SES 이벤트 구성
  • SES 클라우드 와치 이벤트 연동
  • SES 트리거 구성

SES란
Simple Email Service이다.
복수의 사용자들에게 이메일을 보내거나 메일 서버 등을 관리할 때 사용된다
이외에도 SNS(Simple Notification Service 문자 알림 서비스),
SQS(Simple Queue Service 수만 건 이상의 람다 함수를 실행 할 때 도와주는 서비스가 있다.


aws의 콘솔에서 ses를 검색하면 나오는 화면이다.

Email addresses 를 누르면
먼저 Verify(증명)을 하라고 나온다

그럼 이렇게 메일이 오는데 url을 클릭하면


이렇게 Verified(증명되었음)으로 바뀐다
이렇게 등록을 했으니 IAM 에서 역할을 생성해야한다.


정책생성, 서비스는 Cost Explorer Service, SES
(Cost Explorer Service는 모든 작업, SES는 메일쓰기 이므로 쓰기를 선택한다.)


리소스영역은 모든 리소스를 선택한다.

태그, 이름, 설명을 넣고 정책 생성!


이후 연결 할 수 있는 역할을 만든다.
lambda 선택


아까 만들었던 정책을 연결 할 수 있다.


태그, 이름, 설명, 이후 생성

역할이 정상적으로 생성된 것을 확인할 수 있다.

이제 람다 함수생성, 이름을 넣고 방금 만든 역할을 선택한다.

// 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) {
    // Data 객체를 생성합니다.
    // 인자를 주지 않으면 오늘 데이터를 가져옵니다.
    var today = new Date();
    // Data 객체를 문자열로 바꾸어줍니다.
    var todayISOString = today.toISOString();
    // 연도, 월, 날짜를 생성자로 주어 new Date(year, month, day)를 통해 Data 객체를 만들 수 있습니다.
    // 오늘 날짜에서 -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 = costResult.ResultsByTime[0].Total.UnblendedCost.Amount;
        console.log("billing amount" + yesterdayBilling);
        var params = {
            Destination: {
                ToAddresses: [event.sender],
            },
            Message: {
                Body: {
                    Text: {
                        Data: "AWS Price: " + yesterdayBilling + "$",
                    },
                },
                Subject: {
                    Data: yesterdayISOString + "AWS Billing",
                },
            },
            Source: event.receiver,
        };
        new AWS.SES().sendEmail(params, function(err, result) {
            if(err) {
                callback(err);
            }
            else {
                callback(null);
            }
        });
    });
};

SES코드를 작성한다.
deploy 를 누르고 테스트 이벤트 구성을 한다.

{
    "sender": "보내는 사람 이메일",
    "receiver": "받는 사람 이메일"
}

(receiver 스펠링에 유의)

처음에는 Rejected가 됐는데
알고보니 코드에는 북부리전이고 메일 인증은 서울로 했기 때문이다.
오류메세지를 보면 us-east-1 에서 확인을 하라고 나온다.
us-east-1로 지역을 옮겨서 이메일을 다시 인증하면

정상적으로 작동된다.

메일도 온다 우왕

profile
개발자 새싹🌱 The only constant is change.

0개의 댓글