fluentdのプラグインでcertificate verify failedエラーが発生した話

  • 2
    Like
  • 0
    Comment
More than 1 year has passed since last update.

環境

  • 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で使う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情報も付与すること)

s3.rb
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で発生すると思われます。