CloudWatch Dashboard を自動作成、自動更新する

はじめに

システムを実際に運用する際、監視項目を設定し、項目の状態遷移を可視化(グラフ化)するのはほぼ必須かと思います。AWS の場合、マネージドサービスを監視するのに容易な CloudWatch の利用を検討することになりますが、CloudWatch は AWS Console から監視したい項目(Metrics)を手動で選択し、Dashboard も手動で作成することになります。 また、AWS のようなクラウドサービスは動的に変化する項目(文字列)も多くあり、それらが変化するたびに手動で作成や変更するのは非常に手間のかかる作業となります。 よって、監視対象の情報を自動更新するための仕組みが必要です。 今回は自動で Amazon CloudWatch Dashboard を作成、更新するための方法を説明します。

自動作成&表示方法の詳細

取得したいメトリクスの文字列が固定の場合

この場合は CFn で監視したいメトリクスを定義するだけです。 但し、CFn を YAML で定義している場合、次の例のように表示する情報(DashboardBody)自体は JSON で定義する必要があり、少しややこしいのですが YAML と JSON の記述を混在させることになります。

例: CloudWatch Dashboard 作成用 CFn

 :
Resources:
  CWDashboard:
    Type: AWS::CloudWatch::Dashboard
    Properties:
      DashboardName: EC2_CPUUtilization
      DashboardBody: !Sub |
        {
          "widgets": [
            {
              "type": "metric","x": 0,"y": 0,"width": 8,"height": 6,"properties": {"metrics": [ [ "AWS/EC2", "CPUUtilization", "instanceId", "i-0e3ab51f7934bf366" ] ], "region": "${AWS::Region}"}
            }
          ]
        }
 :

※ 上記 i-0e3ab51f7934bf366 は実際の EC2 instanceId に変更してください。

取得したいメトリクスの文字列が動的に変化する場合

メトリクスの文字列が動的に変化する場合は静的な場合と比べて工夫が必要です。 例えば、CodeDeploy の機能を利用し EC2 の Blue-Green Deployment を行う場合、Autoscaling Group の文字列が Deploy 毎に変化することになります。 このような場合は下記に挙げる内容を考慮しながら CloudWatch Dashboard API 経由を利用してメトリクスを表示するようにします。 もう少し具体的に申し上げれば Dashboard API 操作用の Lambda function を CFn で作成することで Dashboard の作成、メトリクス表示が自動化できます。

  • 監視対象のインスタンスを特定可能にするための仕組み

    • AutoScaling Group のインスタンスに Tag づけし、Lambda function から監視対象のインスタンスを特定可能にします

      例: CFn で Autoscaling Group に Tag 付け

        :
      Resources:
          :
        ServerGroup:
          Type: AWS::AutoScaling::AutoScalingGroup
            :
          Properties:
            :
            Tags:
            - Key: Name
              Value: !Sub Node.js-${EnvironmentIdentifier}
              PropagateAtLaunch: true
            :
      
  • InstanceId の取得方法

    • EC2 DescribeInstances API を利用して上記 Tag が設定され、かつ "running" 状態の instanceId を取得します

      例: Lambda function(Python) 内で instanceID を取得

        :
        instances = ec2.describe_instances(
                      Filters=[{'Name':'tag:Name','Values':[ec2_tag_prefix+environid]},
                        {'Name': 'instance-state-name', 'Values': ['running']}
                      ]
                    )
        :
      
  • Dashboard 表示用 Lambda function を呼び出す仕組み

    • Lambda function を呼び出す方法はいくつかありますが、結論から申し上げると上記のケースの場合は次の 1) の方法を実装します

      1)cloud-init & aws lambda コマンドで Lambda function を呼び出す

      • EC2 インスタンスが生成される際に実行される cloud-init から aws lambda invoke コマンドを実行

        例: AWS lambda コマンドの実行方法

         :
        UserData:
         Fn::Base64:
           Fn::Sub: |
              :
             aws lambda invoke --invocation-type RequestResponse --function-name ${GetStackOutput.UpdateCWDashboardLambdaName} \
             --region ${AWS::Region} --log-type Tail \
             --payload '{"EnvironmentIdentifier":"${EnvironmentIdentifier}","LoadBalancerFullName":"${LoadBalancer.LoadBalancerFullName}"}' \
             lamdainvoke_output.txt
              :
        

      2)CloudWatch Events

      • EC2 インスタンスが running となった際に Lambda を呼び出すことは可能

        ※但し、今回のケースについては下記列挙した理由により不採用

        • Staging or Production 環境等なのか等々、カスタマイズされた情報を CloudWatch Event から Lambda に引き渡すことができない
        • Autoscaling によるインスタンスの増減は CodePipeline に関係なく発生するため、トリガーとしては不適切

なお、Dashboard 全部を API 経由で作成してしまうと、Lambda function が削除されても 作成した Dashboard は残り続けるため、Dashboard の枠組み作成は CFn で作成します。 これにより、該当の CFn 削除を削除すると Dashboard も連動して削除されます。

Dashboard の完成

前述したような CFn と Lambda Function により次の CloudWatch Dashboard を作成することができます。

(自動化された)CloudWatch Dashoard の例

最後に

上記に記載された具体例は当社 Ignite CI/CD の DevSecOps カタログで実装しています。 ご興味ある方はIgnite ホームページからご利用ください。

補足

  • 2018 年 11 月から Dashboardのテンプレート提供が開始されました(CloudWatch Automatic Dashboard)。

    これにより、ほしいと思うものに近いテンプレートを選択し、カスタマイズすることで Dashboard の作成が容易になりましたが、カスタマイズ等は手動で実施する必要がります。

以上

results matching ""

    No results matching ""