• facebookのIPがmod_geoipで拒否される対応

    こんにちは。プラットフォームの小宮です。 apacheのmod_geoipモジュールで海外を拒否してみたところ、 Facebookの画像が表示されないということで対応しました。 ・whoisが必要だが入ってなかったので他の入ってるサーバでパッケージ名を調べて導入 [shell]$ which whois /usr/bin/whois # rpm -qf /usr/bin/whois jwhois-3.2.2-1 # yum install jwhois Installed: jwhois.x86_64 0:4.0-19.el6 # which whois /usr/bin/whois[/shell] ・fb公式で許可リスト取得方法を確認 以下のコマンドで定期的に更新リストを取得せよと公式に書いてある。 App Security - Facebook開発者 [shell]# whois -h whois.radb.net – ‘-i origin AS32934’ | grep ^route:|awk ‘{print $2}’ 204.15.20.0/22 69.63.176.0/20 ~略~ 69.63.184.0/21 66.220.144.0/20 69.63.176.0/20[/shell] ※65ブロックくらいだった。手作業はあり得ないので何とか自動化を試みる。
    ...
  • MySQLのMyISAMが混在する環境のバックアップについて注意事項

    ※古い記事ですのでご注意ください※ こんにちは。小宮です。 社内のMyISAMテーブルが混在しているサービスにて、 mysqldumpによるバックアップに失敗しコールドバックアップを取ったが不整合出たという事件について相談うけまして、 その顛末を記録しがてら注意事項をまとめておきたいと思います。 (昔軽く伝えた記憶があり皆知ってると思ってたんですが、わかりやすさや伝える力と、 私と他の人のmysqlに対する愛のレベルが少し異なるという認識が足らなかったようです。 トラブルは起きるもんだし失敗は挑戦の証で成功の元ですが同じことは繰り返さないようにしないと。) 何が大切かって、マスタとスレーブのデータの整合性です。 つまり、 ⇒バックアップ対象が絶対に更新されてないこと ⇒バックアップ取得時点のポジションとバイナリログファイル名が明確であること が超重要です。 MyISAM混在環境では気をつけないと不整合でます。 不整合でると購入したはずのコンテンツが買われてないように見えるなど割と大変なことになりますね。 InnoDBだけなら–single-transactionつけとけば不整合は気にしなくて大丈夫です。 ・mysqldumpに失敗した原因 mysqldump: Error 1317: Query execution was interrupted when dumping table このエラーは、 mysqldumpでデータを読んでる間にクエリーが中断されると出るやつです。Ctrl + Cとかkillでスレッドが殺されたとか。。 (とTwitterで教えていただきました。ありがとうございます。 それから、整合性のためにマスタからmysqldumpでデータをとることになったのですが、 その際にslaveでreplicationを止めて更新がない状態でとっている方法をそのまま用いたのも不整合が起きる原因になりました。 (MyISAMが混在する環境なのにFLUSH TABLES WITH READ LOCK;をしてなかった) MyISAMが混在する環境の場合、トランザクションは使えないので、 replicaion停止または共有ロックで更新停止が必要になります。 ex) FLUSH TABLES WITH READ LOCK; sleepやsyncでロックが終わる(確実に更新停止される)のを待つ ポジションとファイル名をとりログに記録する mysqldumpする UNLOCK TABLES; 特にクエリを中断したりしてない(中断と整合性がごっちゃ)という指摘があったりしてそれは私もよくわからないところですが、
    ...
  • AWSメンテナンスでstoppingのまま停止しない障害の対応

    こんにちは。小宮です。 タイトルどおり障害がありまして、今後の為に記録しておこうかと思います。 AWSメンテ通知の来たインスタンスをStopしたところ、最終的には6時間強ほどstoppingのままでした。 今回のインスタンスは、自分で構築したわけでなく、構築メモは残っているもののメンテナンスされていない、 という状況把握が難しいパターンでした。 一応上がってるプロセスとポートくらいは控えてから止めましたが、snapshotは撮ってなくAMIも作っていませんでした。 日本語フォーラムに投稿したところ特に反応がありませんでした。 聞いた話によると英語フォーラムを使えば15分くらいで対応してもらえることもあるようです。 その間、stoppingのインスタンスのsnapshotを撮ってAMI作成してそこから新インスタンスを起動してみましたが、 NICの設定の問題かなにかで接続できませんでした。 microインスタンスを起動しapacheだけ入れて簡単なsorryページを設置しました。 stoppingのまま6時間ほど待ったのですが一向に進捗せず、 しかもサポートにも未加入だったので、サポートに申し込んで以下のように問い合わせをしました。 (申し込んだら10分くらいで反映されました)。 -——————————– 1回目: EC2 Management ConsoleからサーバをStopしましたが、Stoppingから進みません。 http://aws.amazon.com/jp/instance-help/ に従い、何度かForce Stopを試みましたが同様のため、強制停止をお願いしたいです。 Zone: ap-northeast-1a Instance: i-4a42a348 インスタンスID: i-4a42a348 -——————————– 2回目: 先ほどstopしました。何か対応されましたでしょうか。 同じインスタンスをstartしたいのですが、2回ほどstartしてもstopされてしまいます。 可能なら起動をお願いできますでしょうか。 -——————————– 私が時短なので帰宅後、stopedになってから選べたCreateImageでAMIを作って新インスタンスを起動したら接続できたようです。 翌朝みたらサポートから返事が来ていました。 -——————————– サポートの方から: お問い合わせ誠にありがとうございます。 i-4a42a348についてお調べしたところ、仮想サーバホストに問題が発生していたためインスタンスの停止にお時間を要しておりました。 EC2では、長時間StoppingやShuttingdownの状態が続いているインスタンスを自動でクリーンアップする仕組みがございます。 今回はこちらの仕組みによってインスタンスのStopが行われておりました。 このたびはご迷惑をおかけし、申し訳ございませんでした。 インスタンスが起動できない件については、インスタンスとEBSボリュームの関連付けに問題が発生しており、その影響でインスタンスが起動しない状態となっているようです。 お手数をおかけしますが、インスタンスにアタッチされているボリュームをデタッチ/アタッチして再度インスタンスの起動をお試しいただけるでしょうか。 通常のデタッチが効かない場合、Force Detachをお試しください。 ボリュームのデタッチ/アタッチを行ってもインスタンスが起動しない場合、恐れ入りますが、再度ご連絡いただけるでしょうか。 ご不明な点がありましたらお知らせください。 よろしくお願いいたします。
    ...
  • VPC上でPrivateIPアドレスを付け替える

    こんにちは。小宮です。 ちょっと前にAWSのVPC上でVIP(VirtualIPアドレス)を移動させる需要があって検証したのですが、 個人的にメモってただけだったのと、質問される機会が数回ありましたので簡単にですが投稿しておきます。 なんらかのクラスタ構成をVPC上で扱う際、VPC上でPrivateIPアドレスを付け替える必要が生じた場合、 awsなので切替スクリプトをAPI使うように修正しないと内部はともかく外部から打ったPINGへの応答が帰ってこない。 つまりVIPが移動したことになりません。 つまり、以下のような感じになります 落とすときは、IF落としてかつCLIも実行する [shell]ifconfig eth0:1 down ec2-unassign-private-addresses –network-interface eni-4b649*** –secondary-private-ip-address 10.0.0.96[/shell] ※ec2-unassign-private-addressesの短縮バージョンはec2upip 起動するときも、IF起動かつCLI実行する [shell]ifconfig eth0:1 up ec2-assign-private-ip-addresses –network-interface eni-70609*** –secondary-private-ip-address 10.0.0.96[/shell] ※ec2-assign-private-ip-addressesの短縮バージョンはec2apip 切替元のENI:eni-4b649*** 切替先のENI:eni-70609*** 参考: VPC 内の EC2 インスタンス に複数EIPを付与する ec2-assign-private-ip-addresses - Amazon Elastic Compute Cloud ec2-unassign-private-ip-addresses - Amazon Elastic Compute Cloud もし、EIPが紐づいてるENIをデタッチ、アタッチしたい場合、以下のような感じ。(たぶん(自分で試してないです)) [shell]ec2-detach-network-interface ${eni_attach_id} ec2-attach-network-interface ${ENI_ID} –instance ${target_instance_id} –device-index ${TARGET_DEVICE_INDEX}[/shell]
    ...
  • MySQLのslaveでDuplicate entryエラーが出た時の対処

    こんにちは。小宮です。 このまえ出たエラーの記録です。 ・エラーログ >show slave status\G Last_Error: Error 'Duplicate entry '1133523-2013-08-18 05:03:01' for key 'PRIMARY'' on query. Default database: '*****'. Query: 'INSERT INTO `event_****_logs` ... 時刻がプライマリキーになってるから重複してる感じのエラーなような。 ログとかセッションとか重複しやすい感じがします。 念のためmysqldumpのオプションをみたものの、 --skip-optは入ってないのでoptが勝手について–add-drop-tableは有効なはず。 MYDUMP_PAR='--single-transaction --dump-slave=2 --routines --include-master-host-port --all-databases' http://dev.mysql.com/doc/refman/5.5/en/mysqldump.html データ投入後にreset slaveしてログファイルとポジション合わせてstart slaveするなど手順には問題がないように見えました。 お客さまに重複エントリは全部skipしていいか確認いただいたところ Insertでプライマリキーが被ってるのは大丈夫なのかは別途開発側で確認でとりあえずskipという話に。 (対象がサービスで使用していないいので復旧優先ということだったと思います。不整合が気になるならマスタからdump撮り直すのが良いです。) ・エラーのクエリをskipする方法 1つだけなら、 SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; ですがいっぱいでてくる場合は Last_SQL_Errno: 1062
    ...
  • Chefで書いたレシピをテストする(serverspec)

    こんにちは。小宮です。 今回で最終回です。 前回までにご紹介したレシピのテストするところをご紹介します。Serverspecを用います。 なぜServerspecがいいかというのは以下リンクにも書いてますが、以下の点がよいと思います。 ・Chefのテストツールでなく外部のツールなので依存関係がない(puppetでも使える) ・設計思想がシンプル簡単に使えるものということで、手間があんまりなくて簡単につかえた 参考: Serverspec at hbstudy #45 入門Chef Solo落ち穂拾い kayac/newbie-training 「入門Puppet」 resource_typeのマニュアル advanced_tips ncstudy#05 ハンズオン資料 parallel_tests ・セットアップ バージョン0.3と0.6だとテストの書き方が若干違う感じだったので、マニュアルに沿ってる新しいほうを推奨します。 [shell]# yum install rubygems gem install serverspec rake serverspec-init Select a backend type: 1) SSH 2) Exec (local) Select number: 1 Vagrant instance y/n: y Input vagrant instance name: 10.
    ...
  • Chefで既存手順のレシピを書く5(munin、zabbix)

    おつかれさまです。小宮です。 前回に引き続き、munin,zabbixの手順のレシピをご紹介します。レシピはこの記事でおしまいです。 記事の最後にはレシピの適用方法を記載します。 ・muninのレシピ # cd /opt/src/rpms # mkdir -p /root/chef-repo/site-cookbooks/munin/files/default/rpms # mkdir -p /root/chef-repo/site-cookbooks/munin/files/default/var/www/html/munin # mkdir /root/chef-repo/site-cookbooks/munin/files/default/etc/munin/plugin-conf.d # cp -p /etc/munin/munin.conf /root/chef-repo/site-cookbooks/munin/files/default/etc/munin/ # scp -Cp xxx-web01:/etc/munin/munin-node.conf /root/chef-repo/site-cookbooks/munin/files/default/etc/munin/ # cp -p /var/www/html/munin/.htaccess /root/chef-repo/site-cookbooks/munin/files/default/var/www/html/munin/ # cp -p /etc/munin/plugin-conf.d/munin-node /root/chef-repo/site-cookbooks/munin/files/default/etc/munin/plugin-conf.d/ # tar cf /root/chef-repo/site-cookbooks/munin/files/default/rpms/munin-node-rpm.tar ./munin-node-rpm/ # tar tf /root/chef-repo/site-cookbooks/munin/files/default/rpms/munin-node-rpm.tar ./munin-node-rpm/ # tar cf /root/chef-repo/site-cookbooks/munin/files/default/rpms/munin-serv-rpm.
    ...
  • Chefで既存手順のレシピを書く4(DBサーバ)

    おつかれさまです。小宮です。 前回に引き続きdbserverのレシピについて書いていきます。 のこってるのはmunin、zabbxとserverspecでのテストだけです。もうすこしの辛抱です。 webと同じくバージョン固定インストールなので、外部レシピは基本的に使わない方向とする ・mysqlのインストールと起動と自動起動の有効化 [shell]# cd /root/chef-repo/site-cookbooks/mysqld/recipes mkdir -p /root/chef-repo/site-cookbooks/mysqld/files/default/usr/local/src/rpms mkdir -p ../templates/default/etc/init.d mkdir -p ../files/default/etc/init.d mkdir -p ../files/default/root mkdir -p /root/chef-repo/site-cookbooks/mysqld/files/default/etc/logrotate.d mkdir -p /root/chef-repo/site-cookbooks/mysqld/files/default/opt/{backup,bin} scp -Cp xxx-db02:/opt/bin/mysql-back.sh /root/chef-repo/site-cookbooks/mysqld/files/default/opt/bin/ cp -p /etc/logrotate.d/mysqld /root/chef-repo/site-cookbooks/mysqld/files/default/etc/logrotate.d/ scp -Cp xxx-db01:/etc/init.d/mysqld ../files/default/etc/init.d/ scp -Cp xxx-db02:/etc/my.cnf ../templates/default/etc/ cp -p /root/.path_to_file ../files/default/root/ cd /opt/src/rpms/ tar czf /root/chef-repo/site-cookbooks/mysqld/files/default/usr/local/src/rpms/db-rpm.
    ...
  • Chefで既存手順のレシピを書く3(WEBサーバ)

    こんにちは。プラットフォームの小宮です。 前回に引き続き既存手順のレシピ化をすすめていきます。あと3回くらいだと思われるので気長におつきあいください。 今回はWEBサーバのレシピになります。 特別なことは特にしていなくて普通のwebサーバだと思いますが、一応何してるか書いておきますと、 apache2.2+php5.3系で中間コードキャッシュにAPCを使っていてwordpressとそのsshプラグインつかっておりAWSのS3にmountしています。 s3mountに使うfuseが最新版からソースコードで入れる必要があり、バージョン固定のphpのパッケージが18個くらいとかありまして 一つ一つpackageリソース書くのが面倒だったこともありましてscriptつかいました。 scriptつかうときはnot_if忘れるとmakeとか何回も実行されて困るので注意が必要です。 あとcd書き忘れると展開場所が認識してるとこに出ないのでその後の手順でファイルが存在しないエラーがでました。 ・httpdのレシピを書く 設定ファイルの準備をする [shell]# mkdir -p /root/chef-repo/site-cookbooks/httpd/files/default/rpms # tar cf /root/chef-repo/site-cookbooks/httpd/files/default/rpms/web-rpm.tar ./web-rpm/ # tar tf /root/chef-repo/site-cookbooks/httpd/files/default/rpms/web-rpm.tar ./web-rpm/ # cd /root/chef-repo/site-cookbooks/httpd/recipes # mkdir -p /root/chef-repo/site-cookbooks/httpd/files/default/etc/httpd/{conf,conf.d} # cp -p /opt/src/config/web/httpd.conf /root/chef-repo/site-cookbooks/httpd/files/default/etc/httpd/conf/ # vi /root/chef-repo/site-cookbooks/httpd/files/default/etc/httpd/conf/httpd.conf # mkdir -p /root/chef-repo/site-cookbooks/httpd/files/default/etc/php.d # cp -p /opt/src/config/php/php.ini /root/chef-repo/site-cookbooks/httpd/files/default/etc/ # cd /root/chef-repo/site-cookbooks/httpd/files/default/rpms # wget http://rpms.
    ...
  • MysqlのHAとトラブル事例

    久しぶりの更新になります。プラットフォームの宮下です。 先日開催されました、July Tech Festa2013というイベントの中の1コマで何と私が発表をさせて頂きました。 その時使用した資料をアップしますので興味のある方は是非一読下さい。 [slideshare id=24320385&doc=mysqlha-130716215401-phpapp02] mysqlのHA構成のデザインパターン紹介を経験談を交えて話させて頂きました。 とても緊張してしまって肝心のトラブル事例がお話出来ませんでした。このブログでは、包み隠さずトラブルのレポートが出来ればと思います。 今回のテーマは、小宮先生のレポートを多分に活用させて頂いています。 次回こそは、私の成果を発表したいもんです。 それではまた近いうちに更新します。
    ...
  • Chefで既存手順のレシピを書く2(ユーザ作成)

    こんにちは。プラットフォームの小宮です。 前回に引き続きChefの記事で失礼します。 data_bagsでユーザ管理の用意をします。 一応、以前にこちらに書いてるのですが、関連情報がまとまってるほうがいいと思うので部分的に再掲します。 data_bagsとはldapのような機能をもったデータ検索など管理ができるもの。 chef-server使う場合はサーバと通信してデータ取ってきて反映することが可能。 今回はChef-soloなので、ローカルのファイルにデータを用意して反映させる方法をとります。 参考: もしユーザ数が多くて頻繁にアカウントが追加変更される場合、以下リンクのようにdata_bagsで有効無効も管理するのもよさそうです。 chef-data-bag活用法 [shell]# cd ;cd chef-repo/data_bags # mkdir users;cd users # vi xxx-op.json // xxx-op.json { “id” : “xxx-op”, “groups”: [ “xxx-op”,“wheel” ], “uid”: 1000, “username” : “xxx-op”, “home” : “/home/xxx-op”, “shell” : “/bin/bash”, “password” : “$1$Ka.Mw69U$TT5HRfSe7xxxxx” } # vi yyy-op.json // yyy-op.
    ...
  • Chef-Soloでレシピを書く前の環境について(Vagrantfile,role,node,data_bags)

    こんにちは。小宮です。 いつのまにか今年の前半が終了しました。宇治金時がおいしい季節になってしまったようです。 それはともかく前回の続きです。 今回はChef-Soloのレシピを書く前の環境の定義などまでを書きます。 Chef用語などは軽く解説してる、今日から使い始めるChefを見ていただくか定番の入門Chef Soloを見ていただくのが早いんではないかと思います。 Automated infrastructure is on the menuも英語ですがわかりやすいです。 やりたいこととしては以下のとおりです。 Vagrantfileを書いて仮想インスタンスをたてる chefレポジトリを作る chefクックブックを作る nodeを定義する roleを定義する data_bagsを定義する ★今回はここまで★ レシピを書く レシピをノードに適用する serverspecテストを書く テストを実環境に実行する テストの構成: chef-solo元のadmserver:10.0.0.93 knife-solo適用クライアントwebserver:10.0.0.240 knife-solo適用クライアントdbserver:10.0.0.241 全てCentOS5.8です。 ・AWSの環境変数を定義 AWSのVPC上なので適宜定義しておきます [shell]# cd # vi .ec2 export AWS_ACCESS_KEY_ID=****** export AWS_SECRET_ACCESS_KEY=******* export AWS_KEYPAIR_NAME=xxx-key export AWS_PRIVATE_KEY_PATH=/root/.ssh/xxx-key # source .ec2[/shell] ・VagrantFileを書く vagrant initを実行するとVagrantfileができますのでそれを編集し、
    ...
  • Chefで既存手順のレシピを書く1(初期設定)

    こんにちは。プラットフォームの小宮です。 前回はChefでレシピを書く前のroleやdata_bagsなどの環境定義について書きました。 今回は既存手順のレシピ化ということで淡々と地味に書いていきたいと思います。 注意: scriptリソースを使うときはnot_ifまたはonly_ifを必ず書くこと(複数回実行されないように) bash内でcdを書き忘れるとtarの解凍先パスがその後のコマンドの指定と一致しなくなるので注意 scriptリソースを使うとエラーがまともに出ないので自分でコマンドをたたいて状況を確認する必要がある リソースのマニュアルを熟読推奨。 クックブック名とその内容は以下の通り。 base_setting 初期設定など ★今回ご紹介するレシピはこちらのみです。 login-users ログインユーザ作成 httpd web関連設定 mysqld db関連設定 munin 統計グラフ設定 zabbix 監視設定 レシピを書く ・base_settingのレシピを書く 使いまわしやすさを意識した結果細かく分割して書くことにしました。 ☆バックアップディレクトリ作成レシピ [shell]# cd site-cookbooks/base_setting/recipes/ # for i in bkup_dir hosts sysctl disable ntpd ntpdate mail logrotate ;do touch $i.rb ;done # vi bkup_dir.rb directory ‘/etc/.backup/’ do owner ‘root’ group ‘root’ mode ‘0755’ action :create end[/shell]
    ...
  • Chef-SoloとVagrantの導入(VPC環境)

    こんにちは。プラットフォームの小宮です。 最近chef流行ってますね。 せっかくだからこの波に乗ってプロダクト環境に合わせてやってみよう的な記事を書こうかと思います。 さっさとServerspecまでたどり着きたいんですが、今回は導入のみの記事でレシピなどはまた次回以降に。 やってみよう的なレベルなのでリファクタリングし甲斐のあるレシピになる予感がします。 さて今回Chef化を試みる環境はVPC上に移行する話になってます。(構成はweb2、db2、stg1、nat1です。ELB利用。soloで十分な感じ。) Vagrant-awsでVPCつかう方法が可能なようなので、Vagrantを使用して構成管理を行いつつKnife-soloも使うことにします。 vagrantとsahara連携でOSの状態を保存してロールバックということが可能となります。 knife-soloだと/sbin等の下のrubyを消して入れ替えようとしてしまうことがあるらしいので、アプリケーションにおいてrubyを使用しないことを確認しておきます。 vagrantを入れるのでruby1.8.7より上のバージョンをrbenvで入れます。 (CentOS5系の場合。6系や他のディストリビューションでは別途ruby -vで確認してください) 実は、Chef-Clientを/opt/chefの下に入れた段階で以下のようにPATHを通しておけばrubyのバージョンは気にしなくてもよいかもしれません。 [shell]# curl -L https://www.opscode.com/chef/install.sh | bash # export PATH=$PATH:/opt/chef/embedded/bin/ # vi ~/.bashrc PATHをとおしておく[/shell] gemでchefを入れるのは古いやりかたみたいですね。 ・最初にOracleVirtualBoxを導入 入れる理由はVagrant-awsでインスタンスの起動と管理を行うため。 [shell]cat /etc/redhat-release CentOS release 5.8 (Final) yum install libXmu libXt mesa-libGL qt qt-x11 SDL wget http://download.virtualbox.org/virtualbox/4.2.12/VirtualBox-4.2-4.2.12_84980_el5-1.x86_64.rpm rpm -ivh VirtualBox-4.2-4.2.12_84980_el5-1.x86_64.rpm[/shell] ・ruby-1.8.7より新しいバージョンを導入(必要な場合) [shell]yum -y install zlib-devel readline-devel openssl-devel yum install ruby ruby-devel rdoc irb rubygems yum install git –enablerepo=rpmforge[/shell]
    ...