FROM ME TO YOU

oh my bizarre life !!

AWS体験ハンズオン(オンライン)を受講してみた

2020年3月31日にオンラインで開催された、「はじめてのアマゾン ウェブ サービス for Developer」のAWS構築ハンズオンを実践してみました。

aws-seminar.smktg.jp

本来はWebiner形式だったようですが、体調不良で参加できなかったので後日公開された教材のPDFを見ながら。
僕はAzure畑だったのでAzureに置き換えながら考えてみました。

AWSとAzureの比較サイトは以下。Microsoftの公式ドキュメントっていう。

docs.microsoft.com

ハンズオン前の事前知識

AWSのセキュリティを高める機能・サービス

  • セキュリティグループ
    ファイアウォール。Azureでも同様。

  • Amazon VPC
    プライベートな仮想ネットワーク。AzureではVirtual Network。

  • AWS IAM
    AWSリソースへのアクセス権限の管理。AzureでいうところのAzureActiveDirectryとRDBBCに相当。

セキュリティグループ

インターネットからのトラフィック(インバウンド)だけでなく、EC2からのアウトバウンドトラフィックも制限できる。
個々のインスタンスごとに許可ルールを定義でき、明示的にルールを定義していない通信はすべて許可される。

Amazon VPC (Virtual Private Cloud)

クラウド内にユーザー専用のプライベートアドレス空間を構築できる。社内ネットワークとVPCVPN接続や専用線接続が可能。

VPCとサブネットについて

VPNは1つのネットワークアドレス(CIDR…192.168.0.0/16等)で定義し、複数のサブネットを作成することができる。
サブネットは特定のアベイラビリティゾーン内に配置する。

ルートテーブル

各サブネットはルートテーブルをもっており、設定を変更することでデータの流れを制御可能。Azure Virtual Networkと同じかな。
igw-xxxxxと定義している場合はIGW(インターネットゲートウェイ)にルーティングされているので、そのサブネットは外部と通信できる。

VPCでのセキュリティーグループとNACL

ネットワークACL(NACL)は「サブネットレベル」でファイアウォールを設定できる。設定できる項目はセキュリティグループと同じだが、セキュリティグループはステートフルなのに対し、NACLはステートレスとなっている点に注意。

AWS IAM

IAM (Identity and Access Management)。AWS操作をセキュアに行うための認証・認可の仕組み。グループ、ユーザー、ロールで管理でき、実行できる操作をIAMポリシーで規定できる。MFA(多要素認証)を推奨されている。

ハンズオンフェーズ1 Wordpressのセットアップ

ハンズオンの流れ

  1. WordPressサイトを最小構成でスタートする。サーバ1台構成
  2. スケールできるアーキテクチャに移行する準備をする。Web + DB(サーバ2台構成)
  3. Webサーバがスケールできる構成を構築する。LB + Web x2 + DB 構成(サーバ3台構成)
  4. DBサーバを冗長化された構成にする。LB + Web x2 + DB x2 構成(サーバ 4台構成)

VPCを作成

  1. AWSマネジメントコンソールにログイン
  2. リージョンを東京に変更
  3. 左上のサービス>ネットワーキングとコンテンツ配信>VPC
  4. [VPC ウィザードの起動] をクリック
  5. デフォルトの[1 個のパブリックサブネットを持つ VPC]を選択した状態で[選択]をクリック
  6. VPC名やサブネットのCIDRを入力
  7. サブネットを作成
  8. コンソールにVPNが作成できていることを確認
  9. 左側メニューの「サブネット」を選択肢、作成したサブネットを選択すると画面下にルートテーブルが表示される。igw-xxxxと表示されているのでインターネットと通信できる状態なのを確認

サブネットを追加作成

  1. サブネットを3つ追加作成
  2. 作成したサブネットが外部と通信できるようにルートテーブルの割り当てを変更
    1. サブネットを選択
    2. 画面下のルートテーブルを選択し、ルートテーブルの関連付けの編集を選択
    3. ルートテーブルIDを別のIDに変更(ここ名前で表示されないから間違えそう)

EC2インスタンスの作成

  1. サービスからEC2を選択
  2. インスタンスを起動」を選択(旧UIだと「インスタンスの作成」になっている点に注意)
  3. handson ami image を選択
  4. インスタンスタイプは無料利用枠のt2.microを選択して次のステップへ
  5. インスタンスの詳細設定で、VPCとサブネットを選択。サブネットは先程作成した外部へ通信できるサブネットにすること。
  6. 「高度な詳細」を開き、ユーザーデータにハンズオン用の設定を行う
  7. ストレージは変更せず次へ
  8. タグの設定。キーと値を設定。Azureのタグ機能はキーと値がなかった気がする。
  9. セキュリティグループの設定。SSHのソースを任意の場所へ変更。ルールを追加してHTTPも追加。
  10. キーペアを作成

Elastic IPの割り当て

インスタンスを停止/開始した後も同じIPアドレスが使用できるよう、固定IPアドレスであるElastic IPを取得しておく。

  1. 左メニューからElastic IPを選択
  2. 初期状態のまま「割り当て」を選択
  3. アドレスの関連付けを行い、先程作成したEC2と関連づけ

WordPressの構成

  1. EC2へSSHでログイン
  2. さきほど作成したpemを使ってSSHでアクセス
    1. chmod 600 ~/Downloads/xxxx.pem (初回のみ)
    2. ssh -i ~/Downloads/xxxx.pem ec2-user@xxx.xxx.xxmyx.xxx
  3. ウィザードに従ってWordpressのセットアップ
  4. Wordpressが表示されれば成功!

ハンズオンフェーズ2:Web + DB(サーバ2台構成)への移行

データベースをEC2内蔵のMySQLからAmazon RDS(Relational Database Service)に変更する

RDSセキュリティグループを作成

DBへのアクセスを許可するには、IPアドレスではなくWebサーバ用のセキュリティグループを指定する

  1. 左のメニューから「セキュリティグループ」を選択し、新規作成
  2. 名称や説明、VPCを選択
  3. インバウンドルールでタイプを[MySQL/Aurora]に指定し、ソースをwebサーバ作成時に設定したセキュリティグループを指定する

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

  1. サービス>RDSを選択
  2. 左メニューからサブネットグループを選択し、[DB サブネットグループの作成] をクリック
  3. 名前やVPC、サブネットを選択。サブネットはアベイラビリティゾーンと紐付けられている点に注意。

RDSインスタンスを作成

  1. 左メニューからデータベースを選択し、標準構成>MySQLと進む。テンプレートは開発/テスト。
  2. DBインスタンスサイズは「バースト可能クラス」を選択し、t2.microを選択
  3. 先に作成したセキュリティグループを指定して「作成」
  4. しばらく待って作成が完了したらデータベースの「エンドポイント」を控えておく
  5. EC2インスタンスからRDSへの接続を確認
    1. mysql -u admin -p -h XXXXXX.ap-northeast-1.rds.amazonaws.com

MySQLのデータを移行

  1. EC2インスタンス上にインストールされているMySQLからデータをエクスポート
    1. mysqldump -u root -p wordpress > export.sql
  2. EC2インスタンスMySQLを停止
    1. sudo service mysqld stop
    2. sudo chkconfig --level 345 mysqld off
  3. エクスポートしたデータ(export.sql)をRDSのインスタンスにインポート
    1. mysql -u admin -p -h XXXXXX.ap-northeast-1.rds.amazonaws.com wordpress < export.sql

WordPressのDB接続設定

  1. WordPressのDB接続設定を削除
    1. $ sudo mv /var/www/html/wp-config.php ~/
  2. http:// Elastic IPアドレス / を開いてWordPressの初期設定
  3. データベースのパスをRDSのエンドポイントに設定
  4. ブログが正常に表示されることを確認

ハンズオン フェーズ3:LB + Web x2 + DB 構成(サーバ3台構成)

アベイラビリティゾーンの異なるWebサーバをもう1台セットアップし、ELBで振り分けを行う。

WebサーバのAMIを作成

  1. 既存のインスタンスからAMIを作成
    1. インスタンスを右クリックして「イメージの作成」
  2. AMIが作成できたら右クリックして「起動」を選択(ハンズオン資料では「作成」だった)
  3. 無料利用枠のt2.microを選択
  4. ウィザードを進める。セキュリティグループは既存のWebサーバーのものを利用する。
  5. キーペアも同じ物を利用する
  6. インスタンスの作成が完了したら異なるアベイラビリティゾーンに作成されていることを確認する

ELBを作成

  1. 左メニューの「ロードバランシング」から「ロードバランサー」を選択し、新規作成
  2. Applicationロードバランサーで「作成」
  3. サブネットを2台作成したパブリックサブネットを選択。
  4. セキュリティグループは新しく新規に作成し、HTTPタイプを選択
  5. ヘルスチェックの条件で正常の閾値を「2」に設定
  6. ELBを選択>下メニューのリスナー>転送先>ターゲットで配下のインスタンスを確認できる
  7. Wordpressの設定変更

ELB経由でアクセス

  1. ブラウザからELBのDNS名でアクセスしてWordpressが表示されることを確認
  2. それぞれのWebサーバーにSSHログインし、以下のコマンドでアクセスログを確認
    1. sudo tail -f /var/log/nginx/access.log
    2. Ctrl+Cで終了

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

WebサーバにはELBからのみアクセスを許可するようセキュリティグループを変更。

  1. セキュリティグループを開き、Webサーバーに適用しているセキュリティグループを選択
  2. インバウンドルールを編集し、0.0.0.0/0をELBのセキュリティグループに変更
  3. ブラウザでELBのDNS名ではアクセスできるが、それぞれのEIPでアクセスできないことを確認

ハンズオン Option – RDSをMulti-AZ構成に変更

マルチAZとは?

  • Activeで動作するDBサーバは変わらず1台だが、インスタンスタイプの変更時は先にスタンバイ側を変更してからフェイルオーバする動作になるため変更時の停止時間を短く抑えることができる
  • DBサーバがアベイラビリティゾーンにまたがって2台構成となるため、障害時には自動的にフェイルオーバする構成となり、冗長性が高まる

手順

  1. 「サービス」から「RDS」を開く
  2. 左メニューの「データベース」を開く(ハンズオン資料だと「インスタンス」になっている)
  3. 稼働中のデータベースを開き、上メニューの「変更」
  4. マルチAZのチェックを「はい」にして「すぐに適用」をチェック(チェックを入れなければ次回メンテナンス時に実行される)

あとで調べる

  • アベイラビリティゾーンについて。恐らくAzureの可用性ゾーンに相当すると思われるが、可用性セットと対になるサービスは?
  • バースト可能クラスとは
  • スタンバイインスタンスとは
  • セキュリティグループのステートフルとNACLのステートレスの違いが理解できていない
  • RDSのサブネット作成時、サブネットを2つ選択する理由が把握できていない。
  • udo chkconfig --level 345 mysqld off のコマンドの意味
  • ELBの設定の正常の閾値とは
  • sudo tail -f /var/log/nginx/access.log 調べる
  • RDSのマルチリージョンレプリケーションの方法を調べる(Azureだと比較的簡単にセットアップできたがAWSはどうか)

まとめ

  • Azureの経験があったのである程度は理解しながら進められたと思う。コンソール画面はAzureに比べてサクサク動いた。
  • ハンズオン資料からGUIが更新されており、いくつか画面が異なるところがあったので注意が必要だと思う(特に苦労なく置き換えできる程度だったが)
  • Azureと異なり、インスタンスなどの割り当てや選択画面でIDで表示されることが多く、少しわかりづらいように感じた。
  • 既存インスタンスからコピーする形でAMIを作成できることに感動した。Azureでもできるのかもしれないが、知らなかった。
  • 先に実務でコンソールからのSSH接続に慣れていてよかった。