Mackerel AWSインテグレーション設定(IAMロール)

MackerelでIAMロールでの設定が行えるようになりました。  
AccessKeyでは無く、Roleを推奨ということなので、IAMロールで設定します。
AWSリソースは AWS CLI で作成します。

- [AssumeRoleによるAWSインテグレーションが利用に可能になりました・死活監視の仕様を変更しました　ほか \- Mackerel ブログ \#mackerelio](https://mackerel.io/ja/blog/entry/weekly/20161007)

	> AssumeRoleによるAWSインテグレーションが利用可能になりました

公式手順も更新されています。

- [AWSインテグレーション \- Mackerel ヘルプ](https://mackerel.io/ja/docs/entry/integrations/aws)

	> セキュリティー保全の観点から、IAMロールで設定する方法を強く推奨します。

# 事前準備

IAMロール作成に必要になる JSON ファイルを準備します。

## ポリシーファイル作成

### AssumeRolePolicyDocument.json

公式手順に記載の Account ID、External ID で作成します。

> 許可するAccount IDには 217452466226 、External IDには Mackerel-AWS-Integration と入力して下さい。

```
{
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::217452466226:root"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "StringEquals": {
          "sts:ExternalId": "Mackerel-AWS-Integration"
        }
      }
    }
  ]
}
```

### MackerelAWSIntegrationPolicy.json

タグ絞り込み用のインラインポリシーです。
AWSインテグレーションの対象リソースが増えた場合は適宜追加が必要になると思います。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeTags"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "elasticloadbalancing:DescribeTags"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "rds:ListTagsForResource"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "elasticache:ListTagsForResource"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```

# IAMロール作成

## IAMロール

ポリシーファイルを使用してIAMロールを作成します。

```
aws iam create-role \
  --role-name "MackerelAWSIntegrationRole" \
  --assume-role-policy-document file://AssumeRolePolicyDocument.json
```

## IAMポリシー付与

公式記載のポリシーを作成したIAMロールに付与します。
AWSインテグレーションの対象リソースが増えた場合は、ポリシーの追加が必要になると思います。

```
for POLICYNAME in \
AmazonEC2ReadOnlyAccess \
AmazonElastiCacheReadOnlyAccess \
AmazonRDSReadOnlyAccess
do
  aws iam attach-role-policy \
    --role-name "MackerelAWSIntegrationRole" \
    --policy-arn arn:aws:iam::aws:policy/${POLICYNAME}
  sleep 1
done
```

## インラインポリシー付与

ポリシーファイルを使用してタグ絞り込み用のインラインポリシーを付与します。

```
aws iam put-role-policy \
  --role-name "MackerelAWSIntegrationRole" \
  --policy-name "MackerelAWSIntegrationPolicy" \
  --policy-document file://MackerelAWSIntegrationPolicy.json
```

# IAMロール作成結果

- IAM Role

<img width="1061" alt="20161012_Mackerel_AWS_role_01.png" src="https://qiita-image-store.s3.amazonaws.com/0/89680/e8acd334-d961-5097-4d9f-5f20742601b9.png">
<img width="1045" alt="20161012_Mackerel_AWS_role_02.png" src="https://qiita-image-store.s3.amazonaws.com/0/89680/09733c35-a1aa-71d2-7f21-0384636490cb.png">

# Mackerel に設定

## ARN取得

```
aws iam list-roles \
--query 'Roles[?RoleName==`MackerelAWSIntegrationRole`].Arn' \
--output text
```

## ARNをAWSインテグレーションへ登録

<img width="461" alt="20161012_Mackerel_AWS_role_03.png" src="https://qiita-image-store.s3.amazonaws.com/0/89680/66c6cc88-6dae-2cd9-7b48-6de4af3b0e5f.png">

タグ絞り込みを行い、意図した台数となることを確認できました。

<img width="500" alt="20161012_Mackerel_AWS_role_04.png" src="https://qiita-image-store.s3.amazonaws.com/0/89680/63555b0a-aec7-d842-0a11-a159ebd04ebf.png">