2012年1月16日月曜日

2012年1月3日火曜日

Amazon Linuxで使われてるcloud-initをCentOS6で使ってみる

新年あけましておめでとうございます。
年明け最初の更新をこんなに早くするとは自分でも驚きですが、今年もブログをゆるく継続していきたいと思います。

さて、AWSを使用している方はAmazon Linuxに興味を持った事があると思います。
Redhat系のディストリビューションを使用していた方は操作感も近くてスイッチしやすいのではないでしょうか?
私も何度かAmazon Linuxを使用しましたが、その中でcloud-initってとても便利だなと思いました。
cloud-initはもともとUbuntuに搭載されたクラウド環境でのセットアップツールみたいですが、Amazon Linuxではこの機能が標準で移植されております。
個人的にはChefとかよりもチャラく使えるようなイメージでしょうか。。。
AWSで提供されているUbuntuやAmazon Linuxはcloud-initを使って、指定したSSH公開鍵の設置や、セキュリティアップデートなどが行われているようです。
自前でCentOSなどのAMIを作成した経験がある方はSSHの公開鍵を設置するスクリプトを使った事があると思いますが、Amazon Linuxではcloud-init経由でec2-userに公開鍵を設置しているのですね。

『なるほどー、これはCentOSでも使ってみたいですよねー』というネタです。

■AmazonLinuxで使用されているcloud-initのsrpmを取得する

Amazon Linuxで以下のようにコマンドを実行すると/usr/src/srpm/debug/以下にsrpmが保存されるので、これをCentOSでビルドします。
  1. # get_reference_source -p cloud-init  
  2.   
  3. Requested package: cloud-init  
  4. Found package from local RPM database: cloud-init-0.5.15-20.amzn1  
  5. Corresponding source RPM to found package : cloud-init-0.5.15-20.amzn1.src.rpm  
  6.   
  7. Are these parameters correct? Please type 'yes' to continue: yes  
  8. Source RPM downloaded to: /usr/src/srpm/debug/cloud-init-0.5.15-20.amzn1.src.rpm  
■CentOSでcloud-initのrpmを作成する

ビルドに必要なライブラリをインストールします。
epelをyumのリポジトリに追加している方はPyYAMLとlibyamlもyumでインストールが出来ると思います。
  1. # yum -y groupinstall "Development Tools" "Development Libraries" && yum -y update  
  2. # yum install python-devel python-configobj python-cheetah  
  3. # cd /usr/local/src/  
  4. # wget ftp://ftp.iij.ad.jp/pub/linux/fedora/epel/6/i386/PyYAML-3.09-5.el6.i686.rpm  
  5. # wget ftp://ftp.iij.ad.jp/pub/linux/fedora/epel/6/i386/libyaml-0.1.3-1.el6.i686.rpm  
  6. # rpm -ivh libyaml-0.1.3-1.el6.i686.rpm PyYAML-3.09-5.el6.i686.rpm   
次に事前に転送しておいたcloud-initのsrpmをビルドします。
一部specファイルを以下のように編集しています。
  1. # rpm -ivh --nomd5 cloud-init-0.5.15-20.amzn1.src.rpm   
  2. # cd /root/rpmbuild/  
  3. # grep ^BuildRequire ./SPECS/cloud-init.spec   
  4. BuildRequires: python-devel-abi  
  5. # grep ^Require ./SPECS/cloud-init.spec   
  6. Requires: sudo  
  7. Requires: rpm  
  8. Requires: yum  
  9. Requires:      python-configobj  
  10. Requires:      python-cheetah  
  11. Requires:      python-yaml  
  12. # vi ./cloud-init.spec   
  13.      21 #BuildRequires: python-devel-abi  
  14.      22 BuildRequires: python-devel  
  15.      25 #Requires:      python-yaml  
  16.      26 Requires:      PyYAML  
  17. # grep ^Source ./SPECS/cloud-init.spec   
  18. Source0:   cloud-init-%{version}.tar.gz  
  19. # cd ./SPECS/  
  20. # time rpmbuild -bb --clean ./cloud-init.spec   
  21.   
  22. real 0m0.061s  
  23. user 0m0.043s  
  24. sys 0m0.017s  
■インストール

作成されたcloud-initのrpmをインストールします。
specファイルを見ると分かりますが、インストールするとec2-userやsudoの設定が追加されます。
  1. # rpm -ivh /root/rpmbuild/RPMS/noarch/cloud-init-0.5.15-20.el6.noarch.rpm   
  2. 準備中...                ########################################### [100%]  
  3.    1:cloud-init             ########################################### [100%]  
■動作確認

インストールしたインスタンスからAMIを作成し、以下のようなUserDataを指定して起動してみました。
無事にec2-userへの公開鍵登録と 指定したパッケージがインストールされていましたよ:)
  1. #cloud-config  
  2. packages:  
  3. - httpd  
  4. - postfix  
こんな事するならAmazon Linux使った方が(ryという突っ込みはご勘弁下さい:D

2011年12月25日日曜日

Vyattaを使ってElastic Network Interfaceの動作確認をしてみる

先日、AWSから新しいサービスElastic Network Interfaceがリリースされました。
簡単に言うとAmazon VPC内のインスタンスにNICの二枚差しが可能になるサービスなようです。
今までAWSのインスタンスはeth0しか使えなかったので、これは便利になりそうです。
VPC内のネットワーク構成の幅が大きく広がるようなサービスなので、少しだけ触ってみました。

二枚差しって事はVPC内のルーティングテーブルを使わずにVyattaとかでルーティングしたりNATしたり出来るので、それを試します。
※ちなみにこちらにあるように、今までもNAT Addressingを使ってNATをする事は出来ました。
今回テストをした構成は以下のようなイメージとなります。

Vyattaは@j3tm0t0さんが作成されたAMIを使用させて頂きました。
※ENIはManagement Consoleからも作成可能で、インスタンス起動時/起動後どちらでも追加する事が出来ます。
※インスタンス起動後にChange Source/Dest CheckをDisableにする事をお忘れなく。

■割り当てたローカルIPと同じ設定をVyatta側に設定します
  1. $ configure   
  2. # set interfaces ethernet eth1 address 10.2.2.200/24  
  3. # set interfaces ethernet eth1 smp_affinity auto   
  4. # set interfaces ethernet eth1 speed auto   
  5. # commit  
  6. # run show interfaces ethernet   
  7. Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down  
  8. Interface    IP Address                        S/L  Description                   
  9. ---------    ----------                        ---  -----------                   
  10. eth0         10.2.1.200/24                     u/u                                
  11. eth1         10.2.2.200/24                     u/u                                
  12. [edit]  
  13. # save  
■Vyattaで行うNATの設定を行います
  1. # set service nat rule 10 type masquerade  
  2. # set service nat rule 10 source address 10.2.2.0/24  
  3. # set service nat rule 10 outbound-interface eth0  
  4. # commit  
  5. # save  
■確認用インスタンスAの起動直後のルーティングテーブルは以下のようになっています
  1. # route   
  2. Kernel IP routing table  
  3. Destination     Gateway         Genmask         Flags Metric Ref    Use Iface  
  4. 10.2.2.0        *               255.255.255.0   U     0      0        0 eth0  
  5. default         10.2.2.1        0.0.0.0         UG    0      0        0 eth0  
■確認用インスタンスAに以下のようなルーティングを追加してみます
  1. # route add -net 10.2.1.0 netmask 255.255.255.0 gw 10.2.2.200  
■設定後のルーティングテーブルは以下のようになります
  1. # route   
  2. Kernel IP routing table  
  3. Destination     Gateway         Genmask         Flags Metric Ref    Use Iface  
  4. 10.2.1.0        10.2.2.200      255.255.255.0   UG    0      0        0 eth0  
  5. 10.2.2.0        *               255.255.255.0   U     0      0        0 eth0  
  6. default         10.2.2.1        0.0.0.0         UG    0      0        0 eth0  
■インスタンスBへの疎通テストを行ってみます
  1. # ping -c 3 10.2.1.201  
  2. PING 10.2.1.201 (10.2.1.201) 56(84) bytes of data.  
  3. 64 bytes from 10.2.1.201: icmp_seq=1 ttl=63 time=31.2 ms  
  4. 64 bytes from 10.2.1.201: icmp_seq=2 ttl=63 time=0.849 ms  
  5. 64 bytes from 10.2.1.201: icmp_seq=3 ttl=63 time=0.863 ms  
  6.   
  7. --- 10.2.1.201 ping statistics ---  
  8. 3 packets transmitted, 3 received, 0% packet loss, time 2003ms  
  9. rtt min/avg/max/mdev = 0.849/10.995/31.275/14.340 ms  
■インスタンスBへの経路を確認するとVyattaを経由している事がわかります
  1. # traceroute 10.2.1.201  
  2. traceroute to 10.2.1.201 (10.2.1.201), 30 hops max, 60 byte packets  
  3.  1  10.2.2.200 (10.2.2.200)  0.785 ms  0.769 ms  0.751 ms  
  4.  2  10.2.1.201 (10.2.1.201)  1.088 ms  1.232 ms  1.213 ms  
■インスタンスAからインスタスBにアクセスしてNATが動作しているかApacheのアクセスログを見て確認してみました
  1. # tail -f /var/log/httpd/access_log  
  2. 10.2.1.200 - - [25/Dec/2011:12:00:43 +0000] "GET /index.html HTTP/1.1" 200 12 "-" "curl/7.19.7 (i386-redhat-linux-gnu) libcurl/7.19.7 NSS/3.12.9.0 zlib/1.2.3 libidn/1.18 libssh2/1.2.2"  
今回はインスタスAからインスタンスBでNATされていますが、NATせずルーティングのみさせた場合はNetwork ACLsも動作します。
まだ触り始めたばかりですが、ENIはVPCで色々なネットワークを構成出来るのでインフラエンジニア的にはとてもワクワクしますね!

2011年11月30日水曜日

RDSの自動停止、自動起動スクリプト(right_aws)を作る











前回から一ヶ月以上経過していて相変わらずブログの更新が滞り気味ですが、引っ越しなどをしていた訳です。
ちなみに、引越で一番大事にしたポイントはPC作業を行うための机と椅子これに限ります!

3月11日から数日は自宅でお仕事をしていたのですが、ちゃぶ台にPCとか腰が爆発しちゃいます(汗)
家で仕事したいわけじゃないですが、ブログ書いたり勉強したりする時には重宝しますよねー。
こうしてブログを書いている今も机と椅子のありがたさを実感しております。
そんな訳でこれからはブログの更新頻度がアップしないとかしないとか(汗)

今回もAWSネタなのですがRDSを使っているとどうしても一時停止が出来ない事に不便さを感じますよね。
RDSを使ってる方は既に同様の事をしているかと思いますが、私もスナップショットとリストアを組み合わせた停止/起動スクリプトを作ってみました。
パッと思いつく自動化したいポイントは以下のとおりです
  • RDSのスナップショットを作成した上での停止
  • 最新のスナップショットからの起動
  • スナップショットからRDSをリストアした時にセキュリティグループを割り当て
  • スナップショットからRDSをリストアした時にパラーメタグループを割り当て

※cronとかに登録すれば起動中、停止中を判断して自動で起動したり停止したりします。
※AWSSDK for Rubyを使いたかったのですが、RDSに未対応なのでright_awsを使っています


指定するパラーメタグループはMySQLのバージョンと合わせないとエラーになってしまいます。
また、現状ではスナップショットを削除する処理が入っていません。
入れた方が便利かなと思いつつ、どんな条件で削除するか悩み中。
スナップショットが特定の数以上になったら余分な数を消すって感じが一番事故がなさそうか。。。

ただ作っておいてなんですが、
そのうちRDSで停止がサポートされてこんなスクリプト必要なくなるんだろうなー。

2011年10月10日月曜日

Vyattaを使ってAmazon VPC内に独自NAT環境を作る

このブログでクラウド関連の話題というと、ほとんどRackspace Cloudばかりなのですが…
今回のエントリは珍しくAWSをテーマにしてみたいと思います。
Twitterを見ているとVyattaが最近アツく、個人的にも書籍を購入したのでAmazon VPCと連携させたいです。
AWSではVPCネットワークから外部へ接続するためのNATアドレッシングインスタンスが提供されておりますが、こちらをVyattaに置き換えて使ってみるという事です。
今回はNATを構成するだけですが、Vyattaは機能が豊富で様々な可能性をVPCに付け加える事が出来そうです。
ちなみに先日Vyatta社からアナウンスされた6.3のAMIはSubscription Editionということなので、今回はVyatta Core6.1のAMIを使用しています。



[ネットワーク構成]

[VPCの設定]
VPC内にはVyattaを起動する公開サブネットと、Webサーバを起動する非公開サブネットの2つを用意します。

[Vyattaインスタンスを起動]
今回はこちらのAMIを使用し、インスタンス起動後にはSouce/Dest. CheckをDisableとします。
この設定はVyattaインスタンスを起動後にインスタンスを選択して、右クリックのメニューから変更が出来ます。
VPC内でElastic IPを取得してVyattaインスタンスに割り当てる事も忘れずに!
このIPを使用してWebサーバは通信をします。

[ルートテーブル]
Management Console(VPC)のRoute Tableメニューで公開用/非公開用のルートテーブルを設定します。
公開用サブネットはデフォルトルートがインターネットゲートウェイとなり、非公開用はVyattaインスタンスのinstance-idを指定します。

[セキュリティグループ]
Vyattaに割り当てるセキュリティグループは、Webサーバからの必要な通信をブロックしなければ自由に設定可能です。
また、VPCで設定可能なネットワークACLも同じように自由に使えました。

[Vyattaインスタンスの設定]
起動したVyattaインスタンスにSSH接続し以下のような設定を行います。
  1. ■ホスト名の設定  
  2. $ configure   
  3. [edit]  
  4. # set system host-name vyatta61  
  5. # commit   
  6. # exit  
  7.   
  8. ■時刻の設定  
  9. $ configure   
  10. [edit]  
  11. # set system time-zone Asia/Tokyo   
  12. # commit   
  13. # exit  
  14. $ show date   
  15.   
  16. ■NAT設定(内部から外部への変換)  
  17. $ configure   
  18. [edit]  
  19. # set service nat rule 10 outbound-interface eth0    
  20. # set service nat rule 10 source address 10.0.2.0/24  
  21. # set service nat rule 10 type masquerade   
  22. # commit   
  23.   
  24. ■NAT設定(外部からの8080番ポートを内部へ変換)  
  25. # set service nat rule 20 destination port 8080  
  26. # set service nat rule 20 inbound-interface eth0   
  27. # set service nat rule 20 inside-address address 10.0.2.100  
  28. # set service nat rule 20 protocol tcp  
  29. # set service nat rule 20 type destination   
  30. # commit   
  31. # save  
  32.   
  33. ■NAT設定確認  
  34. # show service nat   
  35. rule 10 {  
  36. outbound-interface eth0  
  37. protocol tcp  
  38. source {  
  39. address 10.0.2.0/24  
  40. }  
  41. type masquerade  
  42. }  
  43. rule 20 {  
  44. destination {  
  45. port 8080  
  46. }  
  47. inbound-interface eth0  
  48. inside-address {  
  49. address 10.0.2.100  
  50. }  
  51. protocol tcp  
  52. type destination  
  53. }  
[Webサーバインスタンスの起動]
それでは動作確認用に適当なインスタンスを非公開用セグメントで起動します。
インスタンス起動後は外部接続の動作確認を行い、Apacheをインストールしました。
  1. ■NAT動作確認インスタンス起動  
  2. $ ping google.co.jp  
  3. $ sudo yum -y install httpd  
  4. $ sudo vi /etc/httpd/conf/httpd.conf   
  5. 136 Listen 8080  
  6. $ sudo chkconfig --level 2345 httpd on  
  7. $ sudo /etc/rc.d/init.d/httpd start  
  8. $ sudo vi /var/www/html/index.html  
[ブラウザから動作確認]
Vyattaに割り当てたElastic IPにポート8080番を指定してアクセスすると以下のようにWebサーバに転送されました。

※おまけ
実はこの構成でVPCのDHCP Options Setを無効にしてDHCPサーバも動かそうとしたのですが、VPCもブロードキャストの通信がサポートされてないという事なので断念しました(汗)

[投入を予定していたDHCP関連の設定]
  1. ■DHCP設定  
  2. Amazon VPCの標準機能ではなくVyattaルータの設定で行います  
  3. $ configure   
  4. [edit]  
  5. # set service dhcp-server shared-network-name oko_chang subnet 10.0.1.0/24  
  6. # set service dhcp-server shared-network-name oko_chang subnet 10.0.1.0/24 start 10.0.1.100 stop 10.0.1.200  
  7. # set service dhcp-server shared-network-name oko_chang subnet 10.0.1.0/24 default-router 10.0.1.254  
  8. # set service dhcp-server shared-network-name oko_chang subnet 10.0.1.0/24 dns-server 10.0.1.254  
  9. # commit   
  10. # exit  
  11.   
  12. ■DNS設定  
  13. Amazon VPCの標準機能ではなく、Googleが提供しているルータの設定を行います  
  14. $ configure   
  15. [edit]  
  16. # set system name-server 8.8.8.8  
  17. # commit   
  18. # exit  
  19.   
  20. ■DNS転送設定  
  21. $ configure   
  22. [edit]  
  23. # set service dns forwarding listen-on eth0   
  24. # commit   
  25. # exit  

AWSが提供しているNATアドレッシングインスタンスも便利ですが、Vyattaユーザやルータの設定経験がある方はこのような構成にした方が理解しやすい部分もありそうですね。

[参考資料]