「Amazon Web Services徹底活用ガイド」を読みました
Amazon Web Services 徹底活用ガイド (日経BPムック)
- 作者: 日経SYSTEMS,日経NETWORK,ITpro
- 出版社/メーカー: 日経BP社
- 発売日: 2014/12/13
- メディア: 単行本
- この商品を含むブログ (1件) を見る
AWSのノウハウ、Tipsを学びたく読んでみました。
AWSを触ったことがない人にはオススメの一冊だと思います。
AWSの機能紹介はいらなかった。
もっと多くの事例紹介が欲しかったです。
とにかく感じたことはオンプレから移行するなら方式設計、運用設計は大きく見直す必要がある。
郷に入っては郷に従え!に尽きます。
脱vSphereClient (Apple信者向け)
最近、自宅マシンにESXiをインストールしました。
プライベートの端末がOSXということもあり、vSphereClientの利用がサポートされません(*)。
VirtualBox上のWindowsマシンにインストールして操作する、という利用方法もありますが、
vSphereClientを利用するのに、VirtualBoxを起動して、Windowsを起動して、vSphereClientを起動。
んで、GUI操作ぽちぽち。
めんどい!
実はある程度のことはESXiにSSH接続してコマンドラインで出来るんです!
今回はVM作成を実施してみます。
ESXiのインストールやストレージ、ネットワークは準備済みとします。
ほとんどはvim-cmdコマンドを利用します。
vim-cmd
サブコマンドを実施し、色々なことを実現できます。
[root@localhost:~] vim-cmd Commands available under /: hbrsvc/ internalsvc/ solo/ vmsvc/ hostsvc/ proxysvc/ vimsvc/ help [root@localhost:~] vim-cmd hostsvc Commands available under hostsvc/: advopt/ enable_ssh refresh_firewall autostartmanager/ firewall_disable_ruleset refresh_services datastore/ firewall_enable_ruleset reset_service datastorebrowser/ get_service_status runtimeinfo firmware/ hostconfig set_hostid net/ hosthardware standby_mode_enter rsrc/ hostsummary standby_mode_exit storage/ login start_esx_shell summary/ logout start_service vmotion/ maintenance_mode_enter start_ssh connect maintenance_mode_exit stop_esx_shell cpuinfo pci_add stop_service disable_esx_shell pci_remove stop_ssh disable_ssh queryconnectioninfo task_list enable_esx_shell querydisabledmethods updateSSLThumbprintsInfo
例えば、
vim-cmd hostsvc/enable_sshを実行すると、ESXiホストでssh接続が有効となります。
vim-cmd maintenance_mode_enterを実行すると、ESXiホストをメンテナンスモードにします。
とかです。
それではいってみよう。
今回はCentos6のVMを作成します。
- VM作成
ブランクVMを作成します。
[root@localhost:~] vim-cmd vmsvc/createdummyvm centos6-1 /vmfs/volumes/local_ssd 4
戻り値はVMのIDです。
[root@localhost:~] ls -l /vmfs/volumes/local_ssd/centos6-1_3/ total 1024 -rw------- 1 root root 1048576 May 10 10:42 centos6-1_3-flat.vmdk -rw------- 1 root root 465 May 10 10:42 centos6-1_3.vmdk -rw-r--r-- 1 root root 0 May 10 10:42 centos6-1_3.vmsd -rwxr-xr-x 1 root root 977 May 10 10:42 centos6-1_3.vmx [root@localhost:~] cat /vmfs/volumes/local_ssd/centos6-1_3/centos6-1_3.vmx .encoding = "UTF-8" config.version = "8" virtualHW.version = "11" nvram = "centos6-1_3.nvram" pciBridge0.present = "TRUE" virtualHW.version = "11" nvram = "centos6-1_3.nvram" pciBridge0.present = "TRUE" svga.present = "TRUE" pciBridge4.present = "TRUE" pciBridge4.virtualDev = "pcieRootPort" pciBridge4.functions = "8" pciBridge5.present = "TRUE" pciBridge5.virtualDev = "pcieRootPort" pciBridge5.functions = "8" pciBridge6.present = "TRUE" pciBridge6.virtualDev = "pcieRootPort" pciBridge6.functions = "8" pciBridge7.present = "TRUE" pciBridge7.virtualDev = "pcieRootPort" pciBridge7.functions = "8" vmci0.present = "TRUE" hpet0.present = "TRUE" floppy0.present = "FALSE" scsi0.virtualDev = "lsilogic" scsi0.present = "TRUE" scsi0:0.deviceType = "scsi-hardDisk" scsi0:0.fileName = "centos6-1_3.vmdk" scsi0:0.present = "TRUE" displayName = "centos6-1" guestOS = "other" uuid.bios = "56 4d fd a6 54 0c 8e 22-a5 d9 9a 10 df 9d be ae" uuid.location = "56 4d fd a6 54 0c 8e 22-a5 d9 9a 10 df 9d be ae" vc.uuid = "52 79 a6 30 04 b7 91 37-35 5d ad 4c 42 08 59 a4"
vmxファイル、vmdkファイル等おなじみのファイルが作成されています。
勝手に付加された「_3」はどこから来たのでしょう。
- ISOファイルアップロード
scpコマンドでCentOS6のisoファイルをdatastoreにアップロードします。
- VMリソース設定
最低限必要な箇所のみ設定します。
まずは以下を設定。
- CPU数 -> 2core
- メモリ値 -> 2GB
- ネットワーク -> 1つ
- CDROMデバイス
- ゲストOS種別
- VNC
[root@localhost:~] vi /vmfs/volumes/local_ssd/centos6-1_3/centos6-1_3.vmx 以下、編集 guestOS = "other" ↓ guestOS = "rhel6-64" 以下、追記 numvcpus = "2" memSize = "2048" ide1:0.startConnected = "TRUE" ide1:0.deviceType = "cdrom-image" ide1:0.fileName = "/vmfs/volumes/local_ssd/CentOS-6.6-x86_64-minimal.iso" ide1:0.present = "TRUE" ethernet0.virtualDev = "vmxnet3" ethernet0.networkName = "VM Network" ethernet0.addressType = "generated" ethernet0.present = "TRUE" RemoteDisplay.vnc.enabled="true" RemoteDisplay.vnc.port="5901" RemoteDisplay.vnc.password="password" RemoteDisplay.vnc.keyMap="jp"
ide1:0.fileNameはアップロードしたisoファイルのパス指定
ethernet0.networkNameはポートグループ名
RemoteDisplay.vnc.portはVNC接続するポート番号
後述しますがVNC接続する用のポートをESXiで開放する必要があります。
RemoteDisplay.vnc.passwordはVNC接続時のパスワード
次はディスクサイズを設定。
- ディスクサイズ -> 16GB
[root@localhost:~] vmkfstools -c 10g -d thin /vmfs/volumes/local_ssd/centos6-1_3/centos6-1_3-1.vmdk [root@localhost:~] vi /vmfs/volumes/local_ssd/centos6-1_3/centos6-1_3.vmx 以下、編集 scsi0:0.fileName = "centos6-1_3.vmdk" ↓ scsi0:0.fileName = "centos6-1_3-1.vmdk" [root@localhost:~] vmkfstools -U /vmfs/volumes/local_ssd/centos6-1_3/centos6-1_3.vmdk
元のvmdkファイルは削除して構いません。
- VM起動
[root@localhost:~] vim-cmd vmsvc/power.on 3 Powering on VM:
- コンソール接続
OSXの場合、デフォルトでVNCクライアントが備わっています。
Finderのメニューから[移動] - [サーバへ接続]を選択
vnc://
:<設定したポート番号>
vmxファイルに設定したパスワードを入力
コンソールの画面が表示されます。
セキュリティプロファイル定義
[root@localhost:~] cp /etc/vmware/firewall/service.xml /etc/vmware/firewall/service.xml.bak [root@localhost:~] chmod u+w /etc/vmware/firewall/service.xml [root@localhost:~] chmod +t /etc/vmware/firewall/service.xml 以下を<ConfigRoot>タグ内に追記 <service id='0140'> <id>vnc</id> <rule id='0000'> <direction>inbound</direction> <protocol>tcp</protocol> <port type='dst'>5901</port> </rule> <enabled>false</enabled> <required>false</required> </service> [root@localhost:~] chmod 444 /etc/vmware/firewall/service.xml
ポート開放
[root@localhost:~] esxcli network firewall refresh [root@localhost:~] esxcli network firewall ruleset list vnc false [root@localhost:~] esxcli network firewall ruleset set -r vnc -e true [root@localhost:~] esxcli network firewall ruleset set -r vnc -a true Already allowed all ip
このようにコマンドとVNC接続により、VMを構築できました。
細やかな設定は難しいところもありますが、
多くの機能を扱うことができます。
私は省エネのため、利用しない時はESXiを落としています。
そのため、VMを全てシャットダウンして、シャットダウンが完了したらESXiをシャットダウンするスクリプトと、
ESXiを起動したらtxtファイルに登録したVMを自動で起動するスクリプトを作成しています。
またESXiはpythonを標準搭載しているのでpythonistaには助かります。
(*) Wineでほとんどの機能を利用可。
AWS AMI
最近、MAC用のSSHクライアントを探しています。
iTerm2でやっていますが、
WindowsのSSHクライアントはログの設定保存でホスト名でログファイルを作成できますが、
iTerm2は元々SSHクライアントツールじゃないところもあり、
ログは都度Startさせなきゃ開始してくれないし、
ファイル名も都度指定しなきゃいけないし、で正直めんどい。
はい、本題です。
前回はRDSを使ってWeb-AP-DB構成を作りました。
本日はWebAPサーバ(EC2インスタンス)をAMIのImage化し、
異なるEC2インスタンスとして生成します。
EC2でWebAP構築
↓
RDSでWebAP-DB構築
↓
AMI (Amazon Machine Image)
AMIはテンプレートです。
EBSディスクのコピーです。
AMIは単体では何もできず、
AMIからEC2インスタンスを作成して複製したり、
AMIを他リージョンにコピーしてDR構成を取ることが可能です。
AMIは不変なデータであるため、
バックアップとしても利用可能です。
それでは作成します。
- EC2画面へ遷移
AWSのメニューからEC2を選択
- AMI作成
対象となるEC2インスタンスを選択して、
[Actions] -> [Image] -> [Create Image]を選択します。
- 設定値入力
Image name -> イメージ名
Image description -> 説明[Create Image]ボタンを押せば、作成が開始されます。
AMI一覧ページを表示するとpenddingステータスのAMIを確認することができます。
次は作成したAMIからEC2インスタンスを作成します。
- AMI画面へ遷移
AWSのメニューからEC2を選択
左のメニューからAMIsを選択
- EC2インスタンス作成
作成したAMIを選択して、
[Actions] -> [Launch]を選択します。
それ以降はEC2インスタンス作成と同じです。EC2インスタンス一覧を確認すると、
作成したAMIのIDと同じAMI IDのEC2インスタンスが作成されていることを確認できます。
それでは確認です。
# curl http://<EC2 Instance Public DNS>/django/list/ Hello, fuji
アクセスできました。
今回はボリューム少な目でしたね。。
次回はELBを作成してアクセスが分散されることを確認します。
AWS RDS
早いもので更新が2週間空いてしまった。
AWSスクリプトを書くことが楽しくなっちゃってアウトプットをサボりました。
botoというPython製のAWSライブラリがあって、
これがまた利用者に優しくAPIリファレンスさえ読めば、
PythonもAWSも理解が乏しい私が簡単にAWSの環境構築スクリプトを組めちゃいました。
さて、本題。
前回はEC2インスタンスを作成して、Webサーバを立ち上げました。
今回はRDSインスタンスを立ち上げて、Webサーバと連携します。
EC2でWebAP構築
↓
RDSでWebAP-DB構築 (今回はここ)
↓
AMIでEC2のイメージ化、複製
↓
ELBで冗長化
↓
ElastiCacheでセッション管理
↓
S3にアクセスログ保存
↓
(できれば)SQSでWebAP連携
では早速RDSを作成しましょう。
(キャプチャは後日こっそりつけときます)
あれ?
2週間の間にEC2インスタンスのOSがRHEL7になってる。。。
- RDS画面へ遷移
AWSのメニューからRDSを選択
- RDS作成開始
[Get Started Now]ボタンやら[Launch DB Instance]ボタンやらをクリック
- DBエンジン選択
DBエンジンは4種類が選べます。(ブログ執筆現在:2015/04/18)
Auroraはまだ東京リージョンでは登場していません。- MySQL
- PostgreSQL
- Oracle Database
- Standard Edition One
- Standard Edition
- Enterprise Edition
- Microsoft SQL Server
- Express
- Web Edition
- Standard Edition
- Enterprise Edition
今回はMySQLを利用します。
- MultiAZ
MultiAZかどうかを選択します。
MultiAZはDBの配置方式として複数のAZに配置するかどうかです。
MultiAZを選択すると、稼働率99.95%以上を保証されます。
99.95%を下回る場合、AWSから返金があります。
※注意:MultiAZは無償枠外です!
私のような無償プレイヤーは要注意です。
でも、本番運用するような場合は必須だと思う。
- 基本設定
- インスタンス設定
- Engineバージョン
- Instanceタイプ
t1.micro以外は無償枠外
-
- ストレージタイプ
-
- ストレージサイズ
- DB設定
DNS等に利用され、データベースでは持たないっぽ
-
- DBユーザ名
- パスワード
- インスタンス設定
- 詳細設定
- ネットワーク設定
- VPC
- SubnetGroup
VPCのSubnetとは別で、複数のSubnetをまとめたもの
-
- Availability Zone
- SecurityGroup
EC2作成時とは別でDBポート番号のみを許可した紐づけるのが望ましい
- DB詳細設定
- DB名
作成する空のデータベース
-
- ポート番号
最初からデフォルト値が入っている
以上の設定で作成されます。
- ネットワーク設定
- 作成中
けっこう時間かかります。。。
- 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 こ、こいつまで遠かった。。。
- 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
- 接続確認
早速繋いでみましょう。# curl http://<EC2 Instance Public DNS>/django/list/ Hello, fuji
おー、うまくいきました。
今回は
クライアント -> Internet -> Web -> AP -> RDS
というあるある構成をAWS上に作ることができました。次回は今回作ったAPサーバをAMIにイメージ化して複製します。
AWS EC2
AWSの記事を書き直します。
前回はごちゃごちゃしてて分かりづらかった。
やっぱり一つ一つ書いていきます。
どうせならより多くの機能を試してみたい。
EC2でWebAP構築
↓
RDSでWebAP-DB構築
↓
AMIでEC2のイメージ化、複製
↓
ELBで冗長化
↓
ElastiCacheでセッション管理
↓
S3にアクセスログ保存
↓
(できれば)SQSでWebAP連携
以上を目標とする。
EC2 (Elastic Compute Cloud)
仮想マシン。
AMIというテンプレートから作成可能。
AMIは標準でたくさんのものが用意されている。
無料枠ではAmazonLinux、RHEL、CentOS、Ubuntu、SuseLinux
それでは早速作ってみよう。
前提
- AWSアカウント登録済み
手順
- EC2画面
AWSのメニュー一覧です。
画面下部が切れているが、ほんとたくさんある。
各メニューには更にオプションがたくさんある。
把握しきれまてん。EC2を選択する。
- EC2作成
Launch Instanceを選択する。
- AMI選択
- インスタンスタイプ選択
CPU、MEM、ディスク、ネットワークの性能を選択できる。
t2.microを選択。
これ唯一の無料枠インスタンスタイプです。 - インスタンス設定
なんか色々設定できる。
- ディスク設定
サイズを選択できる。
Storageタイプを選択できる - タグ設定
です。
- セキュリティグループ設定
ファイアウォールに位置します。
Source IP、Dest Portでフィルタリング可能。
EC2インスタンスはリモートコンソール機能はないため、
Linux系OSはSSHアクセスするためのポートを開放する必要がある。
今回はWebアクセスもするのでHTTPも開放する。 - 確認・作成
Launchを選択。
- キーペア作成・選択
作成していない場合、キーペアを作成します。Instanceの作成が始まります。
View Instanceを選択
- 起動
作成が完了すると自動で起動してきます。 - 接続
キーペア作成時にダウンロードした証明書ファイルを使用して、
SSH接続でログインする。
AMIにCentOSを選択した場合、centosユーザでログインできます。
AMIにAmazonLinux、RHELを選択した場合、ec2-userユーザでログインできます。 - apache起動
# systemctl enabled httpd # systemctl start httpd # ps -ef |grep httpd
- webアクセス
WebブラウザからEC2のPublic DNSへアクセス
http:/// Apacheのサンプルページが表示されれば、アクセス成功!
いかがでしょうか?
今回はEC2インスタンス作成、接続をしました。
こんなに簡単にVMを手に入れることができました。
英語ですが項目が分かり易いですし、
ググれば誰かしら説明してくれている方がいるので敷居は低いです。
次回はRDSを作って、繋いでを実施します。
それにしても、キャプチャ貼りだすと、一気にめんどくさくなる。。
Webアプリケーション on EC2 and RDS
AWSを使ってみた
無償枠でより多くの機能を使ってみたい
とりあえずは基本のEC2とRDSを連携させたWebアプリケーションを構築してみる。
WEB/AP - DBの構成
機能
- ログイン
- データベースに登録されたID/PASSと一致した場合、アカウント一覧画面を表示する
- データベースに登録されたID/PASSと一致しない場合、ログイン画面を再表示して、エラーメッセージを表示する
- アカウント一覧表示
- データベースに登録されたIDを一覧で表示する
- 有効フラグが立っていないIDは表示しない
- アカウント追加
- 入力された情報でデータベースへレコードを追加する
前提
- AWS契約済み
- KeyPair作成済み、ローカルに証明書ファイルがあること
手順
- EC2インスタンス作成
AMIはCentOS7を利用
- RDSインスタンス作成
MySQLを選択
EC2インスタンスと同じVPC、同じSubnetを選択
EC2インスタンスと同じSecurityGroupを選択
DB nameはtestsitedb
- SecurityGroup
Sourceに選択したセキュリティグループ
ポートにRDSのポート番号を入力(今回はMySQLのデフォル3306)
- OSログイン
EC2はコンソール接続はない。
個人的には衝撃の事実
OSのNW系障害が発生したらどうするんだろ。。# ssh -i <証明書> centos@<PublicIP> $ sudo su -
- MySQLクライアントインストール
パッケージインストール# yum install mysql mysql-dev gcc python-devel Loaded plugins: fastestmirror ・・・(略)・・・ Installed: mariadb.x86_64 1:5.5.41-2.el7_0 Dependency Installed: perl.x86_64 4:5.16.3-283.el7 perl-Carp.noarch 0:1.26-244.el7 perl-Encode.x86_64 0:2.51-7.el7 perl-Exporter.noarch 0:5.68-3.el7 perl-File-Path.noarch 0:2.09-2.el7 perl-File-Temp.noarch 0:0.23.01-3.el7 perl-Filter.x86_64 0:1.49-3.el7 perl-Getopt-Long.noarch 0:2.40-2.el7 perl-HTTP-Tiny.noarch 0:0.033-3.el7 perl-PathTools.x86_64 0:3.40-5.el7 perl-Pod-Escapes.noarch 1:1.04-283.el7 perl-Pod-Perldoc.noarch 0:3.20-4.el7 perl-Pod-Simple.noarch 1:3.28-4.el7 perl-Pod-Usage.noarch 0:1.63-3.el7 perl-Scalar-List-Utils.x86_64 0:1.27-248.el7 perl-Socket.x86_64 0:2.010-3.el7 perl-Storable.x86_64 0:2.45-3.el7 perl-Text-ParseWords.noarch 0:3.29-4.el7 perl-Time-Local.noarch 0:1.2300-2.el7 perl-constant.noarch 0:1.27-2.el7 perl-libs.x86_64 4:5.16.3-283.el7 perl-macros.x86_64 4:5.16.3-283.el7 perl-parent.noarch 1:0.225-244.el7 perl-podlators.noarch 0:2.5.1-3.el7 perl-threads.x86_64 0:1.87-4.el7 perl-threads-shared.x86_64 0:1.43-6.el7 Dependency Updated: mariadb-libs.x86_64 1:5.5.41-2.el7_0 Complete!
- 接続試験
# mysql -h <RDS Endpoint> -u <db user> -p Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is 154 Server version: 5.6.22-log MySQL Community Server (GPL) Copyright (c) 2000, 2014, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
- djangoインストール
# easy_install pip Searching for pip Reading https://pypi.python.org/simple/pip/ Best match: pip 6.0.8 Downloading https://pypi.python.org/packages/source/p/pip/pip-6.0.8.tar.gz#md5=2332e6f97e75ded3bddde0ced01dbda3 Processing pip-6.0.8.tar.gz Writing /tmp/easy_install-hvl4ts/pip-6.0.8/setup.cfg Running pip-6.0.8/setup.py -q bdist_egg --dist-dir /tmp/easy_install-hvl4ts/pip-6.0.8/egg-dist-tmp-UeBzQD warning: no previously-included files found matching '.coveragerc' warning: no previously-included files found matching '.mailmap' warning: no previously-included files found matching '.travis.yml' warning: no previously-included files found matching 'pip/_vendor/Makefile' warning: no previously-included files found matching 'tox.ini' warning: no previously-included files found matching 'dev-requirements.txt' no previously-included directories found matching '.travis' no previously-included directories found matching 'docs/_build' no previously-included directories found matching 'contrib' no previously-included directories found matching 'tasks' no previously-included directories found matching 'tests' Adding pip 6.0.8 to easy-install.pth file Installing pip script to /usr/bin Installing pip2.7 script to /usr/bin Installing pip2 script to /usr/bin Installed /usr/lib/python2.7/site-packages/pip-6.0.8-py2.7.egg Processing dependencies for pip Finished processing dependencies for pip # pip list backports.ssl-match-hostname (3.4.0.2) boto (2.25.0) chardet (2.0.1) Cheetah (2.4.4) cloud-init (0.7.5) configobj (4.7.2) decorator (3.4.0) iniparse (0.4) IPy (0.75) jsonpatch (1.2) jsonpointer (1.0) kitchen (1.1.1) Markdown (2.4.1) Pillow (2.0.0) pip (6.0.8) policycoreutils-default-encoding (0.1) prettytable (0.7.2) pycurl (7.19.0) Pygments (1.4) pygobject (3.8.2) pygpgme (0.3) pyliblzma (0.5.3) pyudev (0.15) pyxattr (0.5.1) PyYAML (3.10) requests (1.1.0) seobject (0.1) sepolicy (1.1) setuptools (0.9.8) six (1.3.0) urlgrabber (3.10) urllib3 (1.5) yum-metadata-parser (1.1.4) [root@ip-172-31-8-41 ~]# pip install django mysql-python Collecting django Downloading Django-1.7.7-py2.py3-none-any.whl (7.4MB) 100% |################################| 7.4MB 74kB/s Installing collected packages: django Successfully installed django-1.7.7
- 動作確認
# django-admin startproject testweb # cd testweb/ # ./manage.py runserver 0.0.0.0:8888 Performing system checks... System check identified no issues (0 silenced). You have unapplied migrations; your app may not work properly until they are applied. Run 'python manage.py migrate' to apply them. March 28, 2015 - 16:39:27 Django version 1.7.7, using settings 'testweb.settings' Starting development server at http://0.0.0.0:8888/ Quit the server with CONTROL-C.
Webブラウザ起動してページへアクセス・・・繋がらない
あ、SecurityGroupで8888ポート開放していない
EC2のSecurityGroupに戻ってMyIPから8888へのアクセス開放もう一回アクセス・・・繋がった
- DB設定
DjangoはデフォルトDB設定がsqlite3を利用する
DBをRDSのDB情報に設定変更する# vi testweb/settings.py 以下を変更 --- DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } } --- ↓ --- DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'HOST': <RDS Endpoint>, 'PORT': '3306', 'NAME': 'testsitedb', 'USER': 'test', 'PASSWORD': <password>, } } --- # # ./manage.py runserver Traceback (most recent call last): File "./manage.py", line 10, in <module> execute_from_command_line(sys.argv) File "/usr/lib/python2.7/site-packages/django/core/management/__init__.py", line 385, in execute_from_command_line utility.execute() File "/usr/lib/python2.7/site-packages/django/core/management/__init__.py", line 354, in execute django.setup() File "/usr/lib/python2.7/site-packages/django/__init__.py", line 21, in setup apps.populate(settings.INSTALLED_APPS) File "/usr/lib/python2.7/site-packages/django/apps/registry.py", line 108, in populate app_config.import_models(all_models) File "/usr/lib/python2.7/site-packages/django/apps/config.py", line 202, in import_models self.models_module = import_module(models_module_name) File "/usr/lib64/python2.7/importlib/__init__.py", line 37, in import_module __import__(name) File "/usr/lib/python2.7/site-packages/django/contrib/auth/models.py", line 40, in <module> class Permission(models.Model): File "/usr/lib/python2.7/site-packages/django/db/models/base.py", line 122, in __new__ new_class.add_to_class('_meta', Options(meta, **kwargs)) File "/usr/lib/python2.7/site-packages/django/db/models/base.py", line 297, in add_to_class value.contribute_to_class(cls, name) File "/usr/lib/python2.7/site-packages/django/db/models/options.py", line 166, in contribute_to_class self.db_table = truncate_name(self.db_table, connection.ops.max_name_length()) File "/usr/lib/python2.7/site-packages/django/db/__init__.py", line 40, in __getattr__ return getattr(connections[DEFAULT_DB_ALIAS], item) File "/usr/lib/python2.7/site-packages/django/db/utils.py", line 242, in __getitem__ backend = load_backend(db['ENGINE']) File "/usr/lib/python2.7/site-packages/django/db/utils.py", line 108, in load_backend return import_module('%s.base' % backend_name) File "/usr/lib64/python2.7/importlib/__init__.py", line 37, in import_module __import__(name) File "/usr/lib/python2.7/site-packages/django/db/backends/mysql/base.py", line 18, in <module> raise ImproperlyConfigured("Error loading MySQLdb module: %s" % e) django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module: No module named MySQLdb
MySQLdbモジュールがないらしい
というか色々ないらしい。# yum install mysql-devel gcc python-devel # pip install mysql-python # ./manage.py migrate Operations to perform: Apply all migrations: admin, contenttypes, auth, sessions Running migrations: Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying sessions.0001_initial... OK
なんか色々作られた。
# mysql -h <RDS Endpoint> -u test -p Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is 167 Server version: 5.6.22-log MySQL Community Server (GPL) Copyright (c) 2000, 2014, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MySQL [(none)]> use testsitedb Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed MySQL [testsitedb]> show tables -> ; +----------------------------+ | Tables_in_testsitedb | +----------------------------+ | 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 | +----------------------------+ 10 rows in set (0.00 sec)
データベースにテーブルが作成されていた。
今日はここまで。。
全然出来なかった。
EC2とRDSが連携出来たので目的は達成かな。
Fluentd(インストール編)
SSHクライアントツールって何を使っている?
私はMacではiTerm2、Winではputty使ってた。
元々、プライベート端末も業務端末もWinだったので、
putty一択で不満はありながらも使ってた。
プライベート端末をMacに変えてiTerm2を使いはじめると、
puttyへの不満が募っていった。
特に開発時にサーバ繋げまくりのウィンドウ開きまくりがいけないのだが、
開きたいウィンドウが分からなくなる。
その点、iTerm2は分割表示もタブ表示もできる。
WinはTeraTerm、putty以外を探したことがないわけではないのですが、
改めて最近Google先生に尋ねてみたところ、、、あった。
Poderosa
ポルトガル後らしく直訳するとパワフル。シンプル 笑
UIが素晴らしい。
分割表示、タブ表示はもちろんSSHセッション一つ一つにショートカットキーが割り当てたり、
分割のどこに割り当てるから自由に選択可能。
捗る。
ぜひ試してみてください。
Fluentd
さて、本題。
前々からよく耳にはしていたものの試せていなかったFluentdにようやく手を伸ばしました。
イメージとしては
- 柔軟
- 導入が簡単
- 既存システムに影響を与えない
- OSS
いいことだらけ?
そんな美味しい話ある?
あとで壺とか買わされない?
とりあえず試してみる。
本家サイトのトップページに書いてあるように
- 入力
- フィルター/バッファ
- 出力
の流れで形成される。
単純に入力 -> 出力だけでもよい。
冗長化された複数のWebサーバのaccess_logをサーバ単位でタグ付けして集約して運用改善、とかそんな感じかな。
とりあえずインストールしてみた。
- OS : CentOS7
インストール
本家サイトにあるがコマンド一発でインストールできます。
# curl -L http://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh |sh % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 660 100 660 0 0 19078 0 --:--:-- --:--:-- --:--:-- 19411 This script requires superuser access to install rpm packages. You will be prompted for your password by sudo. curl: (6) Could not resolve host: packages.treasuredata.com; Unknown error error: http://packages.treasuredata.com/GPG-KEY-td-agent: import read failed(2). Loaded plugins: fastestmirror base | 3.6 kB 00:00:00 extras | 3.4 kB 00:00:00 treasuredata | 2.9 kB 00:00:00 updates | 3.4 kB 00:00:00 Loading mirror speeds from cached hostfile * base: ftp.iij.ad.jp * extras: ftp.iij.ad.jp * updates: ftp.iij.ad.jp Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * base: ftp.iij.ad.jp * extras: ftp.iij.ad.jp * updates: ftp.iij.ad.jp Resolving Dependencies --> Running transaction check ---> Package td-agent.x86_64 0:2.1.5-0 will be installed --> Finished Dependency Resolution Dependencies Resolved ============================================================================================================================================================================================================================================= Package Arch Version Repository Size ============================================================================================================================================================================================================================================= Installing: td-agent x86_64 2.1.5-0 treasuredata 99 M Transaction Summary ============================================================================================================================================================================================================================================= Install 1 Package Total download size: 99 M Installed size: 215 M Downloading packages: Delta RPMs disabled because /usr/bin/applydeltarpm not installed. td-agent-2.1.5-0.x86_64.rpm | 99 MB 00:00:43 Running transaction check Running transaction test Transaction test succeeded Running transaction Warning: RPMDB altered outside of yum. Installing : td-agent-2.1.5-0.x86_64 1/1 adding 'td-agent' group... adding 'td-agent' user... prelink detected. Installing /etc/prelink.conf.d/td-agent-ruby.conf ... Configure td-agent to start, when booting up the OS... Verifying : td-agent-2.1.5-0.x86_64 1/1 Installed: td-agent.x86_64 0:2.1.5-0 Complete! # rpm -q td-agent td-agent-2.1.5-0.x86_64
簡単。
こぴぺで完了。
つまらないのでshファイルを覗いてみます。
]# cat install-redhat-td-agent2.sh echo "This script requires superuser access to install rpm packages." echo "You will be prompted for your password by sudo." # clear any previous sudo permission sudo -k # run inside sudo sudo sh <<SCRIPT # add GPG key rpm --import http://packages.treasuredata.com/GPG-KEY-td-agent # add treasure data repository to yum cat >/etc/yum.repos.d/td.repo <<'EOF'; [treasuredata] name=TreasureData baseurl=http://packages.treasuredata.com/2/redhat/\$releasever/\$basearch gpgcheck=1 gpgkey=http://packages.treasuredata.com/GPG-KEY-td-agent EOF # update your sources yum check-update # install the toolbelt yes | yum install -y td-agent SCRIPT
Syslogメッセージのコピー
まずは最もシンプルな設定からどんな感じか味わう。
- 設定内容
/var/log/messagesに出力されたメッセージを
/var/log/td-agent/copy-messagesファイルへ転送する。
- 設定ファイル
/etc/td-agent/td-agent.conf
sourceタグとmatchタグで入力と入力に対する処理内容を定義する。
# cat /etc/td-agent/td-agent.conf <source> type tail path /var/log/messages pos_file /tmp/messages.pos format syslog tag syslog.messages </source> <match syslog.messages> type file path /var/log/td-agent/copy-messages </match>
sourceタグ内に入力を定義する。
type tail => ファイルへの入力を追いかける
path => 指定されたファイルパスをtailの対象とする
pos_file => ファイルに対してどこまで処理したかを記録する
format => メッセージ形式の指定(syslogやapache2などがある)
tag => matchで引っ掛けるため
matchタグ内に入力に対する処理内容を定義する
matchで対象となるtagを指定する。*によるワイルドカード指定可能。
type file => ファイルへの出力
path => 指定されたファイルパスに対して出力する
fluentd起動
# /etc/init.d/td-agent restart Restarting td-agent (via systemctl): [ OK ] # cat /var/log/td-agent/copy-messages.20150325.b5121681c2e412c5c 2015-03-25T14:55:05+09:00 syslog.messages {"host":"centos7-test","ident":"td-agent","message":"Starting td-agent: [ OK ]"} 2015-03-25T14:55:05+09:00 syslog.messages {"host":"centos7-test","ident":"systemd","message":"Started LSB: td-agent's init script."}
標準フォーマットでは日時、タグ、syslogフォーマットを分解したメッセージをJSON形式で記憶する。
確かに導入は簡単だし、
アプリケーションに設定を埋め込むわけではないので、
既存システムへの影響は少ないというのは納得。
ということでインストール編は以上。