雑記

インフラのことだったりプログラムのことだったりどうでもいいこと書いたり。要は雑記。

homebrewで管理しているパッケージのバージョンを切り替えて固定する

brew upgrade するとパッケージのバージョンがあがる

上がることはいいのですが、言語などはバージョン上がってほしくないのでバージョンを切り替えたい、あるいは固定したいときにやること。

切り替え

過去インストールしたことのあるバージョンでないと切り替えられないので注意

インストールしたことないバージョンにしたい場合は別途作業が必要

  • バージョン確認
% brew info golang
go: stable 1.9.2 (bottled), HEAD
Open source programming language to build simple/reliable/efficient software
https://golang.org
/usr/local/Cellar/go/1.4.2 (5,569 files, 595MB)
  Built from source on 2015-05-29 at 23:52:51 with: --with-cc-common
/usr/local/Cellar/go/1.5.3 (5,339 files, 259.8MB)
  Built from source on 2016-02-19 at 23:42:46
/usr/local/Cellar/go/1.6.2 (5,778 files, 325.3MB)
  Poured from bottle on 2016-05-07 at 20:57:42
/usr/local/Cellar/go/1.8.3 (7,035 files, 282.0MB)
  Poured from bottle on 2017-06-07 at 16:39:36
/usr/local/Cellar/go/1.9.2 (7,646 files, 293.9MB) *
  Poured from bottle on 2017-11-06 at 13:38:18
・
・
・
  • 切り替え
% brew switch golang 1.8.3
Cleaning /usr/local/Cellar/go/1.4.2
Cleaning /usr/local/Cellar/go/1.5.3
Cleaning /usr/local/Cellar/go/1.6.2
Cleaning /usr/local/Cellar/go/1.8.3
Cleaning /usr/local/Cellar/go/1.9.2
3 links created for /usr/local/Cellar/go/1.8.3
% go version
go version go1.8.3 darwin/amd64

upgradeの対象外にする

% brew pin golang
% brew list --pinned

これを実行することで brew upgrade を実行してもバージョンがあがらなくなる

pinの解除

% brew unpin golang

unpinすればまたバージョンがあがる

pinしているパッケージの確認

% brew ls --pinned
go

AlpineLinuxについて

割りと自分のメモ代わり

AlpineLinuxとは

超軽量ディストリビューション もともとは組み込みでよく使われていた? 最近はその軽量さからコンテナのイメージによく使われている 公式イメージも順次切り替わっているとのこと http://www.publickey1.jp/blog/16/docker_alpine_linux.html

有名所は代替alpineも提供している印象

Alpineを使うメリット

  • とにかく軽量
  • docker pullとか早くなる
  • コンテナは容量が小さければ小さいほどよい

Alpineを使うデメリット

  • パッケージ管理が弱め(パッケージのサポートが古め)
  • 最新版のミドルなりを使いたかったらソースコンパイルする必要あり
  • が、glibcがデフォで入っていないみたい

DockerHub

apkコマンド

パッケージ管理 yumとかaptと同じ

# apk update
  • パッケージインストー
# apk add [package]
  • パッケージインストール(cacheを削除)
# apk add --no-cache [package]
  • パッケージインストール(group化)
# apk add --no-cache --virtual [virtual name] [package] [package]

グループ化しておくと、削除時に[virtual name]を指定するだけで一括で削除できる

  • パッケージインストー
# apk del [package or virtual name]
  • パッケージ検索
# apk search [packagee]
  • インストール済みパッケージ
# apk info [packagee]
広告を非表示にする

RDSのログをLambda(python3.6)経由でS3に保存する

目的はRDS Auroraのaudit.logをS3に保存するため。 audit.logについてはこちら。

dev.classmethod.jp

どうせならLambdaでやりたくて、誰か作ってないかなと探したらありました。

github.com

ただちょっと物足りなくて、具体的には

  • 初回実行時はフラグを変えなきゃいけない
  • 設定値を直接スクリプトに埋め込むのもうーん
  • ログが更新されていたら1から全取得してアップし直すのもちょっと。。

という点をどうにかしたいなーと。

特に全取得->アップというのがちょっとよろしくなくて、Auroraのaudit.logは現状100M毎のローテーションになるのでそれを毎回取得していたら結構重いなと。

ついでにS3にアップされたらそれをトリガーにさらに何かしらの処理をする、ということもやりたかったということもあります。

というわけでryanhollanさんのを参考にしつつ作り直してみました。

github.com

変更点はこちら。

  • 設定値は環境変数で設定
  • ログが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を定義してなければオプションがつかないみたい。

https://github.com/ansible/ansible/blob/devel/lib/ansible/modules/database/misc/elasticsearch_plugin.py#L150-L151

というわけで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のイメージを使えます。

参考