CloudFormationを使って DevOps Guru (タグで分析対象を指定) を有効化する
はじめに
DevOps Guru は 機械学習を用いた「アプリケーション運用で役立つサービス」です。
アプリケーションの運用上の問題を自動で特定して、 パフォーマンスや可用性を改善するための推奨事項を提案してくれます。 サポートされているリソースタイプは25を超えています。 NATゲートウェイやLambda関数、RDSなどがサポートされています。
DevOps Guru の分析対象はカスタマイズ可能です。以下4通りが存在します。
分析するリソース | 説明 |
---|---|
すべてのアカウントリソース | すべてのリソースを分析 ※コストに注意 |
タグ | 特定のタグと値が付与されたリソースを分析 |
CloudFormation スタック | CloudFormationスタック単位でリソースを分析 |
なし | 分析しない |
今回は "特定のタグと値" をリソースに付与することで、 DevOps Guru による分析をすぐに開始できるようにベースラインを構築してみます。
マルチアカウント環境にてベースラインを作成することを見越して、 CloudFormation テンプレートとして作成します。
補足: SSM QuickSetupからも有効化可能
ちなみにマルチアカウント環境(AWS Organizations)の場合、 以下ドキュメントにあるように Systems Manager(SSM) Quick Setupからも有効化可能です。
ただし、分析対象の柔軟なカスタマイズが難しく、 「すべての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
タグが付けられた リソースを分析するようにします。
マネジメントコンソールの以下キャプチャです。
ちなみに TagValues
を - "*"
にすることで 「すべてのアカウントリソース」と解釈されます。 この場合は タグの有無に関わらず全リソースがスキャンされる ためコストに注意してください。
AWS::DevOpsGuru::LogAnomalyDetectionIntegration
EnableLogAnomalyDetection:
# Note: There are no additional cost with log anomaly detection.
Type: AWS::DevOpsGuru::LogAnomalyDetectionIntegration
DependsOn: CollectionByTagKey
ログ異常検出 の設定です。 CloudWatch Logs の情報も活用して、 より高い精度で診断してくれるオプションです。
マネジメントコンソールの以下キャプチャです。 追加コストは掛からないため有効化しています。
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テンプレートの設定項目は、 マネジメントコンソールの 以下 [設定] > [通知] キャプチャと同じです。
スタックを展開する
先程のテンプレートをスタックとして展開します。 今回はマルチアカウント環境を想定して 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
展開直後の DevOps Guru ダッシュボード
スタック展開後の運用
リソースにタグを付ける
分析したいリソースにタグを付与して分析を開始します。 本ブログの設定では devops-guru-monitoring=default
タグを付与します。
なお DevOps Guru のコストには2種類あります。 「分析対象となるAWSリソースへの時間あたりの料金」と 「DevOps Guru API 呼び出し料金」の2つです。 詳細は公式ドキュメントを参照ください。
SNSトピックにサブスクライブを追加する
重要なインサイトに気付けるようにしたい場合は、 SNSトピックにサブスクライブを作成しましょう。
(マルチアカウント環境の場合)委任管理者アカウントにてインサイトを集約する
Organizationsを利用している場合、生成されたインサイトを アカウント横断で集約できます。 詳細は以下ブログを参照ください。
おわりに
DevOps Guru をすぐに利用開始するためのベースラインを作成してみました。
利用部門では DevOps Guru を活用した パフォーマンス(コスト)最適化 運用を実現していきたいです。 管理部門は DevOps Guru 活用を促進するためのガイドライン作成や、 利用状況の把握に努めたいです。
以上、参考になれば幸いです。
参考
補足
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}