toraMasa's blog

Railsガイドv6.0全部読む#4-1 Action Controllerの概要編

railsguides.jp

1 コントローラの役割

  • コントローラはモデルとビューの間を仲介する
  • リクエストを受け取り、適切な出力を行う

2 コントローラの命名規則

  • コントローラは複数形であることが望ましい
    • resourcesで一括ルーティングできる

3 メソッドとアクション

4 パラメータ

  • Railsではクエリ文字列パラメータとPOSTデータをどちらもparamsハッシュで取得できる
  • paramsでids=["1", "2", "3"]を渡すには、以下のようにする
GET /clients?ids[]=1&ids[]=2&ids[]=3
  • パラメータの値はすべて文字列
  • paramsにnilがあると自動で[]に置き換えられる
  • paramsではキーとしてシンボルも文字列も指定できる
  • config.wrap_parameters, wrap_parametersはじめて知った
    • ちょっとよくわからん
  • 4.3ルーティングパラメータどういう意味かわからない
  • default_url_optionsもはじめて知った
    • 'I18n.locale'ってなんや
  • requiredなパラメータないと400帰る
  • 'Person.create(params[:person])'これだめなんだ。
  • permitのとこに書くやつは許可済みスカラー値って名前らしい
  • Numericってなんや
  • TrueClass、FalseClassっていうのがあるの初めて知った
  • permit!は要注意。
    • 使われてるの見たこと無いけど。
  • ネストしたパラメータ複雑。
  • 4.5.3 その他の事例ようわからん

5 セッション

  • セッションはコントローラとビューのみ利用できる
  • セッションの保存先ストレージ全部初めて知った
    • デフォルトはCookieStore
    • セッションIDは必ずcookieで渡す
    • 正直セッションとCookieの意味よくわかってない
  • モデルインスタンスは基本的なRubyオブジェクトではない?
  • lazy_loadは理解したがeager_loadの意味を忘れた
  • メモ化ってなに
  • flash.keepって初めて知った

6 Cookie

  • Railsではcookieをhashのように扱える。
  • cookieに複雑なオブジェクトを保存するとJSONとして変換されないケースがあるので、できるだけ単純な値だけを保存するようにする。

7 XMLJSONデータを出力する

8 フィルタ

  • フィルタにはbefore, after, aroundがある
    • aroundはbeforeとafter両方で実行される
    • aroudでは必ずyieldを実行しないといけない
      • yieldってなんすか
  • 一般的にはprivateメソッドを定義して、そのメソッドをフィルタとして追加する
    • ブロックとして与えることもできる
    • sendメソッドを使うとprivateメソッドを呼び出せる
    • クラスを渡すならbeforeメソッド必要
      • beforeメソッドって初めて知った

9 リクエストフォージェリからの保護

  • リクエストフォージェリを防ぐ第一歩は、RESTful規則にそってアプリケーションを開発すること
  • リクエストの偽造から保護するには、すべてのリクエストに予測不可能なトークンを追加すること
  • formヘルパーを使っていたら心配ない。APIとかを作るときには気をつけないといけないと思うけど、あんま書いてない。書いて欲しい。

10 requestオブジェクトとresponseオブジェクト

11 HTTP認証

  • RailsではBASIC認証とダイジェスト認証がビルトインされている

12 ストリーミングとファイルダウンロード

  • send_data, send_fileメソッドでファイルを返せる
    • 前者は新しくファイルを作成する場合、後者は既存のファイルを返す場合に使う
    • PDFって文字列だったんだ
  • ただし利点はあんまない。publicフォルダに置いておいてwebサーバーからダウンロードさせる方が良い。
  • mixin = includeで使用すること
  • カラオケアプリを作る時はストリーミングを使う
    • むずい。ようわからん

13 ログをフィルタする

  • ログに出力したくない情報をフィルタリングできる
    • 使ったことないんだけど大丈夫なんだろうか。

14 Rescue

  • Procオブジェクトってなんぞや
  • rescue_fromにExceptionとかStandardErrorを指定しないほうが良い

15 HTTPSプロトコルを強制する

  • configで設定できる

サマーインターンかんたんに振り返る

はじめに

2020の夏休みにいくつかサマーインターンに参加しました。本当は一つ一つブログに書こうと思ってましたが、時間がなくて後回しにしているうちに忘れてしまいそうなので全部まとめて軽く振り返ります。

参加したインターン

振り返り

サイバーエージェント

www.cyberagent.co.jp

これは詳細を別記事に書きました。

toramasa.hatenablog.jp

某社

概要

やったこと

選考

  • ES + 面接

感想

  • 詳細を記事に書いて公開して良いか聞いたんですが社内の審査がすごい大変そうだったので公開は控えます。
  • でもめちゃくちゃ楽しかったし社員の方がすごいエンジニアばかりでした。参加したハッカソン型のインターンの中では自分的には一番良いものを作れたと思ってます。

AWS

概要

aws.amazon.com

  • 期間: 3日間

やったこと

  • AWS のサービスを組み合わせてお客様の課題解決を技術的に支援するソリューションアーキテクトの業務を想定して、学生数名チームで実在する大規模コンシューマー向けサービスを実現するアーキテクチャを設計し、その内容を他のインターン参加者や社員に対して発表するという課題を予定しています。インターシップのプログラムの中には他のポジションの紹介や、社員との交流会も予定しているため、Amazon/AWSのカルチャーやキャリアパス等についても学べる場となっております。当インターンシップは選考直結型のプログラムです。
  • 自分はwell architected frameworkの勉強をしていたのとAWSの構築・運用の経験が一応あったのでアーキテクチャの設計や質疑応答等を中心になってやっていました。
  • ただ質疑応答で社員の方に見事に論破されて結果負けたので責任を感じてます。

選考

  • レジュメ + 技術課題 + (面接)

感想

  • インフラは個人だと取り組める範囲に限界があるので貴重な経験でした。
  • 個人的に面白かったのは、懇親会に社員の方がスライドを作ってきていたことです。笑 学生がポテチを食いながら社員さんのLTを聞いているのがシュールでした。(Amazonってスライド作っていいんだ。。。笑
  • あとアレクサをもらいました。

Sansan

概要

www.wantedly.com

  • 期間: 1day

やったこと

  • 名刺アプリ作成ワークショップ(Rails)

github.com

選考

  • ES

感想

  • 参加する前は1dayのインターンって役に立つのかな、と思っていましたがめちゃくちゃ参加してよかったです。(本当は就業形に参加したかったんですが書類選考で落ちました。書類選考で落ちたのはここだけだったので辛かった)
  • コードレビューめっちゃ丁寧にしてもらえて勉強になりました。コードきれいって言ってもらえて嬉しかった。
  • CTOの藤倉さんの話をめちゃくちゃ聞くことができて最高でした。

Cookpad

概要

internship.cookpad.jp

  • 期間: 5日間

やったこと

  • 1.5日 web開発講義(RailsAWSのCodeDeployを使ったCI/CD環境構築)
  • 1.5日 サービス開発講義
  • 2日 PBL

github.com

選考

  • ES + プログラミングテスト + 面接

感想

  • 一番おもしろかったです。技術だけじゃなくてサービス開発とは、みたいなところを学べました。こんなにサービスについて真剣に考えたことははじめてだったのでしんどくもあり楽しくもありという感じでした。
  • ここでFigmaがっつり触ったおかげで後々のインターンでモック作ったりするとき役立ちました。Figmaは色々使えて便利。

toramasa.hatenablog.jp

github.com

techlife.cookpad.com

NTTドコモ

概要

information.nttdocomo-fresh.jp

やったこと

感想

  • 色々あって自分ひとりで全部開発したのでちょっと辛かったです。
  • クラッシャー気味な人がいて、その人ともうまくやろうと試行錯誤する中でファシリテーションだったりリーダーシップ的な能力の大切さを実感できました。

ハウテレビジョン

概要

www.wantedly.com

  • 期間: 6日間

やったこと

  • 外資就活ドットコムを運営するハウテレビジョンは実務経験型のエンジニアインターンを開催します。
  • インターンでは、みなさんが使っている「外資就活ドットコム」の機能を実際に開発、リリースするまでを目指していただきます。 いつも使っているサービスを、自分が書いたコードで動かす、みんなが使う、そんなエキサイティングな経験をしてみませんか。 期間中は参加者同士でチームを組み、メンター社員のサポートのもと新機能開発に挑戦していただきます。

選考

  • ES + 面接 + プログラミングテスト

感想

  • GoでCRUDを一通り書けるようになりました。
  • Goで書かれたプロダクションコードをはじめてがっつり読みました。クリーンアーキテクチャよくわかってなくて大変でした。笑
  • 心配になるくらい待遇が良かったです(参加10万 + 優勝するとプラス10万、寿司とか叙々苑弁当が毎日出ました)。
  • やたら東大生が多かったです。

Wantedly

概要

www.wantedly.com - 期間: 3週間の就業形インターン

選考

  • アンケート + (プログラミングテスト) + 面接

感想

  • これは今やってる最中なので終わったら別記事に書く予定です。

最後に

  • 時間的に参加できなかったものもありますが、色々経験できて良かったです。
  • ただその分インプットに割ける時間はあまりなかったので、今学期はCS等の勉強に時間を使いたいと思ってます。
  • 貴重な経験をさせて頂きました。本当にありがとうございました。

Railsガイドv6.0全部読む#2-1 Active Record の基礎編

https://railsguides.jp/active_record_basics.html

Railsガイド

1 Active Recordについて

  • Active Record
    • MVCのMに相当する
    • ORMフレームワーク
    • 『Patterns of Enterprise Application Architecture』という書籍で記述されたパターンの一つ

2 Active RecordにおけるCoC(Convention over Configuration)

  • モデル名やテーブル名には命名規則がある

    • それに従えば、自動で色々メソッドを生やしたりしてくれる
  • 特定のカラム名は予約されている

3 Active Recordのモデルを作成する

  • Active RecordモデルはApplicationRecordクラスを継承すれば良い

4 命名ルールを上書きする

  • Active Recordは基本的にモデル名から自動でテーブル名を推測するが、もちろん明示的に指定することもできる

5 CRUD: データの読み書き

  • Active RecordはCRUD操作に必要なメソッドを自動で生やしてくれる

6 バリデーション(検証)

  • モデルがデータベースに書き込まれる前にモデルの状態を検証できる。
    • 属性が空じゃないか
    • 属性が一意か
    • 特定のフォーマットに沿っているか等

7 コールバック

8 マイグレーション

感想・メモ

  • コールバック以外はだいたい知ってた
  • destroy_byとかdestroy_allは知らなかった
  • update_allも初めて知った

    • 結構知らんやん
  • Active RecordはRails最大の利点らしいのでじっくり読む

わかんないとこ

  • コールバック
  • bin/railsのbinってなんだ?

UIデザインに入門してみた

今回勉強したこと

www.figma.com

  • なるほどデザインを読んだ

books.mdn.co.jp

Figma入門

所要時間: 2時間(自分はダラダラやったので3時間かかった)

Chapter 1: Figmaの概要とセットアップ

note.com

要約

  • Figmaに登録した
  • Figmaはすごい
    • Figmaの利点はオンラインで共同編集できること
    • 欠点はリッチなインタラクションを作れないこと(欠点というよりそういう目的のツールではない)

メモ

  • Figmaスマホアプリ使えば実機での検証もできる。。。すごすぎる
  • Zeplinってプロトタイプを渡すためのツールだったのか。じゃあFigmaでええやん
  • Figmaデスクトップダークモードに対応してほしい リンク四角いの貼る

Chapter 2: Figmaの基本操作

note.com

要約

  • Frameとかボタンとか作った

Chapter 3: Figmaのレイヤーを扱う

note.com

要約

  • Figmaにおけるレイヤーの概念を理解した
  • グループ化やページ分け等の利点を確認した

Chapter 4: コンポーネントとスタイル

note.com

要約

メモ

Chapter 5: プロトタイピング

note.com

要約

  • プロトタイピングの方法を学んだ
  • とにかく実機テストがすべて
    • その際スマホスタンドがあるとやりやすい
      • ぽちった

Figmaが目指すデザインのあり方

note.com

要約

  • デザインの大きな3つの変化
    • ピクセルの操作からアイデアの操作へ
    • 完成品から永遠の未完成品へ
    • デザイナーのものからみんなのものへ

なるほどデザイン

  • 読んだ

学び

  • Figmaを利用して実機を用いたプロトタイプを協同で作成する方法を学んだ
  • Figmaがなぜ使われているか理解した
  • UIについてはエンジニアも理解する必要があるとわかった
  • デザインについて雰囲気で理解した

感想

  • Figmaの誕生によってデザインがだいぶエンジニアにもやりやすいものになったと思った
  • デザインはサービスの重要な付加価値の一つだし、必ず理解したい
    • というかサーバーレスとかの傾向から行くと必須なのではとすら思う
  • デザイナーってすごい

  • 関係ないけどはてなブログは編集途中の内容を自動でバックアップしてほしい。esaみたいに。間違えて別のボタン押したら消えた。

Railsガイドv6.0全部読む#1 Railsをはじめよう編

Railsガイド

背景

  • RailsGuideを何度も読めばRuby on Railsのことは8割わかるとのご意見を聞いたので、全部読む
  • 以下はメモです。

1 本ガイドの前提条件

  • 読者にRailsの経験がないことを前提としています。って書いてあるけど、それはきついのでは?

2 Railsとは何か

  • DRY
  • 設定より規約が優先されるの意味があんまよくわからない

3 Railsプロジェクトを新規作成する

  • フォルダの目的とか以外と知らないことが結構ある

4 Hello, Rails!

  • javascriptランタイムってなんだ
  • Pumaってwebサーバーだったのか。。
  • '一般に、Railsの開発モードではファイルに変更を加えた場合でもサーバーを再起動する必要はありません'
    • 最近再起動しないとエラーが出るようになったんだけど俺だけかな?
  • スモークテスト
  • hamlとかslimとかはどういう風に使い分けられているのかな?
  • ERBを処理するコードはどんな感じ?
    • 辛そう
  • invokeってなんだ

5 アプリケーションの実装と実行

  • RESTに対する理解足りない
  • フォーマットとかハンドラーの部分がちょっと難しかった
  • formビルダーのlocal: trueってなに
  • 'form_withはデフォルトではAjaxを用いてフォームを送信するため、完全なページリダイレクトはスキップされます。本ガイドでは説明を簡単にするためlocal: trueを無効にしてあります。'どゆこと
  • マイグレーションRubyのクラス
  • hogehoge_paramsを外部がpublicメソッドだったときに考えうるリスクってなに
  • /articles/:id(.:format)のformatってなに
  • 'CRUDアクションは、多くの場合index、show、new、edit、create、update、destroyの順で配置されます'
    • 知らなかった。気をつけよう
  • Railsガイドって誰が書いたんだ?
  • ビルトインヘルパーって何
  • pluralizeってRailsのメソッドなんだ
  • パーシャル=部分テンプレート
  • protectedメソッドてなんだ
    • OOPの理解が足りない
  • rails-ujsの役割を初めて知った

6 2番目のモデルを追加する

7 リファクタリング

8 コメントを削除する

9 セキュリティ

  • BASIC認証はなんとなくわかるけど、他のよく知らない。。。
    • Authlogicというgemはじめてしった。devise一強だと思ってた。

10 次に学ぶべきこと

第二弾はActive Recordの基礎

11 設定の落とし穴

Railsでの無用なトラブルを避けるための最も初歩的なコツは、外部データを常にUTF-8で保存しておくことです。このとおりにしないと、RubyライブラリやRailsはネイティブデータをたびたびUTF-8に変換しなければならず、しかも場合によっては失敗します。外部データを常にUTF-8にしておくことをぜひお勧めします。
  • Railsがデータベースから読みだしたデータをUTF-8に変換するタイミングはいつ

学び

感想

  • Railsガイドの構成が、モデル -> ビュー -> コントローラーなのが不思議。自分はモデル -> コントローラー -> ビューの順番に重要だと思うから(というかビューは比較的重要性が低いと思っている)。
  • Railsを学ぶ最大のメリットは、歴史上最も成功したwebフレームワークの一つであるRailsを通して、webアプリケーションフレームワークの思想や原則(The Rails Way)を身につけられるのが最大のメリットかなと思う。
  • 知らないことが大量にあって恥ずかしく思った。
  • めっちゃ勉強になる。
  • 勉強したいことがたくさんあるので、優先順位をつけてうまく片付けていきたい。
  • 1h21min

引用

Railsガイドv6.0

AWSのハンズオン色々やってみる#2 Well-Architected-Framework編

背景/目的

  • AWS上でProduction Workloadを動かすためにHigh Availableなアプリケーションを動かすにはどうすればいいか」について学びたかった
  • Well-Architected Frameworkのデモの一部で、EC2, RDS, Availability Zoneそれぞれの障害に対してどのようにして立ち向かえば良いのか。ということについて概要を掴む

Well-Architected Frameworkとは?

ハンズオン 'LEVEL 300: TESTING FOR RESILIENCY OF EC2, RDS, AND AZ'

introduction

  • 'Everything fails, all the time'というアマゾンのCTOの@Wernerの言葉が面白かった

1 DEPLOY THE INFRASTRUCTURE AND APPLICATION

1.1 AWSコンソールにログインします

  • AWS EduでやろうとしたらIAM作成の権限がなくて詰んだので、個人のアカウントで進めることにした
    • コンソールへのログイン権限はオプショナルって書いてあるけど、多分必須
    • あとこれはあんま良くないかもだけど、PowerUserAccessポリシーだけだとうまくいかなかったのでAdministratorAccessポリシーつけた

1.2既存のサービスにリンクされたロールの確認

  • サービスにリンクされたロール用にCloudFormationをセットアップするってのにめっちゃ詰まった
    • よく見たらこの段階ではすでにリンクされてるロールを確認するだけで良かった

1.3「デプロイメントマシン」を作成する

  • スタック名コピーするとスペースが謎に入っててエラーでるので注意
  • なぜかRollBackされた(TOT) ✕ 5
    • LambdaCustomResourceRole-SecureSsmForRds already exists
    • The following resource(s) failed to create: [WebAppLambdaRole, StateExecutionRole, AutoScalingServiceRole, VPCLambdaRole, RDSLambdaRole, LambdaCustomResourceRole, RDSRRLambdaRole, WaitForStackLambdaRole, DMSLambdaRole]. . Rollback requested by user.
    • 単一リージョンにしたり設定いじってもだめ。。。
    • CloudFormationテンプレートをいじったらいけた。
"LambdaCustomResourceRole": {
      "Type": "AWS::IAM::Role",
      "DeletionPolicy" : "Retain",
      "Properties": {
          "RoleName": "LambdaCustomResourceRole-SecureSsmForRds",//←これを違う名前に変える
          "AssumeRolePolicyDocument": {
              "Version": "2012-10-17",
              "Statement": [
                  {
                      "Effect": "Allow",
                      "Principal": {
                          "Service": [
                              "lambda.amazonaws.com"
                          ]
                      },
                      "Action": [
                          "sts:AssumeRole"
                      ]
                  }
              ]
          },

1.4インフラストラクチャをデプロイしてサービスを実行する

  • カッコいい!!
    • マルチリージョンだとインフラとサービスの展開に1時間弱かかるので注意が必要。
  • 失敗した
{
  "error": "Something failed to deploy",
  "cause": "DeploymentFailed"
}
  • いや、それじゃわからん(TOT)
  • 色々ログを見てたら次のメッセージを発見
Exception=[class software.amazon.awssdk.services.kms.model.KmsException] ErrorCode=[AccessDeniedException], ErrorMessage=[An error occurred (AccessDeniedException) when calling the CreateKey operation: You don't have the kms:TagResource permission that is required to add tags during key creation.]

f:id:toraMasa:20200830184749p:plain

試したこと

  • kms:TagResourceを追記
  • RoleNameが消えてないみたいなので前のと変える
  • これでスタックに積んであるResiliencyVPCとMySQLforResiliencyTestingは通ったが、失敗には変わらず。。。
  • 失敗してそうなDeployRDS2にログがない
  • DeployFailedState2のログ
{
  "log_level": "DEBUG",
  "region_name": "us-west-2",
  "secondary_region_name": "us-east-2",
  "cfn_region": "us-east-2",
  "cfn_bucket": "aws-well-architected-labs-ohio",
  "folder": "Reliability/",
  "workshop": "300-ResiliencyofEC2RDSandS3",
  "boot_bucket": "aws-well-architected-labs-ohio",
  "boot_prefix": "Reliability/",
  "websiteimage": "https://s3.us-east-2.amazonaws.com/arc327-well-architected-for-reliability/Cirque_of_the_Towers.jpg",
  "vpc": {
    "stackname": "ResiliencyVPC",
    "status": "ROLLBACK_FAILED"
  }
}
  • わからんw
    • スタックではResiliencyVPCは成功している

単一リージョンでやり直してみる

CloudFormationテンプレートの値をいじる

  • LambdaCustomResourceRole-SecureSsmForRdsを毎回違う値にする
  • Policiesを編集
"Policies" : [ {
          "PolicyName" : "CreateVPC",
          "PolicyDocument" : {
            "Statement" : [ {
              "Effect" : "Allow",
              "Action" :  [
                (中略)
                "kms:TagResource",//これを追記
                (中略)
              ]
            }
            ]
          }
}
]

ステートマシンを作り直して再実行

  • できた!!(TOT) f:id:toraMasa:20200830184728p:plain
  • クロスリージョンの復元力のテストもしたかったけどやむなし。

  • と思ったらWebServersForResiliencyTestingが失敗してた(TOT)

    • ここまで6時間
The default Service-Linked Role for Auto Scaling could not be created.
  • CreateServiceLinkedRoleがfalseになってるから?
    • "WebAppLambdaRole" > "Policies" > "Action"に"iam:CreateServiceLinkedRole"を追加した
    • WaitForVPCStackでこけた
    • TypeError: not all arguments converted during string formatting
    • これによるとCreateServiceLinkedRoleはautoscaling policiesに関係してるっぽいのでtrueにして作り直した

1.5テストWebサービスのWebサイトを表示する

2 CONFIGURE EXECUTION ENVIRONMENT

2.1 AWS認証情報と設定をセットアップする

  • これbashだけでいいのかな?それともbash + なにかなのかな?
    • bashだけで良い。どれか一つで良い。

2.2 bash環境を設定する

  • 特になし。

2.3プログラミング言語環境をセットアップする(PythonJava、C#、またはPowerShell用)

  • skip

3 PREPARATION FOR FAILURE INJECTION

準備

  • ページを何回かリロードするとAZとinstance_idが変わることを確認。

4 TEST RESILIENCY USING EC2 FAILURE INJECTION

4.1 EC2障害の挿入

  • fail_instance.shを実行したら
You must specify a region. You can also configure your region by running "aws configure".
  • AWS CLIを使用するための初期設定をしていませんでした。
$ aws configure
AWS Access Key ID [None]: <Access Key ID>
AWS Secret Access Key [None]: <Secret Access Key>
Default region name [None]: us-east-2
Default output format [None]: json
  • もう一回実行
./fail_instance.sh <vpc-id>
  • 実行結果
{
    "TerminatingInstances": [
        {
            "CurrentState": {
                "Code": 32,
                "Name": "shutting-down"
            },
            "InstanceId": "i-0ba4f56494209d445",
            "PreviousState": {
                "Code": 16,
                "Name": "running"
            }
        }
    ]
}
  • なんか1個増えたけどいいのか?! f:id:toraMasa:20200830184837p:plain
    • Amazon EC2 Auto Scalingがすべてのアベイラビリティーゾーン全体のバランスを自動的に維持したっぽい
    • てかそれを確認するための作業だった笑

4.2 EC2インスタンスの失敗に対するシステムの応答

4.2.1システムの可用性

  • ウェブサイトは引き続き利用可能→OK
  • 残りの2つのEC2インスタンスは、すべてのリクエストを処理しています→3つのインスタンスが動いてるんだけど?笑

4.2.2負荷分散

  • 異常から自動で回復していることがわかります。 f:id:toraMasa:20200830184851p:plain

4.2.3自動スケーリング

4.2.4 EC2障害の挿入-結論

  • 複数のサーバーとELBをデプロイしたことによって、特定のサーバーに異常が発生したとしても、自動で正常なサーバーにトラフィックが割り振られることを確認した。
  • AWS Auto Scalingが異常なホストを削除し、正常なホストに置き換えることを確認した。
  • それによって、高い可用性が実現されていることを確認した。

5 TEST RESILIENCY USING RDS FAILURE INJECTION

5.1 RDS障害の挿入

  • 以下のコマンドを実行。
./failover_rds.sh <vpc-id>
  • 実行結果は長いので省略するが、コンソールにこれが出ればOK
Failing over md5fz4eklwy6vh

5.2 RDSインスタンス障害に対するシステムの応答

  • 上記を実行してwebページを読み込むと、応答しなくなる。
    • しばらくして(といっても数十秒)再度読み込むと、504が出る。
      • (同上)502に変化
        • ページが正常に表示されるようになる。フェイルオーバーが完了したということ。
  • フェイルオーバーが完了すると、プライマリインスタンスとスタンバイインスタンスが入れ替わる。
  • ログからも、フェイルオーバーの完了を確認
August 30th 2020, 6:34:49 am UTC
Multi-AZ instance failover started.
August 30th 2020, 6:35:09 am UTC
DB instance restarted
August 30th 2020, 6:35:43 am UTC
Multi-AZ instance failover completed

f:id:toraMasa:20200830184919p:plain

  • Target GroupとAuto Scaling Groupのコンソールでもフェイルオーバーを確認した。

5.2.4 RDS障害挿入-結論

  • RDSのDBのフェイルオーバーは1分未満で完了することを確認した。
  • Auto Scalingが異常を検知し、新しいインスタンスを立ち上げるのに??分くらいかかった。
  • つまり、RDSに障害が発生した場合、約??分サービスは利用不可状態である、ということ。
    • ハンズオンの資料には4分って書いてあるけど、1分30秒くらいで自分はできた。

5.2.5 [オプション] RDS障害挿入-回復力の向上

6 TEST RESILIENCY USING AVAILABILITY ZONE (AZ) FAILURE INJECTION

6.1 AZ失敗の挿入

シナリオ1

$./fail_az.sh us-east-2c <vpc-id>

シナリオ2

./fail_az.sh us-east-2b <vpc-id>

6.2 AZ障害に対するシステムの応答

シナリオ1

  • シナリオ1では、プライマリDBインスタンスのあるAZとは異なるAZを停止させる。
  • Webサイトは中断することなく表示される。
  • ちょっとよくわかんない

シナリオ2

  • Webサイトにアクセスできないことを確認
    • RDS障害のテストと同じ。フェイルオーバーしてAuto Scalingで新しいインスタンスが立ち上がるまで、Webサイトはアクセス不可能になる。

結論

  • 複数のAZにWebシステムのすべての層が存在するため、一つのAZが完全に(もしくはALBとWebサーバーが)機能停止しても、サービスを提供し続けることができる。

7 TEST RESILIENCY USING FAILURE INJECTION - OPTIONAL STEPS

  • S3については独自のものを使わなかったのでここはスキップした。

8 TEAR DOWN THIS LAB

  • 環境も一旦残しておくことにした。 - ちなみに、このハンズオンを通じてお金は特にかかりませんでした(無料期間中) →このワークショップで作った環境を一ヶ月放置すると無料期間中でも70ドルくらいかかるみたいです。絶対消しましょう。

トラブルシューティング

わからなかったところ調べた

学び( != 感想。技術的な学びをかく)

  • AWSのWell-Architected Frameworkにおける、EC2,RDS,AZそれぞれの障害に対する回復のテストを通じて、High Availableなアプリケーションを実現するためのアーキテクチャについての知見を得られた。

感想

  • Cloud Formationかっこいい
    • Cloud Formationに限らず、infra as codeってかっこいい
  • セットアップ済みのアカウントみたいな探してやったほうがよかったかも?
  • メンテとかされてなかったのか、辛いハンズオンだった
    • すらすら行くより勉強になったかもw
    • 費やした時間のほとんどが一章。。。笑

ネクストアクション

  • CloudFormation Templateを深堀り
  • サーバーレスについて勉強する
  • (AWSの資格の本読んで見る)
  • ALBとは読む

謝辞

  • インターン先の先輩にこのハンズオンを教えて頂きました。ありがとうございました。

AWSのハンズオン色々やってみる#1 スケーラブルウェブサイト構築編

概要

WordPressを具体的にして、EC2/VPC/RDS/ELBを利用し、スケーラブルなWebシステムの構築を行うハンズオン

1 ハンズオン全体の流れの紹介

2 Amazon VPCの作成

3 Amazon EC2の作成

  • シェルスクリプト色々書いてみたい、かっこいい
  • ブラウザからssh接続する方法(ec2 instance connect)初めて知った

4 Amazon RDSの作成

  • セキュリティグループってなんだ
  • インバウンドルールとアウトバウンドルール

5 ELB の作成

  • なんでAZ aとc?
  • Lambdaってよく聞くけどなに
  • ヘルスチェックってなに
  • healthyってなんかいいね

6 WordPressの初期設定

7 AMIの作成と作成したAMIから2つ目のEC2インスタンスの起動

  • AMIってなに
  • ターゲットグループってなんだっけ

8 RDSのマルチAZ配置

  • めっちゃかんたんw

9 Webシステム全体の可用性の確認

1台のEC2を停止して、冗長性を確認

RDSのフェイルオーバー

  • あんまやってる感ない笑

10 補足 & まとめ & 今後のラーニングパス・作成したAWSリソースの削除

  • Solution Architectってどんな仕事?

EC2へのアクセス方法

Learning Paths

同じアーキテクチャで別のアプリケーションを作ってみる

  • EC2(Nginx + Rails) + DB(Postgres)

Auto Scalingを利用してみる

  • 節約になるのか?

負荷のオフロードを行ってみる

  • CloudFront + S3で配信
  • セッション・キャッシュストレージとしてElastiCacheを利用する

レーニングコースの受講

資格取得のための学習

  • AWSの資格はどんな物がある?

他のAWSハンズオンやる

  • Serverlessハンズオン
  • ネットワーク入門

感想

  • スケーラブルで冗長化したアーキテクチャを実践できるという観点で大変参考になるハンズオンでした。
  • 今までRails+Nginxのシステムを構築したことがあったものの、冗長性がない設計になってしまっていたということがわかりました。
  • とはいえELBとかたしか無料期間でも1日100円くらいかかった気がするのでAWS Eduとかないと結構しんどいなという気持ちもあります。
  • スピードもゆっくりではじめてやるには良いかなと思いました。
  • TCP/IPとかを読んでいると出てくる用語に混乱せずに済むかなと思いました。