Amazon Echo を使ってブログのRSSを配信する方法(AWS実装編)

Amazon Echo のニューススキルを利用して自分で運営しているブログのRSSを配信する方法をお伝えします。
当ブログはURL末尾に”/feed”を付け加えるとRSSが確認できます。
https://xp-cloud.jp/blog/feed

 

使用するサービスや用意する物は下記のものです。
サービス
・ASK(Alexa Skill Kit)のフラッシュブリーフィングスキル
AWS(API Gateway)
AWS(Lambda(Node.js))

用意する物
AndroidiPhone系のスマートホン
・Node.jsが実行できる環境

 

データフローは次のようになります。

 

AlexaはニュースのあるURLへアクセスすることしかできないため、直接Lambdaを呼ぶことはできません。
API Gatewayを挟むことによってURLを生成し、AlexaからLambdaを呼べるようにします。

当記事では前編としてAPI GatewayAWS Lambda〜RSSの部分を実装してみます。
Echo〜Alexa〜API Gatewayの部分は後半の記事で記載していきます。

 

AWS LambdaからRSSを読み込む

アレクサのスキル用に新しいLambda関数を作成し、RSSを読み込む処理を作っていきます。
AWSの管理コンソールからLambdaを開いてください
“関数の作成”を押して新しいLambda関数を作成していきます。

 

“名前”を入力し、”ロール”は”カスタムロール”を選択します。
“既存のロールを選択”にしても大丈夫ですが、後々、スキル単位でメンテナンスすることを考えると、Lambda毎にロールを用意した方が都合が良いです。

 

ロールを作成する画面が開きますので、
“IAMロール”は”新しいIAMロールの作成”
“ロール名”は任意の名前を指定して”許可”を押します。

 

名前を入力した画面に戻って来ますので”関数の作成”を押します。

 

 

ローカルPCでソースコードを編集する必要があるため、適当なフォルダを作成してください。
作成したフォルダにWindowsならコマンドプロンプトMACならterminalで移動してください。 コマンド

cd <作成したフォルダのパス>

 

RSSを読み込むために”cheerio-httpcli”を使用します。
https://www.npmjs.com/package/cheerio-httpcli

 

 

コマンドプロンプトかterminalでコマンドを実行し、”cheerio-httpcli”をインストールします

npm install cheerio-httpcli

 

 

“node_modules”というフォルダができました。
“index.js”を新規作成し、下記コードを貼り付けてください。

'use strict';
 
const client = require('cheerio-httpcli');
 
let event;
let context;
let callback;
exports.handler = (_event, _context, _callback) => {
    event = _event;
    context = _context;
    callback = _callback;
 
    // "cheerio-httpcli"を使いRSSを取得
    client.fetch('https://xp-cloud.jp/blog/feed/', {}, 'utf-8', searchRss);
};
 
let searchRss = function (err, $, res, body) {
 
    // 日付をechoが認識できる形式に整形
    var nowTime = new Date();
    var time = nowTime.getFullYear() + '-';
    time += ("0" + (nowTime.getMonth() + 1)).slice(-2) + '-';
    time += ("0" + nowTime.getDate()).slice(-2) + 'T';
    time += ("0" + nowTime.getHours()).slice(-2) + ':';
    time += ("0" + nowTime.getMinutes()).slice(-2) + ':';
    time += ("0" + nowTime.getSeconds()).slice(-2) + '.0Z';
 
    try {
        // RSSのアイテムを1つづつ読み込んで整形
        var resultList = [];
        $('item').each(function(i, elem) {
            // タイトル取得
            var title = $(elem).find('title').text();
            // 説明文を取得
            var description = $(elem).find('description').text().trim().replace(/\n/g, '').replace(/\r/g, '').replace(/\t/g, '');
            resultList.push({
                "uid": title,
                "updateDate": time,
                "titleText": title,
                "mainText": description
            });
            if (resultList.length == 5) {
                return false;
            }
        });
 
        //アイテムが取れていた場合だけ正常終了
        if (resultList.length > 0) {
            callback(null, resultList);
            return;
        }
    } catch(e) {
    }
    callback(null, {
        "uid": time,
        "updateDate": time,
        "titleText": 'エラー',
        "mainText": 'ニュースが読み取れませんでした。'
    });
};

 

フォルダ構成は下記のようになっていると思います。
新しいフォルダ
┝ index.js
└ node_modules

“index.js”と”node_modules”を選択し、zipに圧縮します。
新しいフォルダごとは圧縮しないでください。Lambdaで読めなくなります。

 

 

管理コンソールからLambdaを開き、先ほどのzipファイルをアップロードします。

 

“テスト”を押して実行してましょう

 

Lambdaへ渡す引数を聞かれますが、引数は使わないので適当に入力してください。

 

“テスト”を押して実行してみましょう

 

“詳細”を押して結果を見てみましょう。
もし実行結果が”異常”になっていたら、どこかで落ちています。
Lambdaの更新が遅れている場合は1分後くらいに再度テストすると上手くいくことがあります。

 

 

API GatewayからLambdaを呼ぶようにしましょう

AWSの管理コンソールからAPI Gatewayを開きます。
APIの作成”を押してAPIを作成していきます。

 

“新しいAPI”を選択、”API名”に適当な名前を指定し、”APIの作成”を押します。
API名”は公開される情報ではないため、好きな分かりやすい名前でOKです。

 

 

後にURLが発行されるAPIが作られますので、HTTP GETリクエストで動作できるようにGETメソッドを作成します。
“アクション” > “メソッドの作成” を選択

 

“統合タイプ”は"Lambda関数"
“Lambdaリージョン”はLambdaを作成したリージョン
“Lambda関数”は先ほど作成したLambdaの名前を指定して”保存”。
Lambda関数はスペースを入力すると関数の候補が表示されるため、そこから選択しても大丈夫です。

 

権限を追加する必要があるため”OK”を選択

 

これでおおよそ出来上がりですが、日本語を扱う場合、レスポンスヘッダーを変更する必要があります。
“メソッドレスポンス”を選択します

 

“HTTPのステータス 200”を編集します。この”200”とは正常終了した場合に返されるレスポンスのことです。

 

“コンテンツタイプ”を”application/json;charset=UTF-8"に変更します

 

設定が終わったのでURLを生成するため”APIのデプロイ”を行います。

 

“デプロイされるステージ”は”新しいステージ”を選択、
“ステージ名”はURLに使われるため、後でAlexaに設定することになります。
“デプロイ”をクリックしてデプロイ完了です。

 

生成されたURLを開くと、先ほどLambdaで返って来たようなレスポンスが確認できます。

 

次回はいよいよEchoから作成したAPI Gatewayを呼び出して完成させてみます。