LoginSignup
3
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-07-15

4月から一般公開中の「Gunners News」というAlexa Skill が壊れていることに気づいた。

開発した時の記事はこちら

"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

では次。
上記の一覧画面から、
>「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サイトから、リンク先の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

JSONエディターで見ても、大丈夫そう。
Json.png

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

デバッグ

Alexa SkillsのDeveloperサイトから、公開中の当該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に一言も書いてないじゃん!とはいえ、古いニュースを流す方が間違いなので、サービスとしては正しい。

配列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にアップしたところ、あっさり復旧した。

穴があったら入りたい。

学んだこと

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

以上です!

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

3
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1