NRIネットコム Blog

NRIネットコム社員が様々な視点で、日々の気づきやナレッジを発信するメディアです

インフラ編Part1 ~ニュース定期通知機能~

本記事は  ブログ書き初めウィーク  8日目②の記事です。
📝  8日目①  ▶▶ 本記事 ▶▶  9日目  📅

本記事は、こちらの記事の続きとなっております。

tech.nri-net.com

では、実際に開発を始めていきましょう。

前提条件

以下の説明は省略させていただきます。

  • LINE DevelopersでのChannel作成済み
  • LINE Messaging APIでChannelアクセストークンとシークレットキーは発行済み
  • VPC、サブネット(今回はパブリック)、ルートテーブル、インターネットゲートウェイ作成済み
  • GitHub登録済み
  • お名前.comでドメイン発行済み

全体構成図

本システムの全体構成図は以下の通りです。

アーキテクチャ図
本システムは主に4つの機能を実装します。

  • ニュース定期通知
  • メッセージ内容に応じたニュース通知
  • CI・CD
  • 監視・アラート通知

これらの機能を実現するために使用したAWSサービス、及びその設定内容についてお話していきます。

ニュース定期通知機能

まず、ニュース定期通知機能についてです。この機能に関してはLambdaを用いたサーバーレスアーキテクチャで実装していきます。

AWS Lambda

本機能は4つの処理で構成されます。

  1. Webサイトから記事のURLを取得(スクレイピング)
  2. 取得したURLをS3バケット内のファイルに書き込む
  3. 前回スクレイピング時に取得したURLとの比較を行い、更新分だけ取り出す
  4. LINEに更新分URLを通知する

Lambdaに上記の処理を実装していきます(ソースコードの詳細はアプリ編をご覧ください)が、残念なことにソースコードをベタ貼りするだけではLambdaは正常に動いてくれません。今回の場合、

  • LamadaがS3バケットへアクセスするためのIAMロール

  • サードパーティ製ライブラリを使用するためのLambdaレイヤー作成

が追加で必要になります。

IAMロール

S3バケットへのアクセスが発生するため、S3バケットアクセス許可ポリシーを付与したIAMロールをLambdaにアタッチする必要があります。

S3バケットアクセス許可ポリシーは以下の通りです。S3オブジェクトの一覧確認、読み込み、書き込みを許可しています。

{
    "Statement": [
        {
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::バケット名",
                "arn:aws:s3:::バケット名/*"
            ]
        }
    ],
    "Version": "2012-10-17"
}

Lambdaレイヤー

Lamdaレイヤーとは、Lambda関数で使用する追加のコードやデータを含むことができる.zipファイルアーカイブです。
レイヤーを設定することで、サードパーティ製のライブラリの使用、及び複数のLambda関数でライブラリ呼び出しが可能となります。

では、具体的に見ていきましょう。今回はLINEを操作するためのライブラリであるline-bot-sdkをLambdaレイヤーに登録していきます。

まず、pythonディレクトリを作成し、line-bot-sdkをpythonディレクトリ以下にインストールします。

$ mkdir python
$ cd python
$ pip install line-bot-sdk -t .

次にインストールしたモジュールを.zipファイルに圧縮します。ここで一つ注意してほしいのですが、解凍(展開)後のファイルは「python」になるようにしてください。python以外の場合、Lambda関数からレイヤー呼び出しに失敗してしまいます。

ファイル圧縮完了後、AWS Lambdaの画面に移り、レイヤーを作成していきます。

レイヤーの名前、説明を記入し、アップロード欄で先ほど作成したzipファイルを選択します。ランタイムを選択し、「作成」ボタンを押すとレイヤーが作成されます。

レイヤーを作成したのち、ソースコードを記載するLambda関数へ移動し、「レイヤーを追加」をクリックします。

レイヤー追加の画面でカスタムレイヤーを選択し、先ほど作成したレイヤーを追加してください。以上の手順でline-bot-sdkライブラリをLambda上で使用することができます。

S3

スクレイピング時に取得したURLをS3バケット内のファイルに格納します。

EventBridge

ニュース通知を定期実行するために、EventBridge内のスケジューラーを設定していきます。スケジューラーには、実行対象のAWSリソースや実行日時を設定していきます。

今回の場合、実行対象は先ほど作成したLambda関数、実行日時は、Asia/Tokyoタイムゾーンで毎日朝7時と19時に設定します。

スケジュールの設定

また、スケジューラーの実行ロールにはLamda関数の実行許可ポリシーをアタッチする必要があります。
Lamda関数の実行許可ポリシーは以下の通りです。

{
    "Statement": [
        {
            "Action": "lambda:InvokeFunction",
            "Effect": "Allow",
            "Resource": "arn:aws:lambda:ap-northeast-1:アカウントID:function:関数名"
        }
    ],
    "Version": "2012-10-17"
}

宣伝と次回予告

以上でニュース定期通知機能の実装は終了です。

次回以降のブログは「井手ウィーク」にて掲載していきます!

井手ウィークとは、1週間にわたってこのアプリ挑戦記に関するブログを毎日投稿していくウィークのことです! 具体的なコード例や設定手順を交えながら、わかりやすく説明しますのでお楽しみに!

執筆者:井手 亮太
職種 : インフラエンジニア
推しのサッカー選手 : ケビン デブライネ