AWS RDS

早いもので更新が2週間空いてしまった。

AWSスクリプトを書くことが楽しくなっちゃってアウトプットをサボりました。
botoというPython製のAWSライブラリがあって、
これがまた利用者に優しくAPIリファレンスさえ読めば、
PythonAWSも理解が乏しい私が簡単にAWSの環境構築スクリプトを組めちゃいました。

さて、本題。
前回はEC2インスタンスを作成して、Webサーバを立ち上げました。

今回はRDSインスタンスを立ち上げて、Webサーバと連携します。

EC2でWebAP構築
 ↓

RDSでWebAP-DB構築 (今回はここ)

 ↓
AMIでEC2のイメージ化、複製
 ↓
ELBで冗長化
 ↓
ElastiCacheでセッション管理
 ↓
S3にアクセスログ保存
 ↓
(できれば)SQSでWebAP連携

では早速RDSを作成しましょう。
(キャプチャは後日こっそりつけときます)

あれ?
2週間の間にEC2インスタンスのOSがRHEL7になってる。。。

  1. RDS画面へ遷移
     AWSのメニューからRDSを選択

  2. RDS作成開始
     [Get Started Now]ボタンやら[Launch DB Instance]ボタンやらをクリック

  3. DBエンジン選択
     DBエンジンは4種類が選べます。(ブログ執筆現在:2015/04/18)
     Auroraはまだ東京リージョンでは登場していません。

     今回はMySQLを利用します。


  4. MultiAZ
     MultiAZかどうかを選択します。
     MultiAZはDBの配置方式として複数のAZに配置するかどうかです。
     MultiAZを選択すると、稼働率99.95%以上を保証されます。
     99.95%を下回る場合、AWSから返金があります。
     ※注意:MultiAZは無償枠外です!
      私のような無償プレイヤーは要注意です。
      でも、本番運用するような場合は必須だと思う。


  5. 基本設定

     t1.micro以外は無償枠外

      • ストレージタイプ

     SSD、高性能SSD、HDDから選択可

      DNS等に利用され、データベースでは持たないっぽ

      • DBユーザ名
      • パスワード


  6. 詳細設定

    • ネットワーク設定
      • VPC
      • SubnetGroup

      VPCのSubnetとは別で、複数のSubnetをまとめたもの

      • Availability Zone
      • SecurityGroup

      EC2作成時とは別でDBポート番号のみを許可した紐づけるのが望ましい

    • DB詳細設定
      • DB名

      作成する空のデータベース

      • ポート番号

      最初からデフォルト値が入っている

     以上の設定で作成されます。


  7. 作成中
     けっこう時間かかります。。。


  8. APサーバ作成
     DB作成中にDBを利用可能なAPサーバを構築しましょう。
     APサーバはDjangoでちょちょいと。。。


     ん?


     あれ?こうかな。


     ダメだな。


     あー、これか。


     はぁ。。。


     あーーーー
     ですよねー
     だいたいこういう時ってSELINUXですよねー


     ちょちょいと、3時間(内、SELINUXに2時間半)で出来ました。
     さて、そろそろRDS立ち上がったかな。

     簡単にやったことを備忘録

    # yum install -y gcc python-devel mysql mysql-devel
    # pip install django mysql-python
    # django-admin startproject project
    # cd project
    # vi project/settings.py
    databaseの設定追記
    # ./manage.py startapp app
    # vi project/settings.py
    appを追加
    # vi app/models.py
    Userクラス追加
    # ./manage.py makemigrations
    # ./manage.py makemigrate
    # vi app/views.py
    list関数定義
    UserテーブルからSelectしたデータにHelloを付けて返す
    # vi project/urls.py
    list/とapp.views.listを紐付け
    # vi /etc/httpd/conf.module.d/10-wsgi.conf
    魔法の言葉を追加
    # systemctl 
    
    # setenforce 0
    こ、こいつまで遠かった。。。


  9. DB接続確認
     試験用にDBを設定します。

    # mysql -h <RDS Public DNS> -u <username> -p
    Password: 
    
    > show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | innodb             |
    | mysql              |
    | newdb              |
    | performance_schema |
    +--------------------+

    newdbがRDS作成時に指定したDB名です。

    > use newdb;
    Database changed
    
    > show tables;
    +----------------------------+
    | Tables_in_newdb            |
    +----------------------------+
    | app_user                   |
    | auth_group                 |
    | auth_group_permissions     |
    | auth_permission            |
    | auth_user                  |
    | auth_user_groups           |
    | auth_user_user_permissions |
    | django_admin_log           |
    | django_content_type        |
    | django_migrations          |
    | django_session             |
    +----------------------------+
    
    > desc app_user;
    +-------------+-------------+------+-----+---------+----------------+
    | Field       | Type        | Null | Key | Default | Extra          |
    +-------------+-------------+------+-----+---------+----------------+
    | id          | int(11)     | NO   | PRI | NULL    | auto_increment |
    | name        | varchar(32) | NO   |     | NULL    |                |
    | create_date | date        | NO   |     | NULL    |                |
    +-------------+-------------+------+-----+---------+----------------+
    

    Djangoが勝手に色々作ってます。
    app_userテーブルにデータを登録して取得します。

    > insert into app_user values(1, 'fuji', '2015-04-18');
    Query OK, 1 row affected (0.00 sec)
    
    > select * from app_user;
    +----+------+-------------+
    | id | name | create_date |
    +----+------+-------------+
    |  1 | fuji | 2015-04-18  |
    +----+------+-------------+
    1 row in set (0.00 sec)

    おk


  10. 接続確認
    早速繋いでみましょう。

    # curl http://<EC2 Instance Public DNS>/django/list/
    Hello, fuji

    おー、うまくいきました。

    今回は
    クライアント -> Internet -> Web -> AP -> RDS
    というあるある構成をAWS上に作ることができました。

    次回は今回作ったAPサーバをAMIにイメージ化して複製します。