クラシル開発ブログ

クラシル開発ブログ

AWS RunCommandを使ってEC2上に監視ダッシュボードをサクッと作る(Ansible+Terraform+Grafana編)

こちらは、dely advent calender 2019の23日目の記事です。
qiita.com
adventar.org
昨日は、サーバーサイドエンジニアのyamanoiさんが「画像管理をActiveStorageからCarrierWaveへ乗り換えた話」という記事を書きました。興味を持った方は、是非読んでみてください!
tech.dely.jp

こんにちは!
今年11月からdelyに入社しました開発部SREの松嶋です。
本記事では、Systems ManagerのRunCommand (Ansible-playbook)を使うことでより簡単に監視ダッシュボードを作ることができたので、その手順について紹介したいと思います。

はじめに

今年9月にGitHubまたはS3に保存しているAnsible-playbookを直接実行する機能がSystems Managerに導入されたのを覚えていますか。
この新機能によって、Ansibleを使うためにEC2にssh接続用の公開鍵の作成や管理をしなくてもplaybookを実行可能になりました。Ansibleのplaybookを作成するだけでサーバー設定ができるのは、設定や管理面で楽になりますよね。
ちょうど弊社でも運用やセキュリティの観点からSystems ManagerのRunCommandやAutomationを使用することで、sshしなくてもデプロイできる手順に順次置き換えている最中です。
aws.amazon.com

また今年の11月には、Grafana6.5がリリースされました。このアップデートによって、AWS Cloudwatchのメトリクスをより効率的に監視できる機能が新しく追加されました。例えば、ワイルドカードを使って動的なクエリを書くことが可能になったり、事前構築されたダッシュボードが用意されるようになったため素早くモニタリング開始することができるようになっています。
aws.amazon.com

そこで、今回はこれらの新機能を試すために、Systems Managerの公式ドキュメント「AWS-ApplyAnsiblePlaybooks」を使ってRunCommandでGrafanaの監視ダッシュボードを構築してみたいと思います。

今回使ったものは、以下の通りです。

  • Grafana 6.5.2
  • Nginx 1.16.1
  • Terraform 0.12.12
  • AWS-ApplyAnsiblePlaybooks (Systems Managerドキュメント)

Grafanaプロビジョニング用設定ファイルの用意

現在のGrafanaでは、データソースやダッシュボードをファイル管理することが可能となっています。そのため、事前に設定ファイルを用意しておけば、Grafanaの起動と同時にモニタリングを開始することができます。

まずは、データソース設定用ymlファイルを用意します。ここでは、データソースのタイプと認証方法の設定を記載します。セキュアな情報が必要となるのでAWSのパラメータストア等を使用して安全に管理してください。

  • cloudwatch-datasource.yml
apiVersion: 1

datasources:
  - name: cloudwatch
    type: cloudwatch
    jsonData:
      authType: keys
      defaultRegion: ap-northeast-1
    secureJsonData:
      accessKey: $AWS_ACCESSKEY
      secretKey: $AWS_SECRETKEY

続いて、ダッシュボード設定用ymlファイルを用意します。optionsのpathはダッシュボードのjsonファイル置き場を指定しています。

  • cloudwatch-dashboard.yml
# # config file version
apiVersion: 1

providers:
 - name: 'cloudwatch'
   orgId: 1
   folder: ''
   folderUid: ''
   type: file
   options:
     path: /var/lib/grafana/dashboards #dashboard jsonファイル置き場

監視ダッシュボード用jsonファイルは、公式サイトからダウンロードしました。今回は、以下3つのダッシュボードjsonファイル(EC2,EBS,Billding)を用意しました。

  • amazon-ebs_rev1.json
  • amazon-ec2_rev1.json
  • aws-billing_rev13.json

公式のダッシュボードは、他にもLambdaやCloudwatchLogs、RDSがあります。ここはお好みのものをどうぞ。
grafana.com

Ansible-playbookの作成

RunCommandで使用するplaybookは以下のような構成にしました。playbookの中身は、grafana及びnginxのインストール、設定をするタスクを記載しています。これらをzipファイルにまとめて後ほどs3にアップロードします。

.
├── README.md
├── main-ansible.yml
└── roles
    ├── grafana
    │   ├── files
    │   │   ├── amazon-ebs_rev1.json
    │   │   ├── amazon-ec2_rev1.json
    │   │   ├── aws-billing_rev13.json
    │   │   ├── cloudwatch-dashboard.yml
    │   │   └── cloudwatch-datasource.yml
    │   ├── handlers
    │   │   └── main.yml
    │   ├── tasks
    │   │   └── main.yml
    │   └── templates
    │       └── grafana.ini.j2
    └── nginx
        ├── files
        │   └── grafana.conf
        ├── handlers
        │   └── main.yml
        └── tasks
            └── main.yml

10 directories, 13 files

使用したplaybookのサンプルをgithubにあげていますので、参考までに。
github.com

terraformで環境構築

ここまで準備ができたら、terraformで必要なものを構築していきます。
今回Grafanaサーバー用に構築したのは、以下の通りです。VPCやサブネットは既存のものを使用しました。

  • EC2インスタンス
  • セキュリティグループ
  • IAMロール
  • IAMポリシー
  • S3バケット
  • S3オブジェクトのアップロード
  • Route53のAレコード

EC2インスタンスに付与するIAMロールに関しては、RunCommandの実行やGrafanaがCloudwatchのメトリクスを取得できるように以下のIAMポリシーをアタッチしておく必要があります。

  • Cloudwatchのメトリクス取得
  • 作成したS3バケットのアクセス権限
  • AmazonEC2RoleforSSM (Amazon管理ポリシー)

IAMロールとアタッチしたポリシーの例は、github上に置いているので参考にしてみてください。
github.com


Terraformの実行は、GithubActionを使うとGithub上でterrraform initからvalidateやshow, applyまで完結するのでおすすめです。GithubActionで実施したplanやapply履歴もgithubで確認することができます。
github.com

Ansible-playbookの実行

Systems Manager > Run CommandからAWS公式コマンドドキュメントの「AWS-ApplyAnsiblePlaybook」を選択します。
コマンドのパラメータは、以下のように設定しました。Source InfoはS3バケットに保管しているオブジェクトURLを記載してください。

Source Type: S3
Source Info: {"path":"object-url"} 
Install Dependencies: True
Playbook File: grafana-ansible/main-ansible.yml
Extra Variables: SSM=True
Check: False
Verbose: -v

後はRunCommand先のインスタンスを選択し、ログが必要な場合はCloudwatchLogsまたはS3に出力するように設定して実行すればOKです。
成功すれば以下のように表示されます。

f:id:akngo22:20191222210405j:plain
RunCommand実行結果

S3にアップロードしておくだけで、ssh経由せずにAnsible-playbookを実行することができるのはかなり便利だと思いました。ただ、デバックオプションを使ってログ出力していてもplaybookのどのタスクで失敗したのか表示されずデバッグしづらかったので、事前にplyabookが想定通りに動作することを確認の上で使う必要があると思います。この点は、RunCommandの実行結果で見れるようになると良いですね。

Grafana確認

Ansible-playbookの実行が成功したら、Grafanaにログインしダッシュボードを見てみましょう。ダッシュボード一覧にプロビジョニングしたダッシュボードが表示されていることが確認できると思います。
Grafana6.5では、ワイルドカードを使えるようになったため動的なクエリに対応できるようになり、AutoScalingでEC2インスタンスが増減しても自動でダッシュボードに反映されるようになっています。

f:id:akngo22:20191222205423j:plain
EC2インスタンスのダッシュボード

また、グラフをクリックすると「View in Cloudwatch console」というCloudwatchコンソール画面に遷移するためのディープリンクがコンテキストメニューに追加されていることが確認できます。このリンクをクリックすれば、Cloudwatchコンソール画面に飛び、対象メトリクスを表示させることも可能となっています。

f:id:akngo22:20191222205024j:plain
ディープリンクが表示される
f:id:akngo22:20191222205106j:plain
Cloudwatchコンソール画面に遷移できる


まだ、発展途上な感じではありますが今後よりAWS Cloudwatchと親和性が高くなる予感がするので、さらに使いやすくなるのではと思います。

最後に

delyではSREを大募集しています!興味ある人は気軽にまずはオフィスに遊びにきてください!
www.wantedly.com

delyの開発部について知りたい方はこちらをご覧ください!
speakerdeck.com