awsざっくりキャッチアップ 2

スケールアウトとは、システムの処理能力を向上させるために、サーバーの台数を増やす方法である。
これにより、システムの負荷分散や可用性の向上が期待できる。
ユーザー数が増えると、1台のサーバーだとリクエストを捌ききれなくなるタイミングがくるから、そのときにスケールアウトをやる。

HTTPSのプロトコルで、送受信しているデータを暗号化するSSL処理が使われている。

AWSでは、ELBというサービスでロードバランサーを提供していて、
webサービスでロードバランサーを使いたいなら、ELBでALBを使う。
(ALBはHTTPやHTTPSによるアクセスを分散させるために最適化されたロードバランサーである。SSL処理やURLのパターンで分岐先を切り替えたりなど高度な機能が良いされている)

ロードバランサーをvpcに配置して、通信したいアベイラビリティゾーンのパブリックサブネットを指定する。

ALBを設定するときに、ロードバランサーの設定と、ターゲットグループの設定が必要。

リスナーは、ALBがどのような通信を受けつけ、どこに転送するかを決める設定である。
受付の設定では、HTTP or HTTPSの指定と、ポートの設定をする。
HTTPSを選択する場合は、サーバー証明書の準備が必要。
転送先については、ターゲットグループなどが指定できる。
また、パスベースルーティングはこの転送先の設定で行える

ターゲットグループとは、負荷分散の対象サーバーをまとめたグループである。
ターゲットグループに含まれる各サーバーをターゲットと呼ぶ。
インターゲットからALBに到達して、ターゲットグループに転送され、ターゲットで処理を行う。

ALBはターゲットグループ内のターゲットに対して、定期的にヘルスチェックをして、正常に稼働しているかをチェックしている。
ヘルスチェックで正常に稼働しているサーバーにのみ通信を転送する。

ALBって、OSI参照モデルのレイヤー7 アプリケーション層で機能するのか

ロードバランサーにもセキュリティグループ設定できるのか

一般的なwebアプリケーションではHTTP1を使用するらしい

一つのロードバランサーには複数のターゲットグループを指定できるそう

ロードバランサーは正常に作成されてから、実際にリクエストを分散する動作をするようになるまで、数分程度のタイムラグが発生する

停止してたec2インスタンスを立ち上げるときに、プライベートipは変わらないけど、パブリックipは変わるのか

httpがちゃんとターゲットにリクエストされているかは、ターゲットグループのターゲットのhealth statusを見るとわかる。healtyになっていれば、対象のwebサーバーへリクエストがルーティングされている

ロードバランサーのdns名をコピーしてブラウザでアクセスできる

合ってる:デフォルトのセキュリティグループに割り当てられたリソース同士の通信を許可する
間違ってる:インターネットからのすべての通信を許可する
defaultのセキュリティグループが割り当てられたリソース同士で通信できるのか。
インターネットからのすべての通信を許可するって話ではない。

amazon linux2には、あらかじめpythonがインストールされていて、httpサーバープログラムとして使える。

pythonのwebサーバーソフトウェア立ち上げてから、awsコンソールに反映されるまでラグがある。

albとec2インスタンスの通信がうまくいかない
↓
ec2インスタンスのセキュリティグループが問題だった(albからの通信を許可してなかった)
↓
新しくセキュリティグループを作ってそれをec2インスタンスにアタッチ
↓
ec2インスタンスにアタッチしてもなぜかalbからec2へのunhealtyは解決しない
↓
ec2インスタンスでwebサーバーソフトウェアを起動させていなかったのが問題だった。インフラ側で許可しただけだと通信ができないから、ヘルスチェックが成功したと言えない。
あと、実際にwebサーバーソフトウェアを起動してから、ヘルスチェックが通るまで5分くらい時間あったな。

rdb製品は、linuxやwindowsなどのosが動作しているサーバー上にインストールして動作するプログラムとして用意されている
↓
ec2インスタンスにこのプログラムをインストールしてデーターベースサーバーにすることもできる
↓
しかし、以下の課題がある
- dbソフトウェアのインストール作業が必要になる
- osのバージョンアップとかを気にする必要がある。
- 不足の障害発生時対応が必要な場合、その準備を行う必要がある

rdsは次の4つで構成されている
- データベースエンジン
- パラメータグループ
- オプショングループ
- サブネットグループ

データベースエンジンは、データベース本体を表している。
RDSで使用できるデータベースエンジンは、
- MySQL
- MariaDB
- PostgreSQL
- Oracle
- Microsoft SQL Server
- Db2
- Amazon Aurora(AWSが独自開発した)
などがある。

Amazon AuroraはMySQLとPostgreSQLと互換性があるクラウド向けのデータベースである。
特徴としては、
- 処理性能が高い
- MySQLの最大5倍、PostgreSQLの最大3倍の性能である
- また、3つのアベイラビリティゾーンに6つのデータをコピーするので、耐障害性に優れている

パラメータグループとは、データベースエンジン固有の設定を行うためのもの
オプショングループとは、RDS固有の設定を行うためのもの。
サブネットグループとは、データーベースサーバーを複数のアベイラビリティゾーンに分散させて配置するときに使われる設定である(サブネットを2つ以上含んだグループ)。

一旦明日やる

パラメータグループファミリーで、パラメータグループを適用するデータベースを選択する。
タイプで、パラメータグループが通常のRDS用かクラスタリングされるRDS用かを選択する。

オプショングループは結構簡単に作れる

次サブネットグループの作成からやる

マルチAZ配置とは、AZを跨いでスタンバイインスタンス(予備機)を作成し、プライマリインスタンス(メイン機)からデータベースの内容を同期する構成のこと。
RDSにはマルチAZ機能があって、マルチAZ配置にしてくれる。
マルチAZ配置にすることで、冗長性も上がる。
アプリケーションサーバーはDBインスタンスのipアドレスでリクエストするわけではなくて、DBインスタンスのエンドポイント(FQDN)でアクセスする。
このエンドポイントがaws側でipアドレスと紐づいていて、
もしプライマリインスタンスに障害が発生した場合は、エンドポイントに紐づくipアドレスをスタンバイインスタンスのipアドレスに切り替えてくれる(フェイルオーバーの仕組みがある)。

サブネットグループでプライベートサブネットを指定したら、
rdsのインスタンスはプライベートサブネットに作られる。
プライベートサブネットにlocalのルートがあって、rdsのセキュリティグループが設定されてたらwebのインスタンスから通信できる。
rdsの設定

rdsのインスタンスの設定画面にエンドポイントというのがあって、これがrdsインスタンスのipアドレスと紐づいている。

mysqladmin ping -u admin -p -h sample-db.cs.ap-northeast-1.rds.amazonaws.com
このコマンドを実行することで、rdsへの接続ができるか確認できる。
実行すると何が起こるか
1. コマンドを実行すると、パスワードの入力を求められる
2. 正しいパスワードを入力すると、指定したRDSインスタンスへの接続を試みる
3. 接続が成功すれば「mysqld is alive」と表示される
4. 接続に失敗した場合はエラーメッセージが表示される

レプリカは英語で複製って意味。
リードレプリカは、読み取り専用のDBインスタンスのことである。
DBインスタンスが1つだと1つでreadとwriteの全てを処理しなければいけなくて負荷高いので、読み取りだけリードレプリカに分散することでDBインスタンスの負荷を軽減できる

rdsのサブネットグループ作る時は、パブリックサブネットを指定しないように注意。パブリックサブネットにdbインスタンスが置かれてセキュリティ的に問題がある構成になるから。

マルチAZにすると、データベース2つ用意されることになるから、コストもほぼ倍かかるのに注意
rdsって無料利用枠あるのか

インスタンスクラスは後で変更できる
ec2でも確かそうだった。
数分のダウンタイムが発生するのがだるい。

rdsの設定でパスワード認証を選択すると、マスターユーザーでデータベースに接続できるのか
(easyだが、セキュリティ的にもっと良いやり方もありそうな気がする)

ec2停止した時にebsをデタッチしてたのだが、再度ec2を立ち上げるの失敗してた
アタッチしたら大丈夫だった。

さて,今回は「特定のSGを許可対象のソースに割り当てる」というテクを覚えた。ソースというのは普通はIPアドレスレンジ,例えば10.0.0.0/8とか,::/0といったものを指定する箇所だ。ここに入力したアドレスレンジ(から/行き)の通信が許可される。 ここにSGを指定すると,そのSGがアタッチされているインスタンスのIPアドレス をソースに指定したのと同じ効果になる。
なるほど、セキュリティグループAにセキュリティグループBがアタッチされていると、セキュリティグループBがアタッチされているインスタンスのipアドレスを指定したのと同じ意味になるのか

踏み台サーバーを許可するようなセキュリティグループをwebのec2インスタンスにつけないと、接続できない。

踏み台サーバーにパブリックipを付与しないと、sshでインターネットからそのサーバーに接続するときに、当たり前だけどうまくいかない。
ec2インスタンスを停止したタイミングで自動割り当てされてたパブリックipが解放されて、再起動しても解放されたままだから、そのec2インスタンスに紐づいているネットワークインターの設定画面を見て、パプリックipを有効化をonにすれば再度自動でつく。

NAT Gatewayへの通信経路
プライベートEC2
↓
プライベートサブネットのルーター(0.0.0.0/0 → nat-gateway)
↓
NAT Gateway(パブリックサブネット内に存在)

プライベートサブネットのec2インスタンスって、インターネットへアクセスできないから、sshでそのec2インスタンスに入ってライブラリのインストールしてもできないんだよな。
そういう時は、natgatewayでパブリックサブネットにnatのインスタンスを配置して、プライベートサブネットのルートテーブルにnat向きのルートを定義すれば、パブリックサブネットにいるnatインスタンスからインターネットに接続できる(インターネット側からこのルート辿るとかはできないので安全)

学習終了時にやること
- rdsの削除
- ec2インスタンスの停止
- ebsの削除
- natgatewayの停止
- elastic ipの削除
学習開始時にやること
- ebsの追加
- 起動させたいec2インスタンスにアタッチ
- ec2インスタンスの起動
- 踏み台サーバーを使う場合は、ネットワークインターフェースでパブリックipの自動割り当てをonにする
- ssh configで踏み台サーバーのパブリックipをonにする
- natgatewayの追加
- rdsの追加

次はs3からやる

dns, メール, キャッシュも明日やる
アプリの導入も余裕があればやる

コンピュータは情報処理する機械で、ハードウェアとソフトウェアで構成されている。
コンピュータ機械そのものをハードウェアと呼ぶ。
ハードウェアで実際に計算処理する装置をCPU(中央処理装置)と呼ぶ
メインメモリは主記憶装置と呼ばれる。処理の最中にデータを一時的に保存する場所。電源消すとデータ消える
ストレージは補助記憶装置と呼ばれる。データを継続的に保存する場所を表している。
ストレージは2種類ある。
ハードディスク(例: HDD)とフラッシュメモリ(例: SSD)
ハードディスクは、円盤上の記憶媒体に磁気を利用して情報を補助記憶装置である。
フラッシュメモリは、電気的にデータの削除と書き込みを行う補助記憶装置である
USBメモリは、フラッシュメモリが内蔵されている持ち運び可能な記憶装置
SDカードは、カード型のフラッシュメモリ。携帯電話やゲーム機に使われる。

ストレージとして、ebsを使うこともできるけど、ec2インスタンスを管理する必要があるし、s3よりec2インスタンスが使えなくなることのほうが多いからやめといた方が良いかも。
s3使った方が良い。

s3はストレージの管理を行うマネージドサービスで、os、スケーリング、監視とかを意識しなくて済む。
s3を利用するだけ簡単にストレージを用意できる。

s3のバケットはvpcの外に作成するものである。リージョンに対して作る。
リージョンに対して作るので、リージョン内で重複しない名前にする必要がある
s3にアクセスするケースは、以下が考えられる
- インターネットからの直接アクセス
- vpc内のリソースからのアクセス
- vpc内のリソースからアクセスするなら、s3のバケットに対するアクセス権が必要になる。
- この権限は、通常IAMのロールという概念を使って適用する。
- まず対象となるs3のバケットにアクセスするためのポリシーを持ったロールを作成する。そしてそのロールをリソースに適用する。
- ロールに含まれるポリシーを使って、s3のバケットにアクセスできる。

- IAMロールは、AWSアカウント上で作成したAWSリソースに対して他のAWSリソースの操作権限を認可するための仕組み。
- IAMロールでは、 AWSリソースに認可する権限をIAMポリシーで定義する。
- このIAMロールをAWSリソースにアタッチすることで操作権限の認可を行う。
- IAMポリシーとは、IAMにおいて操作権限の認可を行うための仕組みである。IAMポリシーはJSONを用いて定義する。
IAMポリシーが2つ種類あるのか。
AWS管理おpages李シーには、AWSサービス名 + FullAccessもしくはReadOnlyAccessというポリシー名のものが多い。
AWS管理ポリシーでは利用者側で細かな制御ができないため、特定のリソースのみに操作権限を絞りたいような場合ではカスタマー管理ポリシーを使った方が良い。
IAMポリシー(権限の定義)
├── AWS管理ポリシー(AWS作成)
└── カスタマー管理ポリシー(自分で作成)
↓ アタッチ
IAMロール(身分証)
↓ 割り当て
EC2インスタンス、Lambda関数など

s3ではデータをオブジェクトと呼び、バケットに保存していく。
オブジェクトはファイルに相当する。テキスト、画像、音声、動画など。
バケットの中でフォルダーを作ってそこにオブジェクトを保存したりもできる。

AmazonS3FullAccessは、ここで作成したs3バケットだけではなく、今後作成するすべてのs3バケットへのアクセス権限をこのロールが持つことを意味するので、ここで作成したs3バケットだけアクセスできるポリシーを作成するなら、カスタマー管理ポリシーを使った方が良い。


エンティティは、権限を与える対象を表している

IAMロール作成した時に、信頼ポリシーの確認画面出てきた。
’IAMロール’が、どのAWSサービス・リソースへアタッチできるかは信頼ポリシーでJSONを用いて定義する。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow", # 操作を許可
"Action": [ # 具体的な操作内容
"sts:AssumeRole" # 権限の委任(sts:AssumeRole)を表す。
],
"Principal": { # どのサービスへ委任(アタッチ)できるか
"Service": [
"ec2.amazonaws.com" # ec2を指定
]
}
}
]
}

ec2の管理画面から対象インスタンス選択して、セキュリティからIAMロールをアタッチできた

aws s3 cp test01.txt s3://バケット名
これで、s3バケットにアップロードできる。

aws s3 cpコマンド反応しなくて、なんでだろうってなったが、シンプルにnatgatewayが存在しないことが原因だった。
プライベートサブネットでこのコマンド実行してたから、インターネットと接続できてなくて、プライベートサブネットからインターネットに接続するためにnat-gatewayが必要だった。しかしnat-gatewayがなかったから何も接続できなかった。
aws s3 cp test01.txt s3://aws-intro-sample-2nd-upload
upload: ./test01.txt to s3://aws-intro-sample-2nd-upload/test01.txt

ドメインは、ipアドレスを文字列で対応させたものである。
ドメインの名前は、右がトップレベルドメインで、左に行くごとに第二レベルドメイン、第三レベルドメインという名前がつけられている。
ドメイン名からipアドレスを決定することを名前を解決するという。

nslookupを使うと詳細見れるらしいが、一旦アプリができた方がわかりやすいから保留

HTTPSでは、ブラウザからあるWebサーバーへ送られた暗号化したデータは、サイトの運営者が持つ秘密の鍵で元のデータに戻すことができる。
暗号化通信のすごいざっくりとしたフローとしては、
ブラウザ:SSL通信をリクエストする
サーバー:SSL証明書を送付する
ブラウザ:電子署名の検証により「SSL証明書に記載されたドメイン」と「通信先のドメイン」が同じであることを確認する
ブラウザ/サーバー:SSL通信を行うために共通鍵を交換する
SSLサーバー証明書は、サーバーが本人のものであることを証明するもの。
認証局は証明書を発行するだけで、通信時に登場しない。

そのドメインを持っている人しか、そのドメインのSSLサーバー証明書は作れない。信頼性のある第三者の承認を得て作られる。
なので、そのサーバーがそのドメインの所有所によって運営されているかは、SSLサーバー証明書で保証されている。

SSLサーバー証明書がない世界線だと、偽サーバーが、そのドメインに対応するサーバーなのか識別する方法がないから、成り済ましを防げない
amazon.co.jpで名前解決できて、正規のipアドレスを入手したとしても、悪意のあるネットワークに入ってたら、特定のアドレスを悪意のあるルーターによって偽サイトに誘導するとかできる
証明書が発行されていれば、amazon.co.jpで正規サーバーではない攻撃者のサーバーにアクセスしてデータがブラウザに返ってきたとしても、ブラウザが検証して、問題あるっていってくれるのか

AWSではDNSの役割を果たすサービスとして、Route53がいる。
Route53には次の2つの機能がある。
- ドメイン名の登録
- DNSサーバー

ACM(AWS Certificate Manager)とは、AWS内でSSL証明書の発行や発行したSSL証明書の自動更新ができるサービスです。
ACMを使えば、簡単にSSLサーバー証明書を発行できそう。
SSLサーバー証明書は、認証するもののレベルよって段階が分かれている。
大きく3種類ある。
- ドメイン検証済み(DV)証明書
- ドメイン名の正しさを保証する
- 組織認証ずみ(OV0証明書
- 拡張認証(EV)証明書
下に行くほどより厳密に審査を行うので、利用者に対するサイトの信頼度が上がる。
しかし、コストもそれなりにかかる。
AWSではドメイン検証済み(DV)証明書のみ対応している。

awsのroute 53からドメイン取得できるぽい

- DNSのAレコードは、ドメイン名をIPv4アドレスに変換するためのDNSレコードの一種である。
- ドメイン名(例: example.com)を32ビットのiPv4アドレスに対応づける
- ウェブブラウザがドメイン名にアクセスする際、DNSサーバーはAレコードを参照してIPアドレスを返します。
- 「A」は「Address」の略
- AレコードはDNSシステムの最も基本的で重要なレコードタイプの一つ

パブリックdnsのホストゾーンを作成すると1ヶ月単位で金かかるから、12時間以内に削除した方が良い

SSLサーバー証明書は後でやるか

まとめ
-
スケールアウトとロードバランサー
システムの負荷分散や可用性向上にはスケールアウトとロードバランサーが必須。ロードバランサーはリクエスト分散、SSL処理、不正リクエスト対策を担う。ALBはアプリケーション層(OSIレイヤー7)で機能。 -
AWSのELB/ALB設定
VPCやサブネット、セキュリティグループ、リスナー、ターゲットグループなど複数の構成要素があり、それぞれチューニングや設定が必要。 -
RDSとマネージドサービスのメリット
RDSを使うことで運用負荷や障害対応の負担が軽減。パラメータグループ、オプショングループ、サブネットグループ等で柔軟な設定が可能。マルチAZやリードレプリカ、エンドポイントの活用で信頼性向上も実現。 -
ネットワークやセキュリティ設計
セキュリティグループ同士の通信許可やNAT Gatewayの設定など、VPC内外のネットワークの把握が重要。踏み台サーバーやパブリックIP自動割り当ての設定・運用もポイント。 -
S3・IAMなど周辺サービス
S3はストレージの管理負荷を劇的に下げる。IAMロールやカスタムポリシーで細かい権限制御や運用体験向上が可能。 -
DNSやSSL証明書管理
Route53によるドメイン管理、ACMによる証明書発行もAWS統合でシンプルに。SSLにはドメイン認証レベルなどの違いがある。 -
運用時の注意
リソース削除や課金タイミング、ダウンタイム考慮など、学習フェーズ・実運用フェーズそれぞれで着目すべき点も多い。