社内研修の振り返り

お世話になっております。
クラウド事業本部の柳です。
社内研修で有意義なことをたくさん学べたので、構築したものの構成図と手順を記載していきます。
記載している内容はあくまで協栄情報の研修で行ったことですので、実際に個人でやるとなると必要な手順が省かれています。(例えば、Route53ではドメイン取得・登録する必要があるが、今回はそれがない、など)

背景

AWS未経験で、SAAのみ資格取得をしている状態から、下記に掲載する研修を受けました。

目的

AWSサービスを使ったWebアプリケーションの構築を学ぶ

今回作成した構成図

構築手順

1. VPC

  • VPCとは?
    • VPC(Virtual Private Cloud)はAWSが提供する仮想ネットワーク空間で、他のユーザーから隔離された環境を作成できます。IPアドレスやサブネット、ルーティング、セキュリティ設定を自由にカスタマイズ可能です。
  • なぜ必要か?
    • VPCはセキュリティの確保(通信制御やプライベート通信)、柔軟なネットワーク構成、マルチAZによる高可用性、コスト効率の向上、セキュリティ要件に対応できるため重要です。これにより、安全で最適なクラウド環境を構築できます。

  • VPCの構築
    • コンソールのホーム→検索バーで[VPC]と検索→VPCの右側にある☆を選択し★にする(検索バーの下に常に表記されるようになりサービスを選びやすくなる)→VPCを選択→VPCのホーム画面に遷移→VPCを作成(他のサービスを選択する際も大体こんな感じで選択していきます)
設定項目 設定項目の説明
作成するリソース VPCなどで作成すると、サブネット、ルートテーブル、IGWなどをまとめて作成してくれる。 VPC など
VPC 名 VPC を識別するための名前タグ。すべてのリソースで一意。 yanagi-vpc
IPv4 CIDR ブロック VPC 内で利用する IP アドレス範囲を指定する設定。(今回扱うリソースは少ないが、サブネットCIDRブロックを意識するためにもこの値) 10.0.0.0/16 (65,536 IPs)
IPv6 CIDR ブロック IPv6 の IP アドレス範囲を設定するオプション。 なし
テナンシー VPC のインスタンスを専有か共有か選択する設定。 デフォルト
アベイラビリティゾーンの数 サブネットを作成する AWS のエリア数を指定する設定。 2 (ap-northeast-2a, ap-northeast-2b)
パブリックサブネットの数 外部アクセス可能なサブネットを作成する数を設定。 2
プライベートサブネットの数 内部のみ利用するサブネットを作成する数を設定。 4
サブネット CIDR ブロック 各サブネットの IP アドレス範囲を設定する項目。(ここもわかりやすくしておくと、後々の設定がやりやすい) パブリック: 10.0.1.0/24, 10.0.2.0/24プライベート: 10.0.3.0/24, 10.0.4.0/24, 10.0.5.0/24, 10.0.6.0/24
NAT ゲートウェイ プライベートサブネットから外部通信を可能にする設定。(研修なので費用抑えるため1個) 1 AZ 内
VPC エンドポイント VPC 内から直接 S3 にアクセスするオプション。(インターフェイスエンドポイントと違って無料) S3 ゲートウェイ
DNS オプション VPC で DNS 名の解決やホスト名の有効化を行う設定。DNS解決を無効にすると、VPC内のインスタンスはAmazon提供のDNSサーバーを使用できなくなり、名前解決が困難になる。DNSホスト名を無効にすると、インスタンスにホスト名が割り当てられず、ホスト名を使用した通信ができなくなる。(IPアドレスでの通信になる) DNS ホスト名を有効化、DNS 解決を有効化
タグ リソースの検索や管理が容易になる。 任意(この後も全部のリソースに対してつけないので割愛)

作成した後は、private subnet3, 4の名称をprotect subnet1, 2に変更する(RDSを構築する際に置くサブネット)


続いてセキュリティグループを作成します。

  • セキュリティグループとは?
    • セキュリティグループは、クラウド上のサーバー(EC2など)への通信を制御する「壁」のようなものです。特定の条件に合った通信だけを許可し、不要なアクセスをブロックします。
  • なぜ必要か?
    • 外部からの不正アクセスやデータ漏洩を防ぎ、安全な通信環境を作るために必要です。簡単に設定変更ができ、柔軟にセキュリティを強化できます。

  • セキュリティグループの作成
    • VPC左メニューのセキュリティグループ→セキュリティグループを作成
    • 今回はALB, EC2, RDS, EFS用の4つを作成

セキュリティグループ

設定項目 設定項目の説明
VPC 作成したもの vpc-0c4794615f1432b9e (yanagi-vpc)
セキュリティグループ名と説明 SGの名前 [yanagi-alb-sg], [yanagi-ec2-sg], [yanagi-rds-sg], [yanagi-efs-sg]
インバウンドルール サーバーに入ってくる通信の種類を指定(HTTPで一回接続をテストして証明書とった後でHTTPSに変更する) [HTTP, TCP, ポート80, 0.0.0.0/0], [HTTP, TCP, ポート80, カスタム(yanagi-alb-sg)], [MYSQL/Aurora, TCP, ポート3306, カスタム(yanagi-ec2-sg)], [NFS, TCP, ポート2049, カスタム(yanagi-ec2-sg)]
アウトバウンドルール サーバーから外へ出る通信の種類を指定 すべてのトラフィック, 0.0.0.0/0

2. IAM

  • IAMとは?

IAM(Identity and Access Management)は、AWSの「ユーザー管理システム」です。誰がどのサービスを使えるかを決める仕組みです。

  • なぜ必要か?

セキュリティを守るためです。例えば、会計担当者には請求情報だけを見せ、開発者には必要な操作だけを許可する、といった管理ができます。


  • ロールの作成
    • 検索バーでIAM→左メニューのロール→ロールの作成
設定項目 設定項目の説明
信頼されたエンティティタイプ AWS内で動作を許可するサービスやエンティティの種類を選択します。 AWSのサービス
サービスまたはユースケースとユースケース 選択したサービスが特定のアクションを実行する目的を指定します。 EC2

次へ

設定項目 設定項目の説明
許可ポリシー IAMにおいて「誰が」「何を」「どのように」できるかを定義するJSONドキュメント。今回はSSMの権限とCloudWatchAgentの設定・管理・サーバーでの実行権限を付与 AmazonSSMManagedInstanceCore, CloudWatchAgentAdminPolicy, CloudWatchAgentServerPolicy
許可の境界を設定 許可の境界を設定して、このロールが持つことのできる許可の上限を制御します。これは一般的な設定ではありませんが、許可の管理を他のユーザーに委任するために使用できます。 今回は研修なのでデフォルトの許可の境界なしでロールを作成のまま

次へ。確認画面にうつるので、名前を入力(今回はyanagi-ssm-cwag-role)し、それぞれの項目を確認し作成。


3. EC2

  • EC2(Amazon Elastic Compute Cloud) とは?

    AWSが提供する仮想サーバーサービスで、インターネット上にコンピューターを簡単に作成できます。

  • なぜ必要か?

    サーバーを自分で用意しなくても、必要な時だけ使えるためコストを削減でき、アプリやウェブサイトを素早く動かせます。


  • EC2を作成する前に、キーペアの作成

  • キーペアとは?

    AWSの仮想サーバーに安全にログインするための「鍵」のようなものです。

  • なぜ必要か?

    他人に不正アクセスされないようにするため、キーペアでセキュリティを確保し、安全にサーバーを操作できます。

    • EC2左メニューキーペア→キーぺアを作成
設定項目 設定項目の説明
名前 キーペアに割り当てる名前を指定 yanagi-kp
キーペアのタイプ RSAを選ぶ時:幅広いシステムと接続する時。とにかく確実に繋げたい時。または一般的にこっち。ED25519を選ぶ時:より早くより安全につなげたい時。研修なのでRSA。 RSA
プライベートキーファイル形式 .pemを選ぶ時:Mac/Linuxから接続する時 .ppkを選ぶ時:Windowsから接続する時。今回は.pem .pem

キーぺアを作成


  • EC2の構築
    • EC2→インスタンスを起動
設定項目 設定項目の説明
名前とタグ お好きな名前 yanagi-ec2
Amazon マシンイメージ (AMI) インスタンスのOSやアプリを含むテンプレートです。Amazon Linux などを選択します。 Amazon Linux 2023
AMI ID インスタンスのOSを特定する一意の識別番号です。 ami-0de20b1c8590e09c5
インスタンスタイプ サーバーの性能を決定する設定です。無料利用枠のt2.microなどを選べます。 t2.micro
キーペア インスタンスに安全に接続するための鍵のペアを設定します。 yanagi-kp
VPC 仮想ネットワーク環境を設定します。これも先ほど作成したやつです。 yanagi-vpc (10.0.0.0/16)
サブネット インスタンスを配置するネットワークの一部を選択します。通信の範囲を制限できます。 yanagi-subnet-private1
パブリックIPの自動割り当て インスタンスに自動的にインターネット接続用のIPを割り当てるかを設定します。 無効化
ファイアウォール (セキュリティグループ) インスタンスにアクセスできる通信を制御します。セキュリティルールを設定します。 yanagi-ec2-sg
ストレージ インスタンスのデータ保存用ストレージの容量やタイプを設定します。 8 GiB (gp3)
ロール 先ほど作成したロールに設定します。 yanagi-ssm-cwag-role

インスタンスを起動

インスタンスの起動を正常に開始しましたとでればOK。全てのインスタンスを表示でインスタンスが作られているか確認。


構築したEC2にSSM接続して、Apacheをインストールし、ブラウザに表示します。

  • SSM(AWS Systems Manager Session Manager)接続とは?

    AWSが提供する、インターネットを使わず安全にサーバーへ接続できる機能です。

  • なぜ必要か?

    SSH(Secure Shell)のように公開鍵やIPアドレスを管理する必要がなく、セキュリティが向上し手間を削減できるためです。

  • Apacheとは?

    ウェブサイトをインターネットで公開するための、人気のあるウェブサーバーソフトウェアです。

  • なぜ必要か?

    ウェブページをユーザーのブラウザに配信する役割があり、ウェブサイトの基盤として欠かせません。


  • SSM接続
    • EC2→インスタンス→作成したEC2に☑→接続→セッションマネージャータブ→接続
  • Apacheのインストール&ブラウザに表示する用のindex.htmlを作成
コマンド コマンドの説明 実行結果
sudo yum update -y すべてのパッケージを最新バージョンにアップデートします。 アップデートされたパッケージの一覧が表示される。
sudo yum -y install httpd Apacheをインストールします。Complete!と表示されれば成功です。 Complete!
httpd -v Apacheが正常にインストールされているか、バージョン情報を確認します。 Server version: ...
sudo systemctl start httpd Apacheを起動します。結果は表示されませんが、正常に動作します。 なし
sudo systemctl status httpd Apacheの動作状態を確認します。active(running)と表示されていれば成功です。 active (running)
sudo systemctl enable httpd Apacheを自動起動に設定します。Created symlinkと表示されれば成功です。 Created symlink...
sudo systemctl is-enabled httpd Apacheが自動起動に設定されているか確認します。enabledと表示されれば成功です。 enabled
echo "<h1>Hello, World</h1>" | sudo tee /var/www/html/index.html ウェブページにHello, Worldを表示する設定をします。成功すると内容が表示されます。 Hello, World
curl EC2内からウェブページにアクセスし、Hello, Worldが表示されることを確認します。 Hello, World

4. ALB

  • ALBとは?

    AWSが提供する負荷分散サービスで、アクセスを複数のサーバーに分散させる仕組みです。

    どのサーバーに送るかのルールをルーティングアルゴリズムといいます。

    最もシンプルなルーティングアルゴリズムで、各サーバーに均等にルーティングすることをラウンドロビンといいます。

  • なぜ必要か?

    サーバーの負荷を軽減し、安定したサービス提供と障害時のバックアップを実現します。

  • ALBとNLBの違い

    • ALB (Application Load Balancer)
      リクエストの内容(URL、Cookie、HTTPヘッダーなど)に基づいて細かいルーティングが可能です。主にウェブアプリやAPI向けに適しています。
    • NLB (Network Load Balancer)
      IPアドレスやポートに基づいて非常に高速なルーティングを行います。高いスループットや低レイテンシが必要なシステム向けです。

      • ルーティング

        データをどのサーバーに送るかを決める仕組みです。

      • スループット

        一定時間で処理できるデータ量を指し、性能の指標です。

      • レイテンシ

        データが届くまでの時間の遅れを指し、低いほど速いです。

ALBを作成する前にターゲットグループを作成します。

  • ターゲットグループとは?

    ALBやNLBがリクエストを送るサーバーやインスタンスのまとまりを指します。

  • なぜ必要か?

    サーバーの管理を簡単にし、特定の条件に基づいてリクエストを効率的に振り分けられるからです。


    ALBのトラフィックの分散とルーティングのためのターゲットグループを作成
    EC2左メニューターゲットグループ→ターゲットグループの作成

    設定項目 設定項目の説明
    ターゲットタイプの選択 リクエストを送る先のタイプを選択、ここではさきほど作成したEC2 インスタンス
    ターゲットグループ名 ターゲットグループの名前を設定します。識別に使います。 yanagi-tg
    プロトコル : ポート 通信方式とポート番号を指定します。ウェブではHTTPと80を使用します。 HTTP : 80
    IP アドレスタイプ 通信に使うIPアドレスの種類を指定します。通常はIPv4を使用します。 IPv4
    VPC 先ほど作成したVPC yanagi-vpc
    プロトコルバージョン 使用する通信プロトコルのバージョンを選択します。 HTTP1
    ヘルスチェックプロトコル ターゲットの正常性を確認する通信プロトコルを設定します。 HTTP
    ヘルスチェックパス ヘルスチェック用のURLパスを指定します。正常性を判定、これは先ほどapacheの時に作成してindex.htmlです。 /index.html

    そのまま次へ→ターゲットを登録
    作成したインスタンスに☑→保留中として以下を含める→ターゲットグループの作成

    ターゲットグループが正常に作成されましたとでればOK。念のため下にスクロールしターゲットタブの登録済みターゲットを確認して、作成したインスタンスが登録されているかチェック。


    ALBを作成し、ALBのDNS名で接続できるかテストする。
    EC2→左メニュのロードバランサー→ロードバランサーを作成

    ロードバランサータイプ
    Application Load Balancer→作成

    設定項目 設定項目の説明
    ロードバランサー名 名前 yanagi-alb
    スキーム ロードバランサーがインターネット向けか内部用かを指定します。 インターネット向け
    ロードバランサーのIPアドレスタイプ 通信に使用するIPアドレスの種類を指定します。通常はIPv4です。 IPv4
    VPC ロードバランサーが動作する仮想ネットワークを指定します。 yanagi-vpc
    アベイラビリティーゾーン ロードバランサーが配置されるリージョン内のゾーンを指定します。 ap-northeast-2a, ap-northeast-2b
    サブネット ロードバランサーに接続するネットワークを指定します。 public1, public2
    セキュリティグループ ロードバランサーの通信を管理するセキュリティ設定を指定します。 yanagi-alb-sg
    プロトコル ロードバランサーが受け取る通信の種類を指定します(例: HTTP)。 HTTP
    ポート ロードバランサーが使用する通信ポートを指定します(例: 80)。 80
    デフォルトアクション ロードバランサーがリクエストを送る先のターゲットグループを指定します。 yanagi-tg

    その他そのままで確認で設定項目をチェックし、問題なければロードバランサーの作成


    ロードバランサーが正常に作成されましたとでればOK
    作成後の画面の詳細にDNS名というのがあるので、それをコピーしブラウザのアドレスバーにはりつけ接続できたらOK(接続できるまでラグがある。作成したロードバランサーのステータスがアクティブになるのと、ターゲットグループのヘルスチェックが正常になったら接続できる)


5. Route 53

  • Route 53とは?

    AWSが提供するDNSサービスで、ドメイン名をIPアドレスに変換する役割を持ちます。

  • なぜ必要か?

    ウェブサイトやアプリへのアクセスを簡単にするために、分かりやすい名前でサーバーを利用できるようにします。


Route 53を用いて、ALBのDNS名にレコードを対応付け、名前解決を行う(さらに、ALBのDNS名に対応付いているIPアドレスに対しても間接的に対応付ける)
Route53→ホストゾーン→test.cloud5.jp→レコードを作成

設定項目 設定項目の説明
レコード名 ドメイン名に対応するサーバーの名前を設定します。 例: xxx.example.com
レコードタイプ ドメイン名をIPv4アドレスに変換するタイプを選択します。 A
エイリアス設定 ドメイン名をロードバランサーなどのAWSリソースに関連付けます。 ON
トラフィックのルーティング先 リクエストを送る先のロードバランサーを指定します。 Application Load Balancer
リージョン サービスを提供するAWSの地理的エリアを選択します。 ソウル
ルーティングポリシー トラフィックを単純に1つのリソースにルーティングします。 シンプルルーティング
ターゲットのヘルスを評価 ターゲットの動作状態を確認してリクエストを送るかを判断します。 はい

レコードを作成


レコードが正常に作成されましたとでればOK。
作成後のレコード一覧画面で作成したレコードに☑をつけて、レコードの詳細からレコード名をコピーしてブラウザのアドレスバーに貼り付け
Hello, World
が表示されたらOK。
貼り付ける前に、先頭に

http://

を付けるのを忘れずに。


6. ACM

  • ACM(AWS Certificate Manager)とは?

    AWSが提供するSSL/TLS証明書を簡単に管理できるサービスです。

  • なぜ必要か?

    ウェブサイトの通信を暗号化し、安全にデータをやり取りするために必要です。


AWS Certificate ManagerでSSL証明書を発行し、ドメインに関連付け、HTTPS通信の準備をする
Certificate Manager→リクエスト

設定項目 設定項目の説明
証明書タイプ 公開用の証明書をリクエストし、ウェブサイトを保護します。 パブリック証明書をリクエスト
完全修飾ドメイン名 証明書を適用するウェブサイトのドメイン名を指定します。 xxx.example.com
検証方法 証明書の有効性を確認するための方法を選択します。 DNS 検証 – 推薦
キーアルゴリズム 暗号化通信に使用する鍵の形式を選択します。 RSA 2048

IDのある証明書が正常にリクエストされましたとでたらOK(まだ終わりじゃありません)
作成後の画面中央のドメインからRoute53でレコードを作成→完全修飾ドメイン名で記載したものがデフォルトで選択されているので、レコードを作成→DNS レコードが正常に作成されましたとでたらOK。
Route53→ホストゾーン→test.cloud5.jp→レコードの欄にレコードタイプがCNAMEのものが新しく作成されていたらOK
まだHTTPS通信はできない。


ALBのリスナー・SGの設定変更

  • ALBのリスナーとルールとは?

    リスナーは通信の入口で、ルールはその通信をどのサーバーに送るかを決める設定です。

  • なぜ必要か?

    ウェブサイトやアプリのリクエストを適切なサーバーに振り分けるために必要です。


ALBのリスナーとセキュリティグループの設定を変更してHTTPS通信を可能にする。
EC2→左メニューのロードバランサー→作成したALBを☑→下に詳細が表示されるのでリスナーとルールタブ→すでに作ったリスナーとルールを☑→リスナーの管理→リスナーの編集

設定項目 設定項目の説明
プロトコル 通信方式を指定します。HTTPSにすることで安全性が向上します。 HTTPS
ポート HTTPS通信に必要な標準ポート番号に自動的に設定されます。 443
証明書の取得先 通信の暗号化に使用する証明書をどこから取得するか指定します。 ACMから
証明書 ウェブサイトの暗号化通信に使用するSSL/TLS証明書を指定します。 各自の値

リスナーが正常に変更されましたとでたらOK
そのまま左メニューのセキュリティグループ→alb-sgを☑→下の項目のインバウンドルールタブ→設定してあるインバウンドルールを☑→インバウンドのルールの編集→タイプをHTTPS通信に変更
→ルールを保存
インバウンドセキュリティグループのルールが、セキュリティグループで正常に変更されましたとでればOK

ブラウザのアドレスバーでレコードに

https://

をつけてhello, Worldが表示され、かつ

http://

をつけたやつが表示されなければOK


7. RDS

  • RDS(Amazon Relational Database Service)とは?

    AWSが提供するクラウド型データベースサービスで、データを簡単に管理・保存できます。

  • なぜ必要か?

    データベースの設定やバックアップを自動化し、信頼性と効率を向上させるために必要です。


サブネットグループ

RDSを作成する前にサブネットグループを作成する
RDS→左メニューのサブネットグループ→DB サブネットグループを作成

  • サブネットグループとは?

    RDSが配置されるサブネットの集合で、どのネットワークを利用するか指定します。

  • なぜ必要か?

    RDSを配置するサブネットを明確にするために必要で、シングルAZでも必須です。


設定項目 設定項目の説明
名前と説明 サブネットグループの名前を設定し、リソースの識別に使用します。 yanagi-sng
VPC サブネットグループが属する仮想ネットワークを指定します。 yanagi-vpc
アベイラビリティーゾーン サブネットを配置するゾーンを指定し、冗長性を確保します。 ap-northeast-2a, ap-northeast-2b
サブネット リソースが配置されるネットワークの範囲を指定します。CIDR形式で定義。 10.0.5.0/24, 10.0.6.0/24

作成→yanagi-sngが正常に作成されましたとでたらOK


データを格納しておくためのRDSを作成する
RDS→データベースの作成

設定項目 設定項目の説明
データベースの作成方法 データベースを設定する方法を選択します。 標準作成
エンジンのタイプ 使用するデータベースエンジンを選択します。 MySQL
エディション データベースエンジンのバージョンやエディションを選択します。 MySQL Community
エンジンバージョン 使用するデータベースエンジンの具体的なバージョンを指定します。 MySQL8.0.39
テンプレート 設定のテンプレートを選択します。無料枠を利用します。 無料開発枠
可用性と耐久性 単一構成か冗長構成かを選択します。 単一 DB インスタンス
DB インスタンス識別子 データベースの識別名を設定します。 yanagi-db
マスターユーザー名 データベースへのログイン用ユーザー名を設定します。 yanagi
認証情報管理 認証情報を手動で管理します。 セルフマネージド
パスワード データベースの管理パスワードを設定します。 メモして保存
インスタンスクラス データベースの性能と料金に応じたインスタンスを選択します。 db.t4g.micro
ストレージタイプ 使用するストレージの種類を選択します。 汎用SSD(gp2)
ストレージ割り当て データベースに割り当てるストレージ容量を指定します。 20 GiB
ストレージの自動スケーリング ストレージの自動スケーリングを有効化します。今回は研修なので無効にします。 無効
VPC データベースを配置する仮想ネットワークを指定します。 yanagi-vpc
DB サブネットグループ データベースに関連付けるサブネットグループを指定します。 yanagi-sng
パブリックアクセス データベースへのインターネットアクセスを無効にします。 なし
セキュリティグループ データベースの通信を管理するセキュリティ設定を選択します。 rds-sg
アベイラビリティーゾーン データベースを配置するゾーンを指定します。 ap-northeast-2a
最初のデータベース名 初期設定で作成されるデータベースの名前を指定します。 yanagidb
自動バックアップ データの自動バックアップ機能を有効化します。今回は研修なので無効にします。 無効

その他全部デフォルトの値

データベースの作成


データベースの作成には時間がかかるので待つ。データベースが正常に作成されましたとでればOK
接続とセキュリティのエンドポイントとルートのエンドポイントを表示させ、タブは開いたままにしておく


8. 抽出テスト

EC2からRDSに接続し、index.phpにより抽出するデータを作成し、index.phpにより抽出する。
新しいタブでEC2→インスタンス→作成したEC2を☑→接続→セッションマネージャータブ→接続


コマンド コマンドの説明 実行結果
sudo yum install -y telnet telnetをインストールします。Complete!と表示されれば成功です。 Complete!
telnet --version telnetがインストールされているか確認します。telnet: invalid...でOKです。 telnet: invalid...
telnet データベースのエンドポイント 3306 データベースと通信できるか確認します。password...と出れば成功です。 password: (点滅表示)
sudo rpm --import MySQLのGPGキーをインストールします。 なし
sudo yum install -y MySQLリポジトリをインストールします。Complete!と表示されれば成功です。 Complete!
sudo yum install -y mysql-community-server MySQLのサーバーをインストールします。Complete!と表示されれば成功です。 Complete!
mysql --version MySQLがインストールされているか確認します。mysql Ver...で成功です。 mysql Ver...
mysql -h RDSのエンドポイント -P 3306 -u ユーザー名 -p MySQLクライアントでRDSに接続します。mysql>が表示されれば成功です。 mysql>
SHOW DATABASES; データベース一覧を表示します。作成したデータベースがリストに出れば成功です。 作成したデータベース名が表示される
USE 作成したデータベース 使用するデータベースを選択します。 Database changed
CREATE TABLE items (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL); itemsテーブルを作成します。 Query OK (正常に作成される)
SHOW TABLES; 作成したテーブルを確認します。 itemsが表示される
INSERT INTO items (name) VALUES ('卵'),('鶏むね肉'),('さつまいも'); itemsテーブルにデータを格納します。 Query OK (データが挿入される)
SELECT * FROM items; テーブルに格納されたデータを確認します。 テーブル内のデータが表示される
Ctrl + z MySQLクライアントを終了します。 プロンプトに戻る
コマンド コマンドの説明 実行結果
sudo yum install -y php PHPをインストールします。 Complete!と表示されれば成功
sudo yum install -y php-pdo php-mysqlnd PHP拡張モジュールをインストールします。MySQLにアクセス可能になります。 Complete!と表示されれば成功
php -v PHPがインストールされているか確認します。 PHP ...とバージョンが表示される
sudo vi /var/www/html/index.php Apacheの公開フォルダにPHPファイルを作成します。 index.phpが編集可能になる
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>商品一覧</title>
</head>
<body>
<?php
try {
$pdo = new PDO(
'mysql:host=[yanagi-db.cxv3vk9lsvtx.ap-northeast-2.rds.amazonaws.com](http://yanagi-db.cxv3vk9lsvtx.ap-northeast-2.rds.amazonaws.com/);dbname=yanagidb;charset=utf8',
'yanagi',
'password'
);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
} catch (PDOException $Exception) {
die('接続エラー:' . $Exception->getMessage());
}
try {
$sql = "SELECT * FROM items";
$stmh = $pdo->prepare($sql);
$stmh->execute();
} catch (PDOException $Exception) {
die('クエリエラー:' . $Exception->getMessage());
}
?>
<h1>商品一覧</h1>
<table border="1">
<thead>
<tr><th>ID</th><th>商品名</th></tr>
</thead>
<tbody>
<?php
while ($row = $stmh->fetch(PDO::FETCH_ASSOC)) {
?>
<tr>
<td><?= htmlspecialchars($row['id']) ?></td>
<td><?= htmlspecialchars($row['name']) ?></td>
</tr>
<?php
}
$pdo = null;
?>
</tbody>
</table>
</body>
</html>

↑vimで開いた後に張り付けて

:wq

で保存して終了

sudo systemctl restart httpd
Apacheの再起動
curl <http://localhost/index.php
ローカルで抽出できるか確認

最後に自分のレコードの先頭に

https://

をつけて、末尾に

/index.php

を付けたものをブラウザのアクセスバーに入力しデータが表示されれば成功。


9. CloudWatch

  • CloudWatchとは?

    AWSのサービスやアプリケーションの動作状況を監視し、データを記録するサービスです。

  • なぜ必要か?

    サーバーやアプリの問題を早期に発見し、システムの安定稼働を保つために必要です。

  • CloudWatchAgentとは?
    サーバーやアプリのCPUやメモリ、ディスク使用率などをCloudWatchに送信するためのツールです。


CloudWatchとAmazon SNSによって、CPU, メモリー, disk使用率が80%以上になった場合、アラームを発報し、同時に管理者にメールを送信する設定をしていく。

System Manager→左メニューRun Command→Run Command

設定項目 設定項目の説明
コマンドドキュメント CloudWatchAgentをインストールするためのドキュメントです。 AWS-ConfigureAWSPackage
コマンドのパラメータ インストールするCloudWatchAgentの名前とバージョンを指定します。 Name: AmazonCloudWatchAgent, , Version: latest
ターゲット CloudWatchAgentをインストールする対象のインスタンスを選びます。 作成したEC2

その他デフォルトで実行

コマンドが正常に送信されましたとでたらOK


CloudWatchAgent設定ファイルを作成

EC2インスタンス☑→接続→セッションマネージャー→接続

コマンド
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
CloudWatchAgent設定ウィザードが開始するので質問に答えていく。基本エンターで大丈夫だが、

Do you want to monitor any log files?

Do you want the CloudWatch agent to also retrieve X-ray traces?

のふたつの質問は今回の目的と合致しないのでnoの2をおしてからエンター。
最後に[Successfully put config to parameter store AmazonCloudWatch-linux.]とでれば設定完了。

sudo yum install -y collectd
先ほどの設定の際にCollectedを有効にしたので、インストールする。


CloudWatchAgentを起動

Systems Manager→Run Command→Run Command

設定項目 設定項目の説明
コマンドドキュメント CloudWatch Agentを管理するためのAWSドキュメントです。 AmazonCloudWatch-ManageAgent
パラメータ 設定元としてAmazonCloudWatch-linuxを使用。Linux用のメトリクス収集方法(CPU使用率、メモリ使用量など)が含まれます。Windowsの場合はパラメータはAmazonCloudWatch-windowsを指定します。Windows用の設定が適用され、イベントログやディスクI/OなどWindows特有のメトリクスも取得可能です。 AmazonCloudWatch-linux
ターゲット CloudWatch Agentを適用するEC2インスタンスを選択します。 作成したEC2インスタンスに☑

その他デフォルトの値で実行します。デフォルト設定はAWSの推奨構成に基づいており、一般的なユースケースで問題なく動作します。

リロードしてステータスが成功になってたらOK


CloudWatch→全てのメトリクス→リージョンがSeoulになってることを確認
カスタム名前空間のCWAgent→Instanced→2つのyanagi-ec2の
disk_used_percent
mem_used_percent
の2つを☑
上に表示されているグラフに2つの値がでればOK。時間を置くか、期間やグラフを線じゃなくて違うのにしたりすると出る。


10. Amazon SNS

  • Amazon SNS(Simple Notification Service)とは?

    AWSが提供する通知サービスで、メールやSMSで情報を配信できます。

  • なぜ必要か?

    システムの状態やエラーをリアルタイムで通知し、迅速な対応を可能にするためです。


Simple Nortification Service→トピック→トピックの作成

設定項目 設定項目の説明
タイプ 通知タイプを選択します。スタンダードは一般的な用途向けです。 スタンダード
名前と表示名 通知のトピック名を設定し、識別に使用します。 yanagi-cw-alarm
プロトコル 通知を送信する方法を選択します。 Eメール
エンドポイント 通知を受け取るメールアドレスを指定します。 自分のEメール

サブスクリプションの作成→サブスクリプションが正常に作成されましたとでたらOK
メールが送られてくるので、届いたメールからの確認登録はせず

Confirm subscription

を右クリックしてコピーする。

サブスクリプション→yanagiを検索し選択→サブスクリプションの確認→先ほどコピーしたURLを張り付ける→サブスクリプションの確認→サブスクリプションが正常に確認されましたとでればOK

トピック→yanagi-cw-alarm→メッセージの発行

件名 : test
メッセージ本文 : testです。

メッセージの発行→メールが届いたら、unsubscribeのリンクをクリック→Subscription not removed と表示されたらOK

11. アラームテスト

CloudWatch→全てのアラーム→アラームの作成

設定項目 設定項目の説明
メトリクスの選択 CPU使用率(CPUUtilization)を監視するインスタンスを選択します。 作成したインスタンス
統計 監視するメトリクスの計算方法を選択します。最大値を使用します。 最大(80%以上でアラームが鳴るか、のチェックなので)
期間 メトリクスの計測間隔を設定します。 1分(それ以下だと有料)
しきい値の種類 アラームを発生させる条件を指定します。 静的
条件 CPU使用率が指定した値を超えるとアラームを発生させます。 CPUUtilizationが80%以上
アラーム状態トリガー アラームが発生した際の状態を指定します。 アラーム状態
SNSトピック 通知を送るSNSトピックを設定します。 yanagi-cw-alarm
Eメール(エンドポイント) 通知を受け取るメールアドレスを確認します。 自分のEメール
アラーム名と説明 アラームの名前と説明を設定します。 yanagi-cw-cpu-alarm

問題がなければアラームを作成

CPUのアラームはこれで作成できたので、残りのメモリーとディスクも同じ要領で作成する。


動作確認

Systems Manager→セッションマネージャー→セッションの開始→自分のインスタンス選択→Session Start

コマンド コマンドの説明 実行結果
sudo yum install stress stressコマンドをインストールします。Complete!と表示されれば成功です。 Complete!
top 現在のCPU使用率を確認します。%Cpuの値が表示されます。 %Cpuの値を確認
stress --cpu 1 --timeout 5m & CPU使用率を一時的に増加させます。5分間持続します。 CPU使用率がほぼ100%に上昇
top CPU使用率が増加したことを再確認します。 %Cpuの値が100%付近に達する
メール確認 CPUアラームに基づいて送信されたメールを確認します。 通知メールを確認
free -h 現在のメモリ使用率を確認します。Mem:のtotalとusedを確認します。 メモリ使用率を確認
timeout 300s stress -m 1 --vm-bytes 700M --vm-hang 0 & メモリ使用率を一時的に増加させます。5分間持続します。 メモリ使用率が上昇
free -h メモリ使用率が増加したことを再確認します。 メモリ使用率が増加している
メール確認 メモリアラームに基づいて送信されたメールを確認します。 通知メールを確認
df -h 現在のディスク使用率を確認します。/dev/xvda1のUse%が表示されます。 ディスク使用率を確認
sudo dd if=/dev/zero of=6G.dummy bs=1M count=5000 ディスク使用率を一時的に増加させます。 ディスク使用率が上昇
df -h ディスク使用率が増加したことを再確認します。 /dev/xvda1のUse%が増加している
メール確認 ディスクアラームに基づいて送信されたメールを確認します。 通知メールを確認
sudo rm 6G.dummy 作成したダミーファイルを削除し、ディスク使用率を元に戻します。 ダミーファイルが削除され、ディスク使用率が低下

12. EFS

  • EFSとは?

    Amazon EFS(Elastic File System)は複数のEC2インスタンスで共有できるクラウドストレージサービスです。

  • なぜ必要か?

    データを複数のサーバー間で簡単に共有でき、スケーラブルで信頼性が高いシステムを構築するために必要です。


Amazon EFSを使ったファイル共有によって、1つのindex.phpで、2台のEC2からブラウザ上に、RDSより抽出したデータを表示していく。

(EFSを作成する前に、EC2を一台追加で作っておく。上で作ったのと同様の手順なので詳細は割愛する。)

EFS→ファイルシステムの作成

設定項目 設定項目の説明
名前 EFSの識別名を設定します。管理や識別に使用されます。 yanagi-efs
VPC EFSが属する仮想ネットワークを指定します。 yanagi-VPC
マウントターゲット 接続設定の既存のエントリを削除して新しいものを設定します。 既存のものは削除
アベイラビリティーゾーン データを分散させるための複数のゾーンを指定します。 2aと2b
サブネットID EFSを配置するサブネットを指定します。 private1とprivate2
IPアドレス EFSが使用するIPアドレスを自動で割り当てます。 自動
セキュリティグループ EFSの通信を保護する設定を選択します。 さっき作ったEFS用のセキュリティグループ

次へ→次へ→確認して作成する→作成→成功!とでたらOK
yanagi-efsを選択しネットワークタブのマウントターゲットの状態を確認→利用可能になったらOK
作成中から動かない時もあるのでその時は次へ進む


EFSのマウント作業

EFS→作成したものを選択→アタッチ

DNS 経由でマウントが選択されているのを確認→EFS マウントヘルパーの使用のコマンドをメモっておく。

EC2→インスタンス→yanagi-ec2選択→接続→セッションマネージャー→接続

二台目の方も同時に立ち上げ、MySQL , Apache , PHPのインストールをする

コマンド打ち込み(接続確認なども含んでる)

コマンド コマンドの説明 実行結果
sudo yum -y install httpd Apacheをインストールします。 Complete!
httpd -v Apacheのバージョンを確認します。 バージョンが表示される
sudo systemctl start httpd Apacheを起動します。 特に出力なし
sudo systemctl status httpd Apacheの動作状況を確認します。 active (running)が表示される
sudo systemctl enable httpd Apacheをサーバー起動時に自動起動するよう設定します。 シンボリックリンク作成のメッセージが表示される
sudo systemctl is-enabled httpd Apacheの自動起動設定を確認します。 enabledが表示される
sudo dnf install -y telnet telnetをインストールします。 Complete!
telnet --version telnetのバージョンを確認します。 バージョンが表示される
telnet データベースのエンドポイント 3306 データベースにtelnetで接続できるか確認します。 password:が表示される
sudo rpm --import <https://repo.mysql.com/RPM-GPG-KEY-mysql-2023 MySQLのGPGキーをインポートします。 特に出力なし
sudo yum install -y が表示される
SHOW DATABASES; データベース一覧を表示します。 作成したデータベースが表示される
USE yanagidb; 使用するデータベースを選択します。 Database changed
SHOW TABLES; テーブル一覧を表示します。 itemsが表示される
SELECT * FROM items; itemsテーブルのデータを確認します。 格納されたデータが表示される
sudo yum install -y php PHPをインストールします。 Complete!
sudo systemctl restart httpd Apacheを再起動して設定を適用します。 特に出力なし(これでめちゃくちゃ詰まった。これをやらないとできなかった)

次のコマンドを実行して、amazon-efs-utils パッケージ(EFS クライアント)をインストールする。(2台ともインストールする)

  • amazon-efs-utils パッケージ(EFS クライアント)とは?
    EFSを簡単にマウントして使用するためのツールです。
コマンド コマンドの説明 実行結果
sudo yum install -y amazon-efs-utils EFSを簡単にマウントするためのツールをインストールします。 Complete! と表示されれば成功
sudo mount -t efs -o tls ~~~~~ /var/www/html/ EFSを/var/www/htmlにマウントします。コマンド実行に少し時間がかかる場合があります。 特に出力なし
df -T | grep nfs4 EFSが正しくマウントされているか確認します。 127.0.0.1:/ nfs4 形式で表示されれば成功です。
mount | grep /var/www/html EFSが/var/www/htmlにマウントされているか確認します。 127.0.0.1:/ on /var/www/html が表示されれば成功です。

13. ファイル共有テスト

最初に開いておいたセッションマネージャーのタブに戻る
cd コマンドで、マウントした ディレクトリに移動
cd /var/www/html/
lsで中身確認
ls
マウントする前のファイルは共有されないので何もない。
なので、もう一度作成、index.phpによるデータ抽出の目次から。

両方のEC2からlsチェック
curlコマンドでもチェック
curl <http://localhost/index.php

ブラウザから更新連打で確認して問題なさそうならOK

PHP, MySQL, Apacheのインストールし忘れ、Apacheの再起動し忘れで「あれ?できない!」と何回かなったので気をつけるように!


14. S3

  • S3(Simple Storage Service)とは?

    AWSが提供するクラウドストレージサービスで、データを簡単に保存・管理できます。

  • なぜ必要か?

    ALBのアクセスログを安全に保存・管理し、後で分析やトラブルシューティングに利用するためです。


ALBのアクセスログを、S3バケットに保管する。

S3→バケットを作成

設定項目 設定項目の説明
オブジェクト所有者 バケット内のオブジェクトの所有権を管理します。IAMポリシーで一元管理するためACLを無効化します。 ACL 無効(推薦)
このバケットのブロックパブリックアクセス設定 バケットのパブリックアクセスをすべてブロックすることで安全性を高めます。 パブリックアクセスをすべてブロック
バケットのバージョニング バケットのオブジェクト履歴を保存しますが、今回は無効にします。 無効にする
タグ バケットに関連付けられる追加情報ですが、今回は不要です。 なし
デフォルトの暗号化 オブジェクトを自動で暗号化し、安全に保存します。 Amazon S3 マネージドキーを使用(SSE-S3)
バケットキー 暗号化コストを削減し、パフォーマンスを向上させます。 有効にする
詳細設定 – オブジェクトロック バケット内のデータ削除を防ぎますが、今回は無効にします。 無効にする

作成→画面遷移→yanagiで検索し作られてるか確認


S3バケットにポリシーをアタッチ

S3→yanagi-backetをクリックし画面遷移
アクセス許可タブに移動し、バケットポリシーを編集
バケットポリシー→ポリシー

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::600734575887:root"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::yanagi-backet/*"
        }
    ]
}

変更の保存→画面遷移してバケットポリシーが正常に編集されましたとでたらOK。


ALBのアクセスログ設定

EC2→ロードバランサー→選択→下の属性タブを選択→編集
ロードバランサーの詳細を開き設定を変更したいALBか確認
下までスクロールし、モニタリングタブのアクセスログ ON
今回はアクセスログなので、接続ログはOFFのままで。
S3 URI S3を参照→yanagiで検索し選択
変更内容の保存→画面遷移してロードバランサーの属性が正常に変更されましたとでたらOK。


ログの確認

自分のレコードを数回リロード
S3→バケット→yanagiで検索し選択→AWSLogs/が作られていればOK
そしてその中のディレクトリを潜っていくと自分のレコードにアクセスしたログの記録がある。


15. AWS Backup

  • AWS Backupとは?

    AWSが提供するデータバックアップサービスで、簡単に自動化されたバックアップを設定・管理できます。

  • なぜ必要か?

    データを災害や操作ミスから守り、必要なときに復元できるようにするためです。


Amazon Backupによって、EC2の復元を可能にする。

オンデマンドバックアップを作成

AWS Backup→設定
画面遷移した後の右側にあるリソースを設定→画面遷移しリソース EC2がONになっているかチェック。その他全部OFF
確認

設定項目 設定項目の説明
リソースタイプ バックアップを取得するリソースの種類を指定します。 EC2
インスタンスID バックアップ対象のEC2インスタンスを識別します。 yanagi-ec2
バックアップ期間 今すぐバックアップを作成するよう設定します。 今すぐバックアップ
合計保持期間 バックアップを保存する期間を指定します。今回は1日で設定します。(とれてるかどうかの確認なので) 1日
バックアップボールト バックアップデータを格納するストレージを指定します。プロジェクトやチームごとにボールトを分けることで管理が容易になります。今回は研修で、すぐリソースを消すのでデフォルトのままでいきます。 Default
IAMロール バックアップ処理を実行する権限を持つロールを指定します。 デフォルトのロール
復旧ポイントに追加されたタグ 復旧ポイントに付与するタグの設定です。今回は不要のためなしを選択します。 なし
アドバンストバックアップ設定 高度なバックアップ設定を使用するかどうかを選択します。今回は無効です。 OFF

オンデマンドバックアップを作成→ジョブのリストが表示される。


バックアッププランの作成

左側から設定→リソースを設定→使用するサービスの有効化を確認→OKなら確認
左側からバックアッププランを選択→バックアッププランの作成

設定項目 設定項目の説明
バックアッププランのオプション 新しいバックアッププランを作成します。 新しいプランを立てる
プラン名 作成するバックアッププランの名前を設定します。 yanagi-ec2-bup
バックアップルール名 このバックアッププランで使用するルールの名前を設定します。 EC2-Dailies
バックアップボールト バックアップデータを格納するストレージを指定します。プロジェクトやチームごとにボールトを分けることで管理が容易になります。今回は研修で、すぐリソースを消すのでデフォルトのままでいきます。 Default
バックアップ頻度 バックアップを実行する間隔を設定します。毎週の水曜、とかにも設定できます。(今回はとりあえずとれるかどうかの確認なので、デフォルトの値で) 毎日
次の時間以内に開始 バックアップを開始する時間の上限を指定します。例えば、毎週の水曜になったら、8時間以内にバックアップを行う、など。(今回はとりあえずとれるかどうかの確認なので、デフォルトの値で) 8時間
次の時間以内に終了 バックアップを完了するまでの最大時間を設定します。7日以内にバックアップが終了しないとエラーがでます。(今回はとりあえずとれるかどうかの確認なので、デフォルトの値で) 7日
ポイントインタイムリカバリ 特定の時点に戻す復元機能を有効にするか設定します。今回は無効にします。 OFF
コールドストレージ 長期保存用の低コストストレージを使用するか設定します。今回は無効にします。 OFF
合計保持期間 バックアップを保存する期間を指定します。今回は1日で設定します。(とれてるかどうかの確認なので) 1日
コピー先にコピー 他のリージョンにバックアップをコピーするか設定します。他のリージョンにコピーすることで災害対策やデータ安全性を高めますが、今回はコピーしません。 なし
復旧ポイントに追加されたタグ 復旧ポイントに付与するタグを設定します。タグを利用すると検索や分類が容易になりますが、今回は不要のためなしを選択します。 なし
アドバンストバックアップ設定 バックアップの暗号化方法や特定条件の設定など高度な設定を追加するオプションです。今回はシンプルな設定のため使用しません。 なし

プランを作成→画面遷移してリソースを割り当てる

設定項目 設定項目の説明
リソース割り当て名 管理対象のリソースに割り当てる名前を設定します。 yanagi-resource
IAM ロール AWSリソースへのアクセスを許可する既存のロールを選択します。 デフォルトのロール
リソース選択を定義 管理対象とするリソースの選択方法を指定します。特定のリソースタイプを含めます。 特定のリソースタイプを含める
リソースタイプを選択 管理対象のリソースの種類を選択します。 EC2
インスタンスID 対象となる特定のEC2インスタンスを選択します。 検証なので片方のインスタンス
選択したリソースタイプから特定のリソースIDを除外する 管理から除外する特定のリソースを設定しますが、今回は設定しません。 なし
タグを使用して選択を絞り込む タグを使ってリソースをフィルタリングしますが、今回は設定しません。 なし

リソースを割り当てる→画面遷移


バックアップ検証

事前にバックアップする際に設定に使ったEC2インスタンスを削除
左側のボールトを選択→下にスクロールしDefaultを選択→復旧ポイントにあるリソース名がyanagi-ec2を選択→復元をクリック

基本バックアップなので同じ項目だが、インスタンスIAMロールはなしで続行
(復元した後につける。でないと失敗する、公式もその方法を推してる)
インスタンスIAMロールはなし
その下のIAMロールはデフォルトのIAMロールを選択
じゃないとエラーが出て進めない
詳細設定 なし

バックアップを復元→画面遷移して、ステータスが成功になるか確認→成功になったらEC2→インスタンスを確認して、削除したものができてたらOK
復元されたEC2インスタンスにIAMロールをアタッチするのを忘れずに。

最後に全リソース削除するのもわすれずに!!!基本やってきた手順と逆順で消していけばスムーズに消せます。

まとめ

PHP, MySQL, Apacheのインストールし忘れ、再起動し忘れ、サブネットの配置ミス、セキュリティグループの設定ミスなど、ケアレスミスで結構時間を取られていたので、手を動かして構築する前に、Planをちゃんと練ること、そしてインストールしたのか?みたいなチェックを都度行った方が、結果的に早かったりする、というのを学びました。

怒涛の短期間でしたが、とても成長でき楽しかったです。
これからもっと成長していくつもりですので、ご指導ご鞭撻のほどよろしくお願い申し上げます。

Last modified: 2024-11-18

Author