初心者インフラエンジニアが困ったときに試行錯誤するブログ

インフラエンジニアが,開発の勉強をするときのログを残します

【技術書要約】TCP/IPの絵本を3分で理解する

実現したいこと

TCP/IPの絵本という本を読みました.

内容が深いところまでは入っていかないですが,概念的な理解には十分で,とてもいい本だったので,少しでも興味がある人が読んでいただけるように,簡単に要約しました.

やったこと

以下,各目次ごとのポイントを,質疑応答形式でまとめました

TCP/IPの勉強をはじめる前に

プロトコルとは?

  • インターネット通信をする際の規約?
  • コンピュータ同士が問題なくデータをやり取りするためのマニュアル
  • HTTP,FTP,TCP,IP,Ethernetはすべてプロトコルの一つ

LANとWANの違いを説明すると?

  • LANはLocal Area Networkで,WANはWide Area Network.WANは,会社の支店間など,インターネットほどつながっていないが光ファイバーなどでつながっている中間規模のネットワーク

イントラネットとは?

  • インターネットを使った地域限定版のLANのこと

TCP/IPの概要

TCP/IPとは?

  • ネットワーク疎通を確認する通信プロトコル
  • データの送受信に関わる,信号への変換=>伝達=>データの再変換という一連の手続きをまとめたもの.
  • Transmission Control Protocol
  • パケット通信TCP/IPの特徴

TCP/IPの構造はどうなっている?

データの後ろに付加する情報をなんと言う?

  • トレーラ

通信サービスとプロトコル

URLってなんの略?

  • Uniform Resource Locator

メールサーバーの仕組みを2つのプロトコルを用いて説明すると?

  • SMTP(Simple Mail Transfer Protocol)が送信者からメールサーバーへの送信,メールサーバーAからBへの送信を行う.メールサーバーBからPOP(Post Office Protocol)でメールを取得し,受信を完了する

ファイル転送の仕組みをプロトコルを使用して説明すると?

  • FTP(File Transfer Protocol)によって一時的にサーバーにファイルがアップロードされ,通信を許可されたクライアントがダウンロードできる仕組み

遠隔ログインのクライアントを挙げると?

TelnetSSLの違いは?

  • Telnetはコマンドをそのまま流すので,通信の内容が筒抜けになる

IMとは?

アプリケーション層

アプリケーション層の役割は?

  • 実際の処理をするところ?
  • アプリケーションでデータを扱えるように加工,表示,再生する層
  • HTTP,POP3,FTPなどはこの層

アプリケーションヘッダにはどんな情報が入っている?

  • 接続元IP,時刻,URL,リクエストパラメータ,セッションキー,認証パブリックキー?
  • リクエストには,メソッド,ホスト名,対応しているファイルの種類や文字コード,言語など

ヘッダとボディはどうやって分ける?

  • 空行を入れると,その下はボディ.GETメソッドの場合はボディは空になる

HTTPのように,1回の要求と応答で完結する通信のことをなんと言う?

クッキーはなぜ必要?

  • ステートレスでない場合,前回の通信の続きということを証明するため

クッキーはどうやって埋め込む?

  • CGI(Common Gateway Interface)を使ってWebページを作成した後,ヘッダーにクッキーとクッキーを保存させるコマンドをくっつけて返す

クッキーはどこにどれだけの期間保存される?

  • クライアント側のブラウザに保存され,基本はブラウザを閉じたら削除される

SSL/TLSとは?

  • SSLはセキュアな通信のこと?TLSは全くわからない.セキュアな通信だけど公開暗号鍵方式を使っていないとか?
  • Secure Sockets LayerとTransport Layer Securityのことで,インターネット上のデータ通信を暗号化するためのプロトコルSSLを標準化したものがTLS

SSL/TLSの仕組みを流れで説明できる?

  • wwwサーバーがロック専用の公開鍵と秘密鍵を作成
  • CA(認証局)が共通鍵を作成
  • CAは共通鍵でデータを暗号化する.データと共通鍵を安全にわたすため.それを公開鍵で暗号化する
  • wwwサーバーが秘密鍵で共通鍵と暗号化されたデータを取り出す.これにより.共通鍵が暗号化されて渡された.
  • 以後,クライアントとwwwサーバーは共通鍵を使って暗号化・復号を行う

SMTPプロトコルとは?

  • 全くわからん.電子メール系のプロトコル
  • Simple Mail Transfer Protocol だったはず.

SMTPの手順は?

  • コマンドはアルファベット4文字.レスポンスは3桁の数字らしい
  • 通信確立=>220 => HELO => 250 => MAIL FROM<~.jp> => 250 => RCPT TO <~.jp> => 250 => DATA => 354 => メッセージ => 250 => QUIT => 221 => 通信切断という手順

POPプロトコルとは?

  • 全くわからんな.その都度リクエストを送るプロトコル
  • 自分宛てのメールをメールサーバーから受け取るプロトコル.POP3が主流

POPの手順は?

  • コマンドはアルファベット4文字.レスポンスは+OKか-ERRのいずれか
  • 通信確認,ユーザー認証=>メールボックスの状態確認=>メールを取り込む=>通信の切断という感じ

エンコード・デコードとは?

MIMEとは?

  • これもまったくわからん.なんやろ.処理のこと?
  • 本来,メールの件名は英数のみ,本文はテキストのみだが,それを日本語や画像に対応させる仕組みのこと
  • 日本語や画像などをUS-ASCIIの文字列にエンコードし,デコードするときに必要な情報をヘッダーに加える
  • BASE64という方式が有名

トランスポート層

トランスポート層の役割は?

  • これはなんだ?通信を疎通させる役割?
  • 送信されたデータを確実に受信側のアプリケーションに届ける層.
  • パケット分割はこの層の役割.どのポートがどのサービスにつながっているかを判断して振り分けるのもここ
  • TCPUDPはこの層

UDPとは?またどこで使われる?

問題があったときの処理はどうなる?

  • TCP/IPなら,そのパケット自体をキャンセルする.DBならトランズアクションはってループバックする?
  • TCPの場合,通信をやり直したり,再送してだめなら切断する信号を送ったりする
  • UDPの場合,何もしない

TCPヘッダの中身を12個挙げるとしたら?

  • 送信側ポート番号
  • 受信側ポート番号
  • シーケンス番号
  • 確認応答番号
  • データオフセット
  • 予約
  • コントロールフラグ
  • ウィンドウサイズ
  • チェックサム
  • 緊急ポインタ
  • オプション
  • パディング

チェックサムとは?

  • データが無事か判断するヘッダ要素

オプションとは?

  • TCPの機能を拡張するときに使用する

通信状況を調べるコマンドは?

  • netstat -aでTCPや,ポートなど調べられる

ネットワーク層

ネットワーク層の役割は?

  • インターネットとつながる層なのか?
  • 受信側のコンピュータまでデータを届ける層.データが壊れていたり,受信失敗していたりは感知しない
  • IP(Internet Protocol)がこの層
  • IPしかプロトコルがないので,通信手段の違いを吸収できる

IPの通信の確実性を担保する機能は何か?

  • ネットワーク層はセキュリティが問題?
  • IPはコネクションレス型のベストエフォート方式なのでUDPと同じ.ICMP(Internet Control Message Protocol)はIPが直接送信するのではなく,IPのヘッダをつけたIPデータグラムというものに変換してから送信するので,失敗したら送信元に知らせることができる

IPv4のビット数は何列で,どういう意味がある?

相手のPCの接続状況を調べるコマンドは?

自分のPCの接続状況を調べるコマンドは?

  • ifconfig

宛先までの経路を調べるコマンドは?

  • tracert

DHCPとは?

  • Dynamic Host Configuration Protocolで,必要なときだけ自動的にIPを振るプロトコル

ブロードキャストアドレスとは?

  • 255.255.255.255で,LAN内のすべての機器に送信する特殊なアドレス
  • 送信時は,0.0.0.0だが,DHCPサーバーが反応することで,アドレスが振り分けられる

NATとNAPTの違いは?

  • Network Adress Translationは,PIP=>GIPとして振り分けるのでGIPの数だけインターネットにつなげるが,Network Adress Port Translation(IPマスカレードとも言う)は,同じGIPを使用してポートによってPIPを区別するから,何台でも同時につなげる

DNSはなんの略?

  • Domain Name System

データリンク層物理層

データリンク層の役割とは?

  • データリンクというくらいだから,データの入出力をする層?
  • データとビット列をそれぞれに変換する層
  • EthernetやPPPなどがこの層

データリンク層物理層の関係は?

  • リンク層が,情報をやり取りする層で,物理層は読み書きをする層?
  • データリンク層は,データを変換する層に対して,物理層はそのビットデータを電波で送受信する層

データリンクとは?

  • 機器同士が同一の方法でつながったひとかたまりのこと

NICとは?

  • Network Interface Cardで,LANカードやネットワークアダプタとも言う.コンピュータからネットワークに接続するときの玄関口

MACアドレスとは?

  • IPアドレスみたいなやつだが,表記がピリオド区切り?
  • Media Access Controlアドレスで,データリンク層内の個体識別番号.ネットワークまでいくとIPだが,その中で機器を特定する
  • データリンク内ではIPではなくMACアドレスがわかっていないと通信できない
  • 8ビット×6列で示す

MACアドレスを調べる方法は?

  • わからない.ls -llとか?
  • ARP(Address Resolution Protocol)

トークンリングとは?

  • 認証トークン系?
  • リング型のネットワークで,トークンを取得したPCのみが送信できるため,フレーム(データ+ヘッダ)の衝突が起こらない

PPPとPPPoEとは?

  • わからん.personal private portてきな?
  • Point-to-Point Protocol は2点間で1対1の通信を行う.ユーザー認証付きだから,MACアドレスは使わない
  • PPP over Ethernetイーサネット上にある2台のPC間の認証

ブリッジとは?

  • データリンク間をつなぐ機器.宛先MACアドレスが流れてきたのと別のデータリンクであるときのみ送り出す

ルーティング

経路の決めかたを簡単に説明すると?

  • DNSが決めるっていう話?
  • IGP(Interior Gateway Protocol)とEGP(Exterior Gateway Protocol)の2種類があって,ルーティングテーブルを見ながら最適な経路を静的,もしくは動的に決定する

tracertコマンドとは?

  • 通信経路を確認するコマンド

セキュリティ

付録

OSI参照モデルとは?

  • OSのインターフェースの規格を決めるの?
  • 基本的にはTCP/IPの親戚.アプリケーション層が更に3層に分かれているだけ

注意点

参考

以下の記事を参考にさせていただきました.

TCP/IPの絵本 第2版 ネットワークを学ぶ新しい9つの扉

TCP/IPの絵本 第2版 ネットワークを学ぶ新しい9つの扉

本記事について

本記事は,学習を目的に書かれています.

間違い,改良案などございましたら,コメントしていただけると幸いです.

基本的に編集途中ですので,何を書いてほしいかもコメントいただけると,

その情報を中心に追記します.

【技術書要約】nginx実践入門のポイントを3分で押さえる

実現したいこと

nginx実践入門を読みました.

ポイントを3分で押さえられる程度にまとめました. とても良い本だったので,これをきっかけに読者が増えれば嬉しいです

やったこと

以下に各目次と簡単な要点をまとめました. ご参考にしていただければ.

nginxの概要とアーキテクチャ

nginxの用途を2つ挙げるなら?

  • 静的ページを返す
  • リバースプロキシとして使う

リバースプロキシとは?

Apacheとのモデルの違いは?

  • ApacheはMPM(Multi Processing Module)を採用おり,prefork, worker, eventなどの複数の動作モデルを使用できるのに対し,nginxはイベント駆動のみ

Apacheとの拡張性の違いは?

  • Apacheは拡張モジュール単体でビルドできるのに対し,nginxは本体のビルド時にしか拡張モジュールを組み込めない

Apacheとnginxのプロセスの違いは?

  • Apacheは,preforkモデルの場合,クライアントごとにプロセスを起動し,一連の処理を並行して行うのに対し,nginxは発生したイベント毎に並行して処理していく

イベント駆動とは?

  • 各イベントに対応したコールバック関数のみが実行される仕組み

I/O処理の効率化手法を3つ挙げるなら?

I/O Muitiplexingとは?

  • 複数のファイルディスクリプタを監視し,それらのどれかが使用可能になるまでプログラムを待機させること

ブロッキングi/Oとは?

ノンブロッキングI/Oとは?

  • I/O関連のシステムコールによってプログラムがブロックされる見込みの場合やまだ処理できるデータがない場合は,errnoがセットされ,中断して別のディスクリプタとの入出力処理に移ること

非同期I/Oとは?

  • ノンブロッキングI/Oと同じだが,先にエラーや完了をプログラムに通知するためのインターフェースがある

Nginxのプロセス構成は?

  • マスタプロセスが一つと,ワーカープロセスが複数ある
  • マスタプロセスが起動や設定を管理するので,マスタプロセスに対して特定のシグナルを送ると全体のプロセスを制御できる

インストールと起動

基本設定

設定ファイル名とその確認方法は?

  • nginx.confで,確認コマンドは
    $ nginx -V

ディレクティブとは?

  • 設定ファイルの各項目のこと

ディレクティブの種類は?

  • ;で終わるシンプルなディレクティブと,
    ブロックディレクティブがある

コンテキストとは?

  • ブロック内のディレクティブのこと

バーチャルサーバーとは?

  • Serverブロックディレクティブで囲んだサーバーで,IP,ポート,ホスト名毎に設定できる

Rootディレクティブのデフォルト値は?

  • html

MIMEタイプとは?

  • Content-typeヘッダフィールドに指定されるファイルの種類と拡張子のこと.image/pngとか

ルーティングの仕組みを具体的に説明すると?

静的なWebサイトの構築

locationディレクティブとは?

  • [servername]/images/~.pngとかでリクエストが送られた場合に,/images/で来たら/var/www/imgにルーティングするなどの設定のこと

Dos攻撃対策となるディレクティブは?

  • limit_conn_zoneディレクティブで特定のIPなどから同時にコネクションする数を制限できる.
    ngx_http_limit_req_moduleで時間あたりのリクエスト数を制限できる

leaky bucketアルゴリズムを説明できる?

  • 10r/sで1秒に10リクエストまで許容しており,burst=50で入り切らなかった分は50までキューイングし,それでも超えたら503を返す

安全かつ高速なHTTPサーバーの構築

HTTPSとはどのレイヤーで暗号化されている?

  • TLS(Transport Layer Security)

TLSを実現するために使用しているライブラリは?

  • OpenSSL

暗号化スイートとは?

PFSとは?

  • Perfect Forward Secrecyの略で,ある期間の鍵が盗まれたとしてもその一定期間の通信しか複合できないようにする仕組み

HSTSとは?

  • HTTPS通信のみを行うようにする技術.HTTPをHTTPSにリダイレクトさせる方法だと,MITM(Man in the Middle,中間者攻撃)に弱い.

Webアプリケーションサーバーの構築

リバースプロキシの主な2つの役割とは?

フロントサーバーとしてのリバースプロキシの役割を3つ挙げるなら?

Webアプリケーションサーバーにおけるリバースプロキシの役割を6つ挙げるなら?

  • 静的ファイルの配信
  • リクエストの書き換え
    • Route53もここは担える?
  • アクセス制限,不正なリクエストのフィルタリング
  • gzip圧縮転送
  • リクエストのロギング
  • リクエストとレスポンスのバッファリング

Railsに適したサーバープロセスとその理由は?

  • Unicornで,Rackインターフェースを持っているから

Unicornの弱点は?

  • forkを用いたマルチプロセスにはなっているが,イベント駆動型でないため,プロセス数以上のリクエストを処理できない

RailsUnicornを入れるためのgemは?

  • unicornをそのまま.foremanもプロセス管理が楽になるから良い.

nginxでプロキシするときに,ユーザーリクエストのホスト情報をいれるためにはどうする?

  • proxy_set_headerディレクティブで指定する

大規模コンテンツ配信サーバーの構築

ロードバランサの種類を2つ挙げるなら?

  • TCPレベルで分散するL4ロードバランサ
  • HTTPレベルで分散するL7ロードバランサ

L4ロードバランサの方式を2種類挙げるなら?

  • NAT(Network Adress Translation:ネットワークアドレス変換)方式
  • DSR(DIrect Server Return)方式

NAT方式を簡単に説明すると?

  • ネットワークパケットの送信先アドレスを書き換えることで実現する.
    TCPを使用していればどのプロトコルでも分散できる

DSR方式を簡単に説明すると?

  • アップストリームからの帰りのパケット(行きよりサイズが大きい)はロードバランサを経由しないため,トラフィックを削減できる

L7ロードバランサを簡単に説明すると?

  • HTTPリクエストを解釈し,同じリクエストをアップストリームサーバーに送信するため,コンテンツの種類や内容に応じてカスタマイズ可能.
  • HTTPをプロキシするため,DSR方式は使用できないが,ディスクI/OやCPUといったハードウェアの負荷削減には有効

DNSを使ってロードバランスする仕組みをなんと言う?また簡単に説明すると?

DNSラウンドロビンの弱点は?

  • TTL(Time To Live パケット有効期間)の関係で,障害発生時にキャッシュのTTLが切れるまでHTTPサーバーを切り離せない
  • RFC3484では,ネットワークが近いアドレスを優先的につなぐため,ネットワークがまたがるとアドレスに偏りが出る

Webサーバの運用とメトリクスモニタリング

Luaによるnginxの拡張

OpenResty

注意点

後半は個人的にまだ必要でなかったので,ほとんど流しています.

参考

以下の記事を参考にさせていただきました.

nginx実践入門 (WEB+DB PRESS plus)

nginx実践入門 (WEB+DB PRESS plus)

http://ecogis.sfc.keio.ac.jp/online/java/2002/9th/basic.htm

qiita.com

本記事について

本記事は,学習を目的に書かれています.

間違い,改良案などございましたら,コメントしていただけると幸いです.

基本的に編集途中ですので,何を書いてほしいかもコメントいただけると,

その情報を中心に追記します.

【AWSを知る】AWSを使ってネットワーク構成を勉強する その1

実現したいこと

今回は,「Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版」を使ってネットワークの勉強をしたいと思います.

Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版

やったこと

まず,この本から学ぶことをリストアップします.今回はネットワークについて技術的な観点からしっかり学びたいということもあって,だいたい以下の問いに答えられるようになることを目指します.

システム構築をインフラから始めるには

  • 開発者がネットワークやサーバーを構築するメリットは?

  • サーバーの構成は大体どんな感じか?

  • ネットワークの構築はイメージできるか?

ネットワークを構築する

サーバーを構築する

  • パブリックIPを固定するには?

  • 鍵ファイルのパーミッションはどうすればいいか?

webサーバーソフトをインストールする

  • Apacheのプロセス確認方法は?

  • ドメインの構成はどのようになっているか?

HTTPの動きを確認する

  • HTTPのリクエストとレスポンスの書式は?

  • リクエストとレスポンスの詳細を見るには?

  • HTTPからHTTPSへのリダイレクト方法は?

  • telnetを使ってHTTPをしゃべる方法は?

プライベートサブネットを構築する

  • pingコマンドで通信を確認するには?

  • 秘密鍵をアップロードするときの注意は?

NATを構築する

DBを用いたブログシステムの構築

  • MySQLの設定の注意点は?

  • Wordpressの設定の注意点は?

TCP/IPによる通信の仕組みを理解する

パケットキャプチャで通信をのぞいてみる

  • Wiresharkとは?

  • Wiresharkの使い方は?

  • UDPのデータを見ると何がわかるか

  • HTTPのデータを見ると何がわかるか

ネットワークの管理、運用とトラブルシューティング

  • ネットワークを管理する意義は?

  • ネットワーク構成を把握するコツは?

  • Pingの目的,使い方は?

  • tracerouteの目的,使い方は?

  • TCP到達性の確認方法は?

  • Nslookupコマンドやdigコマンドの目的と使い方は?

  • zabbixとは?

  • New Relicとは?

  • cloudwatch を使うときの注意点は?

さて,もちろんすべてをここに残すわけではないですが,実況中継的にどんどん進めていきましょー.

まず,

開発者がネットワークやサーバーを構築するメリットは?

これは,ざっくり言うと,障害対策に強くなる.システム全体について考えて構成を作ることができる点ですね.全体観はエンジニアリングの基本かと思われます.

サーバーの構成は大体どんな感じか?

これはわりとどこにでも載っている話なので,簡単にまとめておきます. サーバーは,リクエストを送ったら何かしらの処理をしてレスポンスを返してくれるものなわけですが,技術的には,OSの上に目的のソフトウェアをいれたものとなりますね.ここもさらっと.

ネットワークの構築はイメージできるか?

これまたどこにでも勉強できるソースはあるので,割愛します.たとえば以下のリンクにはわかりやすくまとまっているかも

https://hesonogoma.com/visio/networkdiagram.html

ざっくり要点を押さえると, - 各サーバーはプライベートIPアドレスを持っている - ルーターにパブリックIPアドレスが振られて,ネットワークにアクセスできる - IPアドレスには,ドメインと紐付けることで名前でアクセスできる - DNSサーバーがドメインを管理している. こんなところでしょうか.

パブリックIPを固定するには?

プロバイダやルーターを固定すればできますね.

パブリックIPを管理しているのはICANNという団体だそうです.そこから地域ごとに支社のようなものがあり,日本では,JPNICが統括をしているとのこと.IPv4は今枯渇していて問題になっており,IPv6に移行する流れはあるものの,互換の都合上まだまだ先の話になりそう.

そこで出てきた概念がNAT(Network Adress Transaction)で,これは,一つのIPアドレスを複数のエンドユーザーで共有しよう!というものです.

VPCを作ってみる

さて,ざっくり概念を学んだところで,VPCくらいは作ってみましょう.

AWSVPC作成画面から,東京リージョンでVPCを作成してみます.

ここでは,CIDRブロックは10.0.0.0/16で切ります.8進数なので10.0までがホストで,下2桁の0.0はネットワーク部ですね.

サブネットを作成する

VPCはさらに小さな単位,サブネットに分割できます. - 障害が起きたとき,影響範囲を最小限にできる - セキュリティを分割できる という理由で,サブネットに細かく分割することには意味があります.

今回は,パブリックサブネットとプライベートサブネットを作成します.ともにCIDRブロックは,10.0.1.0/24と,10.0.2.0/24のように,.1と.2で分割します.

パブリックサブネットをインターネットにつなぐには,インターネットゲートウェイを使用します. 基本はデフォルトで作成されるので問題なし.

TCP/IPとは?

インターネット通信のプロトコル(規約みたいなもの)で,パケットという単位でヘッダー情報(送信元IP, 送信先IP, その他のヘッダー)と,データに分割されます.

このパケットを適切なIPに振り分けるのがルーターで,デスティネーション(送信先IPアドレスと,ターゲット(流すべきネットワーク先)を紐づけたテーブルを持っています.

このルートテーブルは,サブネットの画面から確認できます.

初期設定では,10.0.0.0/16がlocalにつながるだけで,他のIPはすべて破棄されてしまうので,デフォルトゲートウェイ(すべてのIP 0.0.0.0/0を送るルートテーブルを持つもの)を作成します.というかデフォルトで作成されています.ルートテーブルを確認すればOK.

そのあと,ルートテーブルからサブネットにいけるよう,割当てを選択して,パブリックサブネットにつなげます.

インターネットゲートウェイデフォルトゲートウェイにつなげる必要があるので,設定します.具体的には,ルートテーブルから,タグの追加で,デスティネーション:0.0.0.0/0のをターゲット:デフォルトゲートウェイにつなぎます.

これで, - 宛先に内部のIPを指定 => 内部でルーティング - 宛先にそれ以外のIPを指定 => インターネットゲートウェイにルーティング される設定が完了しました!!

今回はここまで.次回は,具体的にサーバーを構築していこうと思います!といってもEC2インスタンス作るだけなのですごく簡単なんですけどね.

参考

以下の記事を参考にさせていただきました.

Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版

ネットワーク構成図の書き方 – 参考サイトの厳選リンク集

本記事について

本記事は,学習を目的に書かれています.

間違い,改良案などございましたら,コメントしていただけると幸いです.

基本的に編集途中ですので,何を書いてほしいかもコメントいただけると,

その情報を中心に追記します.

【AWS】ALBの料金について

起こったこと

ある日,AWSからメールが届きました.

見てみると3USDを超える料金が発生しており,びっくり!

確認したところ,EC2のどこかで急に課金が始まっていたようです.

やったこと

CloudWatchログからメトリクスを探し,コストレポートからサービスを特定しました.どうやらALBのせいみたい.network形式のロードバランサーを使いもしていないのに設置していたせいで,じわじわ課金されていたのでした.

削除して解決

注意点

アラートを設定していないとメールが飛ばないので注意ですね.

参考

以下の記事を参考にさせていただきました.

https://aws.amazon.com/jp/elasticloadbalancing/pricing/

本記事について

本記事は,学習を目的に書かれています.

間違い,改良案などございましたら,コメントしていただけると幸いです.

基本的に編集途中ですので,何を書いてほしいかもコメントいただけると,

その情報を中心に追記します.

DockerでRailsを動かす その4 番外編

実現したいこと

DockerでRailsアプリを動かし,それをAWSのECS上で実行するところまでを完成させたいと思います.

前回までの戦いはこちら...

DockerでRailsを動かす その3 - 初心者インフラエンジニアが困ったときに試行錯誤するブログ

やったこと

前回,拾ってきたRailsサンプルをうまく動かせなかったので,今回は別のサンプルを作成したいと思います.

まず,RDSを使うコンテナの勉強から..

RDSにとりあえずPostgre入れてみよう

RDSのコンソールからポチポチで作成.特に設定をいじった部分もなく,ほとんどデフォルトでいきました.KnowledgeというDockerでQiita:Teamのオープンソースクローンを使用してみたいと思います!これ使えれば本番運用もありかもしれない

$ git clone https://github.com/support-project/docker-knowledge.git
$ vi volumes/knowledge/custom_connection.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<connectionConfig>
        <name>custom</name>
        <driverClass>org.postgresql.Driver</driverClass>
        <URL>[DBのエンドポイント]/URL>
        <user>[ここにユーザー名]</user>
        <password>[ここにパスワード]</password>
        <schema>public</schema>
        <maxConn>0</maxConn>
        <autocommit>false</autocommit>
</connectionConfig>
~

Dockerfileに設定を反映させます.

# Dockerfile for Knowledge

FROM tomcat:jre8

# ==== dumb-init ====
RUN apt-get update && \
    apt-get install -y dumb-init && \
    apt-get clean

# ==== environment ====
RUN rm -rf /usr/local/tomcat/webapps/ROOT \
  && update-ca-certificates -f

# ==== add Knowledge ====
ADD https://github.com/support-project/knowledge/releases/download/v1.13.1/knowledge.war \
      /usr/local/tomcat/webapps/ROOT.war

VOLUME [ "/root/.knowledge" ]
COPY ./volumes/knowledge/custom_connection.xml /root/.knowledge/
EXPOSE 8080

CMD [ "dumb-init", "/usr/local/tomcat/bin/catalina.sh", "run" ]

さて,設定が完了したところで,イメージを作成し,ECRにpushしたいと思います!!

$ docker build -t knowledge .
$(aws ecr get-login --no-include-email --profile <ユーザー名>) #これでAWS CLIからECRにログイン
$ docker tag knowledge:latest <ECRリポジトリのURI>:latest
$ docker push <ECRリポジトリのURI>:latest

さて,これでECRにDockerイメージを置くことができました.

それでは,早速起動していきたいと思います.

ECSでタスク定義を適当に作り,Fargateで適当に起動...

あれ?PENDINGになりますね.なんでだ...セキュリティグループなど間違っているのか?果たしてそうだったとしてもコンテナ自体立ち上がらないのか?

もう少し待ってから見てみよう...と思ったら!!!起動している!!

IPで接続しても全然つながりませんが,とりあえずコンテナの立ち上げはうまく行ったみたい

よかったー.

これから,ネットワーク周りの構築に移行します.

ALBを新規に作成しました.この辺はもう適当.とりあえずつながればいいのでセキュリティなどもテスト用で設定.

ここまでやっておきながら,やっぱりセキュリティグループ的にポート空いていればアクセスできるはずじゃ?と思い,やっぱりそのまま接続に挑戦.

接続に失敗するエラーはでるけど,Fargateのサンプルアプリはそのまま繋げるしなーと.やはり,アプリ側の設定ミスの模様.

ローカルでの実行を試す

$ docker compose up -d

コンテナが起動.localhost:8080に接続してみるが...

...動かない

なんで!?せめてどこでエラーになっているのかのログだけでも教えてくれ!

再度,git cloneし,そのまま起動してみると,接続に成功.

ということは,DB周りの設定がおかしいことは確か.RDSにつなぎたいんだけどなーー

参考

以下の記事を参考にさせていただきました.

dev.classmethod.jp

Amazon Fargate でコンテナを動かす - Qiita

本記事について

本記事は,学習を目的に書かれています.

間違い,改良案などございましたら,コメントしていただけると幸いです.

基本的に編集途中ですので,何を書いてほしいかもコメントいただけると,

その情報を中心に追記します.

DockerでRailsを動かす その4

実現したいこと

AWS Fargateを使って,クラウド上でRailsのコンテナを起動させてみたいと想います.

前回までの戦いはこちら

https://ktaka.hatenablog.com/entry/2018/11/12/002519

今回は,心機一転新しいサンプルアプリを上げてみます.

やったこと

railsのサンプルを拾ってきて,実行してみます

makefile

new:
        echo "$$_gemfile" > Gemfile
        touch Gemfile.lock
        docker-compose run web rails new . --force --database=mysql --skip-bundle --skip-javascript
        sudo chown -R $$USER:$$USER .
        echo "$$_database_yml" > config/database.yml
        docker-compose build
        docker-compose run web rails generate controller welcome index

        docker-compose run web sh -c 'sleep 10 && rake db:create'
        sudo chown -R $$USER:$$USER .

run:
        docker-compose up --build
define _gemfile
source 'https://rubygems.org'
gem 'rails', '~> 5'
endef
export _gemfile

define _database_yml
default: &default
        adapter: mysql2
        encoding: utf8
        pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
        username: root
        password:
        host: db

development:
        <<: *default
        database: myapp_development

test:
        <<: *default
        database: myapp_test

production:
        <<: *default
        url: <%= ENV['DATABASE_URL'] %>
endef
export _database_yml
~

docker-compose.yml

version: '2'
services:
  db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: ''
      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
  web:
    image: ${APP_NAME}
    build: .
    volumes:
      - .:/myapp
    ports:
      - "8080:3000"
    environment:
      PORT: "3000"
    depends_on:
      - db

Dockerfile

FROM ruby:2.4-alpine
RUN apk add -U mariadb-client-libs tzdata
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN apk add -U build-base ruby-dev mariadb-dev --virtual .build-deps \
 && bundle install -j 4 \
 && gem sources --clear-all \
 && apk del .build-deps \
 && rm -rf /var/cache/apk/* \
           /root/.gem/ruby/2.4.0/cache/*.gem
COPY . /myapp
CMD exec bundle exec rails s -p ${PORT} -b '0.0.0.0'FROM ruby:2.4-alpine
RUN apk add -U mariadb-client-libs tzdata
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN apk add -U build-base ruby-dev mariadb-dev --virtual .build-deps \
 && bundle install -j 4 \
 && gem sources --clear-all \
 && apk del .build-deps \
 && rm -rf /var/cache/apk/* \
           /root/.gem/ruby/2.4.0/cache/*.gem
COPY . /myapp
CMD exec bundle exec rails s -p ${PORT} -b '0.0.0.0'

さて,とりあえずローカルで動かそうか...と思いきや...

$ APP_NAME=rails make new
....

RROR: unsatisfiable constraints:
  mariadb-client-libs (missing):
    required by: world[mariadb-client-libs]
ERROR: Service 'web' failed to build: The command '/bin/sh -c apk add-U mariadb-client-libs tzdata' returned a non-zero code: 1
make: *** [new] Error 1

あらら,エラーですよ.今度は何だ.そろそろECSに行かせてくれ

更新かなーとか思ったけど,apk addのときに -Uオプションはちゃんとついているし.

ググってもいい感じの解決方法がわからないので,この手法は諦めます.Postgreがいいし.

今日はこの辺にして,また明日以降がんばります.

参考

以下の記事を参考にさせていただきました.

AWS FargateでRuby on Railsを動かしてみる - Qiita

Alpineでパッケージをインストールしようとしたらエラーがでたので解消する - TOEIC940点の文系プログラマー

本記事について

本記事は,学習を目的に書かれています.

間違い,改良案などございましたら,コメントしていただけると幸いです.

基本的に編集途中ですので,何を書いてほしいかもコメントいただけると,

その情報を中心に追記します.

pgを立ち上げるのにエラーが出たとき

実現したいこと

postgresqlを立ち上げて,さあ開発しようという矢先,

psql: could not connect to server: No such file or directory
        Is the server running locally and accepting
        connections on Unix domain socket "/tmp/.s.PGSQL.5432"?

という謎のエラー.これをなんとかしたい.

やったこと

$ rm /usr/local/var/postgres/postmaster.pid

これはそもそもpostmaster.pidがなかったので不発.

$ brew services restart postgresql

これで解決した.AWSとかも再起動したら直ったりするし,そういうもんなのかなと.プロセスとかもっと勉強しないと.

参考

以下の記事を参考にさせていただきました.

qiita.com

本記事について

本記事は,学習を目的に書かれています.

間違い,改良案などございましたら,コメントしていただけると幸いです.

基本的に編集途中ですので,何を書いてほしいかもコメントいただけると,

その情報を中心に追記します.