MackerelのAWSインテグレーション #mackerelio

5/11、MackerelがAWS連携機能を発表しました。 hatenacorp.jp

実際弊社でもMackerelの有料プランを契約し、NewRelic + Mackerelで本番環境の監視を行っています。
もうZabbixでぽちぽちして消耗することはないんや・・・。

AWSインテグレーションはStandardプランが対象で、AWS側とMackerel側の設定が必要です。

AWS

Mackerelがデータを引っ張ってくるためのIAMユーザを作成する必要があります。
現在対応しているものはELBとRDSで、ドキュメントにはAmazonEC2ReadOnlyAccessAmazonRDSReadOnlyAccessを設定するよう記載されています。
ちなみに、Write権限があるものを設定しようとすると、登録時にエラーで弾いてくれるとのことです。(昨日のMackerel Meetup #7にて)

Mackerel

オーガニゼーションからAWSインテグレーションを選択します。
一つのオーガニゼーションで複数AWSアカウントを登録することが可能です。

新しいAWSアクセスIDを登録を選択すると、IAM情報の登録とメトリック収集対象のサービスを選択することができます。
登録されたサービスをどのロールにひも付けするかをここで設定します。
f:id:damenaragyouza:20160513151144p:plain f:id:damenaragyouza:20160513151149p:plain

設定が完了すると、自動的にホストが登録されてきます。
f:id:damenaragyouza:20160513152130p:plain

ここで注意しなければいけないのは、AWSのサービス1つ1つがMackerelにとってホスト扱いになるということです。
つまり、ELB1つ・RDS1つが課金対象となります。

じゃあ本番環境のインスタンスだけ登録しておこうと思い、dev/stg環境のELB・RDSを削除(Mackerelでいうところの退役)しました。
しかし退役させても自動で復活してきます。こわい!

これはさすがに課金がマッハでヤバイと思ったのでサポートに問い合わせてみました。
以下要約。

現在はAWSインテグレーションで登録したホストを退役させても自動的に復活してくる仕様のため、特定のインスタンスを対象外にはできない。
回避方法としてはAWSインテグレーションの設定を削除するしかないが、将来的にインスタンスのタグで登録対象かどうかを判断できる仕組みを検討しているとのこと。

そこで俺は閃いた。IAMユーザで制限すればよくね?と。
Tagで制限できるかどうか試してみた。

ELB

IAMポリシーで制限できないかも?
調査中

RDS

RDSのタグで制限できるはずだけど正しく動いてないので調査中・・・。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "rds:Describe*",
                "rds:ListTagsForResource"
            ],
            "Effect": "Allow",
            "Condition": {
                "StringEquals": {
                    "rds:db-tag/env": [
                        "prod"
                    ]
                }
            },
            "Resource": "*"
        },
        {
            "Action": [
                "ec2:DescribeAccountAttributes",
                "ec2:DescribeAvailabilityZones",
                "ec2:DescribeSecurityGroups",
                "ec2:DescribeVpcs"
            ],
            "Effect": "Allow",
            "Resource": "*"
        },
        {
            "Action": [
                "cloudwatch:GetMetricStatistics",
                "logs:DescribeLogStreams",
                "logs:GetLogEvents"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}

こんなイメージで。
RDSはタグがないから、インスタンス名=prod-*みたいな条件でひっかけないとだめそう。
大嘘。tagありました・・・。

取り急ぎこんな感じで。