.. request: IAMロールの作成 (Datadog AWS Integration)
前提条件
IAMへの権限
IAMに対してフル権限があること。
AWS CLI
以下のバージョンで動作確認済
- AWS CLI 1.11.14
aws --version
aws-cli/1.11.10 Python/2.7.11 Darwin/15.6.0 botocore/1.4.67
バージョンが古い場合は最新版に更新しましょう。
sudo -H pip install -U awscli
- 準備
=======
変数の確認
プロファイルが想定のものになっていることを確認します。
aws configure list
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. IAMロール名の決定
作成するIAMロールの名称を決定します。
IAM_ROLE_NAME='DatadogAWSIntegrationRole'
同じ名前のIAMロールが存在しないことを確認します。
aws iam get-role \
--role-name ${IAM_ROLE_NAME}
A client error (NoSuchEntity) occurred when calling the GetRole operation: The role with name DatadogAWSIntegrationRole cannot be found.
1.2. プリンシパルの指定
作成するIAMロールを利用することができるサービス(プリンシパル)を指定します。
今回は、DatadogのAWS IDに対してこのロールの利用を許可します。
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をコピーします。
-
-
- IAMロールの作成
==================
IAMロールを作成していきます。
STS_EXTERNAL_ID='<DatadogのAWS External IDの値>'
2.1. assumeロールポリシードキュメントの作成
IAMロールを作成するために、まずassumeロールポリシーを記述したドキュメントをJSON形式で作成します。
cat << ETX
FILE_INPUT: ${FILE_INPUT}
IAM_CLOSS_DEST_ID: ${IAM_CLOSS_DEST_ID}
STS_EXTERNAL_ID: ${STS_EXTERNAL_ID}
ETX
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ファイルを作成したら、フォーマットが壊れてないか必ず確認します。
jsonlint -q ${FILE_INPUT}
エラーが出力されなければOKです。
2.2. IAMロールの作成
assumeロールポリシーを記述したら、次に実際にIAMロールを作成します。
aws iam create-role \
--role-name ${IAM_ROLE_NAME} \
--assume-role-policy-document file://${FILE_INPUT}
{
"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ロールの内容を確認しましょう。
aws iam get-role \
--role-name ${IAM_ROLE_NAME}
{
"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ロールポリシードキュメントと同一の内容になっていれば、問題ありません。
- IAMポリシーの適用
====================
次に、このIAMロールにIAMポリシーを適用して、このIAMロールを利用することで得られる権限を決定します。
3.1. IAMロールに適用するIAMポリシーの決定
利用するIAMポリシーを決めます。
IAM_POLICY_NAME='DatadogAWSIntegrationPolicy'
次に、ポリシーを特定するためのAWSリソース識別名(ARN)を取得します。
IAM_POLICY_ARN=$( \
aws iam list-policies \
--max-items 1000 \
--query "Policies[?PolicyName==\`${IAM_POLICY_NAME}\`].Arn" \
--output text \
) \
&& echo "${IAM_POLICY_ARN}"
arn:aws:iam::aws:policy/service-role/DatadogAWSIntegrationPolicy
ポリシーの内容を見るために、そのポリシーの最新バージョン名を取得します。
IAM_POLICY_VERSION=$( \
aws iam list-policies \
--max-items 1000 \
--query "Policies[?PolicyName==\`${IAM_POLICY_NAME}\`].DefaultVersionId" \
--output text \
) \
&& echo ${IAM_POLICY_VERSION}
v1
ポリシーの最新バージョンの内容を見てみましょう。
aws iam get-policy-version \
--policy-arn ${IAM_POLICY_ARN} \
--version-id ${IAM_POLICY_VERSION}
{
"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ポリシーを確認してみましょう。
aws iam list-attached-role-policies \
--role-name ${IAM_ROLE_NAME}
{
"AttachedPolicies": [],
}
作成直後のIAMロールには、適用されているIAMポリシーはありません。
3.3. IAMポリシーの適用
IAMロールにIAMポリシーを適用します。
cat << ETX
IAM_ROLE_NAME: ${IAM_ROLE_NAME}
IAM_POLICY_ARN: ${IAM_POLICY_ARN}
ETX
aws iam attach-role-policy \
--role-name ${IAM_ROLE_NAME} \
--policy-arn ${IAM_POLICY_ARN}
(戻り値なし)
3.4. ポリシーの確認
IAMロールに適用されているIAMポリシーを再度確認してみましょう。
aws iam list-attached-role-policies \
--role-name ${IAM_ROLE_NAME}
{
"AttachedPolicies": [
{
"PolicyName": "DatadogAWSIntegrationPolicy",
"PolicyArn": "arn:aws:iam::XXXXXXXXXXXX:policy/DatadogAWSIntegrationPolicy"
}
]
}
- AWSアカウントIDの取得
================================
AWS_ID=$( \
aws sts get-caller-identity \
--query 'Account' \
--output text \
) \
&& echo ${AWS_ID}
XXXXXXXXXXXX
- Datadog
================================
-
Integration画面に戻ります。
-
以下を入力します。
- AWS Account ID:
- AWS Role name:
-
'Account credentials are valid!'と表示されればOKです。
-
[Install Configuration]ボタンをクリックします。
-
-
Integration画面に戻ります。
- AWSの各サービスがインストールされます。
-
Dashboards > Dashboard List画面に移動します。
- AWS RDSのリンクをクリックします。
- 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インスタンス名>
- Datadogのエージェント再起動
==============================
sudo /etc/init.d/datadog-agent restart
- 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の設定は完了です。