環境構築中にハマったこと

直近でサーバをセットアップしていてはまったネタを幾つか。
なお、両方ともテスト環境では動作していたので、調査に色々と手間取りました。
両方とも、原因は再構築時に色々バージョンが上がっていたことですが、その問題にぶち当たりそうな人がしばらくでそうなのでメモ代わりに。

fluentdのS3-pluginが動作しない。

IAMの権限や各種キー、endpoint指定は正しいが*1 td-agentサービスを立ち上げてS3に保存しようとするタイミングでエラーになる。

色々探してみると、既存の設定ファイルで指定していた s3_endpointが非推奨*2になっており、s3_regionを指定する仕様に変わっていた模様。

古いサンプルだと、s3_endpoint指定の設定ファイルになっているので、既存の仕様にあった設定を行っているかのチェックが必要。

HttpProxyを経由したaws-cliが動かない。

ネットワーク運用のプラクティスから、Proxyを経由してアクセスするようにサーバーを立てる。
その中からAWSのリソースにアクセスするためにHttpProxyを経由して、以下のコマンドを実行してみたがSSLErrorになる。

aws s3 ls

> raise SSLError(e)
> SSLError: hostname '*******' doesn't match either of 's3-[region].amazonaws.com', ...


もちろん、アクセス権限のあるキーはaws configure済み。
調べてみると、同じ現象と思われるIssueが報告されていた。Python2.6なら動くことも同じ。

https://github.com/aws/aws-cli/issues/864

Proxyの設定とか色々と疑ってみましたが、こちらの原因は、Pythonのhttplib.py*3Issue7776の対応が マージされて、botocoreの内部で使ってる urllib3/connection.py 内 self._tunnel() の呼び出しで、コメントに書いてある set_hostport が実行されなくなったことで予期した動作が変更されていることでした。

urllib3のリポジトリ見る限り該当箇所は多分修正されているので、対策としては2つです。

  • PythonのIssue7776対応前のバージョン(2.7.6以前)を使う
  • botocoreのvendoredに入っているurllib3を更新する

一応、両方試しましたが、両方とも動きました。

これにハマる(ハマった)ユースケースとして、

  • Amazon Linuxでバージョン指定なしにPython27をyumで入れる(2.7.8が入る)
  • インストールしたpython2.7.8でaws-cliを起動する

という、まああり得るかもしれない状態だったので、備忘録として残しておきます。

新しめのPythonでProxy+aws-cliを使ったシステムを構築しようとしている人*4は気をつけてください。

追記 (2015/07/13)

上記の問題については、下記のbotocoreのアップデートでurllib3が更新されたので最新版*5のbotocoreを入れてさえいれば問題は発生しなくなりました。

https://github.com/boto/botocore/commit/0ed96b7a96202b5d6c99ef9c95397395ed30e697

*1:同様の内容でawscliを利用して確認

*2:2014/12/08時点でGithubのmasterブランチから削除されていたので、非推奨というか設定方法が変更になる模様

*3:Python3系だとhttp.client.py

*4:少ない気もする...

*5:細かく言えば、botocoreの0.87以上のようですが、今日では1.1がリリースされているので、最新を入れれば問題ないはずです