Amazon Web Services 基礎からのネットワーク&サーバー構築 メモ

2章

やること VPC領域にネットワークを構築する

  • IPアドレスとはインターネット上の住所
  • 2進数32ビットで表現される 例: 11000000101010000000000100010100
  • 2進数だと人間にとってわかりにくいので、8bit区切りで10進数に変換して表現する 192.168.1.20
  • インターネットと接続する時に使うIPアドレスのことをパブリックIPアドレスと呼ぶ

    パブリックIPアドレスICANNという団体が管理している

  • インターネットと接続しない内部のネットワークで使うIPアドレスをプライベートIPアドレスと呼ぶ

  • IPアドレスはネットワーク部とホスト部に分割される
  • 同じネットワークに属するホストA, Bのネットワーク部の値は同じになる
  • ホストに割り当てるIPアドレスの範囲は2のN乗の値にするルールがある
  • 192.168.1.0~192.168.1.255の場合、192.168.1がネットワーク部、0~255がホスト部となる

    .で区切られた値は0~255のいずれかの値になるので、IPアドレスは256種類となる

  • CIDR表記 ネットワーク部をprefixとし、prefixが何ビットかを明記する

    • 例 192.168.1.0~192.168.1.255の場合、192.168.1がネットワーク部になる
    • 8ビットづつ区切られているので、8 x 3で24ビット
    • 192.168.1.0/24
  • サブネットマスク表記はプレフィックス(ネットワーク部の)のビット数だけ2進数の1を並べ、ホスト部は0とする
    • 192.168.1.0~192.168.1.255の場合、192.168.1 がネットワーク部になる
      • ネットワーク部の値をビット数分2進数の1を並べると 11111111.11111111.11111111 となり、10進数に変換すると255.255.255となる
      • ホスト部を0とする
      • 上記2つを合わせると255.255.255.0となる
      • 192.168.1.0/255.255.255.0 と表現できる (雑に捉えると255がネットワーク部、0がホスト部とわかる)
  • 以下3つは同じ

    • 192.168.1.0 ~ 192.168.1.255
    • 192.168.1.0/24
    • 192.168.1.0/255.255.255.0

    CIDR表記とサブネット表記の違いはビット数で表すか、ビット数を255で表現するか

  • VPC領域には10.0.0.0/16を割り当てる

    • なぜ10.0.0.0/16なのか..?
      • プライベートIPアドレスは範囲が決まっていて、クラスAの範囲を採用
        • クラスA 10.0.0.0~10.255.255.255
        • クラスB 172.16.0.0~172.31.255.255
        • クラスC 192.168.0.0~192.168.255.255
      • ホスト部は16ビット以上でなければならないAWSの制約がある
    • 10.0.0.0/16は10.0.0.0~10.0.255.255となるので、IPアドレスは65536種類となる
  • 10.0.0.0/16をさらに分割する

    • 256のサブネットに分割する(実際に使うのは256のサブネットのうち2つ)
      • aaaa.bbbb.cccc.dddd
        • 10.0.0.0/16だと10.0までがネットワーク部だったが、10.0.0をサブネットとする
        • 256個のサブネットが作成され、各サブネットはddddを256個持つ
      • 10.0.1.0/24 をパブリックサブネットとする
        • 1は0~256の値を選べる
  • パブリックサブネット10.0.1.0/24をインターネットに接続する

    • インターネットゲートウェイを通じてインターネットを通信する
    • インターネットゲートウェイを作成してVPCに紐づける
    • ネットワークにデータを流すにはルーティングを設定する
      • データの単位をパケットと呼ぶ。
      • パケットには宛先のIPアドレスが含まれている。
      • ルーターが宛先IPアドレスを見て、アドレスに近いネットワークにパケットを送信し、最終的に目的地へと送り届ける。
      • 宛先のIPアドレスの値がいくつの時に、どのネットワークに流すかをルートテーブルに設定する
    • サブネットが作成された時にデフォルトでルーティングが設定されている

      • 送信先: 10.0.0.0/16 ターゲット: localhost パケットの宛先IPが10.0.0.0/16 の範囲であれば、自身のネットワークに転送するという設定。 インターネットからの通信、インターネットへの通信は、10.0.0.0/16 の範囲ではないため、通信が破棄される

      • 上記の問題を解決するため、10.0.0.0/16 以外(同一ネットワーク以外)の通信はインターネットゲートウェイに転送するようにするルーティングを設定し、ルーティングをパブリックサブネット10.0.1.0/24と紐付ける

        • パブリックサブネット10.0.1.0/24 → インターネット
          • パケットの宛先IPが10.0.0.0/16 の範囲外なので、インターネットゲートウェイに転送しインターネットへ
        • インターネット → パブリックサブネット..?
          • インターネットゲートウェイを通じてパケットが送られてくる
          • IPが10.0.0.0/16 以外なので紐付けたパブリックサブネットへ
    • デフォルトゲートウェイが、インターネットゲートウェイなルートテーブルをもつサブネットのことを、パブリックサブネットと呼ぶ

3章

  • EC2インスタンスにはプライベートIPを割り当てSSHで接続する
  • ルーター同士が通信してルートテーブルの情報をやりとりしてくれる
  • セキュリティグループでIPアドレス、ポート番号制限などのパケットフィルタリングを行う

4章

  • インバウンドルールにポート80へのアクセス許可を追加し、HTTP通信でブラウザからapacheの画面が開くことを確認する f:id:mashoo1101:20220312205520p:plain
  • ↑のオープンアドレスをクリックするとhttps:グローバルIPとなるので、httpに直してブラウザに入力する必要がある。
  • nslookupコマンドでDNSサーバーがどのように名前解決しているか調べる

5章

  • 特になし

6章

  • DBサーバーはインターネットから隔離したプライベートサブネットにおく
  • インターネットから隔離するので、パブリックIPアドレスは持たない
  • 同じネットワークに所属しているため、WEBサーバーを置いたパブリックサブネットからDBサーバーを置いたプライベートサブネットに通信できる
  • pingコマンドを返すようにするには、セイキュリティグループにすべての ICMP - IPv4を追加する
  • Webサーバーを踏み台とすることで、DBサーバーに接続する
    • ローカル → DBサーバーは繋げない
    • ローカル → Webサーバ → DBサーバー はOK!
    • ローカル(Mac)からSSHでWebサーバーに接続
    • WebサーバーからDBサーバーにSSH接続する

7章

  • プライベートサブネットはインターネットと繋がっていないためMariaDBをインストールできない
  • NATを使うとプライベートサブネット → インターネットの向きの通信ができるようになる(逆は不可)
  • プライベートサブネットとインターネットの間にNAT(Network Adress Translation)を挟む
    • プライベートサブネットからのパケットをNATは受け取り、パケットの送信元IPアドレスをNATのグローバルIPに置き換える
    • 接続先はNATからパケットが送られてくるように見える
    • 応答パケットはNATを通じて元のIPアドレスに置換してプライベートサブネットに戻る
  • NATゲートウェイはインターネットから接続可能な場所である「パブリックサブネット」に配置する
  • プライベートサブネットのデフォルトゲートウェイがNATゲートウェイを経由するように

8章

9章

感想

  • 2章が個人的に一番重かったが、ちゃんと読めば後の章はスラスラ読める
  • 9章のTCPあたりの話は別の本で補完したい

2022年2月振り返り

読んだ本

  • WebAPI Good Parts
  • さわって学ぶクラウドインフラ docker基礎からのコンテナ構築

やったこと

  • 自作アプリについて思いを馳せる
  • スパジアムジャポンに行った

3月の目標

  • 失敗から学ぶRDBを読みきる
  • 自作アプリ(Chrome拡張)をリリースする もうすぐPrime対象になる作品にあとN日で無料で見れますよ!と表示するChrome拡張を作る予定でしたが、普通に表示されていましたので作る必要はなくなりますた!! f:id:mashoo1101:20220305180921p:plain
  • TypeScriptのUdemyの講座を見る

  • キャリアについて考える

Vuetifyのv-slot:activator="{ on, attrs }"についてメモ

v-slot:activator="{ on, attrs }" が何をやっているのか理解できなかったのでメモ。

<v-tooltip bottom>
  <template v-slot:activator="{ on, attrs }">
     <v-btn
       color="primary"dark
       v-bind="attrs"v-on="on">
      Button
     </v-btn>
  </template>
  <span>Tooltip</span>
</v-tooltip>

以下の記事を読めば解決しましたが理解を深めるため自分の言葉でまとめます。

https://qiita.com/aotoriii/items/06ae49c135061a12b75

slotとは

Vuetify云々の前にslotについておさらい。

slotは親コンポーネントから子供コンポーネントで使うコンポーネントを渡せるVueの機能。

シンプルなスロット

<!-- parent-component.vue -->
<div>
    <child-component>
    Hello World
    </child-component>
</div>

<!-- child-component.vue -->
<div>
  message: <slot></slot>
</div>

message: Hello World が表示される。

スコープ付きスロット

コンポーネントが持っているプロパティを、親コンポーネントslotの箇所で参照できるようになる。

<!-- parent-component.vue -->
<template>
  <div>
    <MyCom v-slot:bind-user="parentComponentUser">
      {{ parentComponentUser.user.name }}
    </MyCom>
  </div>
</template>
<script>
import MyCom from '../components/MyCom.vue'
export default {
  components: {
    ChildComponet
  }
}
</script>

<!-- child-component.vue -->
<template>
  <div class="mycom">
    <p>name:<slot v-bind:bind-user="user">{{ user.age }}</slot></p>
  </div>
</template>
<script>
export default {
  name: 'MyCom',
  data () {
    return {
      user: {
          name: 'sano',
         age: 100
      }
    }
  }
}
</script>

child-componentuserというslotを定義している。またbind-userにリアクティブなオブジェクトuserをバインドしている。

コンポーネントでは、bind-userparentComponentUserに渡され最終的にsano が表示される。

上記のslotの例と同様に、Vuetifyのコンポーネントはそのコンポーネントにイベントが発生した時に表示するコンテンツをslotを使って渡すことができる。

<v-tooltip bottom>
  <!-- slot開始-->
  <template v-slot:activator="{ on, attrs }">
     <v-btn
       color="primary"dark
       v-bind="attrs"v-on="on">
      Button
     </v-btn>
  </template>
  <!-- slot終了-->
  <span>Tooltip</span>
</v-tooltip>

toolchipのサンプルコードからは以下のことがわかる。

onとは

https://vuetifyjs.com/ja/api/v-tooltip/#slots

ドキュメントにはイベントハンドラーを持つオブジェクトとある。

on: { [eventName]: eventHandler },

実際に試してみる。

<v-tooltip bottom>
  <template #activator="{ on, attrs }">
    <v-btn color="primary" dark v-bind="attrs" v-on="on" @click="clickOn(on)"> Button </v-btn>   
  </template>
  <span>Tooltip</span>
</v-tooltip>

<script>
export default defineComponent({
  setup() {
    const clickOn = (on: any) => {
      console.log(on)
    }
    return {clickOn}
  }
})
</script>

f:id:mashoo1101:20220305170940p:plain

Buttonをクリックするとconsoleにイベントハンドラーを持つオブジェクトが表示される。

v-on="on"とは

https://qiita.com/aotoriii/items/06ae49c135061a12b75e#v-ononとは で全て解説されているので詳細をこちらを確認してください。

結論を書くとv-on="{ [eventName]: eventHandler }” のようにイベント名とイベントハンドラをかける、ということです。先のconsole.logで確認したVuetifyが提供するイベントハンドラーが登録されます。ホバーしたときにthipを表示するといったコンポーネントの挙動を決めてくれています。

v-bind="attrs"

attrsはアクセシビリティ関連のオブジェクト。

以下の記事に詳しくまとまっていた。

https://qiita.com/Gedyra/items/9d05e10329808367396f

value: boolean

https://vuetifyjs.com/ja/api/v-tooltip/#slots

ドキュメントには明確に記載されていないがイベントハンドラが呼ばれたかの情報と思われる。

valueとonを利用するとiconにホバーした時にtooltipを出し、且つiconの色をかえるといったことができる。

<v-tooltip bottom>
  <template #activator="{ on, attrs, value }">
    <v-icon
      medium
      class="ml-1"
      :color="value ? '#0068B7' : '#757575'"
      v-bind="attrs"
      v-on="on"
    >
      mdi-help-circle
    </v-icon>
  </template>
 thipに出るテキスト       
</v-tooltip>

f:id:mashoo1101:20220305172148p:plain f:id:mashoo1101:20220305172210p:plain

まとめ

Vuetifyのコンポーネントは、slotコンポーネントの中身をカスタマイズでき、そのカスタマイズする内容にコンポーネントの状態を含めることができる。Vuetifyすげ〜。

docker-compose run web bundle installでGemをインストールした後に再度buildが必要な理由

前提

https://docs.docker.com/samples/rails/ を参考にDocker環境でRailsを起動

問題

fakerをGemfileに追記後、docker compose run web bundle install, docker compose upすると以下のエラーが出る。

docker-rails-sample-web-1  | /usr/local/lib/ruby/3.1.0/bundler/definition.rb:481:in `materialize': Could not find faker-2.19.0 in any of the sources (Bundler::GemNotFound)

https://docs.docker.com/samples/rails/#rebuild-the-application を読むとgemをGemfileに追記した後にdocker compose run web bundle install,docker compose up --build する必要がある。

なぜbuildする必要があるのか理解できなかったので整理する。

メモ

  • イメージとは -> コンテナの土台となる動作環境テンプレート

  • Dockerfileとは -> カスタムイメージを作るためのファイル

  • Buildとは -> Dockerファイルからイメージを作ること

docker compose run web bundle install

runコマンドについて

1 つのサービスに対して、1 コマンドだけ実行します。 runによって指定したコマンドは、定義されたサービス設定に基づいて生成された新たなコンテナー内において実行されます。

https://matsuand.github.io/docs.docker.jp.onthefly/compose/reference/run/

ポイントは新たなコンテナー内において実行されるということ。

bundle installでgemが追加される環境はrunコマンドによって作成されたコンテナーに限定される。

docker compose up

コンテナの作成、起動を行う

docker compose build

DockerFileを元にサービスのビルドを実行する。

DockerホストのGemfile, Gemfile.lockを元にbundle installを実行する

# 一部抜粋
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install

エラーが起きるまでの流れ

  1. Dockerホスト(Mac)のGemfileに追記すると、ボリューム先のGemfileも更新される
  2. docker compose run web bundle install を実行すると、コンテナが新たに作成され、そのコンテナでbundle install が実行され、faker gemがインストールされる。 またコンテナー、Dockerホスト のGemfile.lockが更新される
  3. docker compose up を実行すると、fakerをインストールしていないイメージを元にコンテナが作成されるが、Gemfile, Gemfile.lockにはfakerの記述あるので、エラーになる

結論

再度buildしイメージを更新しないとdocker compose up で作成されるcontainerの環境にgemがインストールされない。

回避策としてgem用のvolumeを作って永続化すれば、再buildしなくて済みそうです。

https://qiita.com/neko-neko/items/abe912eba9c113fd527e

おまけ buildした時に必ずbundle installが走るわけではない

  1. docker compose build
  2. 再度docker compose build するがgemのinstallのログは吐かれていない
  3. コンテナのgemのフォルダに移動して作成日時を確認すると、1回目のbuildの時刻と一致する

キャッシュしていることが原因。docker compose build -no-cache とすると上記手順の2でもgemがinstallされる。(インストールされるgemは変わらないので意味はないです。)

2022年1月振り返り

2022年1月にやったこと

  • Githubの草を毎日生やした
  • 成人式へ行った
  • SpiderMan No Way Homeを観た
  • ひばりヶ丘二郎にて鍋二郎

読んだ本

宣言

来月はもっと本読みます。

最後まで読めていない本があるので読み切ります!

  • WeB API Good Parts
  • パーフェクトRuby on Rails
  • 失敗から学ぶRDBの正しい歩き方

2021年の振り返りと2022年の目標

大分出遅れた感がありますが、2021年の振り返りと2022年の目標を書きます。

2021年

2021年は変化の多い年でした。

  • 2月 エンジニアのアルバイト開始
  • 5月 エンペイに入社、フィヨルドブートキャンプ卒業
  • 11月 成人
  • 12月 独り暮らし開始

こうして見ると一年前に書いた2021年の目標は3/4は達成したことになります。

  • 3月までにフィヨルドブートキャンプを卒業する
  • 4月~5月までに就職する
  • 10月までに一人暮らしをはじめる
  • 行ったことのない東京のラーメン二郎(19店舗)を制覇する

最後の都内のラーメン二郎制覇は無念ながら達成できませんでした。

原因としては、実家の近所にある二郎系ラーメンに通いつめたことです。

ここの豚マシラーメンは絶品です。トッピングのオーダーが食券に丸をつけるスタイルなので、二郎特有の意味不明なコールをする必要がないのもおすすめポイントです。

経堂の近くに訪れた際には是非足を運んでみてください。

tabelog.com

エンジニアとして

楽しく働いています。

フロント、サーバーサイドどちらも浅く広く触りました。

やったタスクをざっとまとめると以下のような感じです。

  • フロントの軽微なバグ修正
  • メイン画面で使うコンポーネントを一部作成
  • 決済回りのバグ修正
  • Railsの既存コードの改善(ルーティング、コントローラー等)

少なくともマイナスの戦力ではなく、プラスの戦力になっているかな、、と思います。

僕の考える、Railsエンジニアとして就職できる最低レベルは、 「少しでもプラスの戦力として計算できる」 というものです。 「Issueを一人でこなせる」 といっても良いかもしれません。

Railsエンジニアとして就職できるレベルとは - komagataのブログ

2022年の目標

上にも書いた通り一年目はすぐに着手できるような具体的なタスクを進めました。

来年は「この機能は自分が作った!」いえるような大きめなタスクを完遂させたいです。

技術力向上の面でいうと足踏みした一年だったと反省しています。

Githubの草を見ると分かるのですが、土日は勉強しない日が多かったので、今年はもっと貪欲に学んでいきたいです。

とりあえず1月は土日も草を生やします。

以下の分野に興味があるので、たくさん本を読んで手を動かして学んでいきます!

  • Rails
  • サーバーサイド非同期
  • DB回り(設計、チューニング)

実務とプライベートの勉強のサイクルをいい感じに回していきたいです。

気負わずにマイペースにやっていきます〜

チェリー本 改訂2版 を読みました🍒

プロを目指す人のためのRuby入門[改訂2版] 言語仕様からテスト駆動開発・デバッグ技法まで のプレゼント企画に当選しました。ありがとうございます! 本の到着から時間が経ってしまいましたが、読んだ感想をポエミーに書いていきます。

印象に残った内容

正規表現

実務で正規表現を使ったコードをあまり書いていないので苦手意識がありましたが、本の内容に沿って考えるとそこまで難しくないことが分かりました。 正規表現を使うステップは大きく分けて以下の2つに分類できると考えています。

  1. 文字列の規則性を見つける
  2. 規則を正規表現に変換する

この両方を同時にこなすのではなく、段階を追って考えて行けば適切な正規表現を書けることに気付いたので積極的に使っていきたいです。

パターンマッチ

パターンマッチを使ったコードを実務で見かけどのようなルールで動いているのか非常に興味がありました。
データの構造に合わせて処理を分岐させることでより直感的なコードを書けることが分かりました。 データの実態ではなくあくまで構造にフォーカスを当てたパターンマッチのロジックは、型を厳密に定義する機能と相性が良さそうな印象を持ちました。
将来挙動が変わる可能性のある書き方もあるので、どこまで使うかチームで認識を合わせられると良さそうです!

クラス

第1版を読んでいたとき、「あるクラスのメソッドの中で別のクラスのメソッドを呼び、データをやりとりし、ひとつのプログラムとして動かせるんだ!」と感銘を受けたことを思い出しました。
本の中で一番重いと思われる内容ですが、例題を解くための最低限の知識 -> 例題 -> 深堀 の順で構成されているので、初学者の方でも読み進められるようになっています。

例外処理

例外処理との向き合い方が簡潔にまとまっており、個人的に一番好きな章です。 なんでも例外処理に渡すのではなく、そもそも例外を発生させることを未然に防ぐことはできないか?Rails, Rubyの機能で補足できないか?を検討してから使うようにしたいです。 以下の記事、動画でさらに例外処理への理解を深めたいと思います。

www.youtube.com

qiita.com

本の全体の感想

挫折を防ぐポイントが各章で散りばめられており、絶対に初学者を挫折させない強い意志を感じました。

  • サンプルコードの解説、コメントが丁寧
  • 言語の慣習と規約を明確に分けて解説している
  • 書面の都合で載せられない内容は、伊藤さんのQiita, Zennの記事で解説されている

初学者ではない方でも、Ruby3.0で追加された機能の把握、既存のメソッドの復習、例題を本のコードを写経せずに自分で解くことで更に理解を深めることができます。

初学者の方、第一版を読んだ方、お仕事でRubyを使っている方全員におすすめできる内容となっています! チェリー本を片手にプロになるため精進します。伊藤さん、ありがとうございました!