Closed72

[Udemy]ゼロから実践するAWSの学習メモ

LeivyLeivy

インフラ構築の設計手順

  1. サーバーの構成
    • どのようなサーバーが必要かを考える
    • サーバーを設置する
    • サーバーのOSをインストールして各種設定を行う
  2. ネットワークの構成
    • 構築したサーバーをネットワークに接続する
      • ネットワークで使用するIPアドレスの範囲を決める
      • サーバーにIPアドレスを割り当てる
      • ドメイン名とIPアドレスの対応を割り当てる
LeivyLeivy

インフラを構築するとは

  1. サーバーの構成を考え作成する
  2. ネットワークの構成を考え、サーバーをネットワークに接続する
LeivyLeivy

AWSとは?

Amazon社が提供するクラウドサービス
100以上のサービスが存在する

特徴

  1. サービスが豊富
    • EC2やRDSなど100以上サービスが存在している
    • 高負荷に耐えられる、信頼性の高いシステムを少ない手間で運用できる
  2. リソースが柔軟
    • リソースを必要なときに必要な分だけ調達できる(柔軟でいいね)
  3. 従量課金
    • 使った分だけ支払う
    • 不必要なときは使う必要がなく、費用対効果に優れている
LeivyLeivy

インフラとは?

インフラとは、サーバーやネットワークのこと

意味

  • infrastructure: 基盤
  • 技術用語としての意味システムやサービスの基盤となる設備

サーバーとは?

サーバーとは、クライアントに対してサービスを提供するコンピューター
サーバーは1種類ではなく、ネットワークサーバーやデーターベースサーバーなどと複数ある

ネットワークとは

複数のコンピューターをつないでデーターを送受信できるようにするもの

クラウドとは

ネットワークを利用してコンピューターリソースを利用する形態のこと

オンプレミス

  • インフラを時前で用意して、自社で所有・管理すること
  • 利点は自由度が高いこと
  • 欠点は初期コストが高く、調達期間が必要で、サーバーの増減がしにくいこと

クラウド(AWS)

  • インフラをネットワーク経由で使用・管理すること
  • 利点は初期コストが安く、すぐに始めることができ、サーバ-の増減が自由にできること
  • 欠点は費用の予測が付きづらいこと、クラウド全体の障害が起こると対応のしようがないこと
LeivyLeivy

AWSのアカウント作成

必要なもの

  • クレジットカード
  • 電話番号
  • メールアドレス

アカウント作成を進める

AWSトップページにアクセスして無料アカウントを作成する

LeivyLeivy

料金アラートの設定

これをしておかないと死ぬので超重要
AWSの利用料金がいくらを超えたら通知するかを設定する

設定方法

  1. 請求ダッシュボードで請求アラートを受け取るように設定する
  2. CloudWatchで料金アラートを設定する

具体的な手順

講座とは大幅にUIが異なるので以下は現代版
最新の設定方法についてはアラーム設定方法の公式ドキュメントを参照するように

  1. 右上の自分の名前をクリック
  2. アカウントをクリック
  3. 左のメニューからホームをクリック。ここで料金など確認できる
  4. 再度左のメニューから請求設定をクリック
  5. 請求書の送信設定でpdfの請求書をEメールで受け取るようにチェックをする
  6. アラート設定で受信するに両方チェックをいる。ちなみに最初の1年間は無料枠がある。
  7. アラートを受け取るメールアドレスを設定する
  8. 検索でCloudWatchと検索
  9. ホーム画面のアラームを作成をクリック
  10. メトリクスの選択で、請求を選択する。表示されない場合はリージョンを米国東部 (バージニア北部)に変更する
  11. 請求には2種類あるが、それぞれ以下のとおり
    • サービス別: これは、AWSの各サービスごとの使用量やリソースに関連するメトリクスを表示するためのもの。例えば、EC2やS3、RDSなどの各サービスのメトリクスを個別に確認したい場合に選択。
    • 概算合計請求額: こちらは、全体の請求額に関連するメトリクス。AWS全体のコストを監視する場合や、月ごとの費用を確認したい場合に有用。
    • もし、コスト管理が主な目的であれば「概算合計請求額」を選択すると良い。逆に、特定のサービスのパフォーマンスや使用量を監視したい場合は「サービス別」を選択するのが適切。今回は「概算合計請求額」を選択する。
  12. チェックをいれて、メトリクスの選択をクリックして詳細設定に進む
  13. しきい値の種類は静的で、より大きいを選択して実際のしきい値を定義する。ここで設定した金額を超えるとアラームが届く。今回は10ドルとしておく。
  14. 期間に設定した時間毎に料金をチェックする。短くすることもできるが、それだけアラームの頻度が増えるので短くしすぎには注意。今回は1時間とする。
    • コストに関するアラームの評価期間の設定例:
      1時間: 多くの企業や個人ユーザーは、コストの急激な増加を早期に検知するために1時間ごとにチェックする設定を選びます。これにより、予期しないコストの増加に対して迅速に対応することができます。
      6時間: コストの変動が比較的緩やかであり、リアルタイムの監視が必要ない場合に選ばれます。これは、通知の頻度を抑えながらも定期的にコストを監視する場合に適しています。
      24時間: コスト監視を日次で行いたい場合や、短期間の変動に敏感でない場合に設定されます。予算の超過を週単位や月単位で把握する場合に有用です。
      決定のポイント:
    • アカウントの使用パターン: もし頻繁にリソースを追加・変更している場合や、コストが急激に変動する可能性がある場合は、短い評価期間(1時間など)が推奨されます。
    • コストの重要性: もしコスト超過が即座にビジネスに影響を与える場合は、短い評価期間にすることで、素早い対応が可能になります。
      通知の頻度: 短い評価期間を設定すると、アラームが頻繁に発生する可能性があります。そのため、過剰な通知を避けたい場合は、やや長めの期間(6時間や24時間)を設定するのが良いかもしれません。
  15. 次へ進む
  16. 「通知の追加」をクリック
  17. アラーム状態を選択して、新しいトピックの作成を選択
  18. 通知を受け取るEメールアドレスを設定する
  19. 次へ進む
  20. 適切なアラーム名と説明を設定する。
  21. 次へ進む
  22. プレビューと作成画面で問題がなければアラームの作成を選択して作成する
  23. 設定したメールアドレスに確認メールが届くのでクリックして認証する
  24. アラームの管理画面で作成したアラームのアクションに警告などなければOK

毎月の請求金額の確認方法

名前→アカウント→請求書の順で進む
ここで毎月の請求金額の確認ができる

LeivyLeivy

IAMで作業用ユーザーを作成する

現在は何でもできてしまうルートユーザーしかないので危険
IAMで作業用のユーザーを作成する

それぞれのユーザーの用途

ルートユーザー:
- アカウントの全てのAWSサービスとAWSリソースすべてに完全なアクセス権限を持つ特権ユーザー
- アカウントの変更・解約、サポートプランの変更等をする時のみに使用する
- 極力使用しない
作業用ユーザー(IAMユーザー):
- AWSで作成するユーザー
- 認証情報とアクセス許可の権限を個別に変更できる
- 作業者ごとに個別に作成する
- 通常の作業はIAMユーザーで行う

IAMユーザーの作成

  1. まずマネジメントコンソールにログイン
  2. 先にルートユーザーで設定するべき項目を設定するため、右上の自分の名前からアカウントを選択する
  3. 少し下にいくと「IAM ユーザーおよびロールによる請求情報へのアクセス」という項目があるので編集をクリック
  4. 「IAM アクセスをアクティブ化」にチェックをいれて、IAMユーザーでも請求書で料金を確認できるようにしておく
  5. 画面左上の「サービス」をクリックして「IAM」と入力し、出てきたら★を押してお気に入りにいれておき、選択して進む。よく使うものはお気に入りにしておく。
  6. 左のメニューから「ユーザー」を選択
  7. 「ユーザーの作成」をクリック
  8. 任意のユーザー名を入力
  9. 「AWS マネジメントコンソールへのユーザーアクセスを提供する」にチェック
  10. ユーザータイプは今回「IAM」を選択し、IDとパスワードを設定する。大きいプロジェクトやSSOが求められる場合は「Identity Center」を選択する
  11. 次へ進む
  12. アクセス権限の設定。細かく設定できるが、AWSがあらかじめ用意してくれているものがあるので「ポリシーを直接アタッチする」を選択
  13. 実際の運用時には無駄な権限をつけないほうがいいので、厳しめの権限をつける
  14. 今回は個人用なので一番つよい権限を設定する
  15. 検索窓に「Administrator」と入力し、「AdministratorAccess」にチェックをいれる。これはほとんどのサービスにアクセスできる権限
  16. 次へ進む
  17. ユーザーがどのようなユーザーなのかを識別するためのタグを設定する事ができる。今回は不要なので「ユーザーの作成」を押す。
  18. 作成するとログイン用URLが表示されているので保管し、アクセスしてログインする
  19. ログインできれば完了
LeivyLeivy

CloudTrailで操作ログを記録する

いつだれが何をしたのかを記録しておくことで、不正アクセスや不正操作があった時にチェックできるようになる

CloudTrailとは

  • AWSユーザーの操作を記録するサービス
  • デフォルトで有効になっているが、保存期間は90日のみ
  • S3に操作ログを保存することで、ずっと保存できる
  • CloudTrail自体は無料。S3は有料

設定手順

  1. リージョンを東京に設定しておく
  2. 左上のサービスをクリックして、「CloudTrail」と検索
  3. お気に入りに追加しておき、進む
  4. 「証跡の作成」をクリック。これを設定すると操作ログをずっと記録しておくことができるようになる
  5. 証跡名を設定する。任意でいいが、今回は「cloud-trail-log」とする
  6. 「ストレージの場所」で新しいS3バケットを作成する。バケット名はグローバルに一意である必要があるため、被らないような名前を設定する。今回はデフォルトのまま使用する。
  7. AWS KMS エイリアスを設定する。今回は「alias/cloudtrail-logs-key」としておく
  8. オプションの「CloudWatch Logs」は有料サービスだが、ログデータをリアルタイム監視して設定した特定のログが記録された際に通知を受け取ることができる。今回は使わない。
  9. 他はデフォルトのまま次へ進む
  10. ログイベントは全てチェックをいれる。
  11. 管理イベントでは「読み取り」と「書き込み」にチェック
  12. データイベントではソースにS3を選択肢、すべてのイベントをログに記録するにチェック
  13. Insights イベントではどちらにもチェックをいれる
  14. 次へ進む
  15. 確認画面で問題がなければ作成する
  16. 作成したらS3を確認し、問題なければ「CloudTrail」のホーム画面に戻る
  17. 「イベント履歴」でログが確認できる

CloudTrailで操作ログを記録する

いつだれが何をしたのかを記録しておくことで、不正アクセスや不正操作があった時にチェックできるようになる

CloudTrailとは

  • AWSユーザーの操作を記録するサービス
  • デフォルトで有効になっているが、保存期間は90日のみ
  • S3に操作ログを保存することで、ずっと保存できる
  • CloudTrail自体は無料。S3は有料

設定手順

  1. リージョンを東京に設定しておく
  2. 左上のサービスをクリックして、「CloudTrail」と検索
  3. お気に入りに追加しておき、進む
  4. 「証跡の作成」をクリック。これを設定すると操作ログをずっと記録しておくことができるようになる
  5. 証跡名を設定する。任意でいいが、今回は「cloud-trail-log」とする
  6. 「ストレージの場所」で新しいS3バケットを作成する。バケット名はグローバルに一意である必要があるため、被らないような名前を設定する。今回はデフォルトのまま使用する。
  7. AWS KMS エイリアスを設定する。今回は「alias/cloudtrail-logs-key」としておく
  8. オプションの「CloudWatch Logs」は有料サービスだが、ログデータをリアルタイム監視して設定した特定のログが記録された際に通知を受け取ることができる。今回は使わない。
  9. 他はデフォルトのまま次へ進む
  10. ログイベントは全てチェックをいれる。
  11. 管理イベントでは「読み取り」と「書き込み」にチェック
  12. データイベントではソースにS3を選択肢、すべてのイベントをログに記録するにチェック
  13. Insights イベントではどちらにもチェックをいれる
  14. 次へ進む
  15. 確認画面で問題がなければ作成する
  16. 作成したらS3を確認し、問題なければ「CloudTrail」のホーム画面に戻る
  17. 「イベント履歴」でログが確認できれば完了
LeivyLeivy

ECR、ECS、Fargate、RDSの関係について(脱線)

今回のAWSの学習では、最終的にはECR、ECS、Fargate、RDSについて理解する必要があるため、ここで一度関係をまとめておきます。

AWSのコンテナとデータベースサービスの基本

主要なサービス

  1. ECR (Elastic Container Registry)
  2. ECS (Elastic Container Service)
  3. Fargate
  4. RDS (Relational Database Service)

サービスの役割と動作

  1. ECR

    • アプリケーションのコンテナイメージを保存する場所
    • 開発者がここにアプリケーションのイメージをアップロード
  2. ECS

    • コンテナオーケストレーションサービス
    • コンテナの実行、管理、スケーリングを行う
  3. Fargate

    • サーバーレスのコンテナ実行環境
    • ECSと連携して使用される
    • 基盤となるサーバーの管理が不要
  4. RDS

    • データを保存・管理するデータベース
    • アプリケーションのデータを永続的に保存

ECSとFargateの関係

  • ECSはコンテナの管理を行うサービス
  • Fargateは、ECSが使用できる実行環境の一つ
  • "ECS on Fargate"という形で使用され、サーバー管理なしでコンテナを実行できる

データの流れ

  1. 開発者がアプリケーションのコンテナイメージをECRにアップロード
  2. ECSがECRからイメージを取得
  3. ECSがFargate上でコンテナを起動
  4. 起動したアプリケーションがRDSとデータをやり取り
  5. ユーザーがアプリケーションを利用

図解

+-------------+     +------------------------+     +-------------+
|     ECR     | <-- |        開発者          | --> |    RDS      |
| (イメージ   |     | (アプリケーション開発) |     | (データ保存)|
|  保存場所)  |     +------------------------+     +-------------+
+-------------+               |                          ^
      |                       |                          |
      |                       v                          |
      |     +----------------------------------------+   |
      +---> |               ECS                      |   |
            | (コンテナオーケストレーション)         |   |
            |   +--------------------------------+   |   |
            |   |           Fargate              |   |   |
            |   | (サーバーレス実行環境)         |   |   |
            |   |   +------------------------+   |   |   |
            |   |   | 実行中のアプリケーション|  | ---   |
            |   |   +------------------------+   |   |
            |   +--------------------------------+   |
            +----------------------------------------+   |
                              ^                          |
                              |                          |
                              v                          v
                        +-------------+
                        |   ユーザー  |
                        | (アプリ利用)|
                        +-------------+

要点

  1. ECRはアプリケーションの「設計図」(イメージ)を保管
  2. ECSはコンテナの管理を担当
  3. Fargateは、ECSが使用するサーバーレスの実行環境を提供
  4. RDSは、アプリケーションが使うデータを保存・管理する
  5. 開発者はアプリケーション開発に集中でき、AWSがインフラ管理を担当
  6. ユーザーは、起動されたアプリケーションを利用する
LeivyLeivy

リージョンとは

リージョンとは、AWSの各サービスが提供されている地域のこと
日本のサービスなら日本に設置したほうが応答時間が早くなる

アベイラビリティゾーン

アベイラビリティゾーンとは、独立したデータセンターのこと
どのリージョンにも2つ以上物理的に離れて存在しているので、
災害などがあって利用不可能になってもそれ以外のアベイラビリティゾーンでシステムが稼働できるようになっている

実際に立てるときは、どのアベイラビリティゾーンに設置するかを選ぶ

VPC(Virtual Private Cloud)

VPCはAWS上に仮想ネットワークを作成できるサービス
リージョンを選択して作成するが、アベイラビリティゾーンをまたいで設置する

サブネット

サブネットとは、VPCを細かく区切ったネットワーク
VPCの中にサブネットを2つ作って、片方を見えなく、片方を公開するなどできる
AWSでサーバーを作るときは、アベイラビリティゾーンの中にサブネットを作る
複数のサブネットにサーバーがあれば、災害などに強くなる
AWSではこのようにサブネットを複数のアベイラビリティゾーンに設置してサーバーをそれぞれ分けて設置することで、冗長性を高めることをベストプラクティスとしている

LeivyLeivy

ネットワークのIPアドレスを決める

今回の講座では、VPCの中にパブリックサブネットとプライベートサブネットを作成し、パブリックにはWordpress、プライベートにはMySQLをいれる。
VPCは東京リージョンを使用
東京には3つのリーンジョンがあるが、今回はどちらも1aに設置する

IPアドレスの種類

パブリックIPアドレス:
- インターネットに接続する際に使用するIPアドレス
- 重複すると正しく通信できないのでICANNという団体が管理している
- プロバイダーやサーバー事業者から貸し出される(AWS上でも)
プライベートIPアドレス:
- インターネット上で使用されないIPアドレス
- 下記範囲のアドレスを自由に使用可能
10.0.0.0 ~ 10.255.255.255 172.16.0.0 ~ 172.31.255.255 192.168.0.0 ~ 192.168.255.255
- 社内LANの構築やネットワーク実験時はプライベートIPアドレスを使う

IPアドレスの範囲を表記する

ネットワークを構築する際は、そのネットワークで使うIPアドレスの範囲を決める。
IPアドレスはネットワーク部ホスト部に区分けすることで、範囲を表記する。
以下を例にすると、xxの部分が可変部分で、ここがホスト部にあたる。
192.168.128.xx

サイダー表記

IPアドレスの後ろにスラッシュをかき、その後ろにネットワーク部が何ビットまでなのかを記載する
192.168.128.0/24このように書くと
192.168.128.0から192.168.128.255の256個のIPアドレスと同じ意味になる

これで、24ビットより後ろがホスト部ということになる

サブネットマスク表記

IPアドレスの後ろにスラッシュをかき、ネットワーク部を表すビットと同じ部分を1に、ホスト部を表すビットと同じ部分を0にする
192.168.128.0/255.255.255.0このように書くと
192.168.128.0から192.168.128.255の256個のIPアドレスと同じ意味になる

設定するネットワークのIPアドレス

VPC: 10.0.0.0/16
パブリックサブネット: 10.0.10.0/24
プライベートサブネット: 10.0.20.0/24

LeivyLeivy

VPCを構築する

  1. マネジメントコンソールを開く
  2. サービスをクリックしてVPCと入力してクリック
  3. 東京リージョンに設定しておく
  4. 左のメニューから「お使いのVPC」を選択
  5. 一覧が表示される。実はAWSではVPCがデフォルトで作成されていて、それが表示されている。基本的にはデフォルトの物はつかわず自分で作成する
  6. 「VPCを作成」をクリック
  7. 名前タグにはVPCを識別する名前を入力。今回は「aws-infra-vpc」とする
  8. CIDR表記でVPC: 10.0.0.0/16とする
  9. IPv6を紐づけることができるが、必要ないのでなしを選択
  10. 「テナンシー」とは、物理ハードウェアを占用するオプション。これを選択するとEC2の料金が割高になり、特に必要ないのでデフォルトのままでいい
  11. 作成をクリック
  12. お使いのVPCを見ると増えているのが分かる
  13. 設定したIPアドレスに間違いがなければ完成
LeivyLeivy

サブネットを作成する

前回作成したVPCをサブネットで分割していく
IPアドレスの範囲を分割して使いやすくする
サブネットで分割すると災害などに強くなり、データベースサーバーを隠せたりするのでセキュリティも向上する
実際の運用でもサブネットで分割して使用することになる

  1. マネジメントコンソールを開く
  2. サービス→VPCへ移動
  3. 左のメニューから「サブネット」を選択
  4. デフォルトは使用せず「サブネットを作成」をクリック
  5. 先ほど作ったVPCを選択
  6. サブネット名を入力。今回は「aws-and-infra-public-subnet-1a」とします
  7. アベイラビリティーゾーンでは1aを選択する
  8. IPv4 CIDRブロックには作成するサブネットのIPアドレスの範囲をCIDR形式で入力「10.0.10.0/24」
  9. サブネットを作成をクリック
  10. サブネットが作成されたこれでパブリックは完成
  11. 同じ要領でプライベートサブネットも作成する
  12. 名前は「aws-and-infra-private-subnet-1a」とする
  13. 「IPv4 サブネット CIDR ブロック」には「10.0.20.0/24」と入力して作成する
  14. これでそれぞれのサブネット完成
LeivyLeivy

ルーティングを設定する

最終的にパブリックサブネットからインターネットに接続できるようにする
インターネットでは、ルーターがIPアドレスの行き先を管理しているので、ネットワークとネットワークがIPアドレスを通じて接続ができる(ルーティング)

ルートテーブル

ルーターが持つルートテーブルは「宛先のIPアドレス」と「次のルーター(AWSではターゲット)」という書式で設定する

10.0.10.0/24→local(自身のネットワーク)
10.0.20.0/24→ルーターB
0.0.0.0/0→ルーターC これは「デフォルトルート」といって、ルートテーブルに登録されているどのアドレスにも一致しない場合の経路

今構成しているネットワークはVPCに対してルートテーブルが紐づいている
ルートテーブルに10.0.0.0/16はlocalだよという事がかかれている
含まれていれば自身のネットワーク、範囲外の通信は全て破棄するようになっている
そのため、現状ではインターネットに接続できない
接続できるようにするために、ルートテーブルの設定を変更する

パブリックサブネット用のルートテーブルを新規作成し、10.0.0.0/16はlocalだよという設定に加え、0.0.0.0/16はインターネットゲートウェイに接続するように設定する
インターネットゲートウェイとは、VPCとインターネットを繋げる仮想ルーターのこと
インターネットゲートウェイは今はないので新規で作成する
サブネットごとにルーティングの設定をする必要がある
サブネットを作り、ルートテーブルを設定すると、そのサブネットに対して暗黙的にルーターが動いている

インターネットゲートウェイを作成し、VPCにアタッチ

  1. マネジメントコンソールを開き、VPCのダッシュボードを開く
  2. 左のメニューからインターネットゲートウェイを選択
  3. 作成をクリック
  4. 名前タグには「aws-and-infra-igw」とする
  5. 作成をクリックしてもどる
  6. 見てみると、どのVPCにも紐づけていないため「Detached」になっていることがわかる
  7. 作ったゲートウェイを選択して、アクションから「VPCにアタッチ」を選択
  8. 作ったVPCを選択してアタッチボタンをクリックする
  9. 戻って確認。アタッチされていれば完了

ルートテーブルを作成し、パブリックサブネットに紐づけ

  1. 左側のメニューから「ルートテーブル」を選択する
  2. 作成をクリック
  3. 名前は「aws-and-infra-public-route」とする
  4. 作成したVPCを選択して「ルートテーブルを作成」をクリック
  5. できたルートテーブルを選択し、下のサブネットの関連付けをクリック
  6. 「サブネットの関連付けを編集」をクリック
  7. 複数表示されるので、パブリックの方を選択して保存する
  8. 再度選択し、サブネットの関連付けを確認し問題が無ければ完了
  9. 選択したまま、今度は「ルート」タブを開き、ルートの編集を選択
  10. 追加をクリック
  11. 送信先は0.0.0.0/0とし、ターゲットに「インターネットゲートウェイ」を指定し、作成したものを選択して保存する
  12. 確認し、問題が無ければ完了

これにより、パブリックサブネットからインターネットに接続可能になる

LeivyLeivy

ネットワーク設計で考慮すべきポイント

VPC設計のポイント

  • プライベートIPアドレス範囲から指定しよう
    VPCでは仮想のプライベートネットワーク空間を作成するので、プライベートIPアドレスの使用が推奨されている

    10.0.0.0 ~ 10.255.255.255
    172.16.0.0 ~ 172.31.255.255
    192.168.0.0 ~ 192.168.255.255
    
  • 作成後は変更できないので、大きめに設定しよう
    大きさは/28から/16。/16が推奨

  • オンプレミスや他のVPCのレンジと重複しないように気を付ける
    相互接続する可能性がある場合は重複しないように設計する

VPCを分割するか?アカウントを分けるか?

  • 異なるシステムの場合はアカウントを分けよう
    異なるシステムを同一アカウント内に入れると管理が大変になる

  • 同一システムの書く環境は、VPCとアカウントのどちらを分けるか?
    環境が違う場合、どちらも同一のものを使用するのはNG
    VPCを分けるとIAMの設定が一度でいい。反面、各環境のリソースが見えてしまい、事故の元となる
    アカウントを分けると、他の環境のリソースが見えず、作業しやすい。反面環境ごとにIAMの設定が必要

同一アカウントでVPCとリージョンを分けるのが講座ではおすすめされていた

サブネット設計のポイント

  • 将来に必要なIPアドレスを見積もって設定する
    /24が標準的
  • サブネットの分割は、ルーティングとアベイラビリティゾーンを基準に行う
    サブネットに割り当てられるルートテーブルは一つ
    インターネットアクセスの有無、拠点アクセスの有無などのルーティングpolicyに応じて分割する
    対障害、高可用性の為に、2つ以上のアベイラビリティーゾーンを使用する
LeivyLeivy

EC2インスタンスを設置しよう

パブリックサブネットの中にWebサーバーを設置しApacheをインストールしていく

EC2とは

「ElasticComputeCloud」の略でAWSクラウド上の仮想サーバー

  • 数分で起動し、1時間又は秒単位の従量課金
  • サーバーの追加・削除、マシンスペック変更も数分で可能
  • OSより上のレイヤについては自由に設定できる

作成手順

  1. AMIの選択
  2. インスタンスタイプの選択
  3. ストレージの追加
  4. セキュリティグループの設定
  5. SSHキーペアの設定

AMIとは

「Amazon Machine Image」の略。インスタンス起動に必要な情報が入ったOSのイメージ。サーバーのテンプレのようなもの。
AWSやサードパーティー制のAMIも使えるし、自前のカスタムAMIも作って使える

インスタンスタイプとは

サーバーのスぺックを定義したもの

  • インスタンスタイプによりスペックやネットワーク帯域が異なる
  • インスタンスタイプにより料金が異なる。スペックが高いほど料金も高い。
  • アクセス数などに応じて必要なスペックのあるインスタンスタイプを選択する

インスタンスタイプは以下のように表記されている
m5.xlarge

  • m: インスタンスファミリー
  • 5: インスタンス世代
  • xlarge: インスタンスサイズ

ストレージとは

サーバーにくっつけるデータの保存場所。EC2には2種類ある。

EBS

  • 高い可用性と耐久性をもつストレージ
  • 他のインスタンスに付け替え可能
  • EC2インスタンスをStop/TerminateしてもEBSは保持可能
  • Snapshotを取得し、S3に保存可能
  • EBSの費用が別途発生
  • OSやDBなどの永続性と耐久性が必要なデータをおく

インスタンストア

  • インスタンス専用の一時的なストレージ
  • 他のインスタンスに付け替え出来ない
  • EC2インスタンスをStop/Terminateするとクリアされる
  • 追加費用なし(無料)
  • なくなってはいけないデータは置かない
  • 一時ファイル、キャッシュなど、失われても問題がないデータを置く

実際に作成していく

  1. マネジメントコンソールにIAMユーザーでサインイン
  2. サービスで「EC2」と検索して「EC2ダッシュボード」に移動する
  3. 「インスタンスを起動」をクリック
  4. 名前とタグでは「aws-and-infra-web」とする
  5. 「アプリケーションおよび OS イメージ」では「AmazonLinux」の「Amazon Linux 2 AMI(HVM) - Kernel 5.10, SSD Volume Type」を選択
  6. キーペアでは「新しいキーペアの作成」をクリック
  7. キーペア名は「aws-and-infra-ssh-key」とする
  8. タイプはRSA、形式は.pemを選択して、作成する
  9. インスタンスタイプでは今回は「t2.micro」を使用。これはパフォーマンスが低いインスタンスタイプだが、動作確認には十分なのでこれを選択
  10. ネットワーク設定では作成したパブリックサブネットを選択する
  11. パブリックIPの自動割り当てを有効化
  12. セキュリティグループは新規作成で「aws-and-infra-web」という名前にしておく
  13. セキュリティグループのルールについては、ソースタイプを「カスタム」にし、0.0.0.0/0を選択しておく
  14. ストレージは初期設定のままにしておく
  15. あとはデフォルトのままで、右下の「インスタンスを起動」をクリック
  16. 成功となれば完了
LeivyLeivy

SSHでEC2インスタンスに接続する

今回は講座のとおりではなくVSCodeRemote - SSH拡張機能で接続してゆく

  1. マネジメントコンソール→EC2→インスタンスと進む
  2. 作成したインスタンスを選択する
  3. 下にパブリック IPv4 アドレス(接続するためのIPアドレス)などがあるので控える
  4. 前回ダウンロードされたaws-and-infra-ssh-key.pemを.sshディレクトリに移動
  5. .sshディレクトリのconfigを設定を追加する
    Host aws-and-infra
      Hostname {パブリック IPv4 アドレス}
      Port 22
      User ec2-user
      IdentityFile ~/.ssh/aws-and-infra-ssh-key.pem
    
  6. 無事に接続ができるとプロンプトが返ってくるのでこれで完了

SSHでログインしてサーバーを操作できる理由

サーバー上でSSH接続を受け入れ、ユーザーからのコマンドを受け付けるプログラム(sshd)が動いているから。

LeivyLeivy

ポート番号はどうやって決まっているのか

ポート番号を決める方法には2種類ある

  1. 標準で決められている番号
    • 代表的なプログラムが使うポート番号はあらかじめ決められている(ssh:22,web:80,SMTP:25 ...など)
    • 「ウェルノウンポート番号」と呼ばれる
    • 0~1023までのいずれかの整数値をとる
    • 接続元が接続先のポート番号を省略したときはこのウェルノウンポート番号が使用される
  2. 動的に決まる番号
    • サービスを提供する側(サーバー)はポート番号が決まっている必要があるが、接続元のポート番号は決まってなくてもいい
    • クライアントのポート番号は、OSが他のとかぶらないようにランダムに決めている
    • 動的に割り当てる番号は49152〜65535までのいずれかの整数値をとる

ポート番号を確認する

  1. SSH接続し、コンソールにsudo lsof -i -n -Pと入力。これはどのポート番号でどのプログラムが待ち受けているかを見るためコマンド
    • -i: ネットワークソケットファイルを表示するオプションで、サーバーの待機ポートとプロセスを一覧表示する
    • -n: IPアドレスをホスト名に変換しないオプション
    • -P: ポート番号をサービス名に変換しないオプション
  2. (LISTEN)と書かれているポートが他のコンピューターから待ち受けているポート
  3. (ESTABLISHED)と書かれているポートは現在通信中のポート
  4. *:は、どのIPアドレスでも接続元として受け付けるという意味
LeivyLeivy

Apacheをインストールする

  1. ssh接続する
  2. sudo yum update -yとしてまずはアップデートをする
  3. sudo yum -y install httpdとしてApatchをインストールする。httpdというのがApatchを構成する実行ファイル。
  4. sudo systemctl start httpd.serviceとしてApatchを起動する。systemctlコマンドは指定したサービスを起動停止再起動等するコマンド
  5. sudo systemctl status httpd.serviceとして起動状態を確認する。Activeとなっていれば成功している
    [ec2-user@ip-10-0-10-58 ~]$ sudo systemctl status httpd.service
    ● httpd.service - The Apache HTTP Server
       Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
       Active: active (running) since Tue 2024-08-20 05:37:58 UTC; 46s ago
         Docs: man:httpd.service(8)
     Main PID: 9580 (httpd)
       Status: "Total requests: 0; Idle/Busy workers 100/0;Requests/sec: 0; Bytes served/sec:   0 B/sec"
       CGroup: /system.slice/httpd.service
               ├─9580 /usr/sbin/httpd -DFOREGROUND
               ├─9582 /usr/sbin/httpd -DFOREGROUND
               ├─9583 /usr/sbin/httpd -DFOREGROUND
               ├─9584 /usr/sbin/httpd -DFOREGROUND
               ├─9585 /usr/sbin/httpd -DFOREGROUND
               └─9586 /usr/sbin/httpd -DFOREGROUND
    
    Aug 20 05:37:58 ip-10-0-10-58.ap-northeast-1.compute.internal systemd[1]: Starting The Apache HTTP Server...
    Aug 20 05:37:58 ip-10-0-10-58.ap-northeast-1.compute.internal systemd[1]: Started The Apache HTTP Server.
    
  6. プロセスを確認することでも状態を確認できる。起動中であればHTTPDというプロセスが表示される。ps -axuとしてプロセスを表示
  7. HTTPDがあれば正常に起動しているということになる
    root      9580  0.0  1.0 255524  9780 ?        Ss   05:37   0:00 /usr/sbin/httpd -DFOREGROUND
    apache    9582  0.0  0.6 306916  6576 ?        Sl   05:37   0:00 /usr/sbin/httpd -DFOREGROUND
    apache    9583  0.0  0.6 306916  6576 ?        Sl   05:37   0:00 /usr/sbin/httpd -DFOREGROUND
    apache    9584  0.0  0.6 306916  6576 ?        Sl   05:37   0:00 /usr/sbin/httpd -DFOREGROUND
    apache    9585  0.0  0.6 536356  6576 ?        Sl   05:37   0:00 /usr/sbin/httpd -DFOREGROUND
    apache    9586  0.0  0.6 306916  6576 ?        Sl   05:37   0:00 /usr/sbin/httpd -DFOREGROUND
    
  8. ps -axu | grep httpとしてgrep(検索)コマンドを使うと表示を絞ることができる
  9. 今のままだとサーバーが停止や再起動するとApatchも停止するので、サーバー起動時にApatchが自動起動するようにする
  10. sudo systemctl enable httpd.serviceとして実行する。
  11. 自動起動設定ができたか確認するためにsudo systemctl is-enabled httpd.serviceとして実行する。
  12. enabledと表示されれば完了
LeivyLeivy

ファイアウォールの設定をする

不正アクセスから守るために必要な通信だけ通す、そのためにファイアウォールの設定をする。
AWSにおいては、「セキュリティグループ」がファイアウォールの役割を担っている。これはEC2の外側にあり、通信の入出力を制限する。
インバウンドは必要な通信だけ通すようにして、それ以外を遮断する
セキュリティグループの80番を空けるようにする

  1. EC2ダッシュボードに移動
  2. インスタンスに移動し選択
  3. セキュリティタブを見ると、セキュリティグループの記載があるのでクリック
  4. HTTPアクセスしても接続ができるように、インバウンドルールの編集を押して追加していく
  5. 「ルールを追加」を押して、タイプは「HTTP」ソースは「Anywhere-IPv4」と「Anywhere-IPv6」のどちらかを選択し、もう一つルールを作り、もう片方も設定する
  6. できたら保存を押し、パブリックIPにブラウザでアクセスすると、テストページが表示される。これでApatchに接続できたことになる。
LeivyLeivy

Elastic IPアドレスでパブリックIPアドレスを固定する

EC2インスタンスのパブリックIPは起動・停止すると別のIPアドレスが割り当てられてしまう。Elastic IPアドレスを使用するとそれを固定できる。
Elastic IPアドレスとはンターネット経由でアクセス可能な固定のグローバルIPを取得できるサービス
EC2インスタスに関連付けられていて、そのインスタンスが起動中であれば無料。そうでないと課金される。EC2インスタンスに関連づけられてなかったり、インスタンスを使用すると課金される。それを防ぐために使用しないときはElastic IPアドレスを開放する必要がある。

  1. マネジメントコンソール→EC2ダッシュボードに移動
  2. 左のメニューからElastic IPを選択
  3. 「Elastic IPアドレスを割り当てる」をクリック
  4. そのまま「割り当て」をクリックすると、新しいIPアドレスを確保することができる
  5. 確保したIPを選択して、アクション→アドレスの関連付けをクリック
  6. リソースタイプは「インスタンス」
  7. 紐づけるインスタンスとプライベートIPアドレスは作成したものを選択する
  8. 再度関連付けは。すでに関連付けされているときのオプションなのでなし
  9. 関連付けをクリック
  10. 関連付けたらブラウザでアクセスする。テストページが表示されれば完了

Elastic IPはインスタンスを紐づけていないとき、インスタンスを起動していないときはアクションからアドレスを開放する。そうしないと課金されて爆死します。

LeivyLeivy

課金されないように後片付けをする

  1. まずはElastic IPアドレスを関連付け解除→開放する
  2. メニューから「インスタンス」をクリック
  3. 選択し、アクション→インスタンスの状態→停止をする。しばらくすると完全に停止する

この動作をしないと料金が発生していくため、学習が終わったときなどは必ず停止するようにすること

LeivyLeivy

[Route53]ドメインを登録する

ドメイン名の構造について

ドメイン名はピリオドで区切られた構造をしている

www.example.co.jp

  • www: 第4レベルドメイン
  • example: 第3レベルドメイン
  • co: 第2レベルドメイン
  • jp: トップレベルドメイン

各レベルのドメインでは、同じ名前のものは登録できないようになっている
ドメイン名全体は「ICANN」が管理していて、トップレベルドメインごとにレジストリが管理。販売はレジストラとリセラが行う。

DNSについて

ドメインを購入するだけではアクセスできない。WEBサイトを見れるようにするにはドメインとパブリックIP(サーバー)を「DNS」で紐づける必要がある

DNSとは

  • Domain Name System」の略。ドメイン名の管理システム
  • ドメイン名をIPアドレスに変換する
  • ネームサーバー」と「フルリゾルバ」の2つから構成されている

ネームサーバーとは

  • ドメイン名とそれに紐づくIPアドレスが登録されているサーバー
  • ドメインの階層ごとにネームサーバーが配置され、そのネームサーバが配置された階層のドメインに関する情報を管理する

フルリゾルバとは

  • 「どのドメインに紐づくIPアドレスか教えて」と問い合わせると、いろいろなネームサーバーに聞いてIPアドレスを調べてくれるサーバー

WEBページが表示されるまでのDNSの仕組み

  1. ユーザーがブラウザにドメインを入力する
  2. フルリゾルバが、各ネームサーバーにドメインと紐づくIPアドレスを問い合わせる
  3. ルートネームサーバー→第二ネームサーバー→第三ネームサーバー→第四ネームサーバーと順番に問い合わせる
  4. 最終的にIPアドレスが引き出されたら、ブラウザはそのIPにアクセスしてWEBページが表示される

このようにDNSを通じてドメイン名からIPアドレスを引き出すことを「名前解決」と呼ぶ
一度アクセスしたドメインのIPアドレスはフルリゾルバがキャッシュしてしばらく保存してくれる

DNSはドメイン名とIPアドレス以外も管理している

DNSは様々な情報を管理している。DNSの「ドメイン名とIPアドレスの紐づけ」1つ1つのことを「リソースレコード」と呼び、IPアドレス以外も管理している

リソースレコードのタイプ:内容

  • Aレコード: ドメインに紐づくIPアドレス
  • NSレコード: ドメインのゾーンを管理するネームサーバー
  • MXレコード: ドメインに紐づくメール受信サーバー
  • CNAME: ドメインの別名でリソースレコードの参照先
  • SOA: ドメインのゾーンの管理情報

他にもいろいろある

LeivyLeivy

ドメインを購入する

テスト用ならお名前ドットコムで安いものを買い自動更新を切る
長期的に使うなら原価のCloudflareで買う

今回は適当にお名前ドットコムで取得

LeivyLeivy

Route53って何

AWSのDNSサービス。ネームサーバーの役割を果たす

特徴

  • 高可用。SLA100%(サービスレベルアグリーメント)稼働率が100%で、落ちる事はないとAWSが保証している
  • 高速。エッジロケーションの中で最も近いロケーションから応答を返す
  • フルマネージドサービス。DNSサーバーの設計・構築・維持管理が不要

重要概念

  • ホストゾーン
    • DNSのリソースレコードの集合。ゾーンファイルのようなもの
  • レコードセット
    • リソースレコードのこと
  • ルーティングポリシー
    • Route53がRecordSetに対してどのようにルーティングを行うかを決める
  • ヘルスチェック
    • サーバーの稼働状況をチェック

ルーティングポリシー

Route53がレコードセットに対してどのようにルーティングを行うかを決めるもの
複数設定できるので柔軟に設定可能

シンプル

  • レコードセットで事前に設定された値に基づいて、ドメインへの問い合わせに応答する
  • 最初はこちらを使用する事が多い

加重

  • 複数エンドポイント毎に設定された重みづけに基づいて、ドメインへの問い合わせに対応する
  • 提供リソースに差がある場合や、ABテスト時に使用

レイテンシー

  • リージョン間の遅延が少ない方のリソースへルーティングする
  • マルチリージョンにリソースが存在する場合に使用

位置情報

  • クライアントの位置情報に基づいて、ドメインへの問い合わせに対応する
  • コンテンツのローカライズや地域限定配信時に使用

フェイルオーバー

  • ヘルスチェックの結果に基づいて、利用可能なリソースへルーティングする
  • 障害発生時にSorryサーバーに簡単に切り替えられる
LeivyLeivy

Route53でDNSを設定する

手順概要

  1. ドメインのネームサーバーをRoute53に変更
    • Route53で「ホストゾーン」を作成。作成すると自動的にネームサーバーも登録されている
    • ネームサーバーをお名前.comからRoute53に変更
  2. ドメインに紐づくIPアドレスを登録
    • Route53でレコードセットを作成

実際に設定する

  1. マネジメントコンソール→Route53に進む
  2. 「ホストゾーンを作成」にチェックをいれて開始する
  3. ドメイン名に購入したドメインを入力
  4. コメントは特になしでもいい
  5. タイプはパブリックを選択。プライベートはAWSのルーティングする際にIPアドレスではなくドメイン名を使用したいときに選択する
  6. 作成をクリック
  7. 作成すると、「NSレコード」と「SOAレコード」が登録されている。「NSレコード」はそのドメインを管理するネームサーバーとの紐づけ「SOAレコード」はゾーンの管理情報
  8. NSレコードをクリックして値を確認すると紐づくネームサーバーが4つ登録されているのがわかる
  9. EC2を別タブで開き、インスタンスタブを開く
  10. インスタンスを開始する
  11. Elastic IP も開放しているので取得しなおして関連付ける
  12. .sshディレクトリのconfigを開き、新しいElastic IPに書き換えてSSH接続する
  13. ネームサーバーを確認する。コマンドはdig azoore.online NS +shortdigというのはドメインに紐づくIP、または逆を調べたい時に使う。NSオプションでネームサーバーを知れる。digコマンドはいろいろな情報を表示するので、+shortでネームサーバーだけを知ることができる。
  14. 実行するとお名前ドットコムのネームサーバーが表示される。これはゾーンをお名前ドットコムが管理しているから。そのため、ゾーンをRoute53に変更する必要がる
    [ec2-user@ip-10-0-10-58 ~]$ dig azoore.online NS +short
    dns2.onamae.com.
    dns1.onamae.com.
    
  15. お名前ドットコムにアクセスし、ログインする
  16. ドメイン設定→ネームサーバーの設定→対象ドメインをチェック
  17. 「他のネームサーバーを利用」を選択
  18. Route53の画面に戻り、先ほど確認したときに表示された4つのネームサーバーを入力する
  19. 反映されるとdigコマンドで確認できるので、しばらくまってから確認する

ドメイン名にEC2インスタンスのIPアドレスを紐づける

  1. Route53のダッシュボードへ移動
  2. 登録されているドメインをクリック
  3. 「レコードを作成」をクリック
  4. 名前は空で、タイプはAにする
  5. エイリアスはIPアドレスのかわりに AWSの名前でどこに紐づけるかを設定する。今回はつかわないのでチェックしない
  6. TTLフルリゾルバにドメイン名とIPアドレスの紐づけをキャッシュしておく秒数。デフォルトは5分、そのままでOK
  7. 値には関連付けたElastic IPを入力
  8. シンプルルーティングのままレコードを作成する
  9. これで完了。しばらく時間を待ってdigコマンドで確認する。変わっていればブラウザでドメインにアクセスできるようになっている。1日前後かかるので気長に待つ。変わったらアクセスし、テストページが開けば完了
LeivyLeivy

RDSとは

AWSのフルマネージドなリレーショナルデータベースのサービス
リレーショナルデータベースとは、データベースのことで
フルマネージドとは、AWSが運用管理のところまでやってくれるサービス
RDSの場合、従来に比べると格段に楽になっている
データーベースの設定もデフォルトで設定されていて、ベストプラクティスが適用されておりパフォーマンスが高い

利用可能なエンジン

  • MySQL
  • PostgreSQL
  • Oracle
  • Microsoft SQL Server
  • Amazon Aurora
  • MariaDB

各種設定グループ

RDSはフルマネージドサービスなので自分でSSH接続して各種設定をするということができないため、ユーザーが変更できる部分は「設定グループ」としてAWSから提供されている。
大きく3つのグループに分かれる

  1. DBパラメータグループ: DB設定値を制御
  2. DBオプショングループ: RDSへの機能追加を制御
  3. DBサブネットグループ: RDSを起動させるサブネットを制御

RDSの特徴

  1. 可用性の向上(障害などがあっても停止しない)
    • 「マルチAZ」を簡単に構築できる

「マルチAZ」とは、AWS RDSで高可用性を実現する方法。1つのアベイラビリティゾーンにマスター(メインのデータベース)があり、別のゾーンにスレーブ(バックアップ)が配置されます。それぞれ同じエンドポイントで接続可能。マスターに問題が起きると、スタンバイが自動でマスターに切り替わります(フェイルオーバー)。データはマスターからスタンバイに同期されていて、常に最新の状態が保たれています。

  1. パフォーマンスの向上
    • 「リードレプリカ」を簡単に構築

「リードレプリカ」とは、「マルチAZ」のように複数のRDSインスタンスを立ち上げて、マスターと同期された読み込み専用のRDSインスタンスを起動すること
こうすることでアプリケーション間のDB読み込みはリードレプリカの方に、書き込みはマスターにすることができて、DBの負荷をさげてパフォーマンスを向上させることができる。こういったものもRDSでは簡単に構築できる。

  1. 運用負荷の軽減
    • 自動的なバックアップ
      • 1日1回バックアップを自動取得(スナップショット)
      • スナップショットを基にDBインスタンスを作成(リストア)
    • 自動的なソフトウェアメンテナンス
      • メンテンスウィンドウで指定した曜日・時間帯にアップデートを自動実施
    • 監視
      • 各種メトリクスを60秒間隔で取得・確認可能
LeivyLeivy

RDSの設置

作成手順概要

  1. プライベートサブネットの作成
  2. RDSの作成準備
    • セキュリティグループの作成(EC2)
    • DBサブネットグループの作成
    • DBパラメータグループの作成
    • DBオプショングループの作成
  3. RDSの作成
    • DBエンジン
    • 本番環境
    • DB詳細の指定
    • [詳細設定]の設定

プライベートサブネットを作成する

RDSで「マルチAZ」をするためには、複数のアベイラビリティーゾーンにサブネットが作成されてなければいけない
そのためもう一つプライベートサブネットを作る

プライベートサブネットを作る

  1. VPCのダッシュボードへ
  2. 左からサブネットを選択
  3. 「サブネットを作成」をクリック
  4. VPCは自分で作ったものを選択
  5. 名前は「aws-and-infra-private-subnet-1c」とする
  6. アベイラビリティーゾーンも1cを選択
  7. 「IPv4 サブネット CIDR ブロック」では10.0.21.0/24とする
  8. 作成をクリックして完了

RDSの作成準備

セキュリティグループの設定

RDSのファイアウォールの設定はEC2と同じくセキュリティグループで行う

  1. EC2のダッシュボードを開く
  2. 左のメニューからセキュリティグループを選択
  3. 新しく作成する
  4. 名前と説明は「aws-and-infra-db」とする
  5. 作成したVPCを選択
  6. インバウンドルールで「ルールを追加」をクリック
  7. WEBサーバーからのみMySQLに接続できるようにする
  8. タイプはMySQL Auroraを選択
  9. ソースでは「セキュリティグループ」単位で指定できる。ソースはカスタムで「aws-and-infra-web」を選択する
  10. 作成をクリックして完了

DBサブネットグループの作成

  1. RDSと検索して開く
  2. 左のメニューからサブネットグループを選択
  3. RDSインスタンス起動時、「DBサブネットグループ」というものを指定する。これは、VPC内にあるサブネットを複数指定してRDSインスタンス餓鬼道するサブネットを指定した設定のこと。マルチAZで複数のサブネットを使用する関係でこちらを指定する必要がある。
  4. 作成をクリック
  5. 名前と説明は「aws-and-infra-subnet-group」とする
  6. VPCは作成したもの
  7. サブネットを追加でRDSで使用するサブネットを選択するので、作成した2つのサブネットを指定する
  8. 作成ボタンを押して完了

DBパラメーターグループの設定

RDSではDBの設定ファイルを直接編集できないので、DBの設定値は「DBパラメーターグループ」で行う

  1. 左のメニューから「パラメーターグループ」を選択
  2. 作成をクリック
  3. 名前と説明は「aws-and-infra-mysql80」とする
  4. エンジンタイプは「Aurora MySQL」
  5. グループファミリーは「aurora-mysql8.0」
  6. タイプはそのままで作成をクリックして完了
  7. パラメーターを変更したいときはグループを選択してアクションから「編集」を選択
  8. 色々設定できる。「Static」はRDS起動時に反映され、「Dynamic」は動的に変更される。今回は何もしない

DBオプショングループの設定

ここではDBの機能的な部分を設定する。例えばプラグインを使いたい等

  1. 左のメニューから「オプショングループ」を選択し作成をクリック
  2. 名前と説明は「aws-and-infra-mysql80」とする
  3. エンジンは「mysql」
  4. バージョンは8.0を選択
  5. 作成をクリックして完了

デフォルトがあるが、それは使用しない
これでRDS設置のための下準備が完了

実際にRDSを作成する

  1. 左のメニューから「データベース」を選択して作成をクリック
  2. 「標準設定」を選択
  3. オプションはMySQLを選択
  4. エンジンバージョンでは今回は最新のものを指定
  5. テンプレートは「開発/テスト」を今回は選択。本番を選ぶと料金が高くなる。無料枠は設定項目は限度があり、学習できないので今回は使わない
  6. 可用性と耐久性では「マルチ AZ DB クラスター」を選択するといいが、料金が上がるため今回は「単一の DB インスタンス」を選択
  7. 設定の「DBクラスター識別子」では「aws-and-infra-web」とする
  8. マスターユーザーの名前は「root」などでもいいがadminにしておく
  9. パスワードは本当は自動生成がいいが、今回は「password」とする
  10. インスタンスの設定では、通常は標準を選ぶといいが、学習用ではスペックの低いものを利用する
  11. ストレージタイプでは「汎用」を選択して20GBに設定。自動スケーリングは今回はオフ
  12. 接続の設定では各種自分が作成したものを選択。
  13. パブリックアクセスは、VPCの外からRDSに接続することはないので今回はなし
  14. セキュリティグループは作成したものを選択
  15. アベイラビリティゾーンでは1aを選択
  16. ポートはデフォルトの3306
  17. 追加の設定では名前は空
  18. バックアップは有効にして30日にしておく
  19. バックアップウィンドウではウィンドウを選択
  20. 開始時間は朝4時にしたいため、9時間前の19時にしておく。期間というのはスナップショットを取る間隔。30分の0.5にしておく
  21. モニタリングは有料になるが詳しく情報をみたいときは有効にする。今回は無効
  22. ログの設定ではほしいものがあればチェックをいれる。今回はなし
  23. メンテナンスウィンドウではウィンドウを選択をクリックして、毎週日曜の朝5時くらいにしたいので9時間前の20時にしておく
  24. 削除保護の有効化は本来あるといいが、今回はなし
  25. ここまでできたら作成をおす。しばらくすると起動する

もし手動でバックアップ(スナップショット)をとりたいときは、「メンテナンスとバックアップタブから行うことができる」
手動で取得したスナップショットはインスタンスを削除してもきえない
料金がかかるので、必要なタイミングでのみ使うこと

WEBサーバーからRDS(DBサーバー)に接続する

  1. EC2にSSH接続する
  2. sudo yum -y install mysqlとコマンドを実行してmysqlをWEBサーバーにインストールする
  3. RDSのデータベース情報からエンドポイントを取得する
    4.mysql -h {エンドポイント} -u admin -p このmysqlコマンドでアクセスする。-hでエンドポイントを指定し、-uでログインするユーザーを指定。-pとするとパスワード入力が求められる。-pだけ書いておく
  4. MySQLのプロンプトが返ってくればOK
LeivyLeivy

Wordpress用のデータベース作成

  1. SSH接続する
  2. mysql -h {エンドポイント} -u admin -pでDBにアクセスする
  3. CREATE DATABASEコマンドでデータベースを作成する。今回はaws_and_infraという名前で、utf8を指定し、COLLATEで照合順序を指定する。generalはグローバル、ciは大文字小文字を区別するオプション。CREATE DATABASE aws_and_infra DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
  4. Query OK, 1 row affected, 2 warnings (0.01 sec)となれば成功
  5. SHOW DATABASES;コマンドでRDSインスタンスに含まれているデータベースを一覧表示して確認する。aws_and_infraが含まれていれば成功している
    MySQL [(none)]> SHOW DATABASES;
    +--------------------+
    | Database           |
    +--------------------+
    | aws_and_infra      |
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    +--------------------+
    5 rows in set (0.00 sec)
    
  6. CREATE USERコマンドでワードプレスのユーザーを作成する。@以降は接続元のホストを示していて、%を指定するとどこからでもOKという意味になる。IDENTIFIED BYで接続時のパスワードを指定するCREATE USER 'aws_and_infra'@'%' IDENTIFIED BY 'password';
    MySQL [(none)]> CREATE USER 'aws_and_infra'@'%' IDENTIFIED BY 'password';
    Query OK, 0 rows affected (0.01 sec)
    
  7. 作ったユーザーにDBを操作できる権限をGRANTコマンドで付与する。*aws_and_infraのすべてのデータベースのテーブルを操作できるという意味。TO 'aws_and_infra'@'%';で付与する。GRANT ALL ON aws_and_infra.* TO 'aws_and_infra'@'%';
  8. 設定を反映させるためにFLUSH PRIVILEGES;コマンドを実行する
  9. SELECT user , host FROM mysql.user;というSELECTコマンドでユーザーを確認できる。aws_and_infraがいて%でどこからでも接続できるようになっているのがわかる
    MySQL [(none)]> SELECT user , host FROM mysql.user;
    +--------------------+-----------+
    | user               | host      |
    +--------------------+-----------+
    | admin              | %         |
    | aws_and_infra      | %         |
    | rds_superuser_role | %         |
    | mysql.infoschema   | localhost |
    | mysql.session      | localhost |
    | mysql.sys          | localhost |
    | rdsadmin           | localhost |
    +--------------------+-----------+
    7 rows in set (0.00 sec)
    
  10. 確認出来たらmySQLとの接続を終了し、作ったユーザーでアクセスを試みるmysql -h {エンドポイント} -u aws_and_infra -p
[ec2-user@ip-10-0-10 ~]$ mysql -h {エンドポイント} -u aws_and_infra -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 30
Server version: 8.0.39 Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


// プロンプトが返ってくれば成功
MySQL [(none)]> 
  1. これで完了
LeivyLeivy

Wordpressのインストール

  1. SSH接続する
  2. 必要なものをインストールする。
    • 最新のワードプレスでは5.6以降のPHPが必要なので通常のyumインストールコマンドではなくamazon-linux-extras installコマンドでインストールする。
    • 今回使っているEC2のOSはAmazon linux2で、その中にはextrasというパッケージ群が存在している。
    • その中にPHPの新しいバージョンなどが存在しているのでそれを利用することができる
    • sudo amazon-linux-extras install -y php7.2
  3. PHP関連の必要なものをインストールする
    • 次のコマンドでPHPのバージョンに合ったものをインストールしてくれる
    • sudo yum install -y php php-mbstring
  4. 次のようにしてWordpressの最新ファイルをダウンロード、インストールする
    // ホームへ移動
    $ cd  ~
    
    // ダウンロード
    $ wget https://ja.wordpress.org/latest-ja.tar.gz
    
    // 解凍
    $ tar xzvf latest-ja.tar.gz
    
    $ ls
    latest-ja.tar.gz  wordpress    
    
    // cpコマンドで/var/www/html/へコピー
    $ sudo cp -r * /var/www/html/
    
    // ファイルの所有者と所有者のグループをApacheに変更
    $ sudo chown apache:apache /var/www/html/ -R
    
    // Apacheの起動状態を確認
    $ sudo systemctl status httpd.service
    
    // 設定を反映させるために再起動
    $ sudo systemctl restart httpd.service
    
        // Apacheの起動状態を再確認
    $ sudo systemctl status httpd.service
    
    Active: active (running)
    

ブラウザからApacheにアクセスがいくと、Apacheは/var/www/html/以下にあるファイルを返す

LeivyLeivy

Wordpressの設定をする

  1. ドメインにアクセスすると繋がるようになっているのでアクセスする
  2. 画像のように設定する。ホスト名はDBのエンドポイントにする
  3. あとは各種設定してログインする
  4. ドメインにアクセスするとサイトが表示される
LeivyLeivy

プロトコルについて

「プロトコル」とは、コンピューター同士がネットワークを利用して通信するために決められた約束ごとのこと

プロトコルの例

  • HTTP
  • TCP
  • UDP
  • IP
  • SMTP
  • IPX
  • ect...

なぜプロトコルは必要なのか

メーカーやOSが違うコンピュータ同士が通信するためには、同じ仕様でやり取りする必要がある
そのためにプロトコルがあり、同じプロトコルを使用するという同意があるからこそ、様々なコンピュータ同士が通信できている

TCP/IPとは

「TCP/IP」とは、TCP・IPを中心として、インターネットを構築する上で必要なプロトコル群の総称。インターネットを運用するために開発された

アプリケーションプロトコル

  • HTTP
  • SMTP
  • FTP

トランスポートプロトコル

  • TCP
  • UDP

経路制御プロトコル

  • RIP
  • OSPF
  • BGP

インターネットプロトコル

  • IP
  • ICMP
  • ARP

TCP/IPの階層モデル

TCP/IPの階層モデルは、インターネットでコンピュータ同士が通信する一連の処理を4階層で表現したもの。通信に必要な機能全体を整理している
以下順番に、上位の階層は下位の階層は何でもよく、下位の階層は上位の階層の内容がわからなくてもよいという構造になっている

今回はメールに例える
送信側では上の層から順番にデータが伝えられ、その時に上位層から渡されたデータに自分の階層のプロトコル処理に必要な情報をヘッダーとして付ける
そのデータはルーターを通じて受信側に届き、受け取ったデータを処理して該当する層のヘッダとデータを分離してデータを上位層に渡していく
こうして送信したデータが元のデータに戻って、受信側に届く

アプリケーション層

アプリケーション同士が会話する
データを送信するとき、一つ下の層であるトランスポート層にコネクションの確立を指示し、データの送信を開始する役割をもつ
エラー対応や文字コードの処理を行ったりもここで行う

  • HTTP
  • SMTP
  • DNS
  • SMTP

トランスポート層

データの転送を制御する
データ送信先への通信路を確保してデータを送信する準備をする(コネクションの確立)また、通信が終わったら確立したコネクションを切断する
アプリケーションの指示によって接続を確立したり切断したりしてコンピューター間の通信手段を作るのが役割をもつ
また、プロトコルによっては通信するコンピューター間でデータがきちんと届いたかを確認し、届いていなかったらデータを再送したり、データが確実に届くようにすることもここで行う
そしてそのデータをネットワーク層に渡し、実際に送信する処理はネットワーク層へにまかせる

  • TCP
  • UDP

ネットワーク層

IPアドレスを管理し、経路選択する
ネットワークが接続された環境で送信先までデータ(パケット)を届ける
トランスポート層から受け取ったデータにネットワーク層のヘッダーを付ける
ヘッダーには受信側のアドレス等の情報が入っている(IPアドレス)
ネットワーク層のヘッダーを付けたら、ルーターのルーティング情報を参照し、次にデータを渡すルーターやコンピュータを決定する
そしてネットワークインターフェース層にデータを渡して、実際に送信してもらう

  • IP
  • ICMP
  • ARP

ネットワークインターフェース層

直接接続された機器同士で通信する
NIC(LANを使う用の部品)を動かすためのデバイスドライバ
NICを利用してデータをLANへと送信する役割をもつ

  • Ethernet
  • PPP

物理層

TCP/IPの4階層モデルの外側に、物理層がある
これは実際の物理的な機器、コンピューター本体のこと
物理層がデータを電圧や光のパルスに変換して物理的な通信媒体に流し込み、送信先の物理層にデータを送信する
物理層におけるアドレスをMACアドレスと呼ぶ
通信機器には固有のMACアドレスが付与されている

LeivyLeivy

HTTPプロトコルの詳細

  • Hyper Text Transfer Protocolの略
  • インターネットでHTMLなどのコンテンツの送受信に用いられる通信の約束ごと
  • クライアントがHTTPリクエストを送り、それに対してサーバーがHTTPレスポンスを返す。そのリクエスト・レスポンスの書き方がHTTPの正体
LeivyLeivy

TCPとUDPプロトコルの詳細

トランスポート層のプロトコル。
代表的なものがTCPUDP
通信の特性によって使い分ける必要がある

TCP

TCPは通信を制御するプロトコル。データの到達確認、再送処理やコネクション管理を行う
確認応答とシーケンス番号を使用することで再送制御などを行う
データを受け取る側のコンピューターがデータを受け取ると、送信側に確認応答を返す
送信側は、確認応答を待って、帰ってくれば次のデータを送る
もし一定時間の間に確認応答が帰ってこなかった場合は、データが失われたと判断され再送される

  • Transmission Control Protocol
  • 信頼性のある通信を提供
  • 信頼性を保つために、送信するパケットの順序制御や再送制御を行う
  • 信頼性のある通信を実現する必要がある場合に使用する

パケット

1度に大量のデータを送信するのは大変なため、パケットという形にデータを小分けする
そのためデータの届く順番が正しいものになるように保証したり、パケットが届かなかったときに再送処理を行うのがTCP

シーケンス番号

送信するデータ1オクテットごとにつけられる値
1オクテット=8ビット
受信側では受信したパケットのTCPヘッダーに書き込まれているシーケンス番号とデータ長を調べ、次に自分が受信すべき番号を確認応答として返す

コネクション管理

TCPでは通信相手との間で通信を始める準備をしてから通信を行う
これを「コネクション指向」の通信とよぶ
UDPはコネクションレスなので、相手に聞かずに開始する
一方でTCPは「SYNパケット」というTCPヘッダだけからなるコネクションを確立し、要求のパケットを送信し、確認応答をまつ
確認応答が帰ってくればコネクションを確立し通信を開始する
帰ってこなければ通信を開始しない
通信が終了したときには「FINパケット」を送ってコネクションを切断する

UDP

  • User Datagram Protocol
  • 信頼性のない通信
  • 送信するだけで、パケットが届いたかは保証しない
  • 高速性やリアルタイム性を重視する通信で使用する

例えば電話や動画などは一部のパケットが失われても少しラグついたり聞き取りにくくなるだけなので、そういった通信に利用する

特徴

  • アプリケーションから送信要求のあったデータをそのままネットワークに流す
  • パケットが届かなくても再送制御はしないし、パケットの到着順序がいれかわっても直せない
  • コネクションレスなのでいつでもデータを送信できる
  • プロトコルの処理も簡単ので高速

向いてる用途

  • 動画や電話など即時性が必要な通信
  • 総パケット数が少ない通信(DNS)など
  • 特定のネットワークに限定したアプリケーションの通信

ヘッダーのフォーマット

UDP

  • 送信元ポート番号
  • 宛先ポート番号
  • パケット長
  • チェックサム
  • データ

TCP

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

IPプロトコルについてのメモ

役割のなかに、パケットの分割と再構築処理がある
ネットワークインターフェース層のプロトコルによって、最大転送単位が異なる
IPでは、各ネットワークインターフェースの最大転送単位より小さくなるようにパケットを分割して送信し、終点コンピューターで再構築する

ヘッダーのフォーマット(IPv4)

  • 送信元ポート番号
  • 宛先ポート番号
  • バージョン
  • ヘッダ長
  • サービスタイプ
  • パケット長
  • 識別子
  • フラグ
  • フラグメントオフセット
  • 生存時間
  • プロトコル
  • ヘッダチェックサム
  • オプション
  • パディング
  • データ
LeivyLeivy

インフラ設計における重要な観点

可用性

サービスを継続的に利用できるか

  • 稼働率
  • 目標復旧時間
  • 災害対策

性能・拡張性

システムの性能が十分で、将来的においても拡張しやすいか

  • 性能目標
  • 拡張性

運用・保守性

運用と保守がしやすいか

  • 運用時間
  • バックアップ
  • 運用監視
  • メンテナンス

セキュリティ

情報が安全に守られているか

  • 資産の公開範囲
  • ガイドライン
  • 情報漏えい対策

移行性

現在のシステムを他のシステムに移行しやすくなっているか

  • 移行方式の規定
  • 設備・データ
  • 移行スケジュール
LeivyLeivy

S3について知る

「S3」は安価で耐久性の高いAWSのクラウドストレージサービス

特徴

  • 0.023USD/GB・月と安価。1GB約3円/月
  • 99.99999%の高い耐久性
  • 容量無制限で1ファイル5TBまで
  • パケットやオブジェクトに対してアクセス制限を設定できる

重要概念

  • バケット: オブジェクトの保存場所で名前はグローバルにユニークである必要がある
  • オブジェクト: データ本体。URLが付与される。バケット内オブジェクト数は無制限
  • キー: オブジェクトの格納URLパス

S3のよくある利用シーン

  • 静的コンテンツの配信
  • バッチ連携用のファイル置き場
  • ログなどの出力先
  • 静的ウェブホスティング(LPなどをS3から公開できる)

S3バケットをつくる

S3はデフォルトではアクセスできず、許可されたユーザーだけがアクセスできるようになっているので、S3へのアクセス権限を持つIAMユーザーを作成し、そのユーザーをWordpressに割り当てることで、WordpressからS3にアクセスや操作をできるようにする

  1. S3のダッシュボードからバケットを選択し、作成をクリック
  2. 「aws-and-infra-wp」などとしておく。一意である必要がある
  3. 「ブロックパブリックアクセス (バケット設定)」では、アクセスされたくないデータ等がある場合に使うが今回はインターネットに画像を配信するのが目的のため全部オフにする
  4. バージョニングは今回は無効にする
  5. あとはそのままで作成する

S3へのアクセス権をもつIAMユーザーを作成

  1. IAMのダッシュボードへ進み、メニューからユーザーを選択して作成をクリック
  2. ユーザー名は「aws-and-infra-wpadmin」としておく
  3. プログラムによるアクセスなので、マネジメントコンソールへのアクセスは提供しない
  4. ポリシーを直接アタッチを選択
  5. 検索に「S3」と入力
  6. 今回はAmazonS3FullAccessにチェックをいれる
  7. タグはいらないのでそのまま作成する
  8. 許可ポリシーがあっていれば完了
  9. 以前はIAMユーザー作成時に認証情報をダウンロードできたが、いまはできない。IAMユーザーをチェックし詳細を開き、アクセスキーを生成する必要がある。生成したらダウンロードする。「AWS コンピューティングサービスで実行されるアプリケーション」を選択するように
LeivyLeivy

WordpressからS3へ画像をアップロード

  1. 管理画面へアクセスし以下のプラグインをインストール有効化
  2. SSH接続
  3. 次のコマンドで必要なライブラリをインストールしApache再起動
    $ sudo yum install -y php-xml
    
    // 再起動
    $ sudo systemctl restart httpd.service
    
  4. wordpressの管理画面に戻りプラグインを設定する。php-xmlがうまくインストールされないと表示されない
  5. wp-config.phpにアクセス情報を書けと言われる
  6. 次のように該当ファイルを開き、nanoで画像の箇所に表示されていたコードを記入する
    $ cd /var/www/html/
    
    $ nano wp-config.php
    
  7. 保存し、管理画面に戻り画面更新し、次のようになれば成功
  8. つくったバケットを選択する
LeivyLeivy

SSL証明書の取得

  1. 「AWS Certificate Manager (ACM)」のコンソールへ移動
  2. 左のメニューから「証明書をリクエスト」を選択
  3. パブリックのまま次へ
  4. ドメイン名には最初に*.とつける
  5. 「この証明書に別の名前を追加」を押して、*.のないそのままのドメインを入力
  6. 検証方法は「DNS 検証」
  7. アルゴリズムはそのままでリクエストを押す
  8. 「Route 53 でレコードを作成」をクリック
  9. そのまま作成をクリック
  10. あとは検証がおわるのをまつ
LeivyLeivy

ELBでWebレイヤを冗長化する

稼働率を高くするためには障害発生間隔を長くするか、平均復旧時間を短くするために「冗長化」を行う
「稼働率」というのは、「障害発生間隔」と「平均復旧時間」の二つから構成されている
「冗長化」というのは、システムの構成要素を多重化すること。ある構成要素で障害が発生しても処理を引き継げるようにすることで稼働率を高める
単一障害点(SPOF)をなくす。これは、システム構成要素の中で多重化されていない構成要素のこと

稼働率を上げる方法

  1. 要素単体の稼働率を高くする
  2. 要素を組み合わせて全体の稼働率を高くする
  3. 負荷を適切なプロビジョニングで回避する

冗長化構成

要素を組み合わせることでサービスの構成を冗長化する

  • Active-Active: 冗長化した両方が利用可能 ←ベスト
  • Active-Standby: 冗長化した片方は利用不可
    • HotStandby: スタンバイ側は普段起動しすぐに利用可能
    • Warm Standby: スタンバイ側は普段起動しているが、利用するのに準備が必要
    • Cold Standby: スタンバイ側は普段停止している

データベースなどは動作が遅くなりがちなのでActive-Standbyにすることもある

負荷を適切なプロビジョニングで回避する

アクセス数などを予測し適切にリソースを準備する(プロビジョニング)ことで、負荷をさばけるようにする
負荷を軽減するには以下の二種類がある

スケールアップ

ある程度の規模まではコスパがいいが、一定の範囲を超える場合はコスパが悪い

  • 個々の要素の性能を向上させる
  • ある程度の規模まではスケールアップがコストパフォーマンスがよいが、一定範囲を超えると悪くなる

スケールアウト

一定の範囲を超える場合はコスパが良い

  • 個々の要素の数を増やす
  • ある程度の規模を超えそうであれば、スケールアウトで対応する
  • 最低要しておくべきがN+1構成、安心なのはN+2構成

N+1構成とは: サービスに最低限必要なPCの台数をNとし、それに一台を追加した台数がN+1
例えば日常のアクセスに2台必要であれば、3台用意しておくということ。N+2まであればかなり安心ができる

LeivyLeivy

ELBについて

WEBサーバーが複数台あるとき、バランスよくアクセスを捌く役割をもつ
AWSのロードバランサー
各サーバーにアクセスを振り分け、負荷を分散する装置

概要

  • 複数のEC2インスタンスに負荷分散する
  • 複数のアベイラビリティゾーンにある複数のEC2インスタンスの中から正常なターゲットにのみ振り分ける(ヘルスチェック)

特徴

  • スケーラブル: ELB自体も負荷に応じて自動でスケールアウト・スケールインする
  • アベイラビリティゾーンをまたがる構成: ELBを利用する場合、一つのリージョンを選び、そのリージョン内のアベイラビリティーゾーンはまたがるように構成できる
  • 名前解決: ELBにはDNS名が割り当てられる。ELBへの接続ポイントへのアクセスにはDNSを使用する
  • あかな従量課金: 従量課金で利用可能
  • マネージドサービス: 運用が楽
LeivyLeivy

AMIからEC2を起動する

ELB設置の前準備としてもう一台EC2をたてる

  1. VPCのダッシュボードへ行き、サブネットを選択して作成を押す
  2. VPCを選択し、名前は「aws-and-infra-public-subnet-ic」とする
  3. アベイラビリティーゾーンも1c
  4. 「IPv4 サブネット CIDR ブロック」 には10.0.11.0/24と入力する
  5. 作成を押す
  6. 作成したサブネットを選択し、下のメニューからルートテーブルを選択
  7. 編集をクリック
  8. 作ってあるルートを選択して保存する
  9. EC2のダッシュボードに移動し、インスタスを開く
  10. 既存のものを選択し、「イメージとテンプレート」からイメージを作成する
  11. イメージ名には「aws-and-infra-web-{日付}」などといれておく
  12. あとはそのままでイメージを作成する
  13. 左のメニューから「AMI」を選択すると、作成したイメージがある
  14. しばらく待って完了になったら、AMIからインスタンスを起動することができるので、選択してアクションから起動ボタンを押す
  15. タグと名前は「aws-and-infra-web」とする
  16. インスタンスタイプはt2.microにする
  17. ネットワーク設定を編集し、VPCを選択
  18. サブネットは先ほど作った1cを選択
  19. パブリックIPの自動割り当ては有効化に
  20. セキュリティグループはwebの方を選択
  21. 高度なネットワーク設定を開き、プライマリIPに「10.0.11.10」と入力
  22. キャパシティーの予約をなしに変更
  23. キーペアは既存の物を使用し、インスタンスを起動
  24. テストのためにそれぞれ別の内容が表示されるようにする
  25. まずは1aのパブリックアドレスをコピーしてSSH接続する
  26. /var/www/htmlに移動し、index.phpnanoで開く
  27. 一番下にデバックコード挿入
    <?php
    /**
     * Front to the WordPress application. This file doesn't do anything, but loads
     * wp-blog-header.php which does and tells WordPress to load the theme.
     *
     * @package WordPress
     */
    
    /**
     * Tells WordPress to load the WordPress theme and output it.
     *
     * @var bool
     */
    define( 'WP_USE_THEMES', true );
    
    /** Loads the WordPress Environment and Template */
    require __DIR__ . '/wp-blog-header.php';
    
    // ここ
    echo '<p>Sample 1a</p>';
    
  28. 1cのほうでも同様のことをするので、1cにSSH接続し、index.phpをnanoで開き<p>Sample 1c</p>を記入する
LeivyLeivy

ELBで負荷分散をする

  1. EC2のダッシュボードへ移動し、「ロードバランサー」をメニューから選択して作成を押す。ここがELBの設定
  2. ロードバランサーには種類があり、「Application Load Balancer 」はWEBサービスを作るときに基本選ぶ。今回はこれを選択。「Network Load Balancer」はサーバーから直接通信を返すのでより遅延が少ない形でレスポンスを返せるが、ロードバランサーを介さないので色々設定が追加で必要になる。高いパフォーマンスを求めるときに選ぶ。「Gateway Load Balancer」は、セキュリティやネットワーク監視用の仮想アプライアンス(ファイアウォールなど)を統合してトラフィックを処理する場合に使う。
  3. 名前は「aws-and-infra-alb」とする
  4. スキームは「インターネット向き」
  5. IPアドレスタイプはIPv4を選択
  6. ネットワークマッピングではそれぞれ対応するものを設定
  7. セキュリティグループはELBは新しいものを使うので作る
  8. 名前と説明は「aws-and-infra-alb」としておき、VPCを選択
  9. インバウンドルールでは以下のようにする
  10. できたらセキュリティグループを作成し、設定する
  11. 「リスナーとルーティング」は接続リクエストをチェックするプロセル。HTTPの80のままでOK。
  12. ターゲットグループは新しいものを作る。EC2インスタンスをターゲットにするので「インスタンス」を選択
  13. 名前は「aws-and-infra-web-tg」とする
  14. プロトコルはHTTPにし80にする
  15. ヘルスチェックでは、HTTPで、/にアクセスするとページを返すようになっているのでそのままでいい
  16. ヘルスチェックの詳細設定を変更する。ヘルスチェックに失敗したときに確認できるようにするために、しきい値を2にして10秒間隔にする。実際にはデフォルトでいい.
  17. 次へ
  18. ターゲットではどちらのインスタンスも選択し、「保留中として以下を含める」を押し、次へ
  19. 画面を戻り、ターゲットグループを設定
  20. ここまでできたら「ロードバランサーの作成」を押す
  21. 状態がActiveになるのをまつ
  22. Activeになったら選択し、下のタブからDNS名を探しコピーしてアクセスする
  23. ワードプレスが表示されれば完了
  24. 一番下を見るとechoされている内容が見えるので、画面更新を繰り返して1aと1cが切り替わるのを確認する
  25. Route53でドメインにアクセスしたらELBに繋がるように設定する
  26. Route53に移動しホストゾーンを開き、作ってあるものを開く
  27. 現在AレコードはEC2のパブリックドメインになっているので、編集
  28. エイリアスを有効化し次のようにする
  29. ドメインにアクセスし、1aと1cが切り替わるようであれば完了

ヘルスチェック機能の確認

片方のEC2を停止して挙動をみる

  1. 1cのほうにSSH接続してApatchを停止するsudo systemctl stop httpd.service
  2. ストップしたらブラウザで更新を繰り返して確認
  3. ヘルスチェックに失敗して1aしか表示されない
  4. EC2のメニューからターゲットグループを選択しチェック
  5. ターゲットを確認すると1cに問題が出ている。問題があるサーバーには通信を行わないようにELBがしてくれていることがわかる
  6. 再度1cを起動sudo systemctl start httpd.service
  7. ターゲットグループでActiveを確認したらサイトを確認し、1cが表示されればOK

料金がかからないように片づける

  1. ターゲットグループのメニューを開き、1cを登録解除する。ヘルスステータスがDrainingでなくれば完了
  2. 登録が解除されたら
LeivyLeivy

ELB運用のポイント

  1. サーバーをアベイラビリティーゾーンにまたがって配置する
  2. WEBサーバーをステートレスに構築する(データベースサーバーやファイルなどを別のサーバーに分ける)
LeivyLeivy

DBレイヤを冗長化する

マスタースレーブ構成を作っていく

基本的にはマスターへいくようにし、何か障害が発生したらマスターをスレーブに昇格して入れ替えられるようにし、サービス停止を防ぐ
現在はDBが一つしかないのでSPOFになってしまっているので、複製してSPOFをなくしていく
RDSではマルチAZ機能を使って構成を構築可能
マルチAZがONになっていればマスターからスレーブに自動的に同期を行う
マスターからスレーブに入れ替わったとしてもエンドポイントは変わらないので、問題なく使い続けることができる

  1. RDSダッシュボードに移動
  2. データベースをメニューから選択し、作成しているものを選択
  3. 設定タブの中にある「マルチAZ」がなしになっているので編集してアリに変更する
  4. すぐに適用で変更をする。しばらくするとマルチAZがはいになる
  5. これだけでマスタースレーブ構成が構築できている
  6. 最後にこのままだと料金が高いので「なし」に戻して1台構成にもどしておく
LeivyLeivy

CloudWachでシステムを監視する

EC2を監視してCPU使用率が60%を超えたらメールで連絡がいくようにする

監視の種類

死活監視とメトリクス監視の二種類がある

死活監視

  • 正常にシステムが動作しているかを監視

メトリクス監視

リソース状況のことをメトリクスという

  • パフォーマンスを定量的に監視
  • 指標を決め、指標が閾値以上・以下となっているかを把握

監視のポイント

最初は以下のような基本的な要素の使用率・枯渇状況だけ監視し、足りなくなったら都度追加していくようにする

  • CPU
  • Memory
  • Disc
  • Network

AmazonSNS

AmazonSNSというサービスを使って通知をするようにしていく
これは、Topicを作成することでPublisherがメッセージを送信し、Subscriberが通知を受信するための通信チャンネルとして機能するもの

実際に設定する

  1. CloudWatchのダッシュボードのメニューからアラームを選択して作成をクリック
  2. メトリクスではEC2を選択し、「CPUUtilization」をチェックしメトリクスの選択をクリック
  3. 期間を1分に設定
  4. 条件は静的で以上に設定し、60にしておく。これでCPU使用率が60%になったら通知が届くようになる
  5. 通知では「新しいトピックの作成」を選択し「cloudwatch_alarms_topic」としておく
  6. 通知を受け取るメールのエンドポイントには送信先の自分のメールアドレスを入力
  7. トピックの作成を押して選択しておく
  8. 次へ
  9. アラームの名前を「aws-and-infra-ec2-cpu」とし、説明にも同じものをいれておき、次へ
  10. 問題が無ければ作成を押して作成
  11. 認証メールが届いているので認証する
  12. サービスの検索でsnsと検索し、「Simple Notification Service」を開く
  13. トピックを見ると作成したものが表示されている
LeivyLeivy

CloudWachのアラートを確認する

  1. SSHアクセスしyes > /dev/null &コマンドを実行する。yesは標準ターミナル上にyを永遠に出し続けるコマンド。本来はインストール中などにyを何度も選択する時に使うコマンド。/dev/nullは画面に何も表示されない場所で&はバックグラウンドで実行するという指定
  2. 5回ほど実行したらtopコマンドで使用率を確認する
  3. 5~10分でメールが届く
  4. 確認がてきたらps aux | grep yesコマンドでyesのプロセスを絞って表示
  5. kill -9 {プロセスID}で停止していく。
  6. 全て停止させたら完了
LeivyLeivy

IAMについて詳細に学ぶ

IAMは、AWSのサービスを利用するユーザー権限を管理するサービス

概要

  • AWSリソースをセキュアに操作するために、認証・認可の仕組みを提供する
  • 各AWSリソースに対して別々のアクセス権限をユーザー毎に付与できる
  • AWS IAM自体の利用は無料

用語

  • ポリシー: アクセス許可の定義。どのサービスのどのリソースに対して、どんな操作を許可するかなどを定義する
  • ユーザー: 個々のアカウントのユーザー
  • グループ: IAMユーザーの集合。複数のユーザーにアクセス許可を付与する作業を簡素化
  • 一時的にアクセスを許可したアカウントを発行できる。EC2やLambdaなどのAWSリソースに権限を付与するために使用

今回作るもの

ポリシー

  1. DeveloperPolicy
    • EC2の全操作
    • RDSの全操作
  2. DirectorPolicy
    • EC2の読み取り
  3. AmazonS3FullAccess
    • S3の全操作

グループ

  • Developers
  • Directors

ロール

EC2などのAWSリソースに権限を付与するときはロールを使う

  • web
LeivyLeivy

IAMポリシーの作成

  1. IAMのダッシュボードに移動し、メニューからポリシーを選択し作成をクリック
  2. 「DeveloperPolicy」から作成していく。サービスはEC2を選択
  3. 「すべてのアクションを選択」
  4. リソースもすべてを選択
  5. 「許可をさらに追加」でRDSについても同様に追加
  6. 次へ
  7. 名前と説明は「AwsAndInfraDeveloperPolicy」とし、作成する
  8. 続いて「DirectorPolicy」を作成していく
  9. サービスはEC2を選択
  10. アクションでは読み取りだけをすべて選択
  11. リソースは全てにし次へ
  12. 名前と説明は「AwsAndInfraDirectorPolicy」とし、作成をクリック。以上で作成完了

IAMグループの作成

  1. IAMのダッシュボードに移動し、メニューから「ユーザーグループ」を選択して作成
  2. グループ名は「AwsAndInfraDevelopers」とする
  3. 許可ポリシーでは「AwsAndInfraDeveloperPolicy」と検索して選択し作成する
  4. 再度作成をクリックし、名前を「AwsAndInfraDirectors」とする
  5. ポリシーは「AwsAndInfraDirectorPolicy」と検索してアタッチして作成する
  6. 二つのグループが作成された

IAMロールの作成

通常EC2からS3は操作できないので、操作できるようにする

  1. EC2にSSH接続する
  2. aws s3 lsを実行。エラーになる
  3. IAMのダッシュボードメニューからロールを選択して作成を押す
  4. 「EC2」を選択して次へ
  5. S3と検索してフルアクセスをチェック
  6. 名前は「AwsAndInfraWeb」として作成を押す
  7. 次にEC2のダッシュボードへ移動しインスタンスへ移動
  8. インスタンスを選択してアクションからセキュリティ→IAMロールを変更をクリック
  9. 作成したロールを選択して更新
  10. SSH接続している画面に戻り同じコマンドを実行する。実行できれば成功
    $ aws s3 ls
    2024-08-21 08:01:40 aws-and-infra-wp-08
    2024-08-19 08:46:44 aws-cloudtrail-logs
    
LeivyLeivy

IAMのベストプラクティスを知る

  1. 個々人にIAMユーザーを作成する
    • ROOTユーザーでは基本アクセスしないように注意
  2. ユーザーをグループに所属させ、グループに権限を割り当てる
    • 権限を変更したい時に個々人だと大変。グループならグループの権限を変えるだけでいい
  3. 権限は最小限にする
    • IAMポリシーの作成・割り当てはとにかく最小限にしておき、あとから必要に応じて足していく
  4. EC2インスタンスから実行するアプリケーションにはロールを使用する
    • EC2インスタンスから別のサービスにアクセスするには認証情報が必要
    • IAMロールを使うと一時的にキーを発行するなので漏洩の心配が少ない
  5. 定期的に不要な認証情報を削除する
    • IAMユーザーが退職したりなどしたらすぐに削除するようにしっかり管理する
LeivyLeivy

ECSについて

Googleのサービスでkubernetesがあるが、こちらは主に大規模向け
ECSはオールラウンドな感じで使える

ECSは「クラスター」、「サービス」、「タスク」という三層構造になってる

今回はそのサービスを使ってLaravelのコンテナとMariaDBのコンテナを管理する

クラスター

複数のEC2や複数のFargateをつなげた仮想的な集まり
この中に「サービス」がある

サービス

「タスク」の管理者
DOCKERコンテナがいくつか入る「タスク」を管理するものになる

タスク

タスクというものの中には複数の種類のコンテナが入っている
ECSの最小単位で、このタスクを管理するのが「サービス」ということになる
ALBなどからタスクまでつなげてアプリケーションを使う

Fargateの基本

これまでやってきたようにEC2を直接管理する必要がなく、直接コンテナを利用できる
昔は料金が高かったが、今はEC2とそこまでかわらない

LeivyLeivy

ECS用のIAMロールを作成

ECSクラスタを作成するまえに、作成するECSクラスタ用のIAMロールを作成していく

  1. IAMダッシュボードのロールから作成をクリック
  2. AWSサービスの中から「Elastic Container Service」を選択
  3. ユースケースが4つあるので、順番に一つずつロールを作成する
    4.ポリシー名をクリックして詳細を確認しておく。これには、EC2から各サービスにアクセスできるような権限が最初から設定されている
  4. オプションはなしで次へ
  5. ロール名は今回キャメルケースで「ecsRole」としておく
  6. ロールを作成をクリック
  7. 同様に他の3つも作成していく
  • EC2 Role for Elastic Container Service: ecsInstanceRole
  • Elastic Container Service Autoscale: ecsAutoScalingRole
  • Elastic Container Service Task: ecsTaskExecutionRolePolicy
    • この設定だけは特殊で、タスクのロールだけ与えるために検索欄に「task」と入力してチェックする
  1. ロールの検索窓に「ecs」と入力し、ECS用のロールが揃った事を確認して完了
LeivyLeivy

AWS CLIのインストール

記事ではWindowsかMacの方法しか解説されていない
筆者はUbuntuで開発しているので、公式ドキュメントの最新のインストール方法でインストールを試みる

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html

次のようにインストールする

$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"

// unzipが無ければ
sudo apt install unzip
unzip awscliv2.zip
sudo ./aws/install

// インストールが成功しているかどうか確認しておく
aws --version

// バージョンが表示されれば成功している
aws-cli/2.17.36 Python/3.11.9 Linux/5.15.153.1-microsoft-standard-WSL2 exe/x86_64.ubuntu.22

// 不要になったインストール用ファイルを削除
rm awscliv2.zip
rm -rf aws

AWS CLIにログイン

// プロファイル情報の表示コマンド
$ aws configure

// 以下のように入力
AWS Access Key ID [None]: 
AWS Secret Access Key [None]: 
Default region name [None]: ap-northeast-1              
Default output format [None]: json

// エラーが無くプロンプトが変えてくれば成功
$ 
LeivyLeivy

ECSの立ち上げ

サンプルのクラスターを立ち上げてみる

  1. ECSのダッシュボードからクラスターの作成をクリック
  2. クラスター名は「sample-cluster」とする
  3. インフラストラクチャでは今回はまずEC2インスタンスでテストするのでEC2を選択し、オンデマンドからt2.microよりさらにやすいt2.nanoを選択する。これが最も安い
  4. その他の設定はテストなのですべてデフォルトで「作成」をクリックする
  5. Activeになれば完了
LeivyLeivy

タスク定義をする

タスクとは

タスクとは、ECSでアプリケーションを実行するための最小単位のこと。具体的には、1つ以上のコンテナの集まりを指す。タスク定義では、以下のような要素を指定する

  1. 使用するコンテナイメージ
  2. 必要なCPUとメモリのリソース
  3. コンテナ間のリンクや依存関係
  4. 環境変数の設定
  5. ポートマッピング
  6. データボリュームの設定

タスク定義を作成したら、それを基にしてタスクを実行する。クラスター内で実行されるタスクは、この定義に基づいて起動される。

例えば、ウェブアプリケーションとデータベースを組み合わせたサービスを運用する場合、それぞれのコンテナをひとつのタスクとして定義し、連携して動作するよう設定できる。

このようにタスクを適切に定義することで、アプリケーションの各コンポーネントを効率的に管理し、スケーラブルで信頼性の高いサービスを構築することが可能となる。

実際にタスクを定義してみる

  1. ECSのメニューから「タスク定義」を選択して作成を押す
  2. 定義ファミリー名は「test」とする
  3. インフラストラクチャの要件ではまずEC2インスタンスにチェックを入れる
  4. ネットワークモードは「default」を選択。
    • default: ECSはDockerのデフォルトネットワークモード(Linux on Bridge とWindowsのNAT)を使用してコンテナを起動する
    • bridge: ポートフォワーディングと言って、外部からは8080で受けたいけど内部では80で受けたいなどに使用
    • ホスト: EC2と同じポートを使いたいときに使用
    • awsvpc: VPCのネットワーク設定に従うようになる
    • なし: もしネットワーク通信をする必要がないクラスターの場合は「なし」を選ぶ
  5. タスク定義は後で設定するので空にする
  6. タスクロールはそれぞれ先程作成したものを選択
  7. 「コンテナ - 1」の設定では名前を「sample-httpd」とする
  8. DockerHubhttpdのイメージを使用するので、「イメージURI」にはhttpd:latestと書く
  9. 「ポストマッピング」では、クラスターにアクセスが来たときに、このコンテナにどうやってつなぐかというのをここで指定する。
  10. ホストポートは0。ホストポートを0にしておくとECSクラスターのほうで自動的にホスト側のポートを指定してくれる。
  11. コンテナポートは80。これはApacheサーバーのデフォルトのコンテナポート
  12. メモリのハード制限は0.128とする
  13. あとは後ほど設定するので「作成」をクリック
  14. test:11という数字は、更新などするたびに増えていく

タスクをクラスターに展開する

  1. ECSのダッシュボードの「クラスター」から、sample-clusterを選択する
  2. タスクタブに移動し、「新しいタスクの実行」をクリック
  3. 「環境」では「起動タイプ」を選択し、EC2を選択する※筆者の環境では1度「キャパシティープロバイダー戦略」で適当に立ててからでないとEC2関連のエラーここでが出てクラスターを作成できなかった
  4. 「デプロイ設定」では、「タスク」を選択し、testファミリーを選択。タスク数を増やすとその分コンテナが展開される
  5. 「タスク配置」では複数のEC2サーバーの負荷が同じ用になるくらい展開してくれる、デフォルトの「AZ バランススプレッド」を選択しておく
  6. 他はデフォルトのままタスクを作成する

セキュリティグループの設定

このままではApacheにブラウザでアクセスできないのでセキュリティグループを設定してアクセス可能にする

  1. タスクの詳細を開き、画面下部の「ネットワークバインド」タブを開き、ポート番号を確認する
  2. 「ネットワーキング」タブを開き、セキュリティグループを確認。自動で作成されているものが適用されているので、これの設定をクリックして開く
  3. 既存のものを選択し、編集をする。元のは削除し、ホストポートと80番を開けておく
  4. ネットワークバインドに記載されている外部リンクをクリック
  5. 「It works!」と表示されれば完了

不要になったクラスターの削除

  1. タスクを停止する
  2. クラスター詳細画面で削除
  3. EC2のインスタンス確認画面から不要になったものを削除する
LeivyLeivy

Fargateの弱点

  1. EC2のようにサーバーへアクセスできない
  2. dockerコマンドが使えない
  3. デバッグがやりづらい
  4. 初心者にはイメージしずらい
LeivyLeivy

ECSクラスター用VPCを作成する

以前の講座のVPCと重複しないように、以下の値で作成することにしていく

  • CIDRブロック: 10.1.0.0/16
  • パブリックサブネット1a: 10.1.10.0/24
  • パブリックサブネット1c: 10.1.11.0/24

本来はDBはプライベートサブネットに設置するが、今回はテストなのでパブリックサブネットのタスク内でDBにアクセスできないようにする

  1. VPCの新規作成画面へ
  2. VPCのみを選択
  3. 名前は「ecs-vpc」とする
  4. CIDRブロックに10.1.0.0/16と入力
  5. その他そのままで作成をする

ECSクラスター用サブネットを作成する

  1. サブネットの新規作成へ
  2. 「ecs-subnet-1a」とする
  3. アベイラビリティーゾーンは1aに
  4. 「IPv4 サブネット CIDR ブロック」は10.1.10.0/24
  5. 作成をクリック
  6. 続けてecs-subnet-1cも同じ要領で作成する

ECSクラスター用インターネットゲートウェイを作成する

  1. 名前は「ecs-igw」
  2. そのまま作成
  3. 作成したら選択し、「VPCにアタッチ」を選択してアタッチする

ECSクラスター用ルートテーブルを作成する

  1. ルートテーブルの画面へいき、作成されているもののVPCを確認する
  2. ecs-vpcと書いてあるものをチェックし編集する
  3. ルートの追加で0.0.0.0/0を指定し、作成したゲートウェイを選択して保存する
  4. そのまま「サブネットの関連付け」で作ったサブネット2つを関連付ける

以上の方法で同じアカウント内でVPCやサブネットなどを新しく作成することができる

LeivyLeivy

コンテナ配置の流れ

  1. Dockerイメージを作成
    ローカル環境で、本番環境用のDockerfile作成→ビルドでイメージ化
  2. ECRにアップロード
    作成したDockerfileをコンテナレジストリにアップロード
  3. ECSにPULL
    ECSタスクにPULLを行う
    ECSにタスク定義する時にECRにアップロードしたDockerイメージを指定することでダウンロードしてきて動かすことができる
    →自動的にdocker runされる
LeivyLeivy

Dockerfileの作成

講座のものをそのまま使うのでポイントだけメモする

# アプリケーションフォルダを環境変数として設定
# 第一: 変数名 第二: 変数に格納するもの
ENV APP_HOME /var/www/html

# ソースコードと.envファイルをDockerImageに埋め込む
# Laravelプロジェクトフォルダ全てを/var/www/htmlにコピーする
# 第一: コピー元 第二: コピー先
COPY . $APP_HOME

# .env.productionという名前では動かないので、.envという名前に変換してコピーしている
COPY .env.production /var/www/html/.env

# 初回起動時に行うスクリプトファイルをコピーして実行権限を与える
COPY ./php/start.sh /var/www/html/start.sh
RUN chmod 744 ./php/start.sh

# 最後に初回起動時に行うスクリプトをbashで実行
# CMDでは1つしかコマンドを実行できないので、スクリプトを指定している
CMD ["bash", "start.sh"]
#!/usr/bin/env bash
# 本番環境なので--force
php artisan migrate --force
# 必要な権限を付与
chmod -R 777 bootstrap 
chmod -R 777 storage
# ウェブサーバーのプロセスをフォアグラウンド起動
/usr/sbin/apache2ctl -D FOREGROUND
LeivyLeivy

ECRにDockerイメージをアップロード

  1. ECSのダッシュボードへ移動
  2. 「リポジトリ」をクリック
  3. プライベートリポジトリであることを確認して作成。プライベートにしておくとECR用のロールを持つユーザーでないと見れなくなる
  4. リポジトリ名は今回は「laravelecs」とする
  5. イメージタグのミュータビリティではミュータブルを選択しておく
  6. 暗号化設定はそのまま
  7. イメージスキャンは有効にする。これをしておくとセキュリティー上問題ないかなど簡易的なスキャンをECRがしてくれる
  8. 作成を押す
  9. 作成したイメージをクリックして詳細に移動
  10. 「プッシュコマンドを表示」する
  11. 上から順に実行する。エラーが発生した場合は認証情報がまちがえているので要確認
  12. 問題なく全て実行できたらイメージ一覧を確認。表示されていれば完了
LeivyLeivy

Fargateクラスターの作成

  1. ECSダッシュボードから新しいクラスターの作成を選択
  2. クラスター名は「simple-memo-ecs」とする
  3. インフラストラクチャで「AWS Fargate」を選択
  4. モニタリングオプションで「Container Insights の使用」を有効化。これでCloudWachで監視できるようになるツールをECSコンテナに適用できる
  5. 作成を押す

タスク定義する

タスクとは、どんなコンテナがどんな条件で動くかの設計図
これまではEC2サーバーに必要なものを色々インストールしてサーバーを作ってきたが、ECSの場合、事前に定義した形でECSクラスターがコンテナを配置してくれる
設計図を作るつもりでタスクは定義する

  1. 新しいタスク定義の画面へ
  2. 名前はsimplememo
  3. 「起動タイプ」はFargate
  4. OSはLinux
  5. ネットワークモードはawsvpc
  6. タスクサイズはCPU0.5、Memory1GB`としておく
  7. タスクロール、実行ロールは作成したecs用のものを選択。これを選択することでECRからイメージをPullできる
  8. 「コンテナ定義」に進むまえに、別タブでECSのダッシュボードを開き、ECRリポジトリを開く
  9. URIをコピー。これがDockerイメージのURL
  10. コンテナ定義に戻り、名前は「laravel」
  11. イメージURIにコピーしたDockerイメージのURLを貼り付け
  12. 「プライベートレジストリ」のチェックは、タスクとロールをしっかり設定しているので不要
  13. 「ポートマッピング」では80を指定しておく
  14. あとはDBと接続する
  15. 「メモリのハード制限」は0.128とする
  16. ログ収集は有効化
  17. 他はそのままで作成する

ECSにコンテナをデプロイ

  1. ECSのクラスターの管理画面から先ほど作成したクラスターを選択
  2. 「サービス」タブから作成をクリック
  3. 起動タイプは「Fargate」、バージョンは「LATEST」を選択
  4. デプロイ設定では「サービス」を選択し、「simplememo」タスクを選択
  5. サービス名は「simplememo」
  6. ネットワーキング設定ではVPCとサブネットは作成したものを選択
  7. セキュリティグループは新規で、名前を「simplememo-ecs」にしタイプはHTTP、ソースはAnywhereにする
  8. 他はそのままで作成をクリック
  9. 作成されたサービスを開き、タスクタブへ
  10. タスクが開始されたらタスクのパブリックIPへアクセス
  11. 次の画面が表示されていれば無事にアクセス成功※筆者は最初.env.profuctionを保存し忘れたままビルドしていたので、.envが作成されずこの画面が表示されなかった
LeivyLeivy

Fargateにおけるデバッグ

Fargateでは実際にサーバーが動いているが開発者側から見えなくなっているのでデバッグがしにくい
そのためECS Execというセッションマネージャーでコンテナに直接アクセスしてDocker execと同じことができる

講座ではlinuxでのインストール方法がなかったので、公式ドキュメントに沿ってインストールをする

  1. Session Managerプラグインをインストールするための公式ドキュメントを参照
  2. Ubuntuでは以下のコマンドでインストールする
# インストールファイルのダウンロード
curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/ubuntu_64bit/session-manager-plugin.deb" -o "session-manager-plugin.deb"

# インストール
sudo dpkg -i session-manager-plugin.deb

# 不要になったファイルの削除
rm -rf session-manager-plugin.deb

# インストールの検証
session-manager-plugin

# インストールが成功すると、次のメッセージが返される
The Session Manager plugin is installed successfully. Use the AWS CLI to start a session.

ecsTaskExecutionRolePolicyに実行権限を追加

  1. IAMロールの検索で「ecsTaskExecutionRolePolicy」とし開く
  2. 「許可を追加」で「インラインポリシーの作成」を選択
  3. 次の内容を挿入
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssmmessages:CreateControlChannel",
                "ssmmessages:CreateDataChannel",
                "ssmmessages:OpenControlChannel",
                "ssmmessages:OpenDataChannel"
            ],
            "Resource": "*"
        }
    ]
}
  1. 名前は「ecsFargateExecRole」とする
  2. 作成

ECS サービス作成時に ECS Exec フラグを有効化

  1. 次のコマンドを実行
    aws ecs update-service --region ap-northeast-1 --cluster クラスター名 --service サービス名 --enable-execute-command
  2. shift + Gキーを押し最下部に移動し、"enableExecuteCommand": trueとなっていれば成功している
  3. Qを押して終了

タスクを更新して反映

  1. クラスター管理画面でsimplememoサービスを選択して「更新」を押す
  2. 「新しいデプロイの強制」を有効化
  3. 更新をおす

こうすると自動的にタスクを新しく起動し、準備ができたら古いタスクと入れ替え、古いタスクを破棄する。
これをローリングアップデートという

AWS CLI の ecs execute-command を実行

$ aws ecs execute-command --region ap-northeast-1 --cluster simple-memo-ecs --task 543b2e7e22314cacac4dcf7665069a6e --container laravel --interactive --command "/bin/sh"

The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.

// プロンプトが帰ってくれば完了
#
LeivyLeivy

CDKについてのメモ

https://zenn.dev/issy/articles/zenn-cdk-overview

CIDR ブロックを特定の値で指定したい場合は、L1 Construct を使用します。
CDK のコマンド

cdk deploy

https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/cli.html#cli-deploy
# CDK で定義されたリソースを AWS 環境にデプロイするコマンドです。
# すべてのスタックをデプロイしたい場合は、--all オプションを指定します。
# 指定したスタックをデプロイしたい場合は、deploy の後にスタック名を指定します。

cdk diff

https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/cli.html#cli-diff

# 現在の CDK とすでにデプロイされているバージョンとの差分を確認し、変更点を一覧で取得するコマンドです。


cdk synth

https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/cli.html#cli-synth

# CDK で定義されたスタックを CloudFormation テンプレートにするコマンドです。
# リソースに付与される Metadata を削除したい場合は、--path-metadata false オプションを付与します。
# テンプレートは出力せずに、プログラム内に記述した console.log() だけ確認したい場合は、 --quit または -q オプションを付与します。


cdk list / cdk ls

https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/cli.html#cli-list

# 現在の CDK アプリに含まれるスタックの一覧を確認するコマンドです。

ディレクトリ構造

プロジェクトルートディレクトリ
    ├─ [bin]                   // App定義。複数のスタックの依存関係などを定義
    ├─ [lib]
        ├─ ★[stacks]           // スタック定義
        ├─ ★[resources]        // 各リソースごとの定義。スタックから呼ばれる
        ├─ ★[utils]            // 共通使用するものを格納
    ├─ ★[parameters]           // 環境依存情報ファイルを格納(※contextを使わない)
    ├─ ★[src]                  // Lambda や HTML などのソースを格納
    ├─ [test]                  // テスト
    ├─ [node_modules]
    ├─ cdk.context.json        // 環境依存情報(context)
    ├─ cdk.json                // デフォルトのappなどが入る
    ├─ cdk.out                 // cfnなどの出力先。コンパイルされたjsを動かすと出力される
    ├─ jest.config.js          // テストの設定ファイル
    ├─ package-lock.json
    ├─ package.json
    ├─ tsconfig.json
    ├─ README.md
LeivyLeivy

MariaDBのDockerfileの作成

# Dockerfile
# 今回は10.4を使用
FROM mariadb:10.4

# データベース周りのスクリプトファイルをdocker-entrypoint-initdb.dに持たせておくと、コンテナが立ち上がるときに自動的に実行してくれる
COPY ./init.sql /docker-entrypoint-initdb.d
# init.sql
grant all privileges on simplememo.* TO 'dbuser'@'127.0.0.1' identified by 'simplememodbuser';

ECRにイメージをプッシュ

  1. ECRのリポジトリ画面にアクセスし作成へ
  2. 名前は「mariadbecs」とする
  3. スキャンだけ有効にし、作成を押す
  4. 選択してプッシュコマンドを表示
  5. ターミナルに戻りmariadb-dockerfileディレクトリに移動
  6. プッシュコマンドを順に実行する
  7. マネジメントコンソールで問題がないか確認できれば完了
LeivyLeivy

ECRのDockerイメージでMariaDBを起動

  1. イメージURIのコピー
  2. ECSのタスク定義へ移動し、simplememoタスクを選択し、「新しいリービジョンの作成」をクリック。これでリビジョンを追加してバージョンを更新する
  3. laravelのコンテナはそのままで、コンテナの追加をクリック
  4. コンテナ名を「mariadb]とし、URIを貼り付け
  5. ポートマッピングは追加で3306を指定
  6. メモリのハード制限では「0.256」と入力
  7. 環境変数を追加
  8. ヘルスチェックタブを開き、MariaDBが立ち上がってからlaravelが立ち上がるような設定をする。
    • コマンドにCMD-SHELL, mysqladmin ping -u dbuser -psimplememodbuser -h 127.0.0.1 || exit 1と入力する(確認コマンド)
    • 間隔は10
    • タイムアウトは10
    • 開始時間も10にしておく
  9. 作成をクリック
  10. 再度リビジョンの作成をクリック
  11. laravelのコンテナ(コンテナ1)の「スタートアップの依存関係の順序 」で追加をクリック
  12. mariadbのヘルスチェックに合格したらスタートするように指定
  13. 作成をクリック
LeivyLeivy

データの永続化

EFSを使う為にVPCの設定を変更

  1. VPCの画面の、「お使いのVPC」をクリックして一覧を見る
  2. ECS用のVPCを選択
  3. DNSホスト名とDNS解決をどちらも有効にしていく。アクションから「VPCの設定を編集」をクリク
  4. 有効化のチェックをいれて保存
  5. これでEFSと連携ができるようになる

EFS(ElasticFileSystem)の設定

  1. efsの管理画面から「ファイルシステムの作成」をクリック
  2. 名前は「ecs-efs」とし、ecs-vpcを選択
  3. 作成をクリック
  4. EC2のコンソールを別タブで開き、「セキュリティグループ」を選択
  5. simplememo-ecsを選択
  6. 「インバウンドのルールを編集」をクリック
  7. 「ルールを追加」を押して「NFS」タイプをそれぞれ許可する
  8. ルールを保存
  9. EFSのコンソールに戻り、ネットワークタブの「管理」をクリック
  10. セキュリティグループを作成したものに変更
  11. ECSのコンソールに戻り、再度simplememoのリビジョンを作成
  12. 「ストレージ」の設定で、「ボリュームの追加」を押し、次のように設定
  13. 作成をクリックし、サービスを更新する
  14. もしDBが消えてしまっていたら次の手順で手動作成する
  15. コンソールで次のコマンドを実行aws ecs execute-command --region ap-northeast-1 --cluster simple-memo-ecs --task {コンテナID} --container mariadb --interactive --command "/bin/sh"
  16. mysql -u root -pMariaDBにログイン
  17. 次のコマンドでDBとユーザーを作成
    CREATE DATABASE simplememo CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
    
    grant all privileges on simplememo.* TO 'dbuser'@'127.0.0.1' identified by 'simplememodbuser';
    
  18. exitでコンテナから抜ける
  19. コンソールで次のコマンドを実行しlaravelのほうに接続aws ecs execute-command --region ap-northeast-1 --cluster simple-memo-ecs --task {コンテナID} --container laravel --interactive --command "/bin/sh"
  20. php artisan migrate --forceを実行
LeivyLeivy

ロードバランサーの設定

  1. EC2ダッシュボードからターゲットグループを選択し追加
  2. 「IPアドレス」を選択
  3. 名前は「ecs-simplememo」
  4. プロトコルはHTTP:80(一度AWSのネットワークに入るとセキュリティが担保されるためHTTPSでなくてもいい)
  5. ecs-vpcを選択
  6. プロトコルバージョンはHTTP1
  7. ヘルスチェックのパスは「/login」とする。(トップページにアクセスすると/loginにリダイレクトするため)
  8. 次へ進み、ポートが80になっているのを確認して作成する
  9. サイドバーの「ロードバランサー」から作成をクリック
  10. 「Application Load Balancer」から作成
  11. 名前は「ecs-alb」
  12. 他はそのままでVPCを選択し、サブネットも二つ選択
  13. セキュリティグループも作ったものを指定。インバウンドルールにHTTPSがなければ追加をする
  14. リスナーでは新しく追加でHTTPSを選択して、ターゲットグループを作成したものを作成
  15. セキュアリスナーの設定ではACMから証明書を選択しておく
  16. できたら作成をクリック

ECSと接続

  1. ECSのコンソールから、「作成」をクリック
  2. 起動タイプ→FARGATEとする
  3. アプリケーションタイプはサービス
  4. ファミリーはsimplememoでサービス名を「alb-searvice」とする
  5. ネットワーキング設定でVPCやサブネット、セキュリティグループを既存のものを選択
  6. ロードバランシングでは「Application Load Balancer」を選択
  7. コンテナはlaravelで「ecs-alb」を選択
  8. リスナーでは既存のHTTPSを選択
  9. ターゲットグループも選択
  10. 作成したサービスを開き、タスクタブを開き、起動を待つ
    ※同じクラスター内にALBサービスとは別のサービスがあると競合して起動しないので注意

最後にRoute53でAレコードをロードバランサーに向ければ完了

LeivyLeivy

ECSのサービスにオートスケーリング設定を行う

  1. ECSのサービスの更新画面へ
  2. 「サービスの自動スケーリング」を有効化
  3. タスクの最小数は1。最大は3に設定
  4. 「スケーリングポリシー」では名前を「autoScale」にし、「ECSServiceAverageCPUUtilization」を選択
  5. ターゲット値はテストなどで30%(実際は50~75%)
  6. クールダウン値(次のタスクまでのクールタイム)は60秒
  7. スケールイン値(タスクを減らすまでのクールタイム)は60秒(実際はオフ)
  8. できたら更新して完了
LeivyLeivy

負荷テスト

  1. 次のコマンドで負荷をかける
    sudo apt-get update
    sudo apt-get install apache2-utils
    
    ab -n 2000 -c 100 {ドメイン}
    
  2. ECSの管理画面へいき、メトリクスを確認
  3. 次にタスクへ行くと、新しいタスクが自動で起動しているのを確認できる
  4. これでオートスケーリングが自動で行われているのがわかる
LeivyLeivy

クリーンアップ

以下を削除する

  • ロードバランサー
  • EFS
  • タスクが起動しているとFARGATEでお金がかかるので、サービスの更新でタスクの数を0にして更新
  • Route53でAレコードを削除
このスクラップは2024/08/28にクローズされました