LoginSignup
0

More than 3 years have passed since last update.

[AWS]CloudWatchエージェントの設定をある程度Ansibleからやってみる

Last updated at Posted at 2019-06-05

2019/8/14追記: AWS Systems Manager Quick Setupで手軽にセットアップできるようになったようなので、この記事は不要かも知れない。

参考

めんどっちいEC2インスタンスへのCloudWatchエージェントのメトリクス設定をAnsibleである程度頑張る。
ある程度は手動。

前提条件

環境

  • Ansible 2.7.10

EC2ロールへの権限設定

IAMでEC2にアタッチしているロールに CloudWatchAgentServerPolicy AmazonEC2RoleforSSM の2つを付与する。

  • AWSマネジメント コンソールのIAMを開く
  • IAMの左メニューから「ロール」をクリック
  • 対象のロールをクリック
  • 「アクセス権」タブ「Permissions Policies」の「ポリシーをアタッチします」をクリック
  • 対象のポリシーを検索して左側のチェックボックスにチェックを入れる
  • 「ポリシーのアタッチ」をクリック

反映されるまでには若干の時間差がある模様。

インターフェイスとゲートウェイの作成

  • AWSマネジメント コンソールのVPCを開く
  • 左メニューから「エンドポイント」を選択
  • 「エンドポイントの作成」をクリック
  • 以下の内容でInterfaceなエンドポイントを作成する
    • サービスカテゴリ: AWSサービス
    • サービス名: 下記4種分を個別に作成
      • com.amazonaws.(リージョン名).ssm
      • com.amazonaws.(リージョン名).ec2messages
      • com.amazonaws.(リージョン名).ec2
      • com.amazonaws.(リージョン名).ssmmessages
    • VPC: CloudWatchエージェントで管理したいEC2のあるVPC
    • サブネット: IPアドレスに余裕がありそうなとこ
    • このエンドポイントで有効にする: チェック入れとく
    • セキュリティグループ: HTTPS接続が許可されているものを選択
    • ポリシー: 必要に応じて
  • 以下の内容でGatewayなエンドポイントを作成する
    • サービスカテゴリ: AWSサービス
    • サービス名: 下記1種分を作成
      • com.amazonaws.(リージョン名).s3
    • VPC: CloudWatchエージェントで管理したいEC2のあるVPC
    • ルートテーブル: 適当に必要なとこ。必要なAZに作る
    • ポリシー: 必要に応じて

AWS Systems Managerでのパラメータ設定

  • AWSマネジメント コンソールのAWS Systems Managerを開く
  • 左欄から「共有リソース」→「パラメータストア」
  • 「パラメータの作成」
  • 以下の内容でパラメータを作成
    • 名前: AmazonCloudWatch-linux
    • 説明: 適当に
    • 利用枠: 標準
    • タイプ: 文字列
    • 値: 以下参照
  • 「パラメータを作成」をクリック

AWS Systems Managerのパラメータの内容

{
    "metrics": {
        "append_dimensions": {
            "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
            "ImageId": "${aws:ImageId}",
            "InstanceId": "${aws:InstanceId}",
            "InstanceType": "${aws:InstanceType}"
        },
        "metrics_collected": {
            "collectd": {
                "metrics_aggregation_interval": 60
            },
            "cpu": {
                "measurement": [
                    "cpu_usage_idle",
                    "cpu_usage_iowait",
                    "cpu_usage_user",
                    "cpu_usage_system"
                ],
                "metrics_collection_interval": 60,
                "resources": [
                    "*"
                ],
                "totalcpu": false
            },
            "disk": {
                "measurement": [
                    "used_percent",
                    "inodes_free"
                ],
                "metrics_collection_interval": 60,
                "resources": [
                    "*"
                ]
            },
            "diskio": {
                "measurement": [
                    "io_time",
                    "write_bytes",
                    "read_bytes",
                    "writes",
                    "reads"
                ],
                "metrics_collection_interval": 60,
                "resources": [
                    "*"
                ]
            },
            "mem": {
                "measurement": [
                    "mem_used_percent"
                ],
                "metrics_collection_interval": 60
            },
            "netstat": {
                "measurement": [
                    "tcp_established",
                    "tcp_time_wait"
                ],
                "metrics_collection_interval": 60
            },
            "statsd": {
                "metrics_aggregation_interval": 60,
                "metrics_collection_interval": 10,
                "service_address": ":8125"
            },
            "swap": {
                "measurement": [
                    "swap_used_percent"
                ],
                "metrics_collection_interval": 60
            }
        }
    }
}

パラメータはamazon-cloudwatch-agent-config-wizardを使用して生成する事もできる。

この辺はTerraformで自動化できるかも知れない。

Ansible Playbook を書く

cloudwatch-agent/tasks/main.yml
---
- name: enable epel repo
  yum: name=https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm state=present
  become: yes

- name: install python-lxml
  yum:
    name: python-lxml
  become: yes

- name: copy ssm agent profile template
  copy:
    src: /etc/amazon/ssm/seelog.xml.template
    dest: /etc/amazon/ssm/seelog.xml
    remote_src: yes
  become: yes

- name: edit ssm agent profile
  xml:
    path: /etc/amazon/ssm/seelog.xml
    xpath: /seelog/outputs/custom
    attribute: name
    value: cloudwatch_receiver
  become: yes

- name: edit ssm agent profile 2
  xml:
    path: /etc/amazon/ssm/seelog.xml
    xpath: /seelog/outputs/custom
    attribute: formatid
    value: fmtdebug
  become: yes

- name: edit ssm agent profile 3
  xml:
    path: /etc/amazon/ssm/seelog.xml
    xpath: /seelog/outputs/custom
    attribute: data-log-group
    value: ssm-metrics
  become: yes

- name: restart ssm agent
  service:
    name: amazon-ssm-agent
    state: restarted
  become: yes

- name: add collectd
  command: yum provides /usr/share/collectd/types.db
  args:
    warn: no
  become: yes

- name: install collectd
  yum:
    name: collectd
  become: yes

- name: download cloudwatch agent package
  get_url:
    url: https://s3.amazonaws.com/amazoncloudwatch-agent/amazon_linux/amd64/latest/amazon-cloudwatch-agent.rpm
    dest: /tmp

- name: install cloudwatch agent
  command: rpm -U /tmp/amazon-cloudwatch-agent.rpm
  args:
    warn: no
  ignore_errors: yes
  become: yes

- name: unlink cloudwatch agent package
  file:
    path: /tmp/amazon-cloudwatch-agent.rpm
    state: absent

- name: apply cloudwatch agent setting
  command: /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c ssm:AmazonCloudWatch-linux -s
  become: yes

XMLとRPMの処理がどうにも微妙だなぁ…
署名の確認はやっていない。

参考

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0