年中アイス

いろいろつらつら

CloudWatch LogsからKinesis Firehoseに送る時にはまったエラー

ECSコンテナのログをCloudWatch Logsに出力しており、そこからS3に保存しようとした時に、Kinesis Firehoseを使って行える例があったので試してみました。その時にしょうもないミスではまったのでメモです。

この例をもとに試していましたが、Firehose --(delivery stream)-> S3へ転送の設定が終わった後に、12のCloudWatchLogsのSubscription filterを使って、Firehoseへ流す設定を追加しようとしたら以下のエラーが出ました。

An error occurred (InvalidParameterException) when calling the PutSubscriptionFilter operation:
Could not deliver test message to specified Firehose stream.
Check if the given Firehose stream is in ACTIVE state.

そのまま読むと、「テストメッセージの転送に失敗しました。Firehose streamがアクティブになっているか確認してください」です。しかし、streamはすでにActiveステータスになっており、Firehoseにあるテストメッセージの送信を行うと、ちゃんとS3にテストデータが出力されていました。*1

状況的にはSubscription filter設定の何かが悪い、おそらく権限なのでIAMだろうと考えました。そしてよくみていくと、 10. Create a permissions policy to ...で設定するIAM Policyでregionを書き換えるところがap-northeast1(-忘れ)になっており、それを修正したら無事動作しました。

しょうもないミスなんですが、このエラーメッセージからは読み取りにくかったです。streamがActiveじゃないのが結構あるエラーなのか、確認してみてねがミスリードを誘うことに。

参考

*1:Firehose側はAWSコンソールでテストデータの送信ができます。バッファリングがデフォルトで5分なので、すぐ出てこない点に注意が必要です。

RDSの証明書を更新したら、Lambda(node.js)から接続できなくなった

2020/02/05までに、RDS系の証明書を2015から2019に更新するようにアナウンスが出ています。*1

そんな中、RDSの証明書更新してから、Lambda(node.js)から接続できなくなったと相談を受けました。確実にクライアント側の証明書を更新してないからと思いましたが、探しても探してもどこにも証明書ファイルがありません。

最終的に、mysql2というライブラリに入っていました。意識せずに使えると、こういう時どこにあるか全然わからないですね。特に今回全然知らないLambda(node.js)だったのでなおのこと。*2

Lambda自体のコードは、sequelizeというライブラリを使っており、ssl: truessl: 'Amazon RDS'とあるのみでした。sequelizeのgithubで検索しても出てきません。しばらく唸ったのち、前述のmysql2を呼んでいたので、検索したら該当のコミットが出てきました。

ここにあるように、IAM認証を使っていて、あまり意識せずに暗号化通信になっていたようで、証明書の更新で影響が出ることに気づけていなかったようです。

2019証明書は2024年期限だそうなので、5年経つ前に同じような更新が必要そうです。このLambdaが5年後も生きていれば・・・。

参考

*1:使ってなければ3/5まででも可能とかあるので、正確な内容はアナウンス内容をご確認ください。

*2:slack POSTの記事はnode.jsですが当時はGoなかったので、手探りで書いてました。

Python3.8+ansible2.8.6は動かなかった

Python2系がほぼ年内*1で終わってしまうので、そろそろPythonのバージョンと、ansibleのバージョンを上げようと、pyenv+venvで別環境作って試してみてました。とりあえず最新にしてみようと、Python3.8とansible 2.8.6を入れて、playbook実行してみたら、以下のエラー。

ERROR! Unexpected Exception, this is probably a bug: cannot pickle '_io.TextIOWrapper' object
the full traceback was:
〜あとスタックトレース〜

これはバグの可能性があります・・・!?同じようなエラー出た人もいて、Python3.8で7日前(エントリ書いた時点)

調べると、Python3.8自体が今月10/14に出たばっかりだそうで、単に新しいPythonバージョンだから、ansibleがまだ対応してないだけっぽいです。一個バージョン下げてPython3.7.4にしたら動きました。

*1:2020/01/01までで、年内スパッとではなく、タイムゾーンの関係なのかな?