
最近AWSの資格勉強に全力を注いでおりました。おかげさまでAWSソリューションアーキテクトのアソシエイトに無事合格することができました。
勉強の流れとしては、ソリューションアーキテクトの対策本で一通り学習し、Udemyの模試を80%とれるようになるまでひたすら周回するって感じです。
使った本はこちらです。
サービスの解説だけでなく、AWS試験の解き方も解説してくれるのでまずはこの本から学習を始めるのがよいのではないでしょうか。
そして、使った模試はこちらです。
【SAA-C02版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集(6回分390問)
なかなかAWS資格試験の模試がないなかで、6回分も模擬試験がついているお得な模試です!難易度も内容も本番にかなり近く、この模試のおかげで合格できたといっても過言ではないでしょう。
AWSなどのIT系の知識は座学だけでは意味のない知識となってしまいます。そこで、最近学んだ知識を生かすためのアウトプットとしてアプリを作り、AWS上にデプロイしてみました。
作ったアプリはこちらのリンクから開けます。
→KAKEIBO
作ったアプリの構成

構成
EC2: t2.micro、Amazon Linux2。Webサーバー(nginx)、アプリサーバー(unicorn)を一つのインスタンスで実現。
RDS:MySQL 8.0
Ruby on Rails:6.0、今回AWS上に乗せるアプリ構築用。
Python 3.7:LINE BOT作成用。RubyでもLINE BOTを作れるがPythonを書いてみたかったのでPythonを選びました。
S3:画像の保存用。
Lambda:LINE BOTのコードを書いてます。
API Gateway:LINE BOTからのリクエストを受け付けて、Lambda関数を呼び出す。
DynamoDB:Lambda関数のキャッシュ用。関数間でデータを引き継ぐためのキャッシュ用に使ってます。
Route53:ドメインとEC2のアドレスを紐づける。
かかったお金はRoute53で50円、ドメイン代で300円くらいです。
本来であれば以下の構成を取りたかったです。

ポイントとしては、LamdaをVPC内に置き、RDSとの間にRDSプロキシインスタンスを置く点です。
今回の僕の構成のようにLambdaとを直接つなげる構成はアンチパターンなんですよね。

Lambda関数が呼び出されるごとにDBへのコネクションを作成するため、同時接続数がすぐに上限に達してエラーを起こしてしまいます。
間にRDSプロキシを挟むことで、RDSへのコネクションをプロキシが一つにまとめてくれるので、RDSのリソースを効率よく利用できるみたいです。

今回RDSプロキシを使わなかった理由としては、
・RDSプロキシがRDS MySQL8.0に対応していない。
・RDSプロキシを使うと割とお金がかかる。(3円/時間)
RDSプロキシを使った方が学習にもなりますし絶対使うべきでしたが、料金を考えて止めました。(RDSインスタンスを作り直すのが面倒くさかった。)
作ったアプリの概要

今回は家計簿アプリを作成しました。(こちらから開いてみてください。)
Ruby on Railsを使い、出費をカテゴリーごとに登録していくという簡単なアプリです。
いつもデザインに凝ってしまい、アプリ作成に時間がかかってしまっていたので今回はBootstrapを導入して省エネ化を図りました。
それでもそれっぽいデザインになるのがBootstrapのすごいところですね。
Webアプリですので、いちいちブラウザを開かないと登録ができないというのは非常に面倒くさく、LINEからも登録出来たら便利じゃね?ってことでLINE BOTも作成しました。

LINEで日付をどう入力するか、送られてきた画像をどのようにS3に格納してアプリ上で表示するかといったあたりが今後の課題です。
Webアプリ上のアカウントとLINEアカウントを紐づける必要があるので、よく目にするLINEでログイン機能も実装しました。
Oauthの仕組みを使っており、最近業務で勉強したため取り入れてみることにしました。
また、LINEでログイン機能を使用するために通信をSSL化する必要もあったので、Let's encryptという無料のSSL証明書を利用してHttps化を図りました。

今回作ったLINE BOTはこちらのQRコードより追加できるので試してみてください。
最低限の機能しか実装していないので、押しても反応しないメニューボタンがありますが許してください。
アプリを公開するからにはと思い、ドメインもしっかりと取得しております。
AWSのRoute53からでもドメインを取得できるのですが、少し高めなのでお名前.comで取得しました。
こだわりさえなければ1円からドメインを取得できるので非常にお得です。
ぜひみなさんも好きなドメインを取ってみてはいかがでしょうか。
僕はRPGの定番勇者ネーム「あああああ」をもじって「aaaaa.work」のドメインを取得しました。
AWSの無料枠を使い倒す
AWSの学習を進める上で、実際に触ってみるのが一番早いと思います。
アカウント作成から1年以内であれば無料で使えるものと、無制限で無料枠を使えるものがあります。
今回使用したサービスはRoute53以外無料で使えます!(Route53は50円/月くらい)
詳しくは以下のリンクを参考にしてください。
アマゾン ウェブ サービス - AWS製品の無料利用枠
どのサービスをどれくらいまで無料で使えるのかをしっかりと確認してくださいね。
インスタンスを立てすぎたり、停止し忘れるとしっかりと請求がきてビビります。
過去にRDSのインスタンスを複数立てた後、停止し忘れて3000円くらい請求が来ました、
AWSを学習に使うメリット

AWSを使った学習は、AWS自体の学習になるのはもちろんですがサーバーを立てたり、DBサーバーをいじる勉強になります。
というのも、AWSのコンソール上でポチポチするだけで色々なOS、色々なDBエンジンを触れるようになるんですね。
自分のPCに仮想マシンを立ち上げればできないことはないのですが、PC自体のスペックが高くないと動作が重くてイライラします。
また、いじり倒してサーバーを壊してしまっても簡単に作り直せるんです。
僕も今回アプリをデプロイする際に何回もぶっ壊しました!!
まとめると、AWSを学習につかうメリットは
- 色々なOS,DBエンジンが使える。
- いくら壊しても簡単に作り直せる。
- 自分で試行錯誤しながら学習することでより理解が深まる。
思ったよりもAWSを触るハードルは高くないので、ぜひ皆さんもチャレンジしてみてください。
最後に:学習をすすめる上で意識したこと
アプリやAWSの学習を進める上で意識したことが何点かあります。
まず一つ目として、「公式ドキュメントを読む」ことです。
実際、公式ドキュメントは英語だったり、変に翻訳された日本語だったり難しかったりなど、初学者にはハードルが高めですが、正確な情報がしっかりと書かれています。
また、WindowsやLinuxごとにドキュメントが用意されている場合もあるので、自分の環境に合った情報が得られるんですよね。
確かにQiitaやStack Overflowにも有益な情報が転がっていますが、間違った情報や筆者の環境特有の情報など、参考にならない情報も溢れています。
なので正とするリソースは公式ドキュメント、あくまでも補足的情報として QiitaやStack Overflowを活用するというのが望ましいでしょう。
次に二つ目は、「できる範囲でやろうとしない」ことです。
今までに学習した範囲内でできることでアウトプットをしがちですが、できないこも含めて構想を練ることで、更にできることが広がっていきます。
僕も実際、Railsでアプリを作るぐらいしかできませんでしたが、AWSに乗せてみよう!とか、LINE BOTを連携させてみようとかやってるうちにどんどんできることが増えていきました。
よっぽど難しいことじゃない限り、情報はネット上に転がっているのでチャレンジすることが大事です。
最後に、「できたアプリを友達に見せる」ことです。
自分でアプリを作る友達って周りにあんまり多くないですよね?
なので、自分で作ったアプリを友達に見せると大体はすごいとほめてくれます。
また、こんな機能ないの?ですとか、ここ不具合?など教えてくれるのでアプリのブラッシュアップにもつながります。
作ったアプリは積極的に公開して、フィードバックをどんどん得ていきましょう。