環境
- Amazon Linux AMI 2015.03 (HVM)
- td-agent-2.2.0-0.x86_64
- AWS-SDK(ruby)のv2を利用したfluentdのプラグイン
また、AmazonLinuxではS3へアクセスできるIAMロールの権限を付与してる。
問題
AWS-SDK(ruby)のv2を利用したfluentdのプラグイン
を利用したら以下のようなcertificate verify failedエラーが発生しました。
before_shutdown failed error="SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed"
調査
- [Ruby] open-uri の HTTPS リクエストで certificate verify failed
- エラー:OpenSSL::SSL::SSLError SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed
どうやらrubyで使うSSL証明書の所でエラーのようです。。。
証明書が存在しない場合もあるようなので、確認してみます。
$/opt/td-agent/embedded/bin/ruby -ropenssl -e 'puts OpenSSL::X509::DEFAULT_CERT_FILE'
/opt/td-agent/embedded/ssl/cert.pem
$ll /opt/td-agent/embedded/ssl/cert.pem
lrwxrwxrwx 1 root root 43 5月 29 13:00 /opt/td-agent/embedded/ssl/cert.pem -> /opt/td-agent/embedded/ssl/certs/cacert.pem
問題なく、存在するようです。。
うーん、ということで確認のために以下のプログラムを作って確認します。(もし、IAMロールの設定をしていない場合、credential情報も付与すること)
require 'aws-sdk'
require 'pp'
s3 = Aws::S3::Client.new(region: 'ap-northeast-1')
resp = s3.list_objects(
bucket: 'toshihirock-elb-test',
prefix: 'AWSLogs/1111111/elasticloadbalancing/ap-northeast-1/2015/05/29/'
)
pp resp
このプログラムをAmazonLinuxでデフォルトでインストールされているrubyとflunetdで使っているrubyで実行。(事前にrubyのaws-sdkはインストール済み)
$ruby s3.rb
# ok
$/opt/td-agent/embedded/bin/ruby s3.rb
# error
ということでtd-agentのrubyを使うときに発生するようです。AmazonLinuxで使われているrubyの方は問題ないようなので、こちらのSSL証明書をコピーします。
$ruby -ropenssl -e 'puts OpenSSL::X509::DEFAULT_CERT_FILE'
/etc/pki/tls/cert.pem
$cp /opt/td-agent/embedded/ssl/cert.pem /opt/td-agent/embedded/ssl/cert.pem.original
$cp /etc/pki/tls/cert.pem /opt/td-agent/embedded/ssl/cert.pem
この状態で先ほどのS3取得処理を実行。
$/opt/td-agent/embedded/bin/ruby s3.rb
# ok
問題解決しました!
このあと
自己解決したあとまさにドンピシャなブログを発見しました。先に見つけれていれば。。。
EC2上のログをtd-agent使ってCloudWatch Logsに投げようとしたらSSL認証エラーになった話
上記にも記載してありましたが、本問題はrubyのaws-sdk-v1では起きてなかったので、対象はaws-sdk-v2を使っているfluentdで発生すると思われます。