読者です 読者をやめる 読者になる 読者になる

Mackerel Drinkup #4 Tokyo で LT をしてきた

Mackerel Drinkup #4 Tokyo で LT をしてきた。

mackerelio.connpass.com

LT の内容は mackerel-plugin-aws-waf の紹介(公式プラグイン集のひとつになりました)。作成経緯や苦労した点について。AWS WAF 自体の説明は大雑把にしかしていないので、この発表資料は参考にしないほうがいいかも……

久しぶりの発表だったので緊張したし、スライドのフォントサイズが小さかったりと個人的に反省点もあったけど、Mackel の開発者が直接フィードバックをもらうことができたので楽しい時間だった。

LT のご褒美に Mackerel グラスをもらったので、大切に使いたいと思う。

Mackerel のメタデータに Amazon Linux のパッケージ情報を登録してみる

mackerel-agent でメタデータの登録が対応したので、早速 Amazon Linux のパッケージ情報を登録してみることにした。

mackerel.io

ソースコード

使い方

Mackerel エージェントの設定ファイルに下記を追加する。

[plugin.metadata.packages]
command = "perl /path/to/mackerel-metadata-packages.pl"
execution_interval = 60

そうすると、60分間隔でインストール済みのパッケージ情報がメタデータとして更新される。

例えば、OpenSSL のバージョンを確認したい場合は下記のようなコマンドを実行する。

$ curl -s -XGET -H 'X-Api-Key:<APIKEY>' https://mackerel.io/api/v0/hosts/<hostId>/metadata/packages | jq '.openssl'
{
  "architecture": "x86_64",
  "version": "1.0.1k-15.96.amzn1"
}

mackerel-plugin-aws-waf v0.0.2 をリリースした

指定された WebACL に関連づけられている全ルールのメトリックスを取得するようにした mackerel-plugin-aws-waf の最新バージョンをリリースした。

github.com

修正点

WebACL に関連づけられている全ルールのメトリックスを取得するために、下記の修正を実施した。

  • WebACL の指定方法を WebACL 名から WebACL ID に変更
    • GetWwbACL で Web ACL ID を指定する必要があるため
  • グラフ定義における名前を custom.waf.Requests から custom.waf.Requests.#.* に変更
  • ALB と連携している AWS WAF のサポートを削除
    • AWS WAF の API には AWS WAF と AWS WAF Regional の2種類がある
      • AWS WAF : CloudFront
      • AWS WAF Regional : ALB
    • API をどのように使い分けるか迷ったので AWS WAF Regional の実装をしないことに

Mackerel の AWS WAF プラグインを作った

Mackerel 上で AWS WAF のメトリックスを確認したかったのでプラグインを作った。

github.com

使い方

リースページ からパッケージをダウンロードして、適切な場所に配置する。

そして、Mackerel エージェントの設定ファイルに下記を追加する。

[plugin.metrics.aws-waf]
command = "/path/to/mackerel-plugin-aws-waf -web-acl=<aws-waf-web-acl> [-region=<aws-region>]"

web-acl オプションにはメトリックスを取得したい AWS WAF の Web ACL 名を設定する。

region オプションには適切なリージョンを設定する。AWS WAF を CloudFront と連携している場合は us-east-1 を、ALB と連携している場合はそのリージョンを設定する。

今後やりたいこと

AWS WAF はルールを複数設定することが可能だけど、現状メトリックスを取得するルールは ALL 固定となっている。これだと SQL インジェクションやクロスサイトスクリプトのルールのブロックしたリクエスト数を Mackerel 上で確認することができない。そのため、メトリックスを取得するルールを複数設定できるようにしたい。

Groovy で Amazon Athena に接続してみた

Amazon Athena が JDBC 接続をサポートしているので Groovy で試してみた。

github.com

使い方

s3_staging_dir を適当なバケット名に変更する。バケットは Amazon Athena を実行するリージョンの同一にする必要があることに注意する。そして、./gradlew run を下記を実行する。問題が発生しなければ、下記のようになるはずである。

$ ./gradlew run
:compileJava UP-TO-DATE
:compileGroovy UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:run
log4j:WARN No appenders could be found for logger (com.amazonaws.athena.jdbc.AthenaDriver).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
500     22
302     13
304     60
200     4108
301     23
404     3

BUILD SUCCESSFUL

Total time: 7.662 secs

Amazon Linux 2016.03 で Nginx をインストールする Itamae レシピ

Amazon Linux のレポジトリからではなく、Nginx の公式レポジトリからインストールしたかったので、Itamae のレシピを書いてみた。

package 'http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm' do
  not_if 'rpm -q nginx-release-centos'
end

package 'nginx' do
  options '--disablerepo=amzn-main,amzn-updates'
end

Vagrant のプロバイダとして xhyve を使ってみた

現時点で Vagrant のプロバイダとして xhyve を提供するプラグインが2個存在している。

どちらのプラグインが良いかのを比較はしていないが、RubyGems で公開されているためインストールが簡単だった oldpatricka/vagrant-xhyve を試すことにした。

手順

1. インストール

RubyGems で公開されているので vagrant plugin install でインストールした。

$ vagrant plugin install vagrant-xhyve

このプラグインは xhyve-ruby に同梱されている xhyve を使うようになっているので、xhyve 自体のインストールは不要である。

2. Vagrantfile の作成

Ubuntu 14.04 LTS の Box のみが提供されているので、この Box を起動する Vagrantfile を作成した。

Vagrant.configure(2) do |config|
  config.vm.box = 'oldpatricka/ubuntu-14.04'

  config.nfs.functional = false
end

config.nfs.functionalfalse に設定している理由は、vagrant up 時に下記のエラーを発生させないためである。

No host IP was given to the Vagrant core NFS helper. This is
an internal error that should be reported as a bug.

3. 起動

プロバイダに xhyve を指定して起動する必要がある。また、xhyve の制限で root 権限で起動する必要がある。

$ sudo vagrant up --provider=xhyve
Bringing machine 'default' up with 'xhyve' provider...
==> default: Box 'oldpatricka/ubuntu-14.04' could not be found. Attempting to find and install...
    default: Box Provider: xhyve
    default: Box Version: >= 0
==> default: Loading metadata for box 'oldpatricka/ubuntu-14.04'
    default: URL: https://atlas.hashicorp.com/oldpatricka/ubuntu-14.04
==> default: Adding box 'oldpatricka/ubuntu-14.04' (v0.1.0) for provider: xhyve
    default: Downloading: https://atlas.hashicorp.com/oldpatricka/boxes/ubuntu-14.04/versions/0.1.0/providers/xhyve.box
==> default: Successfully added box 'oldpatricka/ubuntu-14.04' (v0.1.0) for 'xhyve'!
==> default: Checking if box 'oldpatricka/ubuntu-14.04' is up to date...
==> default: Importing box...
==> default: Done importing box.
==> default:  About to launch vm
==> default:  -- CPUs: 1
==> default:  -- Memory: 1024
==> default: [vagrant-hostsupdater] Checking for host entries
    default: 
    default: Vagrant insecure key detected. Vagrant will automatically replace
    default: this with a newly generated keypair for better security.
    default: 
    default: Inserting generated public key within guest...
    default: Removing insecure key from the guest if it's present...
    default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Rsyncing folder: /Users/hidekazu/xhyve-vagrant/ => /vagrant