Notifier quotidiennement Slack des factures AWS avec Lambda pour Ruby

Quand j'ai cherché sur Google les cas précédents, il y avait beaucoup d'exemples de Python, donc le mémo de réglage minimum quand je l'ai fait à la main avec [Ruby] doc.

1. Créez AWS Lambda avec Ruby d'exécution

Créer avec un clic de bouton depuis l'écran de la console Lambda sur le Web

--Runtime avec Ruby 2.7

2. Écrivez le processus d'acquisition dans Ruby

lambda_functions.rb


require 'aws-sdk'
require 'net/http'
require 'uri'
require 'json'

#Point d'entrée Lambda
def lambda_handler(event:, context:)
  fetch_cost
    .then { |response| pretty_response(response) }
    .then { |message| notify_slack(message) }

  #Renvoyer comme réponse HTTP
  { statusCode: 200, body: 'ok' }
end

#Obtenir des informations de facturation
def fetch_cost(time = Time.now)
  #Je n'ai pas besoin d'informations d'identification car je me suis déjà authentifié(Voir ci-dessous)
  client = Aws::CostExplorer::Client.new(region: 'us-east-1')

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

#Formater la valeur de retour de l'API
def pretty_response(res)
  #réduction. De manière appropriée
end

#Publier sur Slack
def notify_slack(message)
  #Webhook entrant Définissez l'URL définie dans la variable d'environnement
  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

Cliquez ici pour la source complète (gist). Ce que vous faites est presque la même chose que [processus d'acquisition de cas précédents Develpers.IO en Python] [méthode de classe].

Si vous voulez changer ce que vous voulez voir, vous pouvez changer [ce que vous passez à ʻAws :: CostExplorer :: Client # get_cost_and_usage] [api_doc] ou changer pretty_response`.

3. Définissez l'heure de démarrage dans CloudWatch Events

  1. "Ajouter un déclencheur" sur l'écran de réglage de la fonction Lambda
  2. Sélectionnez "Event Bridge (CloudWatch Events)"
  3. Peut être défini de la même manière que cron (Référence: [AWS_Cron expression wildcard] cron)

J'étais accro à la certification IAM

Je ne savais pas où obtenir l'authentification IAM lors de l'exécution de la fonction Lambda, mais si vous utilisez le gem aws-sdk, vous pouvez le faire sans rien faire. La raison en est la suivante.

Au début, je ne le savais pas, donc c'était inutile car j'ai créé un IAM séparément du rôle d'exécution et utilisé cette clé d'accès et ce chemin.

Page Web référencée

Recommended Posts

Notifier quotidiennement Slack des factures AWS avec Lambda pour Ruby
Informez régulièrement Slack des articles stockés dans Qiita avec AWS Lambda + DynamoDB + CloudWatch
Obtenir la taille de l'objet S3 avec AWS SDK pour Ruby
Créez AWS Lambda avec Quarkus
Essayez d'exécuter SlackBot réalisé avec Ruby x Sinatra sur AWS Lambda
Créer un programme périodique avec Ruby x AWS Lambda x CloudWatch Events
Découvrez AWS gratuitement avec LocalStack
Impressions de faire Black Jack-cli avec Ruby
Obtenir une liste de fichiers S3 avec ListObjectsV2Request (AWS SDK for Java)
J'ai essayé de visualiser l'accès de Lambda → Athena avec AWS X-Ray
Premiers pas avec Ruby pour les ingénieurs Java
AWS Lambda (Lambda) Partie 1 avec Java pour démarrer maintenant
Extraire une partie d'une chaîne en Ruby
Explication de Ruby sur rails pour les débutants ①
Envoyez des notifications à Slack avec la version gratuite de sentry (en utilisant lambda)