Amazon Connectでモーニングコールシステムを作った
AWSのお勉強として、実際にサービスを開発してみようということでモーニングコールシステムを作った。自分の生活に役立つし、何より「動くもの」を自分で作れたのでモチベーション高く取り組めたと思う。
電話といえばAmazon Connectっしょ、と思って着手したけど、一方的に自分のスマホに電話かけるだけなのでほとんどの機能(コールセンター用途)には触れることなく、どちらかといえばCloudFormationやIAMに苦しめられた。
個々の構成要素やハマった話は別で書くとして、概要を記しておく。
できたサービス
- 時刻と電話番号を指定すると、電話(モーニングコール)がかかってくる。設定画面はS3上のHTMLファイル。
- 電話に出た後に流れるメッセージは任意で設定可能。(amazon pollyのmizukiによるテキスト読み上げ) ※電話に出ずに切っちゃえば通話料が発生しない。かつ、電話に出てもmizukiたんのささやきボイスがイマイチなこともあり、電話にでんわ状態。
- Dash Buttonをクリックすると、次回のコールはキャンセル。 (今日は起きてるのでコールいりませーんの通知。実際はあまり使わない。だって起きれないから。)
使ったサービス・技術
- サービスの構成要素
- Lambda
- API Gwateway
- Route53
- CloudFront
- CloudWatch : Events
- IAM
- S3
- Amazon Connect
- IoT 1-Click ※Amazon Dash Button含む
- X-Ray
- デプロイ周り
- CloudFormation / SAM(Serverless Application Model
- CodePipeline
- GitHub
学んだこと
- ハマりポイント①:IAM
- なぜか動かないってなったら大抵コイツのせい。(自分がIAMで適切な権限を付与していないせい)
- AWSのセキュリティの考え方:権限は最小限にすべし、を体現。明示的に権限を付与しないと動かん。
- 最小限に留めようとしたらうまく動かないので、結局Fullでふっちゃうっていう。。ビジネス用途だと許されないだろうなと思う。
- ハマりポイント②:CloudFormation
- 最初からCloudFormationで構築しようとして詰んだ。全然わからん。一度実現したい構成を作ったあとに、テンプレート化していくことで何とか頑張れた。
- いきなり書き始めずに(できないし)、以下の流れで進めるのが効率良かった。
- ネット上に転がっているサンプルを見つけて雰囲気をつかむ
- AWS CloudFormation デザイナー(GUI)で類似構成を組んで、自動生成されるテンプレートを確認
- リファレンスで補完しながらyamlを書く https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-product-property-reference.html
- 環境変数を活用する
- 気づきは小まめに残しておくべし
- この記事のように「やったことを後から振り返ってきれいにまとめよう」とすると忘れちゃう情報が出てくる。良くない。
- 少なくとも一日単位で、きっちり「備忘」としての役割を果たせる運用をしようと思う。 とりあえず個々の構築をなぞって、思い出していきたい。
感想
- 今回の構成はインフラ周りの設定が不要だったので、ネットワークやらセキュリティグループやらの登場はなかった。アプリに専念ってこういうことね、と実感。
- CodePipelineでgit push→GitHubからのソース取り込み→デプロイまでを自動化したので、楽っちゃ楽なんだけど待ち時間が長いのが嬉しくない。今回のケースだと、デプロイまでに5〜10分弱かかった。小さい修正を繰り返していくのにはアンマッチな印象。あとは、Lambdaのコードを書き換えても内容が反映されないことがあった。設定(権限?)が足りていないのかも。調査が必要。
(後日追記)
- 完成翌日、しっかり06:30にモーニングコールがかかってきたことを確認し、電話をとらずに切って、次に気づいた時には07:20だった。うすうすわかっていたけど、強力なスヌーズ機能が必須。おまけで組み込んだDash Buttonを活用して、クリックしないと延々と電話をかけ続ける仕組みにしよう。