CloudFormationを使って DevOps Guru (タグで分析対象を指定) を有効化する

CloudFormationを使って DevOps Guru (タグで分析対象を指定) を有効化する

Clock Icon2025.01.17

はじめに

DevOps Guru は 機械学習を用いた「アプリケーション運用で役立つサービス」です。

https://aws.amazon.com/jp/devops-guru/

アプリケーションの運用上の問題を自動で特定して、 パフォーマンスや可用性を改善するための推奨事項を提案してくれます。 サポートされているリソースタイプは25を超えています。 NATゲートウェイやLambda関数、RDSなどがサポートされています。

DevOps Guru の分析対象はカスタマイズ可能です。以下4通りが存在します。

分析するリソース 説明
すべてのアカウントリソース すべてのリソースを分析 ※コストに注意
タグ 特定のタグと値が付与されたリソースを分析
CloudFormation スタック CloudFormationスタック単位でリソースを分析
なし 分析しない

今回は "特定のタグと値" をリソースに付与することで、 DevOps Guru による分析をすぐに開始できるようにベースラインを構築してみます。

マルチアカウント環境にてベースラインを作成することを見越して、 CloudFormation テンプレートとして作成します。

補足: SSM QuickSetupからも有効化可能

ちなみにマルチアカウント環境(AWS Organizations)の場合、 以下ドキュメントにあるように Systems Manager(SSM) Quick Setupからも有効化可能です。

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/quick-setup-devops.html

ただし、分析対象の柔軟なカスタマイズが難しく、 「すべてのAWSリソースを分析 or Not」しか選択できません。 そのため、今回は Quick Setup は使わずに展開を進めます。

CloudFormationテンプレートを作ってみる

以下CloudFormation テンプレートを作成しました。

AWSTemplateFormatVersion: "2010-09-09"
Description: "Enable DevOps Guru baseline"
Resources:
  # -----
  # SNS Topic for DevOps Guru
  # -----
  SNSTopic:
    Type: AWS::SNS::Topic
    Properties:
      TopicName: devops-guru-notifications

  # -----
  # DevOps Guru
  # -----
  CollectionByTagKey:
    Type: AWS::DevOpsGuru::ResourceCollection
    Properties:
      ResourceCollectionFilter:
        Tags:
          - AppBoundaryKey: devops-guru-monitoring
            TagValues:
              - "default"

  EnableLogAnomalyDetection:
    # Note: There are no additional cost with log anomaly detection.
    Type: AWS::DevOpsGuru::LogAnomalyDetectionIntegration
    DependsOn: CollectionByTagKey

  NotificationChannel:
    Type: AWS::DevOpsGuru::NotificationChannel
    DependsOn: CollectionByTagKey
    Properties:
      Config:
        Filters:
          MessageTypes:
            - CLOSED_INSIGHT
            - NEW_INSIGHT
            - SEVERITY_UPGRADED
          Severities:
            - HIGH
            - MEDIUM
        Sns:
          TopicArn: !Ref SNSTopic

それぞれのリソースについて説明します。

AWS::DevOpsGuru::ResourceCollection

CollectionByTagKey:
  Type: AWS::DevOpsGuru::ResourceCollection
  Properties:
    ResourceCollectionFilter:
      Tags:
        - AppBoundaryKey: devops-guru-monitoring
          TagValues:
            - "default"

リソース分析の設定です。 devops-guru-monitoring=default タグが付けられた リソースを分析するようにします。

マネジメントコンソールの以下キャプチャです。

sc_2025-01-15_11-51-47_29237

ちなみに TagValues- "*" にすることで 「すべてのアカウントリソース」と解釈されます。 この場合は タグの有無に関わらず全リソースがスキャンされる ためコストに注意してください。

AWS::DevOpsGuru::LogAnomalyDetectionIntegration

EnableLogAnomalyDetection:
  # Note: There are no additional cost with log anomaly detection.
  Type: AWS::DevOpsGuru::LogAnomalyDetectionIntegration
  DependsOn: CollectionByTagKey

ログ異常検出 の設定です。 CloudWatch Logs の情報も活用して、 より高い精度で診断してくれるオプションです。

マネジメントコンソールの以下キャプチャです。 追加コストは掛からないため有効化しています。

sc_2025-01-10_13-30-39_23698

AWS::DevOpsGuru::NotificationChannel(+ SNSトピック)

SNSTopic:
  Type: AWS::SNS::Topic
  Properties:
    TopicName: devops-guru-notifications

# ...

NotificationChannel:
  Type: AWS::DevOpsGuru::NotificationChannel
  DependsOn: CollectionByTagKey
  Properties:
    Config:
      Filters:
        MessageTypes:
          - CLOSED_INSIGHT
          - NEW_INSIGHT
          - SEVERITY_UPGRADED
        Severities:
          - HIGH
          - MEDIUM
      Sns:
        TopicArn: !Ref SNSTopic

通知の設定です。 DevOps Guru からインサイトが生成されたときにSNSトピックへ連携するように設定します。

CloudFormationテンプレートの設定項目は、 マネジメントコンソールの 以下 [設定] > [通知] キャプチャと同じです。

sc_2025-01-10_13-31-02_3496

スタックを展開する

先程のテンプレートをスタックとして展開します。 今回はマルチアカウント環境を想定して CloudFormation StackSets (Service-managed) として展開します。

以下AWS CLIコマンドを実行して、StackSet を作成しました。

TEMPLATE_BODY=./devops-guru-baseline.yaml
STACKSET_NAME="devops-guru-baseline"

# StackSet の作成
aws cloudformation create-stack-set \
  --stack-set-name ${STACKSET_NAME} \
  --description "Enable DevOps Guru baseline" \
  --template-body file://${TEMPLATE_BODY} \
  --permission-model SERVICE_MANAGED \
  --auto-deployment Enabled=true,RetainStacksOnAccountRemoval=false

# Stack instances の作成 (組織内の全メンバーアカウントへ展開する例)
ORG_ROOT=$(aws organizations list-roots --query "Roots[0].Id" --output text)
aws cloudformation create-stack-instances \
  --stack-set-name ${STACKSET_NAME} \
  --deployment-targets OrganizationalUnitIds=${ORG_ROOT} \
  --regions ap-northeast-1

sc_2025-01-17_05-43-36_5755

sc_2025-01-17_05-45-52_11640
展開直後の DevOps Guru ダッシュボード

スタック展開後の運用

リソースにタグを付ける

分析したいリソースにタグを付与して分析を開始します。 本ブログの設定では devops-guru-monitoring=default タグを付与します。

sc_2025-01-17_05-49-13_21108

なお DevOps Guru のコストには2種類あります。 「分析対象となるAWSリソースへの時間あたりの料金」と 「DevOps Guru API 呼び出し料金」の2つです。 詳細は公式ドキュメントを参照ください。

https://aws.amazon.com/jp/devops-guru/pricing/

SNSトピックにサブスクライブを追加する

重要なインサイトに気付けるようにしたい場合は、 SNSトピックにサブスクライブを作成しましょう。

sc_2025-01-17_05-58-33_15801

(マルチアカウント環境の場合)委任管理者アカウントにてインサイトを集約する

Organizationsを利用している場合、生成されたインサイトを アカウント横断で集約できます。 詳細は以下ブログを参照ください。

https://dev.classmethod.jp/articles/organizations-devops-guru-insight/

おわりに

DevOps Guru をすぐに利用開始するためのベースラインを作成してみました。

利用部門では DevOps Guru を活用した パフォーマンス(コスト)最適化 運用を実現していきたいです。 管理部門は DevOps Guru 活用を促進するためのガイドライン作成や、 利用状況の把握に努めたいです。

以上、参考になれば幸いです。

参考

https://docs.aws.amazon.com/ja_jp/devops-guru/latest/userguide/working-with-resource-tags.html

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/AWS_DevOpsGuru.html

https://dev.classmethod.jp/articles/organizations-devops-guru-insight/

補足

CloudFormation StackSet の切り戻し(削除) コマンド

STACKSET_NAME="devops-guru-baseline"

# Stack instances の削除 (組織内の全メンバーアカウントがターゲットの場合)
ORG_ROOT=$(aws organizations list-roots --query "Roots[0].Id" --output text)
aws cloudformation delete-stack-instances \
  --stack-set-name ${STACKSET_NAME} \
  --deployment-targets OrganizationalUnitIds=${ORG_ROOT} \
  --regions ap-northeast-1 \
  --no-retain-stacks

# StackSet の削除
aws cloudformation delete-stack-set \
  --stack-set-name ${STACKSET_NAME}

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.