4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

AWSの請求を日次でLambda for RubyでSlackに通知する

Last updated at Posted at 2020-08-26

先行事例をググると Python の例が多かったので、Ruby で手でポチポチやったときの最低限の設定メモ。

1. AWS Lambda をランタイム Ruby で作成

WebのLambdaコンソール画面からボタンポチポチで作成

2. Rubyで取得処理を書く

lambda_functions.rb
require 'aws-sdk'
require 'net/http'
require 'uri'
require 'json'

# Lambdaのエントリーポイント
def lambda_handler(event:, context:)
  fetch_cost
    .then { |response| pretty_response(response) }
    .then { |message| notify_slack(message) }

  # 一応HTTPレスポンスとして返す
  { statusCode: 200, body: 'ok' }
end

# 請求情報の取得
def fetch_cost(time = Time.now)
  # 認証は既にすんでるのでcredentialsいらない(後述)
  client = Aws::CostExplorer::Client.new(region: 'us-east-1')

  client.get_cost_and_usage(
    time_period: {
      start: Date.new(time.year, time.month, 1).strftime('%F'),
      end: Date.new(time.year, time.month, -1).strftime('%F'),
    },
    granularity: 'MONTHLY',
    metrics: ['AmortizedCost'],
    group_by: [ { type: "DIMENSION",key: 'SERVICE' }]
  )
end

# APIの返り値の整形
def pretty_response(res)
  # 省略。適当に
end

# Slackに投稿
def notify_slack(message)
  # incoming Webhook設定したURLを環境変数にセット
  uri = URI.parse(ENV['SLACK'])
  params = { text: message }
  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true
  res = http.start do
    request = Net::HTTP::Post.new(uri.path)
    request.set_form_data(payload: params.to_json)
    http.request(request)
  end

  unless res.is_a? Net::HTTPSuccess
    raise 'Failed POST Slack'
  end

  res
end

省略なしの全ソース(gist)はこちら。やってることはDevelpers.IOの先行事例のPythonでの取得処理とだいたい同じです。

見たいものを変えたい場合は Aws::CostExplorer::Client#get_cost_and_usage に渡すものを変えたり、 pretty_response をよしなにすればいいです。

3. CloudWatch Events で起動時間を設定

  1. Lambdaの関数設定画面の「トリガーを追加」
  2. 「EventBridge(CloudWatch Events)」を選択
  3. cron と同じように設定できる(参考: AWS_Cron式のワイルドカード)

IAM認証でハマったとこ

Lambda関数実行時のIAM認証をどこから取るのかわからなかったが、 aws-sdk gem 使ってるなら何もしなくても取り終えてる。理由は以下。

最初これがわからなくて実行用のロールと別にIAMを作ってそのアクセスキーとパスを使ってたので無駄だった。

参考にしたウェブページ

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?