[RUBY] Benachrichtigen Sie Slack regelmäßig über Artikel, die in Qiita mit AWS Lambda + DynamoDB + CloudWatch vorrätig sind

Überblick

Was zu verwenden

Bedienung Verwenden
AWS Lambda Zum Abrufen von Artikeln aus der Qiita-API und zum Benachrichtigen von Slack
Amazon DynamoDB Da der von der Qiita-API erhaltene Artikel keine Informationen zum "Lagerbestand" enthält, werden die Benachrichtigungsinformationen dupliziert. Um dies zu verhindern, bewahren Sie die zuvor gemeldeten Informationen auf
Amazon CloudWatch Zur regelmäßigen Ausführung von Lambda
AWS SAM (Serverless Application Model) Zum Bereitstellen lokal erstellter Anwendungen für jeden Dienst
Qiita API Zum Erfassen von vorrätigen Informationen

Überblick

↑ ist wie folgt zusammengefasst. Slack App (1).png

Agenda

[0. Vorbereitung](# 0-Vorbereitung) [1. Vorlage erstellen](# 1 - Vorlage erstellen) [2. Bereitstellen mit SAM](# 2-Bereitstellen mit sam) [3. Notify Slack](# 3-Notify Slack) [4. Benachrichtigung über Bestandsinformationen mithilfe der Qiita-API benachrichtigen](Benachrichtigung über Bestandsinformationen mithilfe von # 4-qiita-api benachrichtigen) [5. Benachrichtigungsverlauf mit DynamoDB verwalten](# 5-Benachrichtigungsverlauf mit Dynamodb verwalten) [6. CloudWatch kann Lambda jederzeit regelmäßig ausführen](# 6 - Cloudwatch kann Lambda jederzeit ausführen)

0. Vorbereitung vorbereiten

AWS

Wenn Folgendes nicht erstellt oder installiert wurde, führen Sie es entsprechend aus.

--Erstellen Sie ein AWS-Konto

Slack

Installieren Sie die Webhook-App auf dem Kanal, über den Sie benachrichtigt werden möchten, und überprüfen Sie den Vorgang. Referenz: URL-Erfassungsverfahren für Slack Webhook - Qiita

Implementierung

1. Erstellen Sie eine Vorlage

Erstellen Sie eine Vorlage mit dem Befehl sam.

$ sam init -n qiita-stocks-notifier -r ruby2.5
Möglichkeit Erläuterung
-n, --name TEXT initDer Name des vom Befehl erstellten Projekts.
-r, --runtime Angabe der Laufzeit. DiesmalrubyIch habe es gemacht.

Referenz: sam init --AWS Serverless Application Model )

Ich habe die Standardeinstellung für die in der Konsole gestellten Fragen gewählt. Nach Abschluss des Befehls wird unter dem Verzeichnis eine Vorlage mit der folgenden Struktur erstellt.

$ tree
.
├── Gemfile
├── README.md
├── events
│   └── event.json
├── hello_world
│   ├── Gemfile
│   └── app.rb
├── template.yaml
└── tests
    └── unit
        └── test_handler.rb

Der Inhalt von ** hello_world / app.rb ** gibt nur eine Nachricht aus.

2. Bereitstellen mit SAM

Nachdem die Vorlage erstellt wurde, können Sie sie auf Lambda bereitstellen. Referenz: [Lernprogramm: Bereitstellen des Serverless-Anwendungsmodells von Hello World Applications-AWS](https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-getting-started-hello- world.html)

$ sam build
$ sam deploy --guided
#Ich werde die Frage beantworten.

Wenn die Bereitstellung normal abgeschlossen ist, wird die Zeichenfolge an die Konsole ausgegeben und Sie können bestätigen, dass sie fließt.

 {"message": "hello world"}

Stellen Sie sicher, dass die bereitgestellte Anwendung im Verwaltungsbildschirm von Lambda angezeigt wird. ダウンロード (2).png

3. Benachrichtigen Sie Slack

Füge slack-notifier zu ** hello_world / Gemfile ** und ** bundle install ** hinzu. stevenosloan/slack-notifier: A simple wrapper for posting to slack channels

gem "slack-notifier"
$ bundle

Initialisieren Sie "app.rb", indem Sie die Hooks-URL wie unten gezeigt an "slack-notifier" übergeben, und versuchen Sie, den Testtext zu senden.

app.rb


require "json"
require "slack-notifier"

def lambda_handler(event:, context:)
  notifier = Slack::Notifier.new "https://hooks.slack.com/services/**/**" do
    defaults channel: "#qiita-slacks-notification"
  end
  notifier.ping "yeah"
end

3.1 Bereitstellen und Überprüfen des Betriebs

Erstellen und implementieren Sie die Änderung nach Abschluss der Änderung, um den Vorgang zu überprüfen.

$ sam build
$ sam deploy

Wählen Sie im Lambda-Verwaltungsbildschirm "Testereignis auswählen" -> "Testereignis festlegen". スクリーンショット 2020-06-07 5.37.06.png

Es wird ein Bildschirm angezeigt, in dem Parameter für die erstellte Anwendung ausgewählt werden. Dieses Mal ändert sich das Verhalten jedoch nicht in Abhängigkeit von den Parametern Übernehmen Sie die Standardeinstellung. スクリーンショット 2020-06-07 5.38.52.png

Wählen Sie nach Abschluss des "Set Test Event" "Test" und bestätigen Sie, dass die Nachricht an Slack gesendet wurde. スクリーンショット 2020-06-07 1.02.08.png

Jetzt können Sie die Kommunikation von ** Lambda ** zu Slack bestätigen.

4. Benachrichtigen Sie Slack über Bestandsinformationen mithilfe der Qiita-API

Holen Sie sich als Nächstes den Bestand des Benutzers von der Qiita-API und benachrichtigen Sie ihn.

4.1 API-Dokumentation überprüfen

Hier ist die API, um die Artikel vom Benutzer zu lagern. Qiita API v2 Dokumentation-Qiita: Entwickler

Fügen Sie ** Faraday ** gem ein, um die Interaktion mit externen APIs zu vereinfachen. Referenz: lostisland / faraday: Einfache, aber flexible HTTP-Clientbibliothek mit Unterstützung für mehrere Backends.

gem "faraday"
$ bundle

4.2 Implementierung des Benachrichtigungsteils

Der Umriss des Implementierungsteils lautet wie folgt.

app.rb


require 'json'
require 'faraday'
require 'slack-notifier'

USER_ID = "{Meine Benutzer-ID}".freeze

def lambda_handler(event:, context:)
  #Bestandsinformationen von API abrufen
  response = Faraday.get("https://qiita/api/v2/user/#{USER_ID}/stocks", page: 1, per_page: 10)

  #Organisieren Sie Titel und URLs in einem Array
  messages = JSON.parse(response.body).each_with_object([]) do |res, ary|
    ary << [res["title"], res["url"]]
  end

  notifier = Slack::Notifier.new "https://hooks.slack.com/services/**/**" do
    defaults channel: "#qiita-slacks-notification"
  end

  notifier.ping "Ich werde den Artikel veröffentlichen, der letzte Woche bei Qiita gelagert wurde"
  messages.each do |message|
    notifier.ping message[0]
    notifier.ping message[1]
    notifier.ping "- - - - - - - - - - - - - - - - - - - - "
  end
end

Versuchen Sie nach Abschluss des Fixes, "sam local invoke" zu verwenden, mit dem Sie Ihre App lokal testen können.

sam local invoke --no-event
Möglichkeit Erläuterung
--no-event Rufen Sie die Funktion mit einem leeren Ereignis auf. Verwenden Sie eine andere Option, wenn Sie Parameter zur Überprüfung übergeben möchten.

Referenz: [sam local invoke --AWS Serverless Application Model](https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-local- invoke.html)

Sie können bestätigen, dass die Bestandsinformationen an Slack gesendet wurden, indem Sie den Befehl ausführen.

スクリーンショット 2020-06-07 2.08.04.png

5. Verwalten Sie den Benachrichtigungsverlauf mit DynamoDB

Der Benachrichtigungsteil wurde abgeschlossen, aber wenn er unverändert bleibt, können jedes Mal dieselben Informationen fließen. Daher möchte ich die Benachrichtigung über Artikel verhindern, die einmal benachrichtigt wurden. Verwenden Sie ** DynamoDB **, um Benachrichtigungsinformationen zu registrieren und die Benachrichtigung über Informationen in der Datenbank zu verhindern.

Verwenden Sie ** aws-record ** gem, um Daten mit DynamoDB auszutauschen. aws/aws-sdk-ruby-record: Official repository for the aws-record gem, an abstraction for Amazon DynamoDB.

5.1 Implementierung

template.yml

AWSTemplateFormatVersion: '2010-09-09'
...
Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      CodeUri: hello_world/
      Handler: app.lambda_handler
      Runtime: ruby2.5
      Policies:
+     #In DynamoDB erstellen/Read/Update/Erteilen Sie die Berechtigung zum Löschen
+     - DynamoDBCrudPolicy:
+         TableName: !Ref NotifiedMessageDDBTable
+     #Umgebungsvariable
+     Environment:
+       Variables:
+         DDB_TABLE: !Ref NotifiedMessageDDBTable
      Events:
        HelloWorld:
          Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
          Properties:
            Path: /hello
            Method: get
+ NotifiedMessageDDBTable:
+   Type: AWS::Serverless::SimpleTable
...

app.rb


require 'aws-record'
require 'json'
require 'faraday'
require 'slack-notifier'

USER_ID = "{Meine Benutzer-ID}".freeze

class NotifiedMessage
  include Aws::Record
  set_table_name ENV['DDB_TABLE']
  string_attr :id, hash_key: true
  string_attr :title
  string_attr :url
end

def lambda_handler(event:, context:)
  #Erhalten Sie benachrichtigte Informationen
  already_notified_messages = []
  NotifiedMessage.scan.each do |notified_message|
    already_notified_messages << notified_message.url
  end

  #Holen Sie sich vorrätige Artikel von der API und organisieren Sie nur unangekündigte Artikel in einem Array
  response = Faraday.get("https://qiita.com/api/v2/users/#{USER_ID}/stocks", page: 1, per_page: 10)
  messages = JSON.parse(response.body).each_with_object([]) do |res, ary|
    ary << [res["title"], res["url"]] unless already_notified_messages.include? res["url"]
  end

  notifier = Slack::Notifier.new "https://hooks.slack.com/services/xx/xx" do
    defaults channel: "#qiita-stocks-notification"
  end
  notifier.ping "Ich hatte diese Woche keine Artikel auf Lager" and return if messages.size.zero?

  #Benachrichtigen Sie Slack und speichern Sie es in der Datenbank
  notifier.ping "Ich werde den Artikel veröffentlichen, der letzte Woche bei Qiita gelagert wurde"
  messages.each do |message|
    notifier.ping message[0]
    notifier.ping message[1]
    notifier.ping "- - - - - - - - - - - - - - - - - - - -"

    notified_message = NotifiedMessage.new(id: SecureRandom.uuid, title: message["title"], url: message["url"])
    notified_message.save!
  end
end

Wenn Sie dies bereitstellen und testen, können Sie die hinzugefügte Tabelle auf dem Verwaltungsbildschirm von DynamoDB überprüfen und die letzten 10 Bestandsinformationen einfügen.

スクリーンショット 2020-06-07 3.05.25.png ダウンロード (3).png

6. Lassen Sie CloudWatch Lambda jederzeit ausführen

Stellen Sie schließlich sicher, dass Sie jede Woche zu einer schönen Zeit Benachrichtigungen an Slack erhalten.

6.1 Zeitplaneinstellungen

Wenn Sie ** Trigger hinzufügen ** auswählen und" ** CloudWatch-Ereignisse / Ereignisbrücke ** "aus der Suche auswählen, können Sie die Ausführungsregeln festlegen, sodass ich sie wie folgt einstelle. スクリーンショット 2020-06-07 4.29.19.png

Obwohl der Squeeze durchgesickert war, wurde der Teil der ** Zeitplanformel ** mit cron (0 12? * SAT *) (jeden Samstag um 12:00 Uhr) korrekt eingestellt. Referenz: Zeitplanausdruck mit Rate oder Cron --AWS Lambda

Wenn Sie den Scheduler in CloudWatch überprüfen, können Sie sehen, dass er ** jeden Samstag um 12:00 ** ausgeführt wird (siehe unten). スクリーンショット 2020-06-07 4.34.54.png

Zusammenfassung

Sie haben jetzt wöchentliche Bestandsbenachrichtigungen von Qiita erhalten. Wenn es jedoch so bleibt, wie es ist, erhöht sich die Anzahl der Lesungen von DynamoDB und die Brieftasche wird eingeklemmt, so dass es notwendig ist, die zu erfassenden Informationen einzugrenzen, indem "Abfrage" an "Scan" übergeben wird. Ich habe viel von AWS-Diensten gelernt, weil ich sie oft nur durch Berühren verstehe.

Ich würde mich freuen, wenn Sie auf Fehler hinweisen könnten.

Referenzartikel

Offizielle Dokumentation

Der Blog, den ich als Referenz verwendet habe

Recommended Posts

Benachrichtigen Sie Slack regelmäßig über Artikel, die in Qiita mit AWS Lambda + DynamoDB + CloudWatch vorrätig sind
Veröffentlichen Sie regelmäßig Bild-Tweets auf Twitter mit AWS Lambda + Java