RDSのログをLambda(python3.6)経由でS3に保存する
目的はRDS Auroraのaudit.logをS3に保存するため。 audit.logについてはこちら。
どうせならLambdaでやりたくて、誰か作ってないかなと探したらありました。
ただちょっと物足りなくて、具体的には
- 初回実行時はフラグを変えなきゃいけない
- 設定値を直接スクリプトに埋め込むのもうーん
- ログが更新されていたら1から全取得してアップし直すのもちょっと。。
という点をどうにかしたいなーと。
特に全取得->アップというのがちょっとよろしくなくて、Auroraのaudit.logは現状100M毎のローテーションになるのでそれを毎回取得していたら結構重いなと。
ついでにS3にアップされたらそれをトリガーにさらに何かしらの処理をする、ということもやりたかったということもあります。
というわけでryanhollanさんのを参考にしつつ作り直してみました。
変更点はこちら。
- 設定値は環境変数で設定
- ログがS3に保存されていなかったら勝手に1から取得してくれる
- 前回取得時からの増分を取得、S3に保存
- ログファイルの圧縮に対応
- ついでにpython3.6で動作
ただ、初回実行時はサイズが大きいログやログの数が多いとLambdaの実行時間である3分で終わらない可能性があります。
その場合はLambda以外の環境で実行する必要があります。Lambda以外でもboto3入れてIAMの権限あればそのまま動くようにはなってます。
あと、audit.logだけじゃなくてerror.logやslow_query.logも取得できます(RDSのパラメータでlog_outputをFILEにする必要がありますが)
次は保存されたファイルを元にETL処理するとこまでやる予定。
Ansibleのelasticsearch_pluginモジュールをElasticSearch5系で使う
Ansible2.0からモジュールが提供されている http://docs.ansible.com/ansible/elasticsearch_plugin_module.html
が、ElasticSearch5系だと動かない。。
TASK [elasticsearch : install elasticsearch plugin] **************************** failed: [test] (item=analysis-kuromoji) => {"failed": true, "item": "analysis-kuromoji", "msg": "A tool for managing installed elasticsearch plugins\n\nCommands\n--------\nlist - Lists installed elasticsearch plugins\ninstall - Install a plugin\nremove - Removes a plugin from elasticsearch\n\nNon-option arguments:\ncommand \n\nOption Description \n------ ----------- \n-h, --help show help \n-s, --silent show minimal output\n-v, --verbose show verbose output\nERROR: timeout is not a recognized option\n"}
timeoutオプションがないとのこと。
無効化するオプションもないけど、ソースを見てみるとtimeoutを定義してなければオプションがつかないみたい。
というわけでtimeoutをnullに設定すればいける。
- name: install elasticsearch plugin elasticsearch_plugin: plugin_bin: /usr/share/elasticsearch/bin/elasticsearch-plugin timeout: null name: analysis-kuromoji state: present
Bitbucket PipelinesでAmazonECRのDockerImageを使う
PipelinesではデフォルトではDockerHubを利用するのですが、別のレジストリサービスを使うこともできます。 というわけでECRに置いたイメージを使ってみました。
bitbucket-pipelines.ymlの設定
imageの設定を以下のようにします。
image: name: xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/sample-containert:latest username: AWS password: $ECR_PASSWORD email: none
※nameは自分のコンテナのURL
ECRのパスワードを取得
ローカルでecr get-loginを実行します。
$ aws ecr get-login docker login -u AWS -p xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -e none https://xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com
こんな感じでずらーっと出てきますので、これの-pの引数がパスワードになるので、この値を控えます。
pipelinesの環境変数を設定
リポジトリの「設定」->「Environment variables」からpipelinesで利用する環境変数の設定ができます。 変数名を「ECR_PASSWORD」、値を控えたパスワードにします。ついでにSecuredにチェックを入れておくのが推奨です。
これでpipelinesを走らせればECRのイメージを使えます。
参考
ChatOpsとTerraformについて発表しました
それぞれの資料はこちら
両方ともこれから始める人むけの資料です。
ChatOpsもTerraformも、うまく使いこなせれば生産性や効率が格段に上がります。
それなのになかなか導入しているところが少ないのは、やっぱり会社の文化や業務の適不適はあるのかなーと気がしますが、そしてそこを押し通すのはすごい努力がいりますが、それ以外の「なんか怖い」「難しそう」などなど技術的な障壁がある人に本資料が役立てれば、嬉しいなーと思います。
とはいえ自分もまだまだ完璧に使いこなせているかといえばそうでもないので、日々勉強中です。
また知見が溜まったらどこかで発表したいですね。
CircleCIでAndroidのビルドが失敗する
いつも通りにビルドしたら以下のメッセージがでた。
Could not find com.android.support:appcompat-v7:22.2.1.
Androidのsupportライブラリがみつからないとか。
対処
明示的にライブラリをアップデートするように指定
- 変更前
dependencies: override: - echo y | android update sdk --no-ui --all --filter "android-22,build-tools-21.1.2"
- 変更後
dependencies: override: - echo y | android update sdk --no-ui --all --filter "android-22,build-tools-21.1.2,extra-android-m2repository,extra-android-support"