IBMクラウドのCodeEngineを利用して定期監視アプリケーションを作成してみた。

# APL仕様（概要）
1. 定期的に、Webスクレイピング処理を起動する。
1. 抽出した情報に、事前に定義したKeywordが含まれているかチェックする。
1. Keywordが含まれていた場合、SMSで情報を連携する。

# 作成背景
システム運用でアラートが大量に発生した場合に、AWS障害が発生していないか、Twitterのトレンドで障害発生有無を確認したりする。
都度、確認を行うのではなくpush型で通知してくれるようにアプリケーションを作成し、監視させることを想定。

# APL作成に使用したもの
- Spring-Boot
- Apache Camel
- twilio　(SMS送信の為のWeb-API)

# ソースコード
- MySpringBootApplication.java：WebAP起動用class
- JsoupProcessor.java：Webスクレイピング＆編集用class
- SmsCallProcessor.java：SMS送信用class
- CamelTrigger.xml：トリガー起動用ルート
- CamelTrendSearch.xml：メインルート
- CamelTwilio.xml：SMS送信用ルート


各プロセッサーはCamel.xmlから呼び出せる様に、beans.xmlで定義し、Importしておく。
アプリケーション用のプロパティ定義のkeywordはUTF8で定義したいので、app.propertiesとして定義しUTF8エンコードしておく。

```java:MySpringBootApplication.java
@SpringBootApplication
@ImportResource("classpath:beans.xml")
@Configuration
@PropertySource(value = "classpath:/app.properties", encoding = "UTF-8")
public class MySpringBootApplication {
    /**
     * A main method to start this application.
     */
    public static void main(String[] args) {
        SpringApplication.run(MySpringBootApplication.class, args);
    }
}
```

起動用ルートは初回起動時に一度だけ、非同期でメインルートを呼び出す。

```CamelTrigger.xml
<routes xmlns="http://camel.apache.org/schema/spring">
	<route id="cameltrigger">
		<from uri="timer://foo?repeatCount=1"/>
 		<to uri="seda://CamelTrendSearch"/>
	</route>
</routes>
```

メインルートでは、指定間隔でdelayしながらキーワード検出処理を繰り返す。
また、検出した場合も自己を再起呼び出しし、処理継続する。



ソースは以下にて公開
[kajioka0404/trendpush](https://github.com/kajioka0404/trendpush)



# デプロイ環境
CodeEngine：IBMが提供するフルマネージド型のサーバーレス・プラットフォーム 
【環境採用理由】
- 利便性：コンテナ等のインフラ知識不要でアプリケーションのデプロイが可能
- コストメリット：アプリの利用がないときにはリソース使用量をゼロにでき、課金されない程度での動作検証が可能

# デプロイの流れ
（前提事項）
- IBM Cloudのアカウントが作成されていること
- 従量課金アカウントにアップグレードされていること
　（※アプリケーションを試行する為にアップグレードはするものの、従量課金なので試行レベルであれば0コストで動作確認可能）
- Twilioの開発用アカウントを取得していること

１．CodeEngineの概要ページより、「ソースコードから始める」にgitのソースURLを設定し、「作成の開始」
![codeengine001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83425/fe97f8e3-af81-1681-c09a-adbfc1612fd1.jpeg)
２．ジョブ作成を選択してから、プロジェクトの作成を行います。
　　今回作成したアプリケーションはRestControllerを用いていない為、ジョブを選択していますがHttp要求の受け皿が用意された
　　アプリケーションを作成した場合は、ジョブではなくアプリケーションを選択します。
![codeengine002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83425/227e3e58-ab27-cb84-36c2-a68a3efbcca7.jpeg)
３．ビルド詳細の指定
　　基本はデフォルトでOK。ビルド戦略部分はDockerfileではなく、CloudNativeBuildpackを選択。
![codeengine003-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83425/609c257f-12de-860b-0b7d-328e25ba95c4.jpeg)![codeengine003-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83425/175648ba-33b9-c699-33fd-90ffabfa9703.jpeg)![codeengine003-3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83425/8dff0d50-8989-e942-ae28-ec1f9943eeac.jpeg)
４．環境変数の設定
　　Twilio関連の認証情報や電話番号はアプリケーション上、環境変数から取得するようにしているので設定する。
![codeengine004.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83425/b6dcfe0a-5848-db6b-3e9a-0b0513d79310.jpeg)
５．ジョブの作成
　　ジョブの作成を行うと、ビルドが実行されます。
![codeengine005-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83425/d24c72f8-dc7e-f4d7-54c3-afb22533243c.jpeg)
　　「イメージ・ビルドの待機中」をクリックするとビルド画面に遷移します。
![codeengine005-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83425/574aaf7d-a3c2-cf07-d52d-ae565e35bb87.jpeg)
　　Nameの部分のリンクをクリックすると、ビルドの実行ログが確認できます。
![codeengine005-3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83425/bcccb9f3-07c4-aee6-51ab-0710392114a6.jpeg)
　　Mavenリポジトリから必要な情報をdownloadし、ビルドを行っているので結構時間が掛かります。（今回のアプリケーションで3分程度）
　　以上で、デプロイが完了し、ジョブ実行の準備が整った状態となります。

# ジョブの実行
１．プロジェクトを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83425/a9947e0b-1884-9ca3-28e0-f5b8e6c02e28.png)
２．ログの確認をする為に、モニタリングを追加する。（※CLIから確認することも可能なので必須ではない）
![codeengine006.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83425/8c6415a0-a1c0-5d46-50fc-39296aab4fbf.jpeg)
３．ジョブ画面より、「ジョブの実行依頼」を実行する。
![codeengine007.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83425/9e35e284-db32-04b3-052f-cfc5587d326f.jpeg)
４．ジョブが実行される。
![codeengine008.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83425/19e8c960-4323-03bb-6f2f-9ad8cd6aabe7.jpeg)
５．ロギングを起動すれば、Webからログ確認が出来る。
![codeengine009.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83425/8e436efd-64dd-d617-67c8-2202c10aa34d.jpeg)

# SMS送信実行結果
※twilioのアカウントがトライアル用のものなので、先頭に固定文言が出力されます。
![output_image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83425/16dd3108-04a0-2a34-f501-556e5717c383.jpeg)

# 開発の参考とした記事

https://qiita.com/daikuro/items/9a998d884a9ce0ae80d0

https://qiita.com/mkyz08/items/39007d9dc3e10eecc696

https://qiita.com/yoshiyuki-iwata/items/57a8099a5910325bda34

https://japan.zdnet.com/article/35173145/