本番Webアプリケーションを支えるシステムインフラをAWS(Amazon Web Service)で構築するときのワークフローめも

ネットワーク図とアーキテクチャ概要

ネットワーク図

事前検討と準備

マシンタイプと台数決定に必要な情報の決定

  • 想定PV
  • 必要な固定IP数
  • 基本アーキテクチャ(ネットワーク図)
  • スケール変更の有無

アカウント登録の処理において、必要な情報の決定

  • アカウント毎の一意な名前
  • アカウント毎の一意なメールアドレス(とパスワード)
  • 電話番号
  • クレジットカード
  • 住所
  • プレミアムサポートの有無
  • IAMの必要性の有無

AWSアカウント新規作成

AWSアカウント決済設定

  • 支払いのまとめアカウント(Paying Account)へのConsolidate Billing(一括決済)処理
    • メールが送られてこないときは、受信メールのドメイン拒否設定を見直す

AWSアカウントサポートへの加入

  • $49で加入できる「開発者アカウント」がオススメ

AWSアカウント情報を控える

Account ID(口座番号)

下記で利用する

  • amiの共有設定やSecurityGroupのソース指定
  • 上限解放の申請等で使用

アクセス証明書

下記を控える

  • アクセスキー
  • X.509証明書生成(pk-XX.pem:証明書ファイル)(cert-XX.pem:証明書ファイル)
  • 一対の鍵(AmazonEC2)

上記を、chmod600でAPI発行端末の所定の場所に設置する

AWSアカウント上限解除申請

各リソースで制限に引っかかると思われるものは、事前に制限解除の申請を出しておく。特に下記2点は制限を超えやすいのでよく申請する

  • EIP
  • EC2 Instance起動数
  • ELB Prewarning

EC2

セキュリティグループとELB

shellを実行する

OS Image

  • 新規作成もしくは他のアカウントのAMIを流用
    • AMI化する際は、EBSはDetachされていることを確認する。(AMIのサイズが巨大になってしまうので)
    • 特別な理由が無い限り、Ephemeral Diskは有効にする
    • 別アプリのAMIを使い回す場合でも、ssh-keyだけは別途作成すること
  • Instance起動における各種オプションは下記を推奨
    • ephemeral disk : add
    • Terminate Protection: true
    • shutdown behabior : stop
    • zone : 理由が無い限り、一つのZoneにまとめる。(Conslidata billingによるコストダウンが期待できる。)
    • enable detail monitor : cloud-watchによる監視対象はenableにする
    • user-data:全Instanceで下記を指定する
    #cloud-config
    runcmd:
     - [ ln, -sf, /usr/share/zoneinfo/Asia/Tokyo, /etc/localtime]
     - [ resize2fs, /dev/xvda1]
  • Instance、Volumeにはタグ付けを行う
  • 新規作成したEBSは、ddを実行して暖めてからmkfsしてマウント
    time  dd if=/dev/zero of=/dev/sde9 bs=1M 
    mkfs  -t ext4 /dev/sde10
    mkdir /ebs1

    vi /etc/fstab
    #---------------------------------------------------------------
    #add
    /dev/sde1   /ebs1       ext4    defaults,noatime,nodiratime,barrier=0  0   0
    #---------------------------------------------------------------
    mount -a
    rm -rf /ebs1/lost+found

サーバの分散作業

  • Cacheの分散
    • memcacheやredisの宛先を正しく指定
  • NFSサーバ
    • Appサーバからはread-onlyでマウントされるので、logファイルのようにミドルウェアから書き込まれるファイルはシンボリックリンク化する
  • Database(Master-Slave)の分散
    • Railsにおける、Databaseのshardingには、octopusを使うと想定。
    • 作業後には、select/updateが正常に分散されていることを確認する
    • config/shards、config/databaseやconfig/productionの設定
    # Master-Slave構築手順
    (master)mysql> show master status\G
    *************************** 1. row ***************************
                File: bin-log.000015
            Position: 107
        Binlog_Do_DB: 
    Binlog_Ignore_DB: 
    1 row in set (0.00 sec)

    (slave)mysql >
    CHANGE MASTER TO
    MASTER_HOST='ec2-xx-xx-xx-xx.ap-northeast-1.compute.amazonaws.com',
    MASTER_USER='repl',
    MASTER_PASSWORD='xxxxxxxxx',
    MASTER_LOG_FILE='bin-log.000015',
    MASTER_LOG_POS=107;
    # リモートから飛んでくるクエリの確認には、下記コマンドが便利
    tcpdump -i eth0 -s 0 -l -w - dst port 3306 | strings | perl -e '
    while(<>) { chomp; next if /^[^ ]+[ ]*$/;
      if(/^(SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER)/i) {
        if (defined $q) { print "$q\n"; }
        $q=$_;
      } else {
        $_ =~ s/^[ \t]+//; $q.=" $_";
      }
    }'

ログの集約チェック

  • fluentdによるログの集約の正常性を確認
    • /var/log/bigdataに大きめのEBSをマウント
    • ファイル書き込み先のパーミッションに注意

動作チェック

  • Master-Slaveの分離だったり、NFSマウントの動作確認をしたり

監視設定

  • CloudwatchとAmazonSNSを用いたメトリックの監視
    • ELB Request Count(pv)
    • ELB health instance count
    • ELB latency
    • ELB response 400
    • ELB response 500
    • EC2 cpu avg
  • Nagiosによる監視

    • MySQL slave-lag
    • MySQL slow-query-count
    • Disk usage
    • 死活監視
  • Amazon公式のScriptを使えば、Cloudwatchで下記が取得できる

    • Memory Utilization (%)
    • Memory Used (MB)
    • Memory Available (MB)
    • Swap Utilization (%)
    • Swap Used (MB)
    • Disk Space Utilization (%)
    • Disk Space Used (GB)
    • Disk Space Available (GB)

テスト

  • ストレステスト
    • 想定される本番クエリを用いて負荷テストを行う
    • nginx等各ミドルウェアコンフィグの最終チューニング
  • リストア
    • 定期的(hourly 3d,daily30d)にmysqldumpし、S3にアップロードする流れをシェル化してcronに設定する
    • dumpファイルのリストアが正常に可能なことまで確認

そのほか

  • Cron設定
  • IP-ドメインひも付け
    • EIPは覚えにくいので、Route53で、EIPのCNAMEと覚えやすいドメインをひもづけておくといい
  • サーバの自動増減スクリプト設定

あとかたづけ

  • 不要なリソースのチェック及び解放(特に、EIPは確実にreleaseすること。EIPは常にInstanceとひもづけておかないと課金されるので
    • EIP
    • Volume
    • Snapshot

参考資料