[JAWS-UG CLI] IAM #49 IAMロールの作成(Datadog) + Datadogアカウント作成 


.. request: IAMロールの作成 (Datadog AWS Integration)


前提条件
========


IAMへの権限
-----------

IAMに対してフル権限があること。


AWS CLI
-------

以下のバージョンで動作確認済

- AWS CLI 1.11.14

```bash:コマンド:
aws --version
```

```text:結果(例):
      aws-cli/1.11.10 Python/2.7.11 Darwin/15.6.0 botocore/1.4.67
```

バージョンが古い場合は最新版に更新しましょう。

```bash:コマンド:
sudo -H pip install -U awscli
```


0. 準備
=======


変数の確認
----------

プロファイルが想定のものになっていることを確認します。

```bash:変数の確認:
aws configure list
```

```text:結果(例):
            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile       iamFull-prjz-mbp13        env    AWS_DEFAULT_PROFILE
      access_key     ****************XXXX shared-credentials-file
      secret_key     ****************XXXX shared-credentials-file
          region        ap-northeast-1        env    AWS_DEFAULT_REGION
```

今回は、IAMでの作業となるため、リージョンはどこになっていても影響あり
ません。


1. 事前作業
===========


1.1. IAMロール名の決定
----------------------

作成するIAMロールの名称を決定します。

```bash:変数の設定:
IAM_ROLE_NAME='DatadogAWSIntegrationRole'
```

同じ名前のIAMロールが存在しないことを確認します。

```bash:コマンド:
aws iam get-role \
         --role-name ${IAM_ROLE_NAME}
```

```text:結果(例):
      A client error (NoSuchEntity) occurred when calling the GetRole operation: The role with name DatadogAWSIntegrationRole cannot be found.
```


1.2. プリンシパルの指定
-----------------------

作成するIAMロールを利用することができるサービス(プリンシパル)を指定します。

今回は、DatadogのAWS IDに対してこのロールの利用を許可します。

```bash:変数の設定:
IAM_CLOSS_DEST_ID='464622532012'
```


1.3. Datadogのアカウント作成
--------------------------------

DataDogのアカウントを作成します。

無償のFreeプランを利用します。

課金に関するFAQ: http://docs.datadoghq.com/ja/guides/billing/


- 事前に必要なもの

  - メールアドレス
  - パスワードに使う文字列 (8文字以上、数字と小文字を1文字以上)

- https://app.datadoghq.com/signup にアクセスします。


### 1. Account

  - 下記を入力します。

```
    - Email
    - Full Name
    - Company
    - Password
```

  - [Sign up]ボタンをクリックします。


### 2. Your Stack

```
  - Which services or software do you use? (optional): Amazon Web Services
  - How many servers does your organization manage?: 6-100
  - Are you a Managed Service Provider / Hosting Provider?: No
```

  - [Next]ボタンをクリックします。


### 3. Agent Setup

  - [Amazon Linux]タブを選択します。

    - "1. Use our easy one-step install."の下に記述されているシェルコマンドをコピーします。

```
  # EC2上での作業

    - シェルプロンプトに、先程のシェルコマンドを貼付します。

      - "Your Agent is running and functioning properly." という行が表示されればOKです。

    - エージェントを起動します。

       sudo /etc/init.d/datadog-agent start

       Starting Datadog Agent (using supervisord):                [  OK  ]
```

```
  # Datalog画面 (ブラウザ)

    Install your first Datadog Agent画面

    - 上部に"You have your first Agent running. Congrats!"と表示されます。

    - 下部に"Your first Datadog Agent is reporting. Congrats!"と表示されます。

    - [Next]ボタンをクリックします。
```


### 4. AWS (Optional)

  - [Skip]ボタンをクリックします。



- Integration

  - Amazon Web Services

    - Configuration タブ

      - AWS External IDをコピーします。



2. IAMロールの作成
==================

IAMロールを作成していきます。

```bash:変数の設定:
STS_EXTERNAL_ID='<DatadogのAWS External IDの値>'
```


2.1. assumeロールポリシードキュメントの作成
-------------------------------------------

IAMロールを作成するために、まずassumeロールポリシーを記述したドキュメントをJSON形式で作成します。

```bash:変数の確認:
cat << ETX

        FILE_INPUT:        ${FILE_INPUT}
        IAM_CLOSS_DEST_ID: ${IAM_CLOSS_DEST_ID}
        STS_EXTERNAL_ID:   ${STS_EXTERNAL_ID}

ETX
```

```bash:コマンド:
cat << EOF > ${FILE_INPUT}
{
        "Version": "2012-10-17",
        "Statement": [
          {
            "Action": "sts:AssumeRole",
            "Effect": "Allow",
            "Condition": {
              "StringEquals": {
                "sts:ExternalId": "${STS_EXTERNAL_ID}"
              }
            },
            "Principal": {
              "AWS": "arn:aws:iam::${IAM_CLOSS_DEST_ID}:root"
            }
          }
        ]
}
EOF

cat ${FILE_INPUT}
```

JSONファイルを作成したら、フォーマットが壊れてないか必ず確認します。

```bash:コマンド:
jsonlint -q ${FILE_INPUT}
```

エラーが出力されなければOKです。


2.2. IAMロールの作成
--------------------

assumeロールポリシーを記述したら、次に実際にIAMロールを作成します。

```bash:コマンド:
aws iam create-role \
        --role-name ${IAM_ROLE_NAME} \
        --assume-role-policy-document file://${FILE_INPUT}
```

```text:結果(例):
{
    "Role": {
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17", 
            "Statement": [
                {
                    "Action": "sts:AssumeRole", 
                    "Effect": "Allow", 
                    "Condition": {
                        "StringEquals": {
                            "sts:ExternalId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
                        }
                    }, 
                    "Principal": {
                        "AWS": "arn:aws:iam::464622532012:root"
                    }
                }
            ]
        }, 
        "RoleId": "AROAIXXXXXXXXXXXXXXXXX", 
        "CreateDate": "2016-11-13T13:15:28.563Z", 
        "RoleName": "DatadogAWSIntegrationRole", 
        "Path": "/", 
        "Arn": "arn:aws:iam::XXXXXXXXXXXX:role/DatadogAWSIntegrationRole"
    }
}
```

2.3. IAMロールの確認
--------------------

作成したIAMロールの内容を確認しましょう。

```bash:コマンド:
aws iam get-role \
         --role-name ${IAM_ROLE_NAME}
```

```json:結果(例):
      {
        "Role": {
          "AssumeRolePolicyDocument": {
              "Version": "2012-10-17",
              "Statement": [
                  {
                      "Action": "sts:AssumeRole",
                      "Effect": "Allow",
                      "Condition": {
                          "StringEquals": {
                              "sts:ExternalId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
                          }
                      },
                      "Principal": {
                          "AWS": "arn:aws:iam::464622532012:root"
                      }
                  }
              ]
          },
          "RoleId": "AROAXXXXXXXXXXXXXXXXX",
          "CreateDate": "2016-11-13T10:28:24Z",
          "RoleName": "DatadogAWSIntegrationRole",
          "Path": "/",
          "Arn": "arn:aws:iam::XXXXXXXXXXXX:role/DatadogAWSIntegrationRole"
        }
      }
```

出力結果の'AssumeRolePolicyDocument'が、assumeロールポリシードキュメントと同一の内容になっていれば、問題ありません。


3. IAMポリシーの適用
====================

次に、このIAMロールにIAMポリシーを適用して、このIAMロールを利用することで得られる権限を決定します。


3.1. IAMロールに適用するIAMポリシーの決定
-----------------------------------------

利用するIAMポリシーを決めます。

```bash:変数の設定:
IAM_POLICY_NAME='DatadogAWSIntegrationPolicy'
```

次に、ポリシーを特定するためのAWSリソース識別名(ARN)を取得します。

```bash:変数の設定:
IAM_POLICY_ARN=$( \
        aws iam list-policies \
          --max-items 1000 \
          --query "Policies[?PolicyName==\`${IAM_POLICY_NAME}\`].Arn" \
          --output text \
) \
        && echo "${IAM_POLICY_ARN}"
```

```text:結果(例):
      arn:aws:iam::aws:policy/service-role/DatadogAWSIntegrationPolicy
```

ポリシーの内容を見るために、そのポリシーの最新バージョン名を取得します。

```bash:コマンド:
IAM_POLICY_VERSION=$( \
        aws iam list-policies \
          --max-items 1000 \
          --query "Policies[?PolicyName==\`${IAM_POLICY_NAME}\`].DefaultVersionId" \
          --output text \
) \
        && echo ${IAM_POLICY_VERSION}
```

```text:結果(例)
      v1
```

ポリシーの最新バージョンの内容を見てみましょう。

```bash:コマンド:
aws iam get-policy-version \
        --policy-arn ${IAM_POLICY_ARN} \
        --version-id ${IAM_POLICY_VERSION}
```

```json:結果(例):
      {
        "PolicyVersion": {
          "CreateDate": "2016-11-13T09:53:17Z",
          "VersionId": "v1",
          "Document": {
              "Version": "2012-10-17",
              "Statement": [
                  {
                      "Action": [
                          "autoscaling:Describe*",
                          "cloudtrail:DescribeTrails",
                          "cloudtrail:GetTrailStatus",
                          "cloudwatch:Describe*",
                          "cloudwatch:Get*",
                          "cloudwatch:List*",
                          "dynamodb:list*",
                          "dynamodb:describe*",
                          "ec2:Describe*",
                          "ec2:Get*",
                          "ecs:Describe*",
                          "ecs:List*",
                          "elasticache:Describe*",
                          "elasticache:List*",
                          "elasticloadbalancing:Describe*",
                          "elasticmapreduce:List*",
                          "elasticmapreduce:Describe*",
                          "es:ListTags",
                          "es:ListDomainNames",
                          "es:DescribeElasticsearchDomains",
                          "kinesis:List*",
                          "kinesis:Describe*",
                          "logs:Get*",
                          "logs:Describe*",
                          "logs:FilterLogEvents",
                          "logs:TestMetricFilter",
                          "rds:Describe*",
                          "rds:List*",
                          "route53:List*",
                          "s3:GetBucketTagging",
                          "ses:Get*",
                          "sns:List*",
                          "sns:Publish",
                          "support:*"
                      ],
                      "Resource": "*",
                      "Effect": "Allow"
                  }
              ]
          },
          "IsDefaultVersion": true
        }
      }
```


3.2. IAMポリシーの確認
----------------------

IAMロールに適用されているIAMポリシーを確認してみましょう。

```bash:コマンド:
aws iam list-attached-role-policies \
        --role-name ${IAM_ROLE_NAME}
```

```json:結果:
      {
          "AttachedPolicies": [], 
      }
```

作成直後のIAMロールには、適用されているIAMポリシーはありません。


3.3. IAMポリシーの適用
----------------------

IAMロールにIAMポリシーを適用します。

```bash:変数の確認:
cat << ETX

        IAM_ROLE_NAME:  ${IAM_ROLE_NAME}
        IAM_POLICY_ARN: ${IAM_POLICY_ARN}

ETX
```

```bash:コマンド:
aws iam attach-role-policy \
        --role-name ${IAM_ROLE_NAME} \
        --policy-arn ${IAM_POLICY_ARN}
```

```text:結果:
      (戻り値なし)
```


3.4. ポリシーの確認
-------------------

IAMロールに適用されているIAMポリシーを再度確認してみましょう。

```bash:コマンド:
aws iam list-attached-role-policies \
        --role-name ${IAM_ROLE_NAME}
```

```json:結果(例):
      {
        "AttachedPolicies": [
          {
            "PolicyName": "DatadogAWSIntegrationPolicy",
            "PolicyArn": "arn:aws:iam::XXXXXXXXXXXX:policy/DatadogAWSIntegrationPolicy"
          }
        ]
      }
```


4. AWSアカウントIDの取得
================================

```bash:コマンド:
AWS_ID=$( \
        aws sts get-caller-identity \
          --query 'Account' \
          --output text \
) \
        && echo ${AWS_ID}
```

```text:結果(例)
      XXXXXXXXXXXX
```




5. Datadog
================================

- Integration画面に戻ります。

  - 以下を入力します。

    - AWS Account ID:
    - AWS Role name:

  - 'Account credentials are valid!'と表示されればOKです。 
  - [Install Configuration]ボタンをクリックします。

- Integration画面に戻ります。

  - AWSの各サービスがインストールされます。


- Dashboards > Dashboard List画面に移動します。

  - AWS RDSのリンクをクリックします。



6. Datadogエージェントの設定
========================================

DataDogのエージェントを設定します。


- 事前に必要なもの

  - RDSインスタンスのDBインスタンス名
  - RDSインスタンスのエンドポイント情報


## 1. Datadogのエージェント設定

```
   cd /etc/dd-agent/conf.d/

   sudo cp postgres.yaml.example postgres.yaml
```

/etc/dd-agent/conf.d/postgres.yaml(修正部分の例):

```
   - host: <エンドポイント>
     port: 5432
     username: pgadmin
     password: '#dbPass123'
     dbname:   handson20161114
     tags:
       - dbinstanceidentifier:<DBインスタンス名>
```


2. Datadogのエージェント再起動
==============================

```
   sudo /etc/init.d/datadog-agent restart
```


3. Datadogのエージェント確認
============================

```
   sudo service datadog-agent info
```

全て [OK] になっていることを確認します。

```
   Checks
    ======

      ntp
      ---
        - instance #0 [OK]
        - Collected 1 metric, 0 events & 1 service check

      disk
      ----
        - instance #0 [OK]
        - Collected 24 metrics, 0 events & 0 service checks

      postgres
      --------
        - instance #0 [OK]
        - Collected 5 metrics, 0 events & 1 service check

      network
      -------
        - instance #0 [OK]
        - Collected 0 metrics, 0 events & 0 service checks


    Emitters
    ========

      - http_emitter [OK]
```

5分ぐらいするとRDSのメトリクスは、Metrics Explorerでの検索、グラフやアラートでの指定が出来るようになります。



完了
====

以上で、DatadogのAWS Integrationの利用に必要なIAMロールの作成とDatadogの設定は完了です。