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 |
↑ ist wie folgt zusammengefasst.
[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)
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
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.
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.
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
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".
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.
Wählen Sie nach Abschluss des "Set Test Event" "Test" und bestätigen Sie, dass die Nachricht an Slack gesendet wurde.
Jetzt können Sie die Kommunikation von ** Lambda ** zu Slack bestätigen.
Holen Sie sich als Nächstes den Bestand des Benutzers von der Qiita-API und benachrichtigen Sie ihn.
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
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.
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.
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.
Stellen Sie schließlich sicher, dass Sie jede Woche zu einer schönen Zeit Benachrichtigungen an Slack erhalten.
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.
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).
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.