こんにちは、SCSKの木澤です。
みなさん、AWSのアップデート情報をチェックできていますか?
毎日のようにアップデートはありますが、日々チェックするのは大変ですよね。
弊社内ではMicrosoft Teamsによるコラボレーションプラットフォームが運用されておりますので、アップデート情報をTeamsに通知して効率的にチェックできるようにいたしました。その仕組みをご紹介したいと思います。
システム構成
概要
大多数の各Webサイトでは新着・更新情報をRSSフィードとして配信しています。(当サイトであればここ)
RSSはWebページの見出しや本文の要約、更新情報などの情報がXMLで構造化された形式で記載されています。
RSSには各記事の公開日時が記載されているため、前回チェック時から公開された記事をピックアップして通知することで各種プラットフォームに配信することができます。
通知対象のAWSブログ
ひとまず通知対象のAWSブログは下記としました。
AWSでは分野毎に多数のブログを提供しておりますが、通知が多すぎても大変ですので。
- AWS What’s New(英語版) [RSS]
- AWS What’s New(日本語版) [RSS]
- AWS News Blog(英語版) [RSS]
- Amazon Web Servicesブログ(日本語版) [RSS]
- AWS JAPAN APN ブログ [RSS]
アーキテクチャ
システム構成要素はこのようにしました。
RSSを取得し、前回更新時から新規投稿された記事をピックアップ、日本語以外のブログであればAmazon Translateでタイトルと要約文を日本語に翻訳し、Amazon SES経由でメールで通知するシンプルなものです。
なお、メンテナンス性を考慮し取得先のRSS情報はAWS Systems Managerのパラメータストアに格納しました。
また通知先のTeamsチャンネルは英語(翻訳)版と日本語版で2つのチャンネルに分け投稿することにしました。
Microsoft Teamsへの通知ノウハウ
Microsoft Teamsでは、チャネルごとに当該チャネルに投稿できるメールアドレスを取得できます。
Teams APIの利用は組織のポリシーにより許可されていない場合もあると思いますが、メール経由での投稿によって外部から新しいメッセージを追加することが可能です。
メール経由ですがチャネルごとに投稿できるドメインを設定できますので安心ですね。
なお、テキストメールでTeamsに送信した場合、本文中のURLが自動的にリンクとならず、HTMLメールで送る必要がありました。
上記のアーキテクチャでAmazon SNSではなくSESを採用している理由はそのためとなります。
実装手順
以下の手順を実施しました。
なお、当方では東京リージョン(ap-northeast-1)で実装しました。
パラメータストアの作成
後述のLambda関数では取得元RSSフィード情報をAWS Systems Managerのパラメータストアから取得するように設計してありますので、下記のようなJSON形式でパラメータストアを作成します。
タイトルとURL、言語のみしているシンプルなものです。
こうしておけば、対象ブログの追加も容易ですね。
[ {"TITLE":"AWS What's New(英語版)","URL":"https://aws.amazon.com/about-aws/whats-new/recent/feed/","LANG":"en"}, {"TITLE":"AWS What's New(日本語版)","URL":"https://aws.amazon.com/jp/about-aws/whats-new/recent/feed/","LANG":"ja"}, {"TITLE":"AWS News Blog(英語版)","URL":"https://aws.amazon.com/blogs/aws/feed/","LANG":"en"}, {"TITLE":"Amazon Web Servicesブログ(日本語版)","URL":"https://aws.amazon.com/jp/blogs/news/feed/","LANG":"ja"}, {"TITLE":"AWS JAPAN APN ブログ","URL":"https://aws.amazon.com/jp/blogs/psa/feed/","LANG":"ja"} ]
Amazon SESへのメールアドレス登録
今回はAmazon SES経由で通知を行いますので、メールの「From」になるメールアドレスと、宛先となるTeamsのメールアドレスを登録し認証しておきます。
Lambda関数の作成
IAMロールの事前準備
以下のアクションを許可したポリシーを作成し、これらをアタッチしたロールを作成します。
- AWS Systems Manager(Parameter Store)からの値の取得
- ssm:GetParameterHistory
- ssm:GetParametersByPath
- ssm:GetParameters
- ssm:GetParameter
- Amazon Translateでの翻訳実行
- translate:TranslateText
- SESでのメール送信
- ses:SendEmail
- CloudWatch Logsへのログ送信
- logs:CreateLogGroup
- logs:CreateLogStream
- logs:PutLogEvents
Pythonライブラリの組み込み
RSSフィードを解析するPythonライブラリ「feedparser」はLambda標準に組み込まれていませんのでzipで生成します。
AWS Cloudshellにログインし、適当なフォルダを生成し以下のようなコマンドで生成→S3バケットにプッシュします。
$ pip3 install feedparser -t . $ touch lambda_function.py $ zip -r func.zip ./* $ aws s3 cp ./func.zip s3://(S3バケット名)/
関数の作成
Python 3.9のLambda関数を、上記で作成したIAMロールの権限を付与した形で生成します。
作成後、Pythonライブラリを組み込んだzipファイルをS3バケットから読み込み、差し替えます。
ソースコードはダウンロードできるようにしましたので、下記からダウンロードしご確認ください。
なお、ソースコード中の変数 “THRESHOLD” としてRSSの確認間隔を記述しています。
後述のEventBridgeの設定と合わせて記述するようにしてください。
一般設定・環境変数の設定
本Lambda関数はRSSのパース及び外部の呼び出しに少々時間がかかります。
本内容だと10数秒掛かっていますので、タイムアウト時間を30秒程度にするとよいと思われます。
また環境変数として以下を指定します。
- MAIL_FROM 送信するメールの発信元
- MAIL_DEST_EN 英語版ブログの通知先メールアドレス(Teams)
- MAIL_DEST_JA 日本語版ブログの通知先メールアドレス(Teams)
- PARAMETER_STORE 作成したAWS Systems Managerパラメータストアの名前
EventBridgeルールの設定
最後に、Amazon EventBridgeのルールを追加し、作成したLambda関数を定期実行するように設定します。
当方では4時間おきに動作するように設定しました。
まとめ
以上の仕組みにより、社内のTeamsに最新のAWSアップデート情報を通知できるようになりました。
英語版ブログをAmazon Translateに掛けた時の翻訳精度も素晴らしく、便利に活用できそうです。
この仕組みを用いて弊社のエンジニアがアップデート情報をスピーディーに活用できるようになればと考えております。
皆様もご活用ください。
参考サイト
feerparserの使い方については、クラスメソッドさんのDevelopers.IOの記事を参考にさせていただきました。
ありがとうございました。