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

はじめに
AWSの知識が必要になった為UdemyでAWSをゼロから学習することになりました。
復習も兼ねて、基礎からおさらいしていきます。
これは、詰まった箇所や大事だなと思った箇所をメモするためのスクラップです。
使用する学習教材
学習に使用するGPTs

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

インフラを構築するとは
- サーバーの構成を考え作成する
- ネットワークの構成を考え、サーバーをネットワークに接続する

AWSとは?
Amazon社が提供するクラウドサービス
100以上のサービスが存在する
特徴
- サービスが豊富
- EC2やRDSなど100以上サービスが存在している
- 高負荷に耐えられる、信頼性の高いシステムを少ない手間で運用できる
- リソースが柔軟
- リソースを必要なときに必要な分だけ調達できる(柔軟でいいね)
- 従量課金
- 使った分だけ支払う
- 不必要なときは使う必要がなく、費用対効果に優れている

インフラとは?
インフラとは、サーバーやネットワークのこと
意味
- infrastructure: 基盤
- 技術用語としての意味システムやサービスの基盤となる設備
サーバーとは?
サーバーとは、クライアントに対してサービスを提供するコンピューター
サーバーは1種類ではなく、ネットワークサーバーやデーターベースサーバーなどと複数ある
ネットワークとは
複数のコンピューターをつないでデーターを送受信できるようにするもの
クラウドとは
ネットワークを利用してコンピューターリソースを利用する形態のこと
オンプレミス
- インフラを時前で用意して、自社で所有・管理すること
- 利点は自由度が高いこと
- 欠点は初期コストが高く、調達期間が必要で、サーバーの増減がしにくいこと
クラウド(AWS)
- インフラをネットワーク経由で使用・管理すること
- 利点は初期コストが安く、すぐに始めることができ、サーバ-の増減が自由にできること
- 欠点は費用の予測が付きづらいこと、クラウド全体の障害が起こると対応のしようがないこと

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

IAMで作業用ユーザーを作成する
現在は何でもできてしまうルートユーザーしかないので危険
IAMで作業用のユーザーを作成する
それぞれのユーザーの用途
ルートユーザー:
- アカウントの全てのAWSサービスとAWSリソースすべてに完全なアクセス権限を持つ特権ユーザー
- アカウントの変更・解約、サポートプランの変更等をする時のみに使用する
- 極力使用しない
作業用ユーザー(IAMユーザー):
- AWSで作成するユーザー
- 認証情報とアクセス許可の権限を個別に変更できる
- 作業者ごとに個別に作成する
- 通常の作業はIAMユーザーで行う
IAMユーザーの作成
- まずマネジメントコンソールにログイン
- 先にルートユーザーで設定するべき項目を設定するため、右上の自分の名前から
アカウント
を選択する - 少し下にいくと「IAM ユーザーおよびロールによる請求情報へのアクセス」という項目があるので編集をクリック
- 「IAM アクセスをアクティブ化」にチェックをいれて、IAMユーザーでも請求書で料金を確認できるようにしておく
- 画面左上の「サービス」をクリックして「IAM」と入力し、出てきたら★を押してお気に入りにいれておき、選択して進む。よく使うものはお気に入りにしておく。
- 左のメニューから「ユーザー」を選択
- 「ユーザーの作成」をクリック
- 任意のユーザー名を入力
- 「AWS マネジメントコンソールへのユーザーアクセスを提供する」にチェック
- ユーザータイプは今回「IAM」を選択し、IDとパスワードを設定する。大きいプロジェクトやSSOが求められる場合は「Identity Center」を選択する
- 次へ進む
- アクセス権限の設定。細かく設定できるが、AWSがあらかじめ用意してくれているものがあるので「ポリシーを直接アタッチする」を選択
- 実際の運用時には無駄な権限をつけないほうがいいので、厳しめの権限をつける
- 今回は個人用なので一番つよい権限を設定する
- 検索窓に「Administrator」と入力し、「AdministratorAccess」にチェックをいれる。これはほとんどのサービスにアクセスできる権限
- 次へ進む
- ユーザーがどのようなユーザーなのかを識別するためのタグを設定する事ができる。今回は不要なので「ユーザーの作成」を押す。
- 作成するとログイン用URLが表示されているので保管し、アクセスしてログインする
- ログインできれば完了

CloudTrailで操作ログを記録する
いつだれが何をしたのかを記録しておくことで、不正アクセスや不正操作があった時にチェックできるようになる
CloudTrailとは
- AWSユーザーの操作を記録するサービス
- デフォルトで有効になっているが、保存期間は90日のみ
- S3に操作ログを保存することで、ずっと保存できる
- CloudTrail自体は無料。S3は有料
設定手順
- リージョンを東京に設定しておく
- 左上のサービスをクリックして、「CloudTrail」と検索
- お気に入りに追加しておき、進む
- 「証跡の作成」をクリック。これを設定すると操作ログをずっと記録しておくことができるようになる
- 証跡名を設定する。任意でいいが、今回は「cloud-trail-log」とする
- 「ストレージの場所」で新しいS3バケットを作成する。バケット名はグローバルに一意である必要があるため、被らないような名前を設定する。今回はデフォルトのまま使用する。
- AWS KMS エイリアスを設定する。今回は「alias/cloudtrail-logs-key」としておく
- オプションの「CloudWatch Logs」は有料サービスだが、ログデータをリアルタイム監視して設定した特定のログが記録された際に通知を受け取ることができる。今回は使わない。
- 他はデフォルトのまま次へ進む
- ログイベントは全てチェックをいれる。
- 管理イベントでは「読み取り」と「書き込み」にチェック
- データイベントではソースにS3を選択肢、すべてのイベントをログに記録するにチェック
- Insights イベントではどちらにもチェックをいれる
- 次へ進む
- 確認画面で問題がなければ作成する
- 作成したらS3を確認し、問題なければ「CloudTrail」のホーム画面に戻る
- 「イベント履歴」でログが確認できる
CloudTrailで操作ログを記録する
いつだれが何をしたのかを記録しておくことで、不正アクセスや不正操作があった時にチェックできるようになる
CloudTrailとは
- AWSユーザーの操作を記録するサービス
- デフォルトで有効になっているが、保存期間は90日のみ
- S3に操作ログを保存することで、ずっと保存できる
- CloudTrail自体は無料。S3は有料
設定手順
- リージョンを東京に設定しておく
- 左上のサービスをクリックして、「CloudTrail」と検索
- お気に入りに追加しておき、進む
- 「証跡の作成」をクリック。これを設定すると操作ログをずっと記録しておくことができるようになる
- 証跡名を設定する。任意でいいが、今回は「cloud-trail-log」とする
- 「ストレージの場所」で新しいS3バケットを作成する。バケット名はグローバルに一意である必要があるため、被らないような名前を設定する。今回はデフォルトのまま使用する。
- AWS KMS エイリアスを設定する。今回は「alias/cloudtrail-logs-key」としておく
- オプションの「CloudWatch Logs」は有料サービスだが、ログデータをリアルタイム監視して設定した特定のログが記録された際に通知を受け取ることができる。今回は使わない。
- 他はデフォルトのまま次へ進む
- ログイベントは全てチェックをいれる。
- 管理イベントでは「読み取り」と「書き込み」にチェック
- データイベントではソースにS3を選択肢、すべてのイベントをログに記録するにチェック
- Insights イベントではどちらにもチェックをいれる
- 次へ進む
- 確認画面で問題がなければ作成する
- 作成したらS3を確認し、問題なければ「CloudTrail」のホーム画面に戻る
- 「イベント履歴」でログが確認できれば完了

ECR、ECS、Fargate、RDSの関係について(脱線)
今回のAWSの学習では、最終的にはECR、ECS、Fargate、RDSについて理解する必要があるため、ここで一度関係をまとめておきます。
AWSのコンテナとデータベースサービスの基本
主要なサービス
- ECR (Elastic Container Registry)
- ECS (Elastic Container Service)
- Fargate
- RDS (Relational Database Service)
サービスの役割と動作
-
ECR
- アプリケーションのコンテナイメージを保存する場所
- 開発者がここにアプリケーションのイメージをアップロード
-
ECS
- コンテナオーケストレーションサービス
- コンテナの実行、管理、スケーリングを行う
-
Fargate
- サーバーレスのコンテナ実行環境
- ECSと連携して使用される
- 基盤となるサーバーの管理が不要
-
RDS
- データを保存・管理するデータベース
- アプリケーションのデータを永続的に保存
ECSとFargateの関係
- ECSはコンテナの管理を行うサービス
- Fargateは、ECSが使用できる実行環境の一つ
- "ECS on Fargate"という形で使用され、サーバー管理なしでコンテナを実行できる
データの流れ
- 開発者がアプリケーションのコンテナイメージをECRにアップロード
- ECSがECRからイメージを取得
- ECSがFargate上でコンテナを起動
- 起動したアプリケーションがRDSとデータをやり取り
- ユーザーがアプリケーションを利用
図解
+-------------+ +------------------------+ +-------------+
| ECR | <-- | 開発者 | --> | RDS |
| (イメージ | | (アプリケーション開発) | | (データ保存)|
| 保存場所) | +------------------------+ +-------------+
+-------------+ | ^
| | |
| v |
| +----------------------------------------+ |
+---> | ECS | |
| (コンテナオーケストレーション) | |
| +--------------------------------+ | |
| | Fargate | | |
| | (サーバーレス実行環境) | | |
| | +------------------------+ | | |
| | | 実行中のアプリケーション| | --- |
| | +------------------------+ | |
| +--------------------------------+ |
+----------------------------------------+ |
^ |
| |
v v
+-------------+
| ユーザー |
| (アプリ利用)|
+-------------+
要点
- ECRはアプリケーションの「設計図」(イメージ)を保管
- ECSはコンテナの管理を担当
- Fargateは、ECSが使用するサーバーレスの実行環境を提供
- RDSは、アプリケーションが使うデータを保存・管理する
- 開発者はアプリケーション開発に集中でき、AWSがインフラ管理を担当
- ユーザーは、起動されたアプリケーションを利用する

リージョンとは
リージョンとは、AWSの各サービスが提供されている地域のこと
日本のサービスなら日本に設置したほうが応答時間が早くなる
アベイラビリティゾーン
アベイラビリティゾーンとは、独立したデータセンターのこと
どのリージョンにも2つ以上物理的に離れて存在しているので、
災害などがあって利用不可能になってもそれ以外のアベイラビリティゾーンでシステムが稼働できるようになっている
実際に立てるときは、どのアベイラビリティゾーンに設置するかを選ぶ
VPC(Virtual Private Cloud)
VPCはAWS上に仮想ネットワークを作成できるサービス
リージョンを選択して作成するが、アベイラビリティゾーンをまたいで設置する
サブネット
サブネットとは、VPCを細かく区切ったネットワーク
VPCの中にサブネットを2つ作って、片方を見えなく、片方を公開するなどできる
AWSでサーバーを作るときは、アベイラビリティゾーンの中にサブネットを作る
複数のサブネットにサーバーがあれば、災害などに強くなる
AWSではこのようにサブネットを複数のアベイラビリティゾーンに設置してサーバーをそれぞれ分けて設置することで、冗長性を高めることをベストプラクティスとしている

ネットワークの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

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

サブネットを作成する
前回作成したVPCをサブネットで分割していく
IPアドレスの範囲を分割して使いやすくする
サブネットで分割すると災害などに強くなり、データベースサーバーを隠せたりするのでセキュリティも向上する
実際の運用でもサブネットで分割して使用することになる
- マネジメントコンソールを開く
- サービス→VPCへ移動
- 左のメニューから「サブネット」を選択
- デフォルトは使用せず「サブネットを作成」をクリック
- 先ほど作ったVPCを選択
- サブネット名を入力。今回は「aws-and-infra-public-subnet-1a」とします
- アベイラビリティーゾーンでは1aを選択する
- IPv4 CIDRブロックには作成するサブネットのIPアドレスの範囲をCIDR形式で入力「10.0.10.0/24」
- サブネットを作成をクリック
- サブネットが作成された
これでパブリックは完成
- 同じ要領でプライベートサブネットも作成する
- 名前は「aws-and-infra-private-subnet-1a」とする
- 「IPv4 サブネット CIDR ブロック」には「10.0.20.0/24」と入力して作成する
- これでそれぞれのサブネット完成

ルーティングを設定する
最終的にパブリックサブネットからインターネットに接続できるようにする
インターネットでは、ルーターが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にアタッチ
- マネジメントコンソールを開き、VPCのダッシュボードを開く
- 左のメニューからインターネットゲートウェイを選択
- 作成をクリック
- 名前タグには「aws-and-infra-igw」とする
- 作成をクリックしてもどる
- 見てみると、どのVPCにも紐づけていないため「Detached」になっていることがわかる
- 作ったゲートウェイを選択して、アクションから「VPCにアタッチ」を選択
- 作ったVPCを選択してアタッチボタンをクリックする
- 戻って確認。アタッチされていれば完了
ルートテーブルを作成し、パブリックサブネットに紐づけ
- 左側のメニューから「ルートテーブル」を選択する
- 作成をクリック
- 名前は「aws-and-infra-public-route」とする
- 作成したVPCを選択して「ルートテーブルを作成」をクリック
- できたルートテーブルを選択し、下のサブネットの関連付けをクリック
- 「サブネットの関連付けを編集」をクリック
- 複数表示されるので、パブリックの方を選択して保存する
- 再度選択し、サブネットの関連付けを確認し問題が無ければ完了
- 選択したまま、今度は「ルート」タブを開き、ルートの編集を選択
- 追加をクリック
- 送信先は
0.0.0.0/0
とし、ターゲットに「インターネットゲートウェイ」を指定し、作成したものを選択して保存する - 確認し、問題が無ければ完了
これにより、パブリックサブネットからインターネットに接続可能になる

ネットワーク設計で考慮すべきポイント
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つ以上のアベイラビリティーゾーンを使用する

EC2インスタンスを設置しよう
パブリックサブネットの中にWebサーバーを設置しApacheをインストールしていく
EC2とは
「ElasticComputeCloud」の略でAWSクラウド上の仮想サーバー
- 数分で起動し、1時間又は秒単位の従量課金
- サーバーの追加・削除、マシンスペック変更も数分で可能
- OSより上のレイヤについては自由に設定できる
作成手順
- AMIの選択
- インスタンスタイプの選択
- ストレージの追加
- セキュリティグループの設定
- 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するとクリアされる
- 追加費用なし(無料)
- なくなってはいけないデータは置かない
- 一時ファイル、キャッシュなど、失われても問題がないデータを置く
実際に作成していく
- マネジメントコンソールにIAMユーザーでサインイン
- サービスで「EC2」と検索して「EC2ダッシュボード」に移動する
- 「インスタンスを起動」をクリック
- 名前とタグでは「aws-and-infra-web」とする
- 「アプリケーションおよび OS イメージ」では「AmazonLinux」の「Amazon Linux 2 AMI(HVM) - Kernel 5.10, SSD Volume Type」を選択
- キーペアでは「新しいキーペアの作成」をクリック
- キーペア名は「aws-and-infra-ssh-key」とする
- タイプはRSA、形式は.pemを選択して、作成する
- インスタンスタイプでは今回は「t2.micro」を使用。これはパフォーマンスが低いインスタンスタイプだが、動作確認には十分なのでこれを選択
- ネットワーク設定では作成したパブリックサブネットを選択する
- パブリックIPの自動割り当てを有効化
- セキュリティグループは新規作成で「aws-and-infra-web」という名前にしておく
- セキュリティグループのルールについては、ソースタイプを「カスタム」にし、
0.0.0.0/0
を選択しておく - ストレージは初期設定のままにしておく
- あとはデフォルトのままで、右下の「インスタンスを起動」をクリック
- 成功となれば完了

SSHでEC2インスタンスに接続する
今回は講座のとおりではなくVSCode
のRemote - SSH
拡張機能で接続してゆく
- マネジメントコンソール→EC2→インスタンスと進む
- 作成したインスタンスを選択する
- 下にパブリック IPv4 アドレス(接続するためのIPアドレス)などがあるので控える
- 前回ダウンロードされた
aws-and-infra-ssh-key.pem
を.sshディレクトリに移動 -
.ssh
ディレクトリのconfigを設定を追加するHost aws-and-infra Hostname {パブリック IPv4 アドレス} Port 22 User ec2-user IdentityFile ~/.ssh/aws-and-infra-ssh-key.pem
- 無事に接続ができるとプロンプトが返ってくるのでこれで完了
SSHでログインしてサーバーを操作できる理由
サーバー上でSSH接続を受け入れ、ユーザーからのコマンドを受け付けるプログラム(sshd)が動いているから。

ポート番号はどうやって決まっているのか
ポート番号を決める方法には2種類ある
- 標準で決められている番号
- 代表的なプログラムが使うポート番号はあらかじめ決められている(ssh:22,web:80,SMTP:25 ...など)
- 「ウェルノウンポート番号」と呼ばれる
- 0~1023までのいずれかの整数値をとる
- 接続元が接続先のポート番号を省略したときはこのウェルノウンポート番号が使用される
- 動的に決まる番号
- サービスを提供する側(サーバー)はポート番号が決まっている必要があるが、接続元のポート番号は決まってなくてもいい
- クライアントのポート番号は、OSが他のとかぶらないようにランダムに決めている
- 動的に割り当てる番号は
49152〜65535
までのいずれかの整数値をとる
ポート番号を確認する
- SSH接続し、コンソールに
sudo lsof -i -n -P
と入力。これはどのポート番号でどのプログラムが待ち受けているかを見るためコマンド- -i: ネットワークソケットファイルを表示するオプションで、サーバーの待機ポートとプロセスを一覧表示する
- -n: IPアドレスをホスト名に変換しないオプション
-
-P: ポート番号をサービス名に変換しないオプション
-
(LISTEN)
と書かれているポートが他のコンピューターから待ち受けているポート -
(ESTABLISHED)
と書かれているポートは現在通信中のポート -
*:
は、どのIPアドレスでも接続元として受け付けるという意味

Apacheをインストールする
- ssh接続する
-
sudo yum update -y
としてまずはアップデートをする -
sudo yum -y install httpd
としてApatchをインストールする。httpd
というのがApatchを構成する実行ファイル。 -
sudo systemctl start httpd.service
としてApatchを起動する。systemctl
コマンドは指定したサービスを起動停止再起動等するコマンド -
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.
- プロセスを確認することでも状態を確認できる。起動中であればHTTPDというプロセスが表示される。
ps -axu
としてプロセスを表示 - 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
-
ps -axu | grep http
としてgrep(検索)コマンドを使うと表示を絞ることができる - 今のままだとサーバーが停止や再起動するとApatchも停止するので、サーバー起動時にApatchが自動起動するようにする
-
sudo systemctl enable httpd.service
として実行する。 - 自動起動設定ができたか確認するために
sudo systemctl is-enabled httpd.service
として実行する。 -
enabled
と表示されれば完了

ファイアウォールの設定をする
不正アクセスから守るために必要な通信だけ通す、そのためにファイアウォールの設定をする。
AWS
においては、「セキュリティグループ」がファイアウォールの役割を担っている。これはEC2の外側にあり、通信の入出力を制限する。
インバウンドは必要な通信だけ通すようにして、それ以外を遮断する
セキュリティグループの80番を空けるようにする
- EC2ダッシュボードに移動
- インスタンスに移動し選択
- セキュリティタブを見ると、セキュリティグループの記載があるのでクリック
- HTTPアクセスしても接続ができるように、インバウンドルールの編集を押して追加していく
- 「ルールを追加」を押して、タイプは「HTTP」ソースは「Anywhere-IPv4」と「Anywhere-IPv6」のどちらかを選択し、もう一つルールを作り、もう片方も設定する
- できたら保存を押し、パブリックIPにブラウザでアクセスすると、テストページが表示される。これでApatchに接続できたことになる。

Elastic IPアドレスでパブリックIPアドレスを固定する
EC2インスタンスのパブリックIPは起動・停止すると別のIPアドレスが割り当てられてしまう。Elastic IPアドレスを使用するとそれを固定できる。
Elastic IPアドレスとはンターネット経由でアクセス可能な固定のグローバルIPを取得できるサービス
EC2インスタスに関連付けられていて、そのインスタンスが起動中であれば無料。そうでないと課金される。EC2インスタンスに関連づけられてなかったり、インスタンスを使用すると課金される。それを防ぐために使用しないときはElastic IPアドレスを開放する必要がある。
- マネジメントコンソール→EC2ダッシュボードに移動
- 左のメニューからElastic IPを選択
- 「Elastic IPアドレスを割り当てる」をクリック
- そのまま「割り当て」をクリックすると、新しいIPアドレスを確保することができる
- 確保したIPを選択して、アクション→アドレスの関連付けをクリック
- リソースタイプは「インスタンス」
- 紐づけるインスタンスとプライベートIPアドレスは作成したものを選択する
- 再度関連付けは。すでに関連付けされているときのオプションなのでなし
- 関連付けをクリック
- 関連付けたらブラウザでアクセスする。テストページが表示されれば完了
Elastic IPはインスタンスを紐づけていないとき、インスタンスを起動していないときはアクションからアドレスを開放する。そうしないと課金されて爆死します。

課金されないように後片付けをする
- まずはElastic IPアドレスを関連付け解除→開放する
- メニューから「インスタンス」をクリック
- 選択し、アクション→インスタンスの状態→停止をする。しばらくすると完全に停止する
この動作をしないと料金が発生していくため、学習が終わったときなどは必ず停止するようにすること

[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の仕組み
- ユーザーがブラウザにドメインを入力する
- フルリゾルバが、各ネームサーバーにドメインと紐づくIPアドレスを問い合わせる
- ルートネームサーバー→第二ネームサーバー→第三ネームサーバー→第四ネームサーバーと順番に問い合わせる
- 最終的にIPアドレスが引き出されたら、ブラウザはそのIPにアクセスしてWEBページが表示される
このようにDNSを通じてドメイン名からIPアドレスを引き出すことを「名前解決」と呼ぶ
一度アクセスしたドメインのIPアドレスはフルリゾルバがキャッシュしてしばらく保存してくれる
DNSはドメイン名とIPアドレス以外も管理している
DNSは様々な情報を管理している。DNSの「ドメイン名とIPアドレスの紐づけ」1つ1つのことを「リソースレコード」と呼び、IPアドレス以外も管理している
リソースレコードのタイプ:内容
- Aレコード: ドメインに紐づくIPアドレス
- NSレコード: ドメインのゾーンを管理するネームサーバー
- MXレコード: ドメインに紐づくメール受信サーバー
- CNAME: ドメインの別名でリソースレコードの参照先
- SOA: ドメインのゾーンの管理情報
他にもいろいろある

ドメインを購入する
テスト用ならお名前ドットコムで安いものを買い自動更新を切る
長期的に使うなら原価のCloudflare
で買う
今回は適当にお名前ドットコムで取得

Route53って何
AWSのDNSサービス。ネームサーバーの役割を果たす
特徴
- 高可用。SLA100%(サービスレベルアグリーメント)稼働率が100%で、落ちる事はないとAWSが保証している
- 高速。エッジロケーションの中で最も近いロケーションから応答を返す
- フルマネージドサービス。DNSサーバーの設計・構築・維持管理が不要
重要概念
- ホストゾーン
- DNSのリソースレコードの集合。ゾーンファイルのようなもの
- レコードセット
- リソースレコードのこと
- ルーティングポリシー
- Route53がRecordSetに対してどのようにルーティングを行うかを決める
- ヘルスチェック
- サーバーの稼働状況をチェック
ルーティングポリシー
Route53がレコードセットに対してどのようにルーティングを行うかを決めるもの
複数設定できるので柔軟に設定可能
シンプル
- レコードセットで事前に設定された値に基づいて、ドメインへの問い合わせに応答する
- 最初はこちらを使用する事が多い
加重
- 複数エンドポイント毎に設定された重みづけに基づいて、ドメインへの問い合わせに対応する
- 提供リソースに差がある場合や、ABテスト時に使用
レイテンシー
- リージョン間の遅延が少ない方のリソースへルーティングする
- マルチリージョンにリソースが存在する場合に使用
位置情報
- クライアントの位置情報に基づいて、ドメインへの問い合わせに対応する
- コンテンツのローカライズや地域限定配信時に使用
フェイルオーバー
- ヘルスチェックの結果に基づいて、利用可能なリソースへルーティングする
- 障害発生時にSorryサーバーに簡単に切り替えられる

Route53でDNSを設定する
手順概要
- ドメインのネームサーバーをRoute53に変更
- Route53で「ホストゾーン」を作成。作成すると自動的にネームサーバーも登録されている
- ネームサーバーをお名前.comからRoute53に変更
- ドメインに紐づくIPアドレスを登録
- Route53でレコードセットを作成
実際に設定する
- マネジメントコンソール→Route53に進む
- 「ホストゾーンを作成」にチェックをいれて開始する
- ドメイン名に購入したドメインを入力
- コメントは特になしでもいい
- タイプはパブリックを選択。プライベートはAWSのルーティングする際にIPアドレスではなくドメイン名を使用したいときに選択する
- 作成をクリック
- 作成すると、「NSレコード」と「SOAレコード」が登録されている。「NSレコード」はそのドメインを管理するネームサーバーとの紐づけ「SOAレコード」はゾーンの管理情報
- NSレコードをクリックして値を確認すると紐づくネームサーバーが4つ登録されているのがわかる
- EC2を別タブで開き、インスタンスタブを開く
- インスタンスを開始する
- Elastic IP も開放しているので取得しなおして関連付ける
-
.ssh
ディレクトリのconfig
を開き、新しいElastic IPに書き換えてSSH接続する - ネームサーバーを確認する。コマンドは
dig azoore.online NS +short
。dig
というのはドメインに紐づくIP、または逆を調べたい時に使う。NS
オプションでネームサーバーを知れる。dig
コマンドはいろいろな情報を表示するので、+short
でネームサーバーだけを知ることができる。 - 実行するとお名前ドットコムのネームサーバーが表示される。これはゾーンをお名前ドットコムが管理しているから。そのため、ゾーンをRoute53に変更する必要がる
[ec2-user@ip-10-0-10-58 ~]$ dig azoore.online NS +short dns2.onamae.com. dns1.onamae.com.
- お名前ドットコムにアクセスし、ログインする
- ドメイン設定→ネームサーバーの設定→対象ドメインをチェック
- 「他のネームサーバーを利用」を選択
- Route53の画面に戻り、先ほど確認したときに表示された4つのネームサーバーを入力する
- 反映されると
dig
コマンドで確認できるので、しばらくまってから確認する
ドメイン名にEC2インスタンスのIPアドレスを紐づける
- Route53のダッシュボードへ移動
- 登録されているドメインをクリック
- 「レコードを作成」をクリック
- 名前は空で、タイプは
A
にする - エイリアスはIPアドレスのかわりに AWSの名前でどこに紐づけるかを設定する。今回はつかわないのでチェックしない
-
TTL
はフルリゾルバ
にドメイン名とIPアドレスの紐づけをキャッシュしておく秒数。デフォルトは5分、そのままでOK - 値には関連付けたElastic IPを入力
- シンプルルーティングのままレコードを作成する
- これで完了。しばらく時間を待って
dig
コマンドで確認する。変わっていればブラウザでドメインにアクセスできるようになっている。1日前後かかるので気長に待つ。変わったらアクセスし、テストページが開けば完了

RDSとは
AWSのフルマネージドなリレーショナルデータベースのサービス
リレーショナルデータベースとは、データベースのことで
フルマネージドとは、AWSが運用管理のところまでやってくれるサービス
RDSの場合、従来に比べると格段に楽になっている
データーベースの設定もデフォルトで設定されていて、ベストプラクティスが適用されておりパフォーマンスが高い
利用可能なエンジン
- MySQL
- PostgreSQL
- Oracle
- Microsoft SQL Server
- Amazon Aurora
- MariaDB
各種設定グループ
RDSはフルマネージドサービスなので自分でSSH接続して各種設定をするということができないため、ユーザーが変更できる部分は「設定グループ」としてAWSから提供されている。
大きく3つのグループに分かれる
- DBパラメータグループ: DB設定値を制御
- DBオプショングループ: RDSへの機能追加を制御
- DBサブネットグループ: RDSを起動させるサブネットを制御
RDSの特徴
- 可用性の向上(障害などがあっても停止しない)
- 「マルチAZ」を簡単に構築できる
「マルチAZ」とは、AWS RDSで高可用性を実現する方法。1つのアベイラビリティゾーンにマスター(メインのデータベース)があり、別のゾーンにスレーブ(バックアップ)が配置されます。それぞれ同じエンドポイントで接続可能。マスターに問題が起きると、スタンバイが自動でマスターに切り替わります(フェイルオーバー)。データはマスターからスタンバイに同期されていて、常に最新の状態が保たれています。
- パフォーマンスの向上
- 「リードレプリカ」を簡単に構築
「リードレプリカ」とは、「マルチAZ」のように複数のRDSインスタンスを立ち上げて、マスターと同期された読み込み専用のRDSインスタンスを起動すること
こうすることでアプリケーション間のDB読み込みはリードレプリカの方に、書き込みはマスターにすることができて、DBの負荷をさげてパフォーマンスを向上させることができる。こういったものもRDSでは簡単に構築できる。
- 運用負荷の軽減
- 自動的なバックアップ
- 1日1回バックアップを自動取得(スナップショット)
- スナップショットを基にDBインスタンスを作成(リストア)
- 自動的なソフトウェアメンテナンス
- メンテンスウィンドウで指定した曜日・時間帯にアップデートを自動実施
- 監視
- 各種メトリクスを60秒間隔で取得・確認可能
- 自動的なバックアップ

RDSの設置
作成手順概要
- プライベートサブネットの作成
- RDSの作成準備
- セキュリティグループの作成(EC2)
- DBサブネットグループの作成
- DBパラメータグループの作成
- DBオプショングループの作成
- RDSの作成
- DBエンジン
- 本番環境
- DB詳細の指定
- [詳細設定]の設定
プライベートサブネットを作成する
RDSで「マルチAZ」をするためには、複数のアベイラビリティーゾーンにサブネットが作成されてなければいけない
そのためもう一つプライベートサブネットを作る
プライベートサブネットを作る
- VPCのダッシュボードへ
- 左からサブネットを選択
- 「サブネットを作成」をクリック
- VPCは自分で作ったものを選択
- 名前は「aws-and-infra-private-subnet-1c」とする
- アベイラビリティーゾーンも1cを選択
- 「IPv4 サブネット CIDR ブロック」では
10.0.21.0/24
とする - 作成をクリックして完了
RDSの作成準備
セキュリティグループの設定
RDSのファイアウォールの設定はEC2と同じくセキュリティグループで行う
- EC2のダッシュボードを開く
- 左のメニューからセキュリティグループを選択
- 新しく作成する
- 名前と説明は「aws-and-infra-db」とする
- 作成したVPCを選択
- インバウンドルールで「ルールを追加」をクリック
- WEBサーバーからのみMySQLに接続できるようにする
- タイプはMySQL Auroraを選択
- ソースでは「セキュリティグループ」単位で指定できる。ソースはカスタムで「aws-and-infra-web」を選択する
- 作成をクリックして完了
DBサブネットグループの作成
-
RDS
と検索して開く - 左のメニューからサブネットグループを選択
- RDSインスタンス起動時、「DBサブネットグループ」というものを指定する。これは、VPC内にあるサブネットを複数指定してRDSインスタンス餓鬼道するサブネットを指定した設定のこと。マルチAZで複数のサブネットを使用する関係でこちらを指定する必要がある。
- 作成をクリック
- 名前と説明は「aws-and-infra-subnet-group」とする
- VPCは作成したもの
- サブネットを追加でRDSで使用するサブネットを選択するので、作成した2つのサブネットを指定する
- 作成ボタンを押して完了
DBパラメーターグループの設定
RDSではDBの設定ファイルを直接編集できないので、DBの設定値は「DBパラメーターグループ」で行う
- 左のメニューから「パラメーターグループ」を選択
- 作成をクリック
- 名前と説明は「aws-and-infra-mysql80」とする
- エンジンタイプは「Aurora MySQL」
- グループファミリーは「aurora-mysql8.0」
- タイプはそのままで作成をクリックして完了
- パラメーターを変更したいときはグループを選択してアクションから「編集」を選択
- 色々設定できる。「Static」はRDS起動時に反映され、「Dynamic」は動的に変更される。今回は何もしない
DBオプショングループの設定
ここではDBの機能的な部分を設定する。例えばプラグインを使いたい等
- 左のメニューから「オプショングループ」を選択し作成をクリック
- 名前と説明は「aws-and-infra-mysql80」とする
- エンジンは「mysql」
- バージョンは8.0を選択
- 作成をクリックして完了
デフォルトがあるが、それは使用しない
これでRDS設置のための下準備が完了
実際にRDSを作成する
- 左のメニューから「データベース」を選択して作成をクリック
- 「標準設定」を選択
- オプションはMySQLを選択
- エンジンバージョンでは今回は最新のものを指定
- テンプレートは「開発/テスト」を今回は選択。本番を選ぶと料金が高くなる。無料枠は設定項目は限度があり、学習できないので今回は使わない
- 可用性と耐久性では「マルチ AZ DB クラスター」を選択するといいが、料金が上がるため今回は「単一の DB インスタンス」を選択
- 設定の「DBクラスター識別子」では「aws-and-infra-web」とする
- マスターユーザーの名前は「root」などでもいいがadminにしておく
- パスワードは本当は自動生成がいいが、今回は「password」とする
- インスタンスの設定では、通常は標準を選ぶといいが、学習用ではスペックの低いものを利用する
- ストレージタイプでは「汎用」を選択して20GBに設定。自動スケーリングは今回はオフ
- 接続の設定では各種自分が作成したものを選択。
- パブリックアクセスは、VPCの外からRDSに接続することはないので今回はなし
- セキュリティグループは作成したものを選択
- アベイラビリティゾーンでは1aを選択
- ポートはデフォルトの3306
- 追加の設定では名前は空
- バックアップは有効にして30日にしておく
- バックアップウィンドウではウィンドウを選択
- 開始時間は朝4時にしたいため、9時間前の19時にしておく。期間というのはスナップショットを取る間隔。30分の0.5にしておく
- モニタリングは有料になるが詳しく情報をみたいときは有効にする。今回は無効
- ログの設定ではほしいものがあればチェックをいれる。今回はなし
- メンテナンスウィンドウではウィンドウを選択をクリックして、毎週日曜の朝5時くらいにしたいので9時間前の20時にしておく
- 削除保護の有効化は本来あるといいが、今回はなし
- ここまでできたら作成をおす。しばらくすると起動する
もし手動でバックアップ(スナップショット)をとりたいときは、「メンテナンスとバックアップタブから行うことができる」
手動で取得したスナップショットはインスタンスを削除してもきえない
料金がかかるので、必要なタイミングでのみ使うこと
WEBサーバーからRDS(DBサーバー)に接続する
- EC2にSSH接続する
-
sudo yum -y install mysql
とコマンドを実行してmysql
をWEBサーバーにインストールする - RDSのデータベース情報からエンドポイントを取得する
4.mysql -h {エンドポイント} -u admin -p
このmysqlコマンドでアクセスする。-hでエンドポイントを指定し、-uでログインするユーザーを指定。-pとするとパスワード入力が求められる。-pだけ書いておく - MySQLのプロンプトが返ってくればOK

Wordpress用のデータベース作成
- SSH接続する
-
mysql -h {エンドポイント} -u admin -p
でDBにアクセスする -
CREATE DATABASE
コマンドでデータベースを作成する。今回はaws_and_infra
という名前で、utf8
を指定し、COLLATE
で照合順序を指定する。general
はグローバル、ci
は大文字小文字を区別するオプション。CREATE DATABASE aws_and_infra DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
-
Query OK, 1 row affected, 2 warnings (0.01 sec)
となれば成功 -
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)
-
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)
- 作ったユーザーにDBを操作できる権限を
GRANT
コマンドで付与する。*
はaws_and_infra
のすべてのデータベースのテーブルを操作できるという意味。TO 'aws_and_infra'@'%';
で付与する。GRANT ALL ON aws_and_infra.* TO 'aws_and_infra'@'%';
- 設定を反映させるために
FLUSH PRIVILEGES;
コマンドを実行する -
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)
- 確認出来たら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)]>
- これで完了

Wordpressのインストール
- SSH接続する
- 必要なものをインストールする。
- 最新のワードプレスでは5.6以降のPHPが必要なので通常のyumインストールコマンドではなく
amazon-linux-extras install
コマンドでインストールする。 - 今回使っているEC2のOSは
Amazon linux2
で、その中にはextrasというパッケージ群が存在している。 - その中にPHPの新しいバージョンなどが存在しているのでそれを利用することができる
sudo amazon-linux-extras install -y php7.2
- 最新のワードプレスでは5.6以降のPHPが必要なので通常のyumインストールコマンドではなく
- PHP関連の必要なものをインストールする
- 次のコマンドでPHPのバージョンに合ったものをインストールしてくれる
sudo yum install -y php php-mbstring
- 次のようにして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/
以下にあるファイルを返す

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

プロトコルについて
「プロトコル」とは、コンピューター同士がネットワークを利用して通信するために決められた約束ごとのこと
プロトコルの例
- 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アドレス
が付与されている

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

TCPとUDPプロトコルの詳細
トランスポート層のプロトコル。
代表的なものがTCP
とUDP
通信の特性によって使い分ける必要がある
TCP
TCPは通信を制御するプロトコル。データの到達確認、再送処理やコネクション管理を行う
確認応答とシーケンス番号を使用することで再送制御などを行う
データを受け取る側のコンピューターがデータを受け取ると、送信側に確認応答を返す
送信側は、確認応答を待って、帰ってくれば次のデータを送る
もし一定時間の間に確認応答が帰ってこなかった場合は、データが失われたと判断され再送される
- Transmission Control Protocol
- 信頼性のある通信を提供
- 信頼性を保つために、送信するパケットの順序制御や再送制御を行う
- 信頼性のある通信を実現する必要がある場合に使用する
パケット
1度に大量のデータを送信するのは大変なため、パケットという形にデータを小分けする
そのためデータの届く順番が正しいものになるように保証したり、パケットが届かなかったときに再送処理を行うのがTCP
シーケンス番号
送信するデータ1オクテットごとにつけられる値
1オクテット=8ビット
受信側では受信したパケットのTCPヘッダーに書き込まれているシーケンス番号とデータ長を調べ、次に自分が受信すべき番号を確認応答として返す
コネクション管理
TCPでは通信相手との間で通信を始める準備をしてから通信を行う
これを「コネクション指向」の通信とよぶ
UDPはコネクションレスなので、相手に聞かずに開始する
一方でTCPは「SYNパケット」というTCPヘッダだけからなるコネクションを確立し、要求のパケットを送信し、確認応答をまつ
確認応答が帰ってくればコネクションを確立し通信を開始する
帰ってこなければ通信を開始しない
通信が終了したときには「FINパケット」を送ってコネクションを切断する
UDP
- User Datagram Protocol
- 信頼性のない通信
- 送信するだけで、パケットが届いたかは保証しない
- 高速性やリアルタイム性を重視する通信で使用する
例えば電話や動画などは一部のパケットが失われても少しラグついたり聞き取りにくくなるだけなので、そういった通信に利用する
特徴
- アプリケーションから送信要求のあったデータをそのままネットワークに流す
- パケットが届かなくても再送制御はしないし、パケットの到着順序がいれかわっても直せない
- コネクションレスなのでいつでもデータを送信できる
- プロトコルの処理も簡単ので高速
向いてる用途
- 動画や電話など即時性が必要な通信
- 総パケット数が少ない通信(DNS)など
- 特定のネットワークに限定したアプリケーションの通信
ヘッダーのフォーマット
UDP
- 送信元ポート番号
- 宛先ポート番号
- パケット長
- チェックサム
- データ
TCP
- 送信元ポート番号
- 宛先ポート番号
- シーケンス番号
- チェックサム
- データオフセット
- 予約
- コントロールフラグ
- ウィンドウサイズ
- 確認応答番号
- 緊急ポインタ
- オプション
- パディング
- データ

IPプロトコルについてのメモ
役割のなかに、パケットの分割と再構築処理がある
ネットワークインターフェース層のプロトコルによって、最大転送単位が異なる
IPでは、各ネットワークインターフェースの最大転送単位より小さくなるようにパケットを分割して送信し、終点コンピューターで再構築する
ヘッダーのフォーマット(IPv4)
- 送信元ポート番号
- 宛先ポート番号
- バージョン
- ヘッダ長
- サービスタイプ
- パケット長
- 識別子
- フラグ
- フラグメントオフセット
- 生存時間
- プロトコル
- ヘッダチェックサム
- オプション
- パディング
- データ

インフラ設計における重要な観点
可用性
サービスを継続的に利用できるか
- 稼働率
- 目標復旧時間
- 災害対策
性能・拡張性
システムの性能が十分で、将来的においても拡張しやすいか
- 性能目標
- 拡張性
運用・保守性
運用と保守がしやすいか
- 運用時間
- バックアップ
- 運用監視
- メンテナンス
セキュリティ
情報が安全に守られているか
- 資産の公開範囲
- ガイドライン
- 情報漏えい対策
移行性
現在のシステムを他のシステムに移行しやすくなっているか
- 移行方式の規定
- 設備・データ
- 移行スケジュール

S3について知る
「S3」は安価で耐久性の高いAWSのクラウドストレージサービス
特徴
- 0.023USD/GB・月と安価。1GB約3円/月
- 99.99999%の高い耐久性
- 容量無制限で1ファイル5TBまで
- パケットやオブジェクトに対してアクセス制限を設定できる
重要概念
- バケット: オブジェクトの保存場所で名前はグローバルにユニークである必要がある
- オブジェクト: データ本体。URLが付与される。バケット内オブジェクト数は無制限
- キー: オブジェクトの格納URLパス
S3のよくある利用シーン
- 静的コンテンツの配信
- バッチ連携用のファイル置き場
- ログなどの出力先
- 静的ウェブホスティング(LPなどをS3から公開できる)
S3バケットをつくる
S3はデフォルトではアクセスできず、許可されたユーザーだけがアクセスできるようになっているので、S3へのアクセス権限を持つIAMユーザーを作成し、そのユーザーをWordpressに割り当てることで、WordpressからS3にアクセスや操作をできるようにする
- S3のダッシュボードからバケットを選択し、作成をクリック
- 「aws-and-infra-wp」などとしておく。一意である必要がある
- 「ブロックパブリックアクセス (バケット設定)」では、アクセスされたくないデータ等がある場合に使うが今回はインターネットに画像を配信するのが目的のため全部オフにする
- バージョニングは今回は無効にする
- あとはそのままで作成する
S3へのアクセス権をもつIAMユーザーを作成
- IAMのダッシュボードへ進み、メニューからユーザーを選択して作成をクリック
- ユーザー名は「aws-and-infra-wpadmin」としておく
- プログラムによるアクセスなので、マネジメントコンソールへのアクセスは提供しない
- ポリシーを直接アタッチを選択
- 検索に「S3」と入力
- 今回はAmazonS3FullAccessにチェックをいれる
- タグはいらないのでそのまま作成する
- 許可ポリシーがあっていれば完了
- 以前はIAMユーザー作成時に認証情報をダウンロードできたが、いまはできない。IAMユーザーをチェックし詳細を開き、アクセスキーを生成する必要がある。生成したらダウンロードする。「AWS コンピューティングサービスで実行されるアプリケーション」を選択するように

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

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

ELBでWebレイヤを冗長化する
稼働率を高くするためには障害発生間隔を長くするか、平均復旧時間を短くするために「冗長化」を行う
「稼働率」というのは、「障害発生間隔」と「平均復旧時間」の二つから構成されている
「冗長化」というのは、システムの構成要素を多重化すること。ある構成要素で障害が発生しても処理を引き継げるようにすることで稼働率を高める
単一障害点(SPOF)をなくす。これは、システム構成要素の中で多重化されていない構成要素のこと
稼働率を上げる方法
- 要素単体の稼働率を高くする
- 要素を組み合わせて全体の稼働率を高くする
- 負荷を適切なプロビジョニングで回避する
冗長化構成
要素を組み合わせることでサービスの構成を冗長化する
- 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まであればかなり安心ができる

ELBについて
WEBサーバーが複数台あるとき、バランスよくアクセスを捌く役割をもつ
AWSのロードバランサー
各サーバーにアクセスを振り分け、負荷を分散する装置
概要
- 複数のEC2インスタンスに負荷分散する
- 複数のアベイラビリティゾーンにある複数のEC2インスタンスの中から正常なターゲットにのみ振り分ける(ヘルスチェック)
特徴
- スケーラブル: ELB自体も負荷に応じて自動でスケールアウト・スケールインする
- アベイラビリティゾーンをまたがる構成: ELBを利用する場合、一つのリージョンを選び、そのリージョン内のアベイラビリティーゾーンはまたがるように構成できる
- 名前解決: ELBにはDNS名が割り当てられる。ELBへの接続ポイントへのアクセスにはDNSを使用する
- あかな従量課金: 従量課金で利用可能
- マネージドサービス: 運用が楽

AMIからEC2を起動する
ELB設置の前準備としてもう一台EC2をたてる
- VPCのダッシュボードへ行き、サブネットを選択して作成を押す
- VPCを選択し、名前は「aws-and-infra-public-subnet-ic」とする
- アベイラビリティーゾーンも1c
- 「IPv4 サブネット CIDR ブロック」 には
10.0.11.0/24
と入力する - 作成を押す
- 作成したサブネットを選択し、下のメニューからルートテーブルを選択
- 編集をクリック
- 作ってあるルートを選択して保存する
- EC2のダッシュボードに移動し、インスタスを開く
- 既存のものを選択し、「イメージとテンプレート」からイメージを作成する
- イメージ名には「aws-and-infra-web-{日付}」などといれておく
- あとはそのままでイメージを作成する
- 左のメニューから「AMI」を選択すると、作成したイメージがある
- しばらく待って完了になったら、AMIからインスタンスを起動することができるので、選択してアクションから起動ボタンを押す
- タグと名前は「aws-and-infra-web」とする
- インスタンスタイプは
t2.micro
にする - ネットワーク設定を編集し、VPCを選択
- サブネットは先ほど作った1cを選択
- パブリックIPの自動割り当ては有効化に
- セキュリティグループはwebの方を選択
- 高度なネットワーク設定を開き、プライマリIPに「10.0.11.10」と入力
- キャパシティーの予約をなしに変更
- キーペアは既存の物を使用し、インスタンスを起動
- テストのためにそれぞれ別の内容が表示されるようにする
- まずは1aのパブリックアドレスをコピーしてSSH接続する
-
/var/www/html
に移動し、index.php
をnano
で開く - 一番下にデバックコード挿入
<?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>';
- 1cのほうでも同様のことをするので、1cにSSH接続し、index.phpをnanoで開き
<p>Sample 1c</p>
を記入する

ELBで負荷分散をする
- EC2のダッシュボードへ移動し、「ロードバランサー」をメニューから選択して作成を押す。ここがELBの設定
- ロードバランサーには種類があり、「Application Load Balancer 」はWEBサービスを作るときに基本選ぶ。今回はこれを選択。「Network Load Balancer」はサーバーから直接通信を返すのでより遅延が少ない形でレスポンスを返せるが、ロードバランサーを介さないので色々設定が追加で必要になる。高いパフォーマンスを求めるときに選ぶ。「Gateway Load Balancer」は、セキュリティやネットワーク監視用の仮想アプライアンス(ファイアウォールなど)を統合してトラフィックを処理する場合に使う。
- 名前は「aws-and-infra-alb」とする
- スキームは「インターネット向き」
- IPアドレスタイプはIPv4を選択
- ネットワークマッピングではそれぞれ対応するものを設定
- セキュリティグループはELBは新しいものを使うので作る
- 名前と説明は「aws-and-infra-alb」としておき、VPCを選択
- インバウンドルールでは以下のようにする
- できたらセキュリティグループを作成し、設定する
- 「リスナーとルーティング」は接続リクエストをチェックするプロセル。HTTPの80のままでOK。
- ターゲットグループは新しいものを作る。EC2インスタンスをターゲットにするので「インスタンス」を選択
- 名前は「aws-and-infra-web-tg」とする
- プロトコルはHTTPにし80にする
- ヘルスチェックでは、HTTPで、/にアクセスするとページを返すようになっているのでそのままでいい
- ヘルスチェックの詳細設定を変更する。ヘルスチェックに失敗したときに確認できるようにするために、しきい値を2にして10秒間隔にする。実際にはデフォルトでいい.
- 次へ
- ターゲットではどちらのインスタンスも選択し、「保留中として以下を含める」を押し、次へ
- 画面を戻り、ターゲットグループを設定
- ここまでできたら「ロードバランサーの作成」を押す
- 状態がActiveになるのをまつ
- Activeになったら選択し、下のタブからDNS名を探しコピーしてアクセスする
- ワードプレスが表示されれば完了
- 一番下を見るとechoされている内容が見えるので、画面更新を繰り返して1aと1cが切り替わるのを確認する
- Route53でドメインにアクセスしたらELBに繋がるように設定する
- Route53に移動しホストゾーンを開き、作ってあるものを開く
- 現在AレコードはEC2のパブリックドメインになっているので、編集
- エイリアスを有効化し次のようにする
- ドメインにアクセスし、1aと1cが切り替わるようであれば完了
ヘルスチェック機能の確認
片方のEC2を停止して挙動をみる
- 1cのほうにSSH接続してApatchを停止する
sudo systemctl stop httpd.service
- ストップしたらブラウザで更新を繰り返して確認
- ヘルスチェックに失敗して1aしか表示されない
- EC2のメニューからターゲットグループを選択しチェック
- ターゲットを確認すると1cに問題が出ている。問題があるサーバーには通信を行わないようにELBがしてくれていることがわかる
- 再度1cを起動
sudo systemctl start httpd.service
- ターゲットグループでActiveを確認したらサイトを確認し、1cが表示されればOK
料金がかからないように片づける
- ターゲットグループのメニューを開き、1cを登録解除する。ヘルスステータスがDrainingでなくれば完了
- 登録が解除されたら

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

DBレイヤを冗長化する
マスタースレーブ構成を作っていく
基本的にはマスターへいくようにし、何か障害が発生したらマスターをスレーブに昇格して入れ替えられるようにし、サービス停止を防ぐ
現在はDBが一つしかないのでSPOF
になってしまっているので、複製してSPOF
をなくしていく
RDSではマルチAZ機能を使って構成を構築可能
マルチAZがONになっていればマスターからスレーブに自動的に同期を行う
マスターからスレーブに入れ替わったとしてもエンドポイントは変わらないので、問題なく使い続けることができる
- RDSダッシュボードに移動
- データベースをメニューから選択し、作成しているものを選択
- 設定タブの中にある「マルチAZ」がなしになっているので編集してアリに変更する
- すぐに適用で変更をする。しばらくするとマルチAZがはいになる
- これだけでマスタースレーブ構成が構築できている
- 最後にこのままだと料金が高いので「なし」に戻して1台構成にもどしておく

CloudWachでシステムを監視する
EC2を監視してCPU使用率が60%を超えたらメールで連絡がいくようにする
監視の種類
死活監視とメトリクス監視の二種類がある
死活監視
- 正常にシステムが動作しているかを監視
メトリクス監視
リソース状況のことをメトリクスという
- パフォーマンスを定量的に監視
- 指標を決め、指標が閾値以上・以下となっているかを把握
監視のポイント
最初は以下のような基本的な要素の使用率・枯渇状況だけ監視し、足りなくなったら都度追加していくようにする
- CPU
- Memory
- Disc
- Network
AmazonSNS
AmazonSNSというサービスを使って通知をするようにしていく
これは、Topicを作成することでPublisherがメッセージを送信し、Subscriberが通知を受信するための通信チャンネルとして機能するもの
実際に設定する
- CloudWatchのダッシュボードのメニューからアラームを選択して作成をクリック
- メトリクスではEC2を選択し、「CPUUtilization」をチェックしメトリクスの選択をクリック
- 期間を1分に設定
- 条件は静的で以上に設定し、60にしておく。これでCPU使用率が60%になったら通知が届くようになる
- 通知では「新しいトピックの作成」を選択し「cloudwatch_alarms_topic」としておく
- 通知を受け取るメールのエンドポイントには送信先の自分のメールアドレスを入力
- トピックの作成を押して選択しておく
- 次へ
- アラームの名前を「aws-and-infra-ec2-cpu」とし、説明にも同じものをいれておき、次へ
- 問題が無ければ作成を押して作成
- 認証メールが届いているので認証する
- サービスの検索でsnsと検索し、「Simple Notification Service」を開く
- トピックを見ると作成したものが表示されている

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

IAMについて詳細に学ぶ
IAMは、AWSのサービスを利用するユーザー権限を管理するサービス
概要
- AWSリソースをセキュアに操作するために、認証・認可の仕組みを提供する
- 各AWSリソースに対して別々のアクセス権限をユーザー毎に付与できる
- AWS IAM自体の利用は無料
用語
- ポリシー: アクセス許可の定義。どのサービスのどのリソースに対して、どんな操作を許可するかなどを定義する
- ユーザー: 個々のアカウントのユーザー
- グループ: IAMユーザーの集合。複数のユーザーにアクセス許可を付与する作業を簡素化
- 一時的にアクセスを許可したアカウントを発行できる。EC2やLambdaなどのAWSリソースに権限を付与するために使用
今回作るもの
ポリシー
- DeveloperPolicy
- EC2の全操作
- RDSの全操作
- DirectorPolicy
- EC2の読み取り
- AmazonS3FullAccess
- S3の全操作
グループ
- Developers
- Directors
ロール
EC2などのAWSリソースに権限を付与するときはロールを使う
- web

IAMポリシーの作成
- IAMのダッシュボードに移動し、メニューからポリシーを選択し作成をクリック
- 「DeveloperPolicy」から作成していく。サービスはEC2を選択
- 「すべてのアクションを選択」
- リソースもすべてを選択
- 「許可をさらに追加」でRDSについても同様に追加
- 次へ
- 名前と説明は「AwsAndInfraDeveloperPolicy」とし、作成する
- 続いて「DirectorPolicy」を作成していく
- サービスはEC2を選択
- アクションでは読み取りだけをすべて選択
- リソースは全てにし次へ
- 名前と説明は「AwsAndInfraDirectorPolicy」とし、作成をクリック。以上で作成完了
IAMグループの作成
- IAMのダッシュボードに移動し、メニューから「ユーザーグループ」を選択して作成
- グループ名は「AwsAndInfraDevelopers」とする
- 許可ポリシーでは「AwsAndInfraDeveloperPolicy」と検索して選択し作成する
- 再度作成をクリックし、名前を「AwsAndInfraDirectors」とする
- ポリシーは「AwsAndInfraDirectorPolicy」と検索してアタッチして作成する
- 二つのグループが作成された
IAMロールの作成
通常EC2からS3は操作できないので、操作できるようにする
- EC2にSSH接続する
-
aws s3 ls
を実行。エラーになる - IAMのダッシュボードメニューからロールを選択して作成を押す
- 「EC2」を選択して次へ
- S3と検索してフルアクセスをチェック
- 名前は「AwsAndInfraWeb」として作成を押す
- 次にEC2のダッシュボードへ移動しインスタンスへ移動
- インスタンスを選択してアクションからセキュリティ→IAMロールを変更をクリック
- 作成したロールを選択して更新
- SSH接続している画面に戻り同じコマンドを実行する。実行できれば成功
$ aws s3 ls 2024-08-21 08:01:40 aws-and-infra-wp-08 2024-08-19 08:46:44 aws-cloudtrail-logs

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

ECS Fargateを学ぶ
以降は以下のUdemy講座を受講しながら、AWSでのDocker
運用や、ECS Fargate
について学んでいきます

ECSについて
Googleのサービスでkubernetes
があるが、こちらは主に大規模向け
ECS
はオールラウンドな感じで使える
ECSは「クラスター」、「サービス」、「タスク」という三層構造になってる
今回はそのサービスを使ってLaravelのコンテナとMariaDBのコンテナを管理する
クラスター
複数のEC2や複数のFargateをつなげた仮想的な集まり
この中に「サービス」がある
サービス
「タスク」の管理者
DOCKERコンテナがいくつか入る「タスク」を管理するものになる
タスク
タスクというものの中には複数の種類のコンテナが入っている
ECSの最小単位で、このタスクを管理するのが「サービス」ということになる
ALBなどからタスクまでつなげてアプリケーションを使う
Fargateの基本
これまでやってきたようにEC2を直接管理する必要がなく、直接コンテナを利用できる
昔は料金が高かったが、今はEC2とそこまでかわらない

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

AWS CLIのインストール
記事ではWindowsかMacの方法しか解説されていない
筆者はUbuntuで開発しているので、公式ドキュメントの最新のインストール方法でインストールを試みる
次のようにインストールする
$ 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
// エラーが無くプロンプトが変えてくれば成功
$

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

タスク定義をする
タスクとは
タスクとは、ECSでアプリケーションを実行するための最小単位のこと。具体的には、1つ以上のコンテナの集まりを指す。タスク定義では、以下のような要素を指定する
- 使用するコンテナイメージ
- 必要なCPUとメモリのリソース
- コンテナ間のリンクや依存関係
- 環境変数の設定
- ポートマッピング
- データボリュームの設定
タスク定義を作成したら、それを基にしてタスクを実行する。クラスター内で実行されるタスクは、この定義に基づいて起動される。
例えば、ウェブアプリケーションとデータベースを組み合わせたサービスを運用する場合、それぞれのコンテナをひとつのタスクとして定義し、連携して動作するよう設定できる。
このようにタスクを適切に定義することで、アプリケーションの各コンポーネントを効率的に管理し、スケーラブルで信頼性の高いサービスを構築することが可能となる。
実際にタスクを定義してみる
- ECSのメニューから「タスク定義」を選択して作成を押す
- 定義ファミリー名は「test」とする
- インフラストラクチャの要件ではまずEC2インスタンスにチェックを入れる
- ネットワークモードは「default」を選択。
- default: ECSはDockerのデフォルトネットワークモード(Linux on Bridge とWindowsのNAT)を使用してコンテナを起動する
-
bridge: ポートフォワーディングと言って、外部からは
8080
で受けたいけど内部では80
で受けたいなどに使用 - ホスト: EC2と同じポートを使いたいときに使用
- awsvpc: VPCのネットワーク設定に従うようになる
- なし: もしネットワーク通信をする必要がないクラスターの場合は「なし」を選ぶ
- タスク定義は後で設定するので空にする
- タスクロールはそれぞれ先程作成したものを選択
- 「コンテナ - 1」の設定では名前を「sample-httpd」とする
-
DockerHubの
httpd
のイメージを使用するので、「イメージURI」にはhttpd:latest
と書く - 「ポストマッピング」では、クラスターにアクセスが来たときに、このコンテナにどうやってつなぐかというのをここで指定する。
- ホストポートは
0
。ホストポートを0にしておくとECSクラスターのほうで自動的にホスト側のポートを指定してくれる。 - コンテナポートは
80
。これはApacheサーバーのデフォルトのコンテナポート - メモリのハード制限は
0.128
とする - あとは後ほど設定するので「作成」をクリック
-
test:1
の1
という数字は、更新などするたびに増えていく
タスクをクラスターに展開する
- ECSのダッシュボードの「クラスター」から、
sample-cluster
を選択する - タスクタブに移動し、「新しいタスクの実行」をクリック
- 「環境」では「起動タイプ」を選択し、
EC2
を選択する※筆者の環境では1度「キャパシティープロバイダー戦略」で適当に立ててからでないとEC2関連のエラーここでが出てクラスターを作成できなかった - 「デプロイ設定」では、「タスク」を選択し、
test
ファミリーを選択。タスク数を増やすとその分コンテナが展開される - 「タスク配置」では複数のEC2サーバーの負荷が同じ用になるくらい展開してくれる、デフォルトの「AZ バランススプレッド」を選択しておく
- 他はデフォルトのままタスクを作成する
セキュリティグループの設定
このままではApacheにブラウザでアクセスできないのでセキュリティグループを設定してアクセス可能にする
- タスクの詳細を開き、画面下部の「ネットワークバインド」タブを開き、ポート番号を確認する
- 「ネットワーキング」タブを開き、セキュリティグループを確認。自動で作成されているものが適用されているので、これの設定をクリックして開く
- 既存のものを選択し、編集をする。元のは削除し、ホストポートと80番を開けておく
- ネットワークバインドに記載されている外部リンクをクリック
- 「It works!」と表示されれば完了
不要になったクラスターの削除
- タスクを停止する
- クラスター詳細画面で削除
- EC2のインスタンス確認画面から不要になったものを削除する

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

ECSクラスター用VPCを作成する
以前の講座のVPCと重複しないように、以下の値で作成することにしていく
- CIDRブロック: 10.1.0.0/16
- パブリックサブネット1a: 10.1.10.0/24
- パブリックサブネット1c: 10.1.11.0/24
本来はDBはプライベートサブネットに設置するが、今回はテストなのでパブリックサブネットのタスク内でDBにアクセスできないようにする
- VPCの新規作成画面へ
- VPCのみを選択
- 名前は「ecs-vpc」とする
- CIDRブロックに
10.1.0.0/16
と入力 - その他そのままで作成をする
ECSクラスター用サブネットを作成する
- サブネットの新規作成へ
- 「ecs-subnet-1a」とする
- アベイラビリティーゾーンは1aに
- 「IPv4 サブネット CIDR ブロック」は
10.1.10.0/24
- 作成をクリック
- 続けて
ecs-subnet-1c
も同じ要領で作成する
ECSクラスター用インターネットゲートウェイを作成する
- 名前は「ecs-igw」
- そのまま作成
- 作成したら選択し、「VPCにアタッチ」を選択してアタッチする
ECSクラスター用ルートテーブルを作成する
- ルートテーブルの画面へいき、作成されているものの
VPC
を確認する -
ecs-vpc
と書いてあるものをチェックし編集する - ルートの追加で
0.0.0.0/0
を指定し、作成したゲートウェイを選択して保存する - そのまま「サブネットの関連付け」で作ったサブネット2つを関連付ける
以上の方法で同じアカウント内でVPCやサブネットなどを新しく作成することができる

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

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

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

Fargateクラスターの作成
- ECSダッシュボードから新しいクラスターの作成を選択
- クラスター名は「simple-memo-ecs」とする
- インフラストラクチャで「AWS Fargate」を選択
- モニタリングオプションで「Container Insights の使用」を有効化。これでCloudWachで監視できるようになるツールをECSコンテナに適用できる
- 作成を押す
タスク定義する
タスクとは、どんなコンテナがどんな条件で動くかの設計図
これまではEC2サーバーに必要なものを色々インストールしてサーバーを作ってきたが、ECSの場合、事前に定義した形でECSクラスターがコンテナを配置してくれる
設計図を作るつもりでタスクは定義する
- 新しいタスク定義の画面へ
- 名前は
simplememo
- 「起動タイプ」はFargate
- OSはLinux
- ネットワークモードは
awsvpc
- タスクサイズはCPU
0.5、Memory
1GB`としておく - タスクロール、実行ロールは作成したecs用のものを選択。これを選択することでECRからイメージをPullできる
- 「コンテナ定義」に進むまえに、別タブでECSのダッシュボードを開き、ECRリポジトリを開く
-
URI
をコピー。これがDockerイメージのURL - コンテナ定義に戻り、名前は「laravel」
- イメージURIにコピーしたDockerイメージのURLを貼り付け
- 「プライベートレジストリ」のチェックは、タスクとロールをしっかり設定しているので不要
- 「ポートマッピング」では80を指定しておく
- あとはDBと接続する
- 「メモリのハード制限」は
0.128
とする - ログ収集は有効化
- 他はそのままで作成する
ECSにコンテナをデプロイ
- ECSのクラスターの管理画面から先ほど作成したクラスターを選択
- 「サービス」タブから作成をクリック
- 起動タイプは「Fargate」、バージョンは「LATEST」を選択
- デプロイ設定では「サービス」を選択し、「simplememo」タスクを選択
- サービス名は「simplememo」
- ネットワーキング設定ではVPCとサブネットは作成したものを選択
- セキュリティグループは新規で、名前を「simplememo-ecs」にしタイプは
HTTP
、ソースはAnywhere
にする - 他はそのままで作成をクリック
- 作成されたサービスを開き、タスクタブへ
- タスクが開始されたらタスクのパブリックIPへアクセス
- 次の画面が表示されていれば無事にアクセス成功※筆者は最初
.env.profuction
を保存し忘れたままビルドしていたので、.envが作成されずこの画面が表示されなかった

Fargateにおけるデバッグ
Fargateでは実際にサーバーが動いているが開発者側から見えなくなっているのでデバッグがしにくい
そのためECS Exec
というセッションマネージャーでコンテナに直接アクセスしてDocker exec
と同じことができる
講座ではlinuxでのインストール方法がなかったので、公式ドキュメントに沿ってインストールをする
- Session Managerプラグインをインストールするための公式ドキュメントを参照
- 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に実行権限を追加
- IAMロールの検索で「ecsTaskExecutionRolePolicy」とし開く
- 「許可を追加」で「インラインポリシーの作成」を選択
- 次の内容を挿入
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ssmmessages:CreateControlChannel",
"ssmmessages:CreateDataChannel",
"ssmmessages:OpenControlChannel",
"ssmmessages:OpenDataChannel"
],
"Resource": "*"
}
]
}
- 名前は「ecsFargateExecRole」とする
- 作成
ECS サービス作成時に ECS Exec フラグを有効化
- 次のコマンドを実行
aws ecs update-service --region ap-northeast-1 --cluster クラスター名 --service サービス名 --enable-execute-command
-
shift + G
キーを押し最下部に移動し、"enableExecuteCommand": true
となっていれば成功している -
Q
を押して終了
タスクを更新して反映
- クラスター管理画面で
simplememo
サービスを選択して「更新」を押す - 「新しいデプロイの強制」を有効化
- 更新をおす
こうすると自動的にタスクを新しく起動し、準備ができたら古いタスクと入れ替え、古いタスクを破棄する。
これをローリングアップデートという
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.
// プロンプトが帰ってくれば完了
#

CDKについてのメモ
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

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

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

データの永続化
EFSを使う為にVPCの設定を変更
- VPCの画面の、「お使いのVPC」をクリックして一覧を見る
- ECS用のVPCを選択
- DNSホスト名とDNS解決をどちらも有効にしていく。アクションから「VPCの設定を編集」をクリク
- 有効化のチェックをいれて保存
- これでEFSと連携ができるようになる
EFS(ElasticFileSystem)の設定
- efsの管理画面から「ファイルシステムの作成」をクリック
- 名前は「ecs-efs」とし、
ecs-vpc
を選択 - 作成をクリック
-
EC2
のコンソールを別タブで開き、「セキュリティグループ」を選択 -
simplememo-ecs
を選択 - 「インバウンドのルールを編集」をクリック
- 「ルールを追加」を押して「NFS」タイプをそれぞれ許可する
- ルールを保存
-
EFS
のコンソールに戻り、ネットワークタブの「管理」をクリック - セキュリティグループを作成したものに変更
-
ECS
のコンソールに戻り、再度simplememoのリビジョンを作成 - 「ストレージ」の設定で、「ボリュームの追加」を押し、次のように設定
- 作成をクリックし、サービスを更新する
- もしDBが消えてしまっていたら次の手順で手動作成する
- コンソールで次のコマンドを実行
aws ecs execute-command --region ap-northeast-1 --cluster simple-memo-ecs --task {コンテナID} --container mariadb --interactive --command "/bin/sh"
-
mysql -u root -p
でMariaDB
にログイン - 次のコマンドでDBとユーザーを作成
CREATE DATABASE simplememo CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; grant all privileges on simplememo.* TO 'dbuser'@'127.0.0.1' identified by 'simplememodbuser';
- exitでコンテナから抜ける
- コンソールで次のコマンドを実行し
laravel
のほうに接続aws ecs execute-command --region ap-northeast-1 --cluster simple-memo-ecs --task {コンテナID} --container laravel --interactive --command "/bin/sh"
-
php artisan migrate --force
を実行

ロードバランサーの設定
- EC2ダッシュボードからターゲットグループを選択し追加
- 「IPアドレス」を選択
- 名前は「ecs-simplememo」
- プロトコルは
HTTP:80
(一度AWSのネットワークに入るとセキュリティが担保されるためHTTPSでなくてもいい) -
ecs-vpc
を選択 - プロトコルバージョンはHTTP1
- ヘルスチェックのパスは「/login」とする。(トップページにアクセスすると/loginにリダイレクトするため)
- 次へ進み、ポートが80になっているのを確認して作成する
- サイドバーの「ロードバランサー」から作成をクリック
- 「Application Load Balancer」から作成
- 名前は「ecs-alb」
- 他はそのままでVPCを選択し、サブネットも二つ選択
- セキュリティグループも作ったものを指定。インバウンドルールに
HTTPS
がなければ追加をする - リスナーでは新しく追加で
HTTPS
を選択して、ターゲットグループを作成したものを作成 - セキュアリスナーの設定ではACMから証明書を選択しておく
- できたら作成をクリック
ECSと接続
- ECSのコンソールから、「作成」をクリック
- 起動タイプ→
FARGATE
とする - アプリケーションタイプは
サービス
- ファミリーは
simplememo
でサービス名を「alb-searvice」とする - ネットワーキング設定でVPCやサブネット、セキュリティグループを既存のものを選択
- ロードバランシングでは「Application Load Balancer」を選択
- コンテナはlaravelで「ecs-alb」を選択
- リスナーでは既存のHTTPSを選択
- ターゲットグループも選択
- 作成したサービスを開き、タスクタブを開き、起動を待つ
※同じクラスター内にALBサービスとは別のサービスがあると競合して起動しないので注意
最後にRoute53でAレコードをロードバランサーに向ければ完了

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

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

クリーンアップ
以下を削除する
- ロードバランサー
- EFS
- タスクが起動しているとFARGATEでお金がかかるので、サービスの更新でタスクの数を0にして更新
- Route53でAレコードを削除