[Logic Apps]Azureで遊んでみる ~ 自作RSSリーダー


## やってみること
- AzureでLogicAppsの構築。
- RSSでニュースデータを集める。
- データベースにフィード情報を登録。

## まえがき
とりあえずAzureでなんかやってみたい。
ニュースのテキスト処理とかできたらいいな。

- 前提条件
    - AzureにSQL Databaseを構築済み（[前回記事](https://qiita.com/Meeracker/items/ee1da539f54faaef9e7e)を参考）
- 実行環境
    - Windows10
    - Microsoft Edge 17
    - SSMS v17.3

## DBオブジェクトの作成
Logic AppsのRSSフィード項目を参考に作成しました。
ちなみに2018年時点で[Logic AppsはAtom形式のフィードには対応していない](https://feedback.azure.com/forums/287593-logic-apps/suggestions/15077919-atom-connector)ようです。

```sql
CREATE TABLE [dbo].[T_JP_RSS_FEEDITEM](
	[id] [bigint] IDENTITY(1,1) NOT NULL,
	[feed_id] [nvarchar](64) NULL,
	[feed_categories] [nvarchar](512) NULL,
	[feed_copyright_information] [nvarchar](128) NULL,
	[feed_links] [nvarchar](256) NULL,
	[feed_published_on] [nvarchar](128) NULL,
	[feed_summary] [nvarchar](1024) NULL,
	[feed_title] [nvarchar](256) NULL,
	[feed_updated_on] [nvarchar](64) NULL,
	[primary_feed_link] [nvarchar](256) NULL
) ON [PRIMARY]
GO
```


## Logic Apps のフロー作成

![image.png](https://qiita-image-store.s3.amazonaws.com/0/94824/9364d978-5062-fa55-6911-920819d6c434.png)
設定が終わるとRSSとSQLの接続オブジェクトがAzure上に自動で追加されます。

## 実行確認

```sql
select top 20
 feed_title
,feed_summary
,feed_published_on
,feed_links
from [T_JP_RSS_FEEDITEM]
order by feed_published_on desc
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94824/f7e96f69-d7cb-1c37-5e41-c62d335d1b65.png)

## おまけ：RSSのマルチトリガー
Logic Appsのトリガーはデザイナービューですと１つしか指定できませんが、コードビューであれば複数指定（マルチトリガー）することができます。
なお、コードビューでマルチトリガーにした場合、デザイナービューでは編集できません。

<details><summary>編集前 : コードビューはjson形式です。triggersの箇所をコピペして増やします。</summary><div>

```json
"triggers": {
    "When_a_feed_item_is_published": {
        "inputs": {
            "host": {
                "connection": {
                    "name": "@parameters('$connections')['rss']['connectionId']"
                }
            },
            "method": "get",
            "path": "/OnNewFeed",
            "queries": {
                "feedUrl": "https://rss.itmedia.co.jp/rss/2.0/itmedia_all.xml"
            }
        },
        "recurrence": {
            "frequency": "Minute",
            "interval": 3
        },
        "splitOn": "@triggerBody()?['value']",
        "type": "ApiConnection"
    }
}
```

</div></details>

<details><summary>編集後</summary><div>

```json
"triggers": {
        "RSS_Feed_CNETjapan": {
            "inputs": {
                "host": {
                    "connection": {
                        "name": "@parameters('$connections')['rss']['connectionId']"
                    }
                },
                "method": "get",
                "path": "/OnNewFeed",
                "queries": {
                    "feedUrl": "http://feed.japan.cnet.com/rss/index.rdf"
                }
            },
            "recurrence": {
                "frequency": "Minute",
                "interval": 5
            },
            "splitOn": "@triggerBody()?['value']",
            "type": "ApiConnection"
        },
        "RSS_Feed_ITmedia": {
            "inputs": {
                "host": {
                    "connection": {
                        "name": "@parameters('$connections')['rss']['connectionId']"
                    }
                },
                "method": "get",
                "path": "/OnNewFeed",
                "queries": {
                    "feedUrl": "https://rss.itmedia.co.jp/rss/2.0/itmedia_all.xml"
                }
            },
            "recurrence": {
                "frequency": "Minute",
                "interval": 6
            },
            "splitOn": "@triggerBody()?['value']",
            "type": "ApiConnection"
        },
        "RSS_Feed_LifeHacker": {
            "inputs": {
                "host": {
                    "connection": {
                        "name": "@parameters('$connections')['rss']['connectionId']"
                    }
                },
                "method": "get",
                "path": "/OnNewFeed",
                "queries": {
                    "feedUrl": "http://feeds.lifehacker.jp/rss/lifehacker/index.xml"
                }
            },
            "recurrence": {
                "frequency": "Minute",
                "interval": 7
            },
            "splitOn": "@triggerBody()?['value']",
            "type": "ApiConnection"
        }
}
```

どうやら上限は10個までらしい。

</div></details>

## 参考
[Azure Logic Apps ドキュメント](https://docs.microsoft.com/ja-jp/azure/logic-apps/)
[RSS 2.0 Specification 日本語訳](https://www.futomi.com/lecture/japanese/rss20.html#hrelementsOfLtitemgt)