mackerelのAWSインテグレーション用IAM Userをcloudformationで作る

More than 1 year has passed since last update.

概要

Mackerelいいですよね。導入がとても楽です。
https://mackerel.io/ja/

少し前にAWSからメトリックを取得して、Mackerelでモニタリングに利用できる機能ができていました。
https://mackerel.io/ja/blog/entry/weekly/20160513
https://mackerel.io/ja/docs/entry/integrations/aws

ドキュメントを読むと、下記のようなことをやれば良いみたいです。

  1. AWS上にメトリックのRead権限を持ったIAM Userを作成
  2. IAM UserのアクセスキーをMackerelに登録
  3. (+α)特定のタグを含むAWSリソースだけ登録したい場合、タグ情報を取得できる権限を1のIAM Userに付与する

タグを指定しない場合、対象となるリソース全てを取得してしまいます。
なので、今回はELBのメトリックを取得できるIAM Userを作ってみました。

IAM Userの作成

cloudformation定義

下記のようなcloudformationの定義でcreate-stackを行えば終わりです()

{
  "AWSTemplateFormatVersion" : "2010-09-09",
  "Description" : "IAM User for Mackerel's AWS Integration",
  "Resources" : {
    "MackerelAWSIntegrationUser" : {
      "Type" : "AWS::IAM::User",
      "Properties" : {
        "ManagedPolicyArns": [
          "arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess"
        ]
      }
    },
    "MackerelAWSIntegrationIamGetUser" : {
      "Type" : "AWS::IAM::Policy",
      "Properties" : {
        "PolicyName" : "MackerelAWSIntegrationIamGetUser",
        "PolicyDocument" : {
          "Statement": [{
            "Effect"   : "Allow",
            "Action"   : "iam:GetUser",
            "Resource" : {"Fn::GetAtt": ["MackerelAWSIntegrationUser", "Arn"]}
          }]
        },
        "Users": [{"Ref": "MackerelAWSIntegrationUser"}]
      },
      "DependsOn": "MackerelAWSIntegrationUser"
    }
  },
  "Outputs" : {
    "MackerelAWSIntegrationUser" : {
      "Value" : {"Ref": "MackerelAWSIntegrationUser"},
      "Description" : "MackerelAWSIntegrationUser"
    },
    "MackerelAWSIntegrationIamGetUser" : {
      "Value" : { "Ref" : "MackerelAWSIntegrationIamGetUser" },
      "Description" : "MackerelAWSIntegrationIamGetUser"
    }
  }
}

create-stackの実行

$ls
mackerel.json

$aws cloudformation create-stack --stack-name "MackerelIntegrationIamUser" --template-body file://./mackerel.json --capabilities CAPABILITY_IAM
{
    "StackId": "arn:aws:cloudformation:ap-northeast-1:xxxxxxxxxxxxx:stack/MackerelIntegrationIamUser/6b208770-3d2f-11e6-a5ad-50a68a455c82"
}

$aws cloudformation describe-stacks --stack-name "MackerelIntegrationIamUser"
{
    "Stacks": [
        {
            "StackId": "arn:aws:cloudformation:ap-northeast-1:xxxxxxxxxxxxx:stack/MackerelIntegrationIamUser/6b208770-3d2f-11e6-a5ad-50a68a455c82",
            "Description": "IAM User for Mackerel's AWS Integration",
            "Tags": [],
            "Outputs": [
                {
                    "Description": "MackerelAWSIntegrationUser",
                    "OutputKey": "MackerelAWSIntegrationUser",
                    "OutputValue": "MackerelIntegrationIamUse-MackerelAWSIntegrationUs-1CJ6RWI4E6O1T"
                },
                {
                    "Description": "MackerelAWSIntegrationIamGetUser",
                    "OutputKey": "MackerelAWSIntegrationIamGetUser",
                    "OutputValue": "Macke-Mack-1IX625ZIS1EWV"
                }
            ],
            "CreationTime": "2016-06-28T12:54:15.152Z",
            "Capabilities": [
                "CAPABILITY_IAM"
            ],
            "StackName": "MackerelIntegrationIamUser",
            "NotificationARNs": [],
            "StackStatus": "CREATE_COMPLETE",
            "DisableRollback": false
        }
    ]
}

結果のAWSコンソール

AWS コンソール

感想とか

これで出来たIAM Userのアクセスキーをぽちぽち手動でMackerelの管理画面に入れればELBが1 Hostとして扱われてメトリックが表示されます。
便利!
ここもmkrコマンドでできたら楽なのかなぁとか思ったけど、今のところそんな大変じゃないので、まあいっかという感じです。