Closed92

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

ハガユウキハガユウキ

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

ハガユウキハガユウキ

スケールアウトをしただけだと、送信元リクエストをサーバーに分散する仕組みがなくて、その分散する仕組みを提供しているのが、ロードバランサー。

ハガユウキハガユウキ

ロードバランサーは主に3つの役割がある。

  • リクエストの分散
  • SSL処理
  • 不正リクエスト対策
ハガユウキハガユウキ

ロードバランサーでSSL処理すれば、後ろのサーバーでSSL処理する必要ないのか。一限管理できるようになる。ロードバランサーと後ろのサーバーに関しては社内のネットワークだから、セキュリティ要件次第ではあるが、SSL化しなくても良いのか

ハガユウキハガユウキ

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

ハガユウキハガユウキ

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

ハガユウキハガユウキ

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

ハガユウキハガユウキ

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

ハガユウキハガユウキ

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

ハガユウキハガユウキ

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

ハガユウキハガユウキ

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

ハガユウキハガユウキ

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

ハガユウキハガユウキ

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

ハガユウキハガユウキ

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

ハガユウキハガユウキ

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

ハガユウキハガユウキ

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

ハガユウキハガユウキ

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

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

https://dev.classmethod.jp/articles/what-is-default-sg/

ハガユウキハガユウキ

セキュリティグループのインバウンドルールのsourceには、通信を許可するipアドレスやセキュリティグループIDを指定できたりする。
例として、セキュリティグループBのインバウンドルールで、ソースにセキュリティグループAのセキュリティグループIDを指定した場合、セキュリティグループBはセキュリティグループAが適用されているAWSリソースからの通信を許可する。

ハガユウキハガユウキ

私のdefaultセキュリティグループよくよく見ると、sourceに踏み台サーバーのセキュリティグループidが指定されているから、defaultと言いつつ、踏み台サーバーからのリクエストしか許可してなかったのか。

ハガユウキハガユウキ

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

ハガユウキハガユウキ

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

ハガユウキハガユウキ

albとec2インスタンスの通信がうまくいかない

ec2インスタンスのセキュリティグループが問題だった(albからの通信を許可してなかった)

新しくセキュリティグループを作ってそれをec2インスタンスにアタッチ

ec2インスタンスにアタッチしてもなぜかalbからec2へのunhealtyは解決しない

ec2インスタンスでwebサーバーソフトウェアを起動させていなかったのが問題だった。インフラ側で許可しただけだと通信ができないから、ヘルスチェックが成功したと言えない。
あと、実際にwebサーバーソフトウェアを起動してから、ヘルスチェックが通るまで5分くらい時間あったな。

ハガユウキハガユウキ

大前提albがアプリケーション層で動いていて、httpでヘルスチェックしているからec2インスタンス側もhttpを理解するプログラムが必要なのか。

ハガユウキハガユウキ

rdb製品は、linuxやwindowsなどのosが動作しているサーバー上にインストールして動作するプログラムとして用意されている

ec2インスタンスにこのプログラムをインストールしてデーターベースサーバーにすることもできる

しかし、以下の課題がある

  • dbソフトウェアのインストール作業が必要になる
  • osのバージョンアップとかを気にする必要がある。
  • 不足の障害発生時対応が必要な場合、その準備を行う必要がある
ハガユウキハガユウキ

上の課題を解決するために、awsではrdsというマネージドのデータベースサービスが用意されている。
利用者は利用する製品やスペックなどを指定するだけで、簡単にデーターベースサーバーのdbインスタンスを構築できる。

ハガユウキハガユウキ

awsマネージドサービスは、動作するサーバーやosを意識せずに運用できるサービス

ハガユウキハガユウキ

rdsの場合、ハードウェアからスケーラビリティまでawsが管理するため、利用者はアプリケーションからの利用のみを管理すれば良くなり、運用負荷を軽減できる。

ハガユウキハガユウキ

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だが、セキュリティ的にもっと良いやり方もありそうな気がする)

ハガユウキハガユウキ

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

なるほど、セキュリティグループAにセキュリティグループBがアタッチされていると、セキュリティグループBがアタッチされているインスタンスのipアドレスを指定したのと同じ意味になるのか
https://blog.3qe.us/entry/2019/12/27/131809

ハガユウキハガユウキ

踏み台サーバーを許可するようなセキュリティグループを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インスタンスからインターネットに接続できる(インターネット側からこのルート辿るとかはできないので安全)

ハガユウキハガユウキ

学習終了時にやること

  1. rdsの削除
  2. ec2インスタンスの停止
  3. ebsの削除
  4. natgatewayの停止
  5. elastic ipの削除

学習開始時にやること

  1. ebsの追加
  2. 起動させたいec2インスタンスにアタッチ
  3. ec2インスタンスの起動
  4. 踏み台サーバーを使う場合は、ネットワークインターフェースでパブリックipの自動割り当てをonにする
  5. ssh configで踏み台サーバーのパブリックipをonにする
  6. natgatewayの追加
  7. rdsの追加
ハガユウキハガユウキ

コンピュータは情報処理する機械で、ハードウェアとソフトウェアで構成されている。
コンピュータ機械そのものをハードウェアと呼ぶ。
ハードウェアで実際に計算処理する装置をCPU(中央処理装置)と呼ぶ
メインメモリは主記憶装置と呼ばれる。処理の最中にデータを一時的に保存する場所。電源消すとデータ消える
ストレージは補助記憶装置と呼ばれる。データを継続的に保存する場所を表している。

ストレージは2種類ある。
ハードディスク(例: HDD)とフラッシュメモリ(例: SSD)

ハードディスクは、円盤上の記憶媒体に磁気を利用して情報を補助記憶装置である。
フラッシュメモリは、電気的にデータの削除と書き込みを行う補助記憶装置である

USBメモリは、フラッシュメモリが内蔵されている持ち運び可能な記憶装置
SDカードは、カード型のフラッシュメモリ。携帯電話やゲーム機に使われる。
https://www.google.com/search?q=ストレージ+メモリ+違い&rlz=1C5CHFA_enJP931JP939&oq=ストレージ メモリ 違い&gs_lcrp=EgZjaHJvbWUyCQgAEEUYORiABDIICAEQABgFGB4yCAgCEAAYBRgeMggIAxAAGAUYHjIICAQQABgFGB4yCAgFEAAYCBgeMggIBhAAGAUYHjIICAcQABgFGB4yCAgIEAAYBRgeMggICRAAGAgYHtIBCDQzMDlqMGoxqAIAsAIA&sourceid=chrome&ie=UTF-8#fpstate=ive&vld=cid:4ad1acb6,vid:PH3s6WtFsfE,st:0

ハガユウキハガユウキ

主記憶装置がメモリ
補助記憶装置がストレージ
ストレージにはハードディスク(ハードディスクを使用しているストレージ: HDD)とフラッシュメモリ(フラッシュメモリを使用しているストレージ: SSD)の2種類がある。

ハガユウキハガユウキ

ストレージとして、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を指定
                ]
            }
        }
    ]
}
ハガユウキハガユウキ

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通信を行うために共通鍵を交換する

https://ssl.sakura.ad.jp/column/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証明書の自動更新ができるサービスです。

https://business.ntt-east.co.jp/content/cloudsolution/column-63.html

ACMを使えば、簡単にSSLサーバー証明書を発行できそう。
SSLサーバー証明書は、認証するもののレベルよって段階が分かれている。
大きく3種類ある。

  • ドメイン検証済み(DV)証明書
    • ドメイン名の正しさを保証する
  • 組織認証ずみ(OV0証明書
  • 拡張認証(EV)証明書

下に行くほどより厳密に審査を行うので、利用者に対するサイトの信頼度が上がる。
しかし、コストもそれなりにかかる。
AWSではドメイン検証済み(DV)証明書のみ対応している。

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

確かにAレコード登録した後に、nslookupコマンドの実行結果見ると、ドメイン名をipアドレスに変換できてた
(下の部分)

nslookup bastion.aws.com
Server:		10.0.0.2
Address:	10.0.0.2#53

Non-authoritative answer:
Name:	bastion.aws.com
Address: 57.181.99.221
ハガユウキハガユウキ

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

ハガユウキハガユウキ

まとめ

  • スケールアウトとロードバランサー
    システムの負荷分散や可用性向上にはスケールアウトとロードバランサーが必須。ロードバランサーはリクエスト分散、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にはドメイン認証レベルなどの違いがある。

  • 運用時の注意
    リソース削除や課金タイミング、ダウンタイム考慮など、学習フェーズ・実運用フェーズそれぞれで着目すべき点も多い。

このスクラップは2ヶ月前にクローズされました