USアマゾンで公開中のAlexa Skillが壊れてたので直した件

4月から一般公開中の[「Gunners News」](https://www.amazon.com/Sayaka-Gunners-News/dp/B06ZYPG64X)というAlexa Skill が壊れていることに気づいた。


[開発した時の記事はこちら](http://qiita.com/sitopp/items/048f84b84ada2b297174)

"**Here is your flash briefing from Arsenal.com news feeds is not available at the moment.**"
というメッセージが出て止まってしまう。

あららら？
ということで直します。


## 問題切り分け開始

https://developer.amazon.com/edw/home.html
＞Alexa Skills Kit

作ったスキルの一覧画面で、該当のスキルのステイタスを見ると、ちゃんとLiveになっている。中身がダメでも、ここは「Live」になってしまうようだ。

![Live.png](https://qiita-image-store.s3.amazonaws.com/0/173392/4ac0742f-8554-ec9a-b37a-3fc0ba138c1b.png)


では次。
上記の一覧画面から、
＞「View」
＞「Configuration」
を開いてみる。
「Flash Briefing Feed Configuration」の「Custom Error Message」の箇所には、「Sorry, Gunners news is not available at the moment.」
と設定してある。

あれ？おかしいぞ。
さっきAlexaが言っていたエラーメッセージは、
「from Arsenal.com news feeds is not available at the moment.」
だった。設定したエラーメッセージと違うじゃんか。


## Skillのソース調査

とりまSkillの中身を調べることにする。
以前作った時から3ヶ月近く経っており、その間に旅行行ったり転職して、すっかり何をどうしたのか忘れてしまった。
Skillの開発にはLambda Functionを使ってたかな？
しかしAWSのコンソールには、作り散らかしたLambda Functionのゴミがたくさんありすぎて、どれだかさっぱりわからない。Node.jsの勉強したなー

そうだ、Alexa SkillもLambda FunctionもAWSだから、arn名がわかればLambda Functionのコンソールから検索して探せるはずだ。
そこで、さっき開いてた[Alexa SkillsのDeveloperサイト](https://developer.amazon.com/edw/home.html)から、リンク先のarnを探す。

＞該当スキル
＞Configuration
＞Feed Information
＞edit

URLを見ると、Lambda functionのarnではなく、httpのwebサーバーのURLが書かれていた。そうだ、理由は忘れちゃったけど、EC2にhttpdを立てて、Jsonを編集するphpスクリプトを置いたんだっけ。


早速AWSのコンソールにログインし、EC2のIPアドレスを調べ、sshで接続しようとしたら、接続用の秘密鍵が見つからない。あれれれ。。


## 鍵の捜索

（小一時間）

## キーペアの爆誕

見つからなかったので、新しいEC2インスタンスを作りキーペアも再作成した。

とほほすぎる。

## 新しいインスタンス

・Amazon Linux AMI 2017.03.1 (HVM), SSD Volume Type 
・t2.micro
・ディスク 8GB
・元のEC2からEIPを引っぺがしてこっちに割り当てる

以前初期構築した時、**野生の勘によりEIPを取得しており、Amazonレビューに提出したURLはEIPを使ったものだった。** なので、URLは変化せず、Amazonへの再申請も不要。助かったー

ロードバランサーが欲しいところだが、無料枠の対象じゃないのでやめておく。いずれhttpsを使うような事があったら、ELBにデプロイして使いたいところだが。


## Githubからスクリプトを取ってきてリカバリ

テケトーにApache+phpをインストールしたあと、phpのスクリプトをGithubからcloneしてデプロイして、難なくリカバった。Githubありがとう。

php置き場：
https://github.com/sitopp/Alexa_FlashBriefing_ArsenalFeed


ブラウザでURLをリクエストすると、それっぽい値が帰ってきた。

![リカバった.png](https://qiita-image-store.s3.amazonaws.com/0/173392/1ce11085-5d62-72fd-67a4-c018568b5f5d.png)

JSONエディターで見ても、大丈夫そう。
![Json.png](https://qiita-image-store.s3.amazonaws.com/0/173392/c9d618e6-2885-7e0a-426f-f379650e0f52.png)


これでデバッグできる状態まできた。

## デバッグ

[Alexa SkillsのDeveloperサイト](https://developer.amazon.com/edw/home.html)から、公開中の当該Skillの「View」画面にて、
＞Configuration
＞edit
＞save
を押しても、エラーは何も表示されなかった。開発中なら、何か問題があればここでエラーが出てsaveできないんだが、**一度リリースされたSkillは、Save時に自動チェックが走らないようだ。**

そこで設定をそっくり真似した別のSkillを作って、Configuration画面にてsave時の自動チェックを走らせた。すると今度はちゃんとエラーメッセージが表示された。
なになに。。？

```
Error: uid: urn:uuid:1 error: 
Date [2017-06-15T14:20:13Z] must be no older 
than 7 days

```
訳：
**7日以内じゃないと受け付けましぇん。**

えっ、そうなの？
そんなの、[Flash Briefing Skill API Feed Reference](https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit/docs/flash-briefing-skill-api-feed-reference)に一言も書いてないじゃん！とはいえ、古いニュースを流す方が間違いなので、サービスとしては正しい。

配列0に格納されたニュースの日付は"2017-6-15"になってる。
これが最新ニュースか。。

シーズンの終了とともに、フィードのURLが変更になっちゃったのかなぁ。。
しかしまぁ、ニュースはどこかで更新されているに違いない。

何故ならば、現在イングランドプレミアリーグはシーズンオフであるが、すでにアーセナルはアジアツアーでプレシーズンマッチを行っており、今日もオーストラリアのチームと親善試合をやっていた。アーセナル公式アプリで中継を見ていたが、ジルーの反射神経は素晴らしく、ラムジーのゴールは美しく、エルネニーもごっつあんゴールで大変よろしかった。リプレイを見たら相手ディフェンスのオウンゴールなんだけど、親善試合だからか、エルネニーのゴールになってたな。

新しいニュースのURL探そうかね。

何か引っかかる。

ちょっと待て、さっきのJSONエディターでみたニュースの本文はなんて書いてたっけ？

**"Olivier Giroud, Aaron Ramsey and Mohamed Elneny all score as we end the Sydney leg of our pre-season tour in style"**

あれー、これまさに、さっきの試合の内容じゃんか。。
まさか、まさかの、、、
震える手でスクリプトを開くと、月の名前を数字に置き換えるところが、ありえないミスをおかしていた。


```
    case ("Jul") :
        $MM='06';

```
Julyを6月に変換してる！

それどころか、5月以降、全部間違えていた。
ということはもう2ヶ月以上止まりっぱなしだったことになる。。

orz

こんなポンコツでも消さずに残してくれたAmazonさんありがとう。
単に申請通したものは再チェックしないだけなんだろうけど、それに助けられた。


## 復旧への短い道のり

そこを直してEC2にアップしたところ、あっさり復旧した。


<a href="https://youtu.be/Yvt8jdARJvw"><img src="https://qiita-image-store.s3.amazonaws.com/0/173392/82dd5640-8f65-c389-4f1c-91ff7115b7e1.png"></a>


穴があったら入りたい。


## 学んだこと

・一度申請に通ったAlexa Skillsは、2ヶ月以上壊れていても消されない。
・リリースしたskillsは時々起動して確認すべし。せめて月１。
・AWS用キーペアの保管方法を真剣に考え直す。
・実は自分のローカルの鍵も作り直していた。そのあとちゃんとEC2上のauthorized_keysを書き直していれば、EC2の再構築は避けられた。



以上です！



P.S
全然関係ないけど、アーセナルの17-18のアウェイユニフォームはだいぶカッコイイ。これはエジル、ウォルコットあたりに合わせてデザインされたものだと思う。