gzで圧縮されたファイルの管理

apacheのログを圧縮してローテーションする設定にしている。
ローテーションされるとgzで圧縮される。
普段自身で圧縮する際はtgzが多いので、gzで圧縮されたファイルの解凍にいつも迷う。


gunzipコマンドを使用する。

# gunzip access_log-20180107.gz

これで解凍すると圧縮ファイルの方は残らない。
まさに解凍されて無くなっちゃう感じだろうか。

# gzip -d access_log-20180114.gz

こちらでも解凍可。やはり圧縮ファイルの方は残らない。


圧縮ファイルを残す版。
標準出力に出したものをファイルに書き込む。

# gunzip -c access_log-20180121.gz > access_log-20180121

これやると、圧縮ファイル側と所有者が変わる可能性があるので気をつける。
当たり前だが、解凍実行ユーザの持ち物として解凍されたファイルが作られる。

-rw-r--r-- 1 root    root     42763572  222 12:19 2018 access_log-20180121
-rw-r--r-- 1 neko neko   2266585  24 04:00 2018 access_log-20180121.gz


gunzip, gzip -dで解凍したものは、圧縮ファイルの日時所有者が保持された。

-rw-r--r-- 1 neko neko  63238638  24 04:00 2018 access_log-20180114

aws ec2コマンドでquery内の`でエラーが出た時のメモ

aws ec2コマンドを使用してシェルスクリプトからインスタンスの情報を取ったり、スナップショット取ったりを試していた。
その中で、queryオプションを使うと結果表示を絞れることに気付き(今更!)試していたのだが、バッククォートで躓いた。

この時はインスタンス自身から自分のタグNameに設定されている値を取ろうとしていた。

RET=`aws ec2 describe-instances --instance-ids ${MY_INSTANCE_ID} --query 'Reservations[].Instances[].Tags[?Key==`Name`].Value'`

これ、実行すると下記のようなエラー出ます。

./test.sh: command substitution: line 88: unexpected EOF while looking for matching `''
./test.sh: command substitution: line 89: syntax error: unexpected end of file
./test.sh: command substitution: line 88: unexpected EOF while looking for matching `''
./test.sh: command substitution: line 89: syntax error: unexpected end of file

そこで、\でエスケープしてみた。

RET=`aws ec2 describe-instances --instance-ids ${MY_INSTANCE_ID} --query 'Reservations[].Instances[].Tags[?Key==\`Name\`].Value'`

結果は同じくエラーです。
深く考えず、\が足りないのかと思って複数並べてみたりしましたがエラーです!

で、最終的に下記で対応できました。

NAME=$(aws ec2 describe-instances --instance-ids ${MY_INSTANCE_ID} --query 'Reservations[].Instances[].Tags[?Key==`Name`].Value')

$()の存在を忘れていました。

無事解決。


今回のお悩みポイント。

  • 最初、Nameはシングルクォートで囲まれているものだと思っていてaws側でエラー
  • よく見たら`だったが、今回のように2重になってエラー
  • エスケープ方法を調べようにもgoogle検索に"`"とか入れても検索条件に使われない
  • `の名前をネットで調べる("記号 読み方"で検索)→バッククォート!!

その後検索してもそのままの情報のサイトは見つからなかった。
bash関係のサイトを見ていた時に``と$()の違いを載せている方がいて、そっちがあったーーー!!となりました。

この件解決するまでに時間結構掛かっている…。
`で悩みすぎていたら、スクリプト内の変なところに意図せず挿入されていて更にエラーが出て悩んだっていうのもあるからね…。
老化を感じる…。

MacにModern.IEを使ってWindowsテスト環境を作るメモ

未だにWindows XPのテスト環境が必要になることがある。
会社のPCがWindows 7だったのだけれども、開発やメンテナンスの効率化を図るためMacにかわった。
そこで新たにMacVirtualBoxを入れてIE6 + XPやらIE8 + 7の環境を用意することになった。


Windowsからイメージをコピーでも良かったのかもしれないが、心機一転Mac用のイメージをModern.IEのサイトからダウンロードすることにした。


XPはダウンロードするファイルが1つだけなのでWindowsでも楽だったが、7では4ファイルぐらいある。
私も何度かダウンロードをしたが、ブラウザを使ってダウンロードすると重いし遅いし手間だった。
Windowsからダウンロードする際は、FreeDownloadManagerだったか、ダウンロードツールの使用を勧めるメッセージが出ていた。
試しにそのダウンロードツールをインストールしてみたがtorrentの機能もあったりして、自分も配信側に回ることもあって詳しくない自分としてはちょっと怖いものでもあった。


それがMacの場合はcurlコマンドが使える。
ダウンロード画面にcurlのコマンドを出してくれるのでコマンドをターミナルにコピペすればもう4ファイルのダウンロードが仕掛けられちゃう!!
まだ使い始めて間もないが、Mac素晴らしいと思った1つです。


さて、前置きが長かったが、今日メモしておきたいことは、XPのイメージで日本語表示する方法だ。
ダウンロードしたイメージを起動して、ブラウザから日本語サイトを見に行くと分かるのだが、日本語の部分は全部□になってしまうのだ。


前はホストもWindowsだったので自マシンのフォントファイルをUSBメモリに入れたり、ネット上にあげたりして、フォントをVMにインストールしていた。


だが今はホストがMacだ。
フォントの形式が一緒なのかどうかも私は知らない。


ふと思い出したのが7のイメージだ。
7のIE8で日本語サイトを開くと、問題なく日本語が表示されるのだ。


なので今回は7からフォントをMacにコピーして、それをXPにコピーすることにした。

ホストを通じてフォントをコピーする方法

  • Windows 7のイメージを起動する。
  • Windows 7でc:\Windows\Fontsを開く。
  • ホスト側マシンでMachine > Settingsを開く。
  • 'Shared Folders'を開いて'Folders List'にMac上の共有したいフォルダを指定する。

  • Windows側からアクセスするためには、エクスプローラでパス'\\vboxsvr'にアクセスする。
  • これで先ほど設定したフォルダが表示される。
  • この共有したフォルダを開き、7上からmsgothic.ttcと念のためmsmincho.ttcをコピーする。(MS ゴシックMS Pゴシック、MS UI ゴシックは7のFonts内では別々に見えるが、ファイルは1つらしい。なので、MS ゴシックMS 明朝の2つをMac上にコピーすれば良い。)
  • 同じ手順でXPを起動して、Shared Folders設定をして、MacからフォントファイルをVM上にコピーする。
  • XP上でc:\Windows\Fontsにフォントをドラッグ&ドロップしてインストールする。

これでIEの画面内では日本語表示が可能になる。
たしか、タイトルバーはまだ化けていた気がする。
タイトルバーも日本語を表示させる方法はまだ見つかっていない。

ど素人のchef体験記 2

CentOSよりも新しいバージョンのRubyが入っているUbuntuでやった方が「knife ec2コマンドとかも使えて便利かも」と思い、VirtualBox版のUbuntuをダウンロードして環境構築をしてみた。
注:knife ec2コマンドはまだインストールもしていないので、本当に使えるかは不明


Chefとは関係ないが、Ubuntuの使い方でかなり悩んだ。
コマンドが慣れない(aptは初めてなので)のはもちろんだが、デスクトップの使い方で悩んだ(笑)
Terminalをどこから起動するのか悩んだし、それを左のバーに登録する方法も検索したわよ。
Terminalをバーに登録後は特に問題なし。
初期状態でバーにオフィスアプリがあふれているのは、さすがデスクトップOSって感じがした。

今回の環境

ホストOSはWindows 7
VirtualBoxUbuntu 12.04 LTS 32bit
 chef(11.8.0)、knife-solo(0.4.0)をgemでインストール
VirtualBoxCentOS 6 64bit


VirtualBoxLinuxにはネットワークアダプタを2つ用意し、両方とも1個目はNAT、2個目はホストオンリーアダプターを使用。
最初は両方ともブリッジアダプターで起動していたのを、上記のネットワーク設定に変更した。
ここもはまったよ…。
Ubuntuは問題なしだったが、CentOSでネットワークが全く利かなくなった。
またも検索して、下記のページを参考に対処した。
http://geocities.yahoo.co.jp/gl/ds301b/view/20110928/1317221758
MACアドレスの確認は、下記ページを参考にdmesgコマンドで確認した。
http://itpro.nikkeibp.co.jp/article/COLUMN/20060228/231116/

やったこと

Ubuntuに前回と同じwordpress用のcookbookを集め、CentOSに対してknife soloでwordpressが動作する環境を構築。

はまったこと

Ubuntuにknife-soloをインストール、cookbookを集める、までは良かったのだが、$ knife solo cook centos を実行するとcookbookのパスを/var/chefと認識していてうまく行かない。
実際には~/chef-repo/cookbooksにあるのに。
この時、~/.chef/knife.rbにcookbook_list ["/home/yutanpo/chef-repo/cookbooks"]を追記してみたがエラー変わらず。
むしろ、エラーが出た。
array to stringでなんちゃらかんちゃらと出た。(エラーの詳細残してなくてごめんなさい)


この時、実行は自分のホームディレクトリで作業していた。
ネット検索より、/etc/chef/knife.rbを作成してみたりしたが、無駄。
結果、knife solo cookは~/chef-repoの中で実行しなくてはならなかったのだ!
(このchef-repoディレクトリは、$ knife solo init chef-repo コマンドで作成したものです。)


よく見たらchef-repoの中に.chef/knife.rbがあったよ。
~/chef-repo/以下で実行すると、その中の.chef/knife.rbを見て、~/chef-repo/cookbooksをちゃんと参照してくれるんだね!


まったく、こんな単純なことでハマるなんて……。


あと、$ knife solo prepare root@centos をするときも~/chef-repoの下でやること。
prepareした場所にnode/centos.jsonが作られるからね。
今回は~/nodeに出来てしまっていた&編集済みのjsonファイルを~/chef-repo/node/以下に移動して実行したよ。


その後、jsonファイルへのmysql設定を忘れてまた1度失敗したけれど、無事CentOS上にwordpressがインストールされた。


jsonファイルの書き方は前回とちょっと変えた。
こっちの方が普通の書き方だと思う。

{
  "mysql": {
    "server_root_password": "zzzzzzzzz",
    "server_repl_password": "xxxxxxxxx",
    "server_debian_password": "yyyyyyyy"
  },
  "run_list": [
    "recipe[wordpress::default]"
  ]
}

ど素人のchef体験記 1

Linuxをコンソールから扱うのに不自由はないけれど、chefは「何それ?」状態な私。
とりあえず、やったことをまとめることにする。

覚書しとかないと本当混乱しちゃって覚えられなさそう。
未だにクックブックとかレシピとか、その辺の用語が覚えられていないし…。

続編があると見込んで、タイトルに"1"って付けておく。

参考図書

伊藤直也さんの「入門Chef Solo」をKindle版で購入して読んでいます。

検証環境

使用マシンはWindows 7
その上でVirtualBoxを動かしてCentOS 6を起動。
knife soloでリモート環境が必要な時はAmazon EC2インスタンス(CentOS6)立てて使用。

やったこと

参考図書を読みながらコマンドを実際に打って動作確認。
Vagrantに関する所は、OSが入れ子になって行くためマシン(Windows 7)のメモリ等が足りなくなりそうなので読んだだけ。
knife soloのところまでは読んだ。
本とは別に、起動済みのEC2インスタンスにknife soloでとりあえずwordpressを動かすというのも試した。

はまったところ

参考図書で「#3 nginxをChef Solo で立ち上げたい」の通りにやっていたらエラー発生。
理由は、CentOSリポジトリではnginxをサポートしていなかったから。
最初はエラー画面をよく見ないで(VirtualBoxで起動したコンソール上でやっていたため、more等で大量に出るメッセージをちゃんと読んでなかったから)、どこか手入力した設定ファイルが間違っているんだと思っていた。
何度か実行して、| more でしみじみと画面を眺めたら、yumでそんなパッケージないみたいなエラーが出ていたと思う。

解決には、nginxのサイトに行き、CentOS用のyum用設定を行う。
http://nginx.org/en/linux_packages.html#stable

  • knife-soloコマンドが有効にならない

参考図書の「#5 リモートから chef-solo を実行する ― knife-solo」で、knife-soloのインストールでこんがらかった。
とりあえずgem install knife-soloで入れたが、knife solo --helpで結果が帰らず、次に0.3.0をインストールする方法を試したがbundlerがなんちゃらというエラーが出たと思う。
rubygemsとか詳しくないので、初めてのことにハテナ。

何度も実行して、画面メッセージの通りにgem cleanup knife-soloを実行したところ、初めて2バージョンインストールされていたことに気付いた。
その後もknife soloが使えなかったので、ネットを探した。

すると、chefのバージョンが新しいとknife-soloが動かないという情報あり。
ここが参考になった。
http://qa.atmarkit.co.jp/q/3107

で、結局chefを11.4.4に落とし、knife-soloは0.4.0という組み合わせで無事動いた。

この時、gem uninstall chefとgem uninstall knife-soloして、入れ直した。
バージョン指定でのインストールは-vオプションで可能。

knife soloを使ってEC2上にwordpress(セキュリティ無視)

chefを使って簡単にサーバの設定を経験する、という意図で実施。
公開されているクックブックを利用してとりあえず起動させてみようと言うレベルでやってみた。

クックブックはここからダウンロードした。
https://github.com/opscode-cookbooks

とりあえずwordpressをダウンロードして実行。
apache2が見つからないと怒られた。

先ほどのサイトでapache2をダウンロードして設置、実行。
また足りないと怒られた。

で、結局以下のクックブックを設置したところ、ちょっと先に進んだ。
apache2 build-essential mysql openssl php wordpress xml

今度はmysqlの設定が足りない、とのこと。
githubのページを見に行くと、jsonファイルへの記述方法が載っていた。

wordpressを実行するためのjsonは、下記になる。

{"run_list":[
        "recipe[wordpress::default]"
]}

そこへmysql用の下記の記述をどう追記したものか、悩んだ。

{
  "mysql": {
    "server_root_password": "iloverandompasswordsbutthiswilldo",
    "server_repl_password": "iloverandompasswordsbutthiswilldo",
    "server_debian_password": "iloverandompasswordsbutthiswilldo"
  },
  "run_list":["recipe[mysql::server]"]
}

単純に追記したらjsonファイルがおかしいみたいなエラーが出た。
mysqlwordpressからincludeされて実行されているから、jsonでrun_listの記述がなくて良いと思ったから、どう書いて良いのか悩んだ。
だが、chefはインストール済みだったらだったで対処してくれるようにできていることを思い出した。
だから、結果、下記のように記述して無事実行できるようになった。

{
  "mysql": {
    "server_root_password": "iloverandompasswordsbutthiswilldo",
    "server_repl_password": "iloverandompasswordsbutthiswilldo",
    "server_debian_password": "iloverandompasswordsbutthiswilldo"
  },
  "run_list":["recipe[mysql::server]"],
  "run_list":["recipe[wordpress::default]"]
}

これでwordpressが起動し、管理画面に入れるようになった。

このjsonファイルの編集のところ、夢にも出て来たよ。
","が足りなくてエラーになったりもしたんだけれども、jsonファイルについても知識が足りずになかなか解決しなかった。
夢の中で『jsonファイルの形式を思い出したら","で区切るのが普通だから、そりゃあ","必要だろうよ』という結論に至り、納得した。
寝ている時に頭の中のデータを整理するって本当なんだね。

別サーバから持ってきたmysqlが起動しない

別のサーバで起動していたmysqlディレクトリごと固めて持ってきたものが起動しない。

関係しているサーバは3台。

サーバA:RHEL6 x64 mysql5.1
サーバB:RHEL6 x64 mysql5.1
サーバC:CentOS6 x64 mysql5.1

mysqlの細かいバージョンはCentOSだけ異なる。

サーバAで作ったホットバックアップをサーバBで起動
その後不要データを削除して、ホットバックアップ作成
サーバCでそれを起動・・・で、起動できない

結果だけ書いておくと、SELinuxのせいだった。

以下、確認したこと。

# service mysqld start
MySQL Daemon failed to start.
mysqld を起動中:                                           [失敗]

この時、/var/log/mysqld.logにログなし。
/var/lib/mysql以下にホスト名.errファイルなし。

別方法で起動を試す。

# /etc/init.d/mysqld start
MySQL Daemon failed to start.
mysqld を起動中:                                           [失敗]

またもエラーログなし。

別方法。

# bash -x /etc/init.d/mysqld start
+ . /etc/rc.d/init.d/functions
++ TEXTDOMAIN=initscripts
()
+ return 0
+ touch /var/lock/subsys/mysqld
+ return 0
+ exit 0

無事起動した。
ログを確認すると、サーバA, Bで起動するのと同じ感じ。
エラーは出ていない。
ログインにも成功。

また、以下でも起動に成功した。

# bash /etc/init.d/mysqld start
mysqld を起動中:                                           [  OK  ]
# sh /etc/init.d/mysqld start
mysqld を起動中:                                           [  OK  ]

/etc/init.d/mysqldファイルの先頭をちょっと変更(-x追加)して起動。

#!/bin/sh -x
# /etc/init.d/mysqld start
+ . /etc/rc.d/init.d/functions
++ TEXTDOMAIN=initscripts
()
+ return 1
+ return 1
+ exit 1

起動失敗。

/var/log/messagesを見ても関連するログは出ていなかった。
しばし考えた後、SELinuxが頭をよぎった。

# getenforce
Enforcing

利いている!

/var/log/audit/audit.logを見た。
my.cnfとか関係ありそうなものが出ている。

SELinuxの一時解除を実行。

# setenforce 0
# service mysqld start

起動した…。orz
こんな簡単なことだったとは…。

やはり、新しい環境になった時にはSELinux注意しないとハマる。

/etc/init.d/mysqldファイルを直接いじってしまったので、元に戻しておく。

bash -xから起動して成功した場合の出力と、スクリプト内に-xを追加して失敗した場合の出力を比較(diff -y)したので、貼り付けて置く。


# service mysqld start | # bash -x /etc/init.d/mysqld start
+ . /etc/rc.d/init.d/functions + . /etc/rc.d/init.d/functions
++ TEXTDOMAIN=initscripts ++ TEXTDOMAIN=initscripts
(略)
+ get_mysql_option mysqld datadir /var/lib/mysql + get_mysql_option mysqld datadir /var/lib/mysql
++ /usr/bin/my_print_defaults mysqld ++ /usr/bin/my_print_defaults mysqld
++ sed -n 's/^--datadir=//p' <
++ tail -n 1 ++ tail -n 1
> ++ sed -n 's/^--datadir=//p'
+ result=/var/lib/mysql + result=/var/lib/mysql
+ '[' -z /var/lib/mysql ']' + '[' -z /var/lib/mysql ']'
(略)
+ get_mysql_option mysqld socket /var/lib/mysql/mysql.sock + get_mysql_option mysqld socket /var/lib/mysql/mysql.sock
++ /usr/bin/my_print_defaults mysqld ++ /usr/bin/my_print_defaults mysqld
++ tail -n 1 <
++ sed -n 's/^--socket=//p' ++ sed -n 's/^--socket=//p'
> ++ tail -n 1
+ result=/var/lib/mysql/mysql.sock + result=/var/lib/mysql/mysql.sock
+ '[' -z /var/lib/mysql/mysql.sock ']' + '[' -z /var/lib/mysql/mysql.sock ']'
+ socketfile=/var/lib/mysql/mysql.sock + socketfile=/var/lib/mysql/mysql.sock
+ get_mysql_option mysqld_safe log-error /var/log/mysqld.log + get_mysql_option mysqld_safe log-error /var/log/mysqld.log
++ /usr/bin/my_print_defaults mysqld_safe <
++ sed -n 's/^--log-error=//p' ++ sed -n 's/^--log-error=//p'
++ tail -n 1 ++ tail -n 1
> ++ /usr/bin/my_print_defaults mysqld_safe
+ result=/var/log/mysqld.log + result=/var/log/mysqld.log
+ '[' -z /var/log/mysqld.log ']' + '[' -z /var/log/mysqld.log ']'
(略)
+ chown mysql:mysql /var/lib/mysql + chown mysql:mysql /var/lib/mysql
+ chmod 0755 /var/lib/mysql + chmod 0755 /var/lib/mysql
+ safe_pid=32729 | + safe_pid=401
+ ret=0 + ret=0
+ TIMEOUT=120 + TIMEOUT=120
(略)
+ RESPONSE='/usr/bin/mysqladmin: connect to server at '\''loc + RESPONSE='/usr/bin/mysqladmin: connect to server at '\''loc
error: '\''Can'\''t connect to local MySQL server through soc error: '\''Can'\''t connect to local MySQL server through soc
Check that mysqld is running and that the socket: '\''/var/li Check that mysqld is running and that the socket: '\''/var/li
grep -q 'Access denied for user' <
+ echo '/usr/bin/mysqladmin: connect to server at '\''localho + echo '/usr/bin/mysqladmin: connect to server at '\''localho
error: '\''Can'\''t connect to local MySQL server through soc error: '\''Can'\''t connect to local MySQL server through soc
Check that mysqld is running and that the socket: '\''/var/li Check that mysqld is running and that the socket: '\''/var/li
+ /bin/kill -0 32729 | + grep -q 'Access denied for user'
> + /bin/kill -0 401
+ sleep 1 + sleep 1
+ let TIMEOUT=120-1 + let TIMEOUT=120-1
+ '[' 119 -gt 0 ']' + '[' 119 -gt 0 ']'
++ /usr/bin/mysqladmin --socket=/var/lib/mysql/mysql.sock --u ++ /usr/bin/mysqladmin --socket=/var/lib/mysql/mysql.sock --u
+ RESPONSE='/usr/bin/mysqladmin: connect to server at '\''loc | + RESPONSE='mysqld is alive'
error: '\''Can'\''t connect to local MySQL server through soc <
Check that mysqld is running and that the socket: '\''/var/li <
error: '\''Can'\''t connect to local MySQL server through soc <
Check that mysqld is running and that the socket: '\''/var/li <
+ echo '/usr/bin/mysqladmin: connect to server at '\''localho <
error: '\''Can'\''t connect to local MySQL server through soc <
Check that mysqld is running and that the socket: '\''/var/li <
grep -q 'Access denied for user' <
+ /bin/kill -0 32729 <
+ echo 'MySQL Daemon failed to start.' <
MySQL Daemon failed to start. <
+ ret=1 <
+ break + break
+ '[' 119 -eq 0 ']' + '[' 119 -eq 0 ']'
+ '[' 1 -eq 0 ']' | + '[' 0 -eq 0 ']'
+ action 'mysqld を起動中: ' /bin/false | + action 'mysqld を起動中: ' /bin/true
+ local STRING rc + local STRING rc
+ STRING='mysqld を起動中: ' + STRING='mysqld を起動中: '
+ echo -n 'mysqld を起動中: ' + echo -n 'mysqld を起動中: '
mysqld を起動中: + shift mysqld を起動中: + shift
+ /bin/false | + /bin/true
+ failure 'mysqld を起動中: ' | + success 'mysqld を起動中: '
+ local rc=1 <
+ '[' color '!=' verbose -a -z '' ']' + '[' color '!=' verbose -a -z '' ']'
+ echo_failure | + echo_success
+ '[' color = color ']' + '[' color = color ']'
+ echo -en '\033[60G' + echo -en '\033[60G'
+ +
[+ '[' color = color ']' [+ '[' color = color ']'
+ echo -en '\033[0;31m' | + echo -en '\033[0;32m'
+ echo -n $'\345\244\261\346\225\227' | + echo -n ' OK '
失敗+ '[' color = color ']' | OK + '[' color = color ']'
+ echo -en '\033[0;39m' + echo -en '\033[0;39m'
+ echo -n ']' + echo -n ']'
]+ echo -ne '\r' ]+ echo -ne '\r'
+ return 1 | + return 0
+ '[' -x /bin/plymouth ']' | + return 0
+ /bin/plymouth --details | + rc=0
+ return 1 <
+ rc=1 <
+ echo + echo

+ return 1 | + return 0
+ return 1 | + touch /var/lock/subsys/mysqld
+ exit 1 | + return 0
> + exit 0

ところどころ、出力の順番が異なっているところがある。
そこが原因なんだろうか。

SELinux用に、mysqlディレクトリの設定を追加しておいた。

# restorecon -FRv /var/lib/mysql

AWS RHEL5でyumがエラーを吐きまくり

とあるソフトのインストール中、最初にwgetが足りないとエラーが出た。
yumでインストールしようとしたら、エラーが出て、作業中断。。。解決まで時間が掛かってしまったのでメモ。


# yum list
Loaded plugins: amazon-id, fastestmirror, security
Loading mirror speeds from cached hostfile
Traceback (most recent call last):
File "/usr/bin/yum", line 29, in ?
yummain.user_main(sys.argv[1:], exit_code=True)
File "/usr/share/yum-cli/yummain.py", line 309, in user_main
errcode = main(args)
File "/usr/share/yum-cli/yummain.py", line 178, in main
result, resultmsgs = base.doCommands()
File "/usr/share/yum-cli/cli.py", line 345, in doCommands
self._getTs(needTsRemove)
File "/usr/lib/python2.4/site-packages/yum/depsolve.py", line 101, in _getTs
self._getTsInfo(remove_only)
File "/usr/lib/python2.4/site-packages/yum/depsolve.py", line 112, in _getTsInfo
pkgSack = self.pkgSack
File "/usr/lib/python2.4/site-packages/yum/__init__.py", line 662, in
pkgSack = property(fget=lambda self: self._getSacks(),
File "/usr/lib/python2.4/site-packages/yum/__init__.py", line 502, in _getSacks
self.repos.populateSack(which=repos)
File "/usr/lib/python2.4/site-packages/yum/repos.py", line 260, in populateSack
sack.populate(repo, mdtype, callback, cacheonly)
File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 168, in populate
if self._check_db_version(repo, mydbtype):
File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 226, in _check_db_version
return repo._check_db_version(mdtype)
File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 1233, in _check_db_version
repoXML = self.repoXML
File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 1406, in
repoXML = property(fget=lambda self: self._getRepoXML(),
File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 1398, in _getRepoXML
self._loadRepoXML(text=self)
File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 1388, in _loadRepoXML
return self._groupLoadRepoXML(text, ["primary"])
File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 1372, in _groupLoadRepoXML
if self._commonLoadRepoXML(text):
File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 1208, in _commonLoadRepoXML
result = self._getFileRepoXML(local, text)
File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 989, in _getFileRepoXML
cache=self.http_caching == 'all')
File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 826, in _getFile
http_headers=headers,
File "/usr/lib/python2.4/site-packages/urlgrabber/mirror.py", line 412, in urlgrab
return self._mirror_try(func, url, kw)
File "/usr/lib/python2.4/site-packages/urlgrabber/mirror.py", line 398, in _mirror_try
return func_ref( *(fullurl,), **kwargs )
File "/usr/lib/python2.4/site-packages/urlgrabber/grabber.py", line 936, in urlgrab
return self._retry(opts, retryfunc, url, filename)
File "/usr/lib/python2.4/site-packages/urlgrabber/grabber.py", line 854, in _retry
r = apply(func, (opts,) + args, {})
File "/usr/lib/python2.4/site-packages/urlgrabber/grabber.py", line 922, in retryfunc
fo = URLGrabberFileObject(url, filename, opts)
File "/usr/lib/python2.4/site-packages/urlgrabber/grabber.py", line 1010, in __init__
self._do_open()
File "/usr/lib/python2.4/site-packages/urlgrabber/grabber.py", line 1093, in _do_open
fo, hdr = self._make_request(req, opener)
File "/usr/lib/python2.4/site-packages/urlgrabber/grabber.py", line 1202, in _make_request
fo = opener.open(req)
File "/usr/lib/python2.4/urllib2.py", line 358, in open
response = self._open(req, data)
File "/usr/lib/python2.4/urllib2.py", line 376, in _open
'_open', req)
File "/usr/lib/python2.4/urllib2.py", line 337, in _call_chain
result = func(*args)
File "/usr/lib/python2.4/site-packages/M2Crypto/m2urllib2.py", line 82, in https_open
h.request(req.get_method(), req.get_selector(), req.data, headers)
File "/usr/lib/python2.4/httplib.py", line 810, in request
self._send_request(method, url, body, headers)
File "/usr/lib/python2.4/httplib.py", line 833, in _send_request
self.endheaders()
File "/usr/lib/python2.4/httplib.py", line 804, in endheaders
self._send_output()
File "/usr/lib/python2.4/httplib.py", line 685, in _send_output
self.send(msg)
File "/usr/lib/python2.4/httplib.py", line 652, in send
self.connect()
File "/usr/lib/python2.4/site-packages/M2Crypto/httpslib.py", line 47, in connect
self.sock.connect ( (self.host, self.port) )
File "/usr/lib/python2.4/site-packages/M2Crypto/SSL/Connection.py", line 174, in connect
ret = self.connect_ssl()
File "/usr/lib/python2.4/site-packages/M2Crypto/SSL/Connection.py", line 167, in connect_ssl
return m2.ssl_connect(self.ssl, self._timeout)
M2Crypto.SSL.SSLError: certificate verify failed

# yum clean all

でも解決せず。色々探したところ、AWSのフォーラムに辿り着いた。
https://forums.aws.amazon.com/thread.jspa?threadID=76738
現在のインスタンスは東京リージョンで稼働中なので、ここを参考にした。


For customers in AP-Northeast:
RHEL5: rpm -Uhv http://redhat-clientconfig-ap-northeast-1.s3.amazonaws.com/rh-amazon-rhui-client-2.2.16-1.el5.noarch.rpm

rpmをインストール後、再度clean allを実行したところ、無事、接続できるようになった!


当初の検索時、2009年とか数年前の情報ばかりヒットして、今回の件に当てはまらない解決策ばかりだった。
その後思い立って、1年以内のページで検索し直したところ、唯一ヒットしたページで無事解決した。
検索の仕方も重要だね。