9
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

アラーム発生時の初動対応をDevOps Agentに任せてみた

Last updated at Posted at 2025-12-15

はじめに

Amazon DevOps Agentとは?

Amazon DevOps Agentは、インシデントを解決、予防し、信頼性とパフォーマンスを継続的に向上させるフロンティアエージェント ※1 です。

従来は運用担当者が手動でやっていたような以下の作業を、AIが代行してくれます。

  • CloudWatch Logsの確認
  • 各種AWSサービスの設定状況確認
  • メトリクスの分析
  • 根本原因の特定
  • 解決策の提案

※1【フロンティアエージェントとは】
目標を達成するために独立して動作し、同時実行タスクに対応するために大規模にスケールして、人間の介入なしで数時間または数日間にわたって持続的に動作する自律システムです。

https://aws.amazon.com/jp/ai/frontier-agents/

対象読者

  • Amazon DevOps Agent使ったことがない方
  • AWSの基本的なサービス(Lambda・EventBridge・SNS)を触ったことがある
  • 障害調査を効率化したい方

今回検証する障害シナリオ

本記事では、よくある『Lambdaのメモリ不足エラー』を再現し、DevOps Agentがどのように原因を特定するかを検証します。

【アーキテクチャ図】
image.png

以下のYamlをCloudFormationスタックとして作成して、検証しています。
AWSTemplateFormatVersion: '2010-09-09'
Description: 'Production Data Analytics Pipeline'

Parameters:
  NotificationEmail:
    Type: String
    Default: 'xxxxxxxxx'
    Description: 'Email address for alarm notifications'

Resources:
  DataAnalyzerRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: data-analyzer-lambda-role
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service: lambda.amazonaws.com
            Action: 'sts:AssumeRole'
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

  DataAnalyzerFunction:
    Type: AWS::Lambda::Function
    Properties:
      FunctionName: DataAnalyzer
      Runtime: python3.12
      Handler: index.lambda_handler
      Role: !GetAtt DataAnalyzerRole.Arn
      Timeout: 30
      MemorySize: 128
      Code:
        ZipFile: |
          import json
          
          def lambda_handler(event, context):
              print("Starting data analysis...")
              
              data_records = []
              
              for i in range(5000000):
                  record = {
                      'user_id': f'user_{i}',
                      'action': 'click' if i % 3 == 0 else 'view',
                      'timestamp': i,
                      'metadata': 'x' * 200
                  }
                  data_records.append(record)
                  
                  if i % 100000 == 0:
                      print(f"Processed {i} records, Memory usage increasing...")
              
              total_clicks = sum(1 for r in data_records if r['action'] == 'click')
              total_views = len(data_records) - total_clicks
              
              result = {
                  'total_records': len(data_records),
                  'total_clicks': total_clicks,
                  'total_views': total_views
              }
              
              print(f"Analysis complete: {result}")
              
              return {
                  'statusCode': 200,
                  'body': json.dumps(result)
              }

  AnalyzerSchedule:
    Type: AWS::Events::Rule
    Properties:
      Name: data-analyzer-schedule
      ScheduleExpression: 'rate(5 minutes)'
      State: ENABLED
      Targets:
        - Arn: !GetAtt DataAnalyzerFunction.Arn
          Id: DataAnalyzerTarget

  SchedulePermission:
    Type: AWS::Lambda::Permission
    Properties:
      FunctionName: !Ref DataAnalyzerFunction
      Action: lambda:InvokeFunction
      Principal: events.amazonaws.com
      SourceArn: !GetAtt AnalyzerSchedule.Arn

  DataAnalyzerLogGroup:
    Type: AWS::Logs::LogGroup
    Properties:
      LogGroupName: !Sub '/aws/lambda/${DataAnalyzerFunction}'
      RetentionInDays: 7

  AlertTopic:
    Type: AWS::SNS::Topic
    Properties:
      TopicName: production-analytics-alerts
      DisplayName: 'Production Analytics Alerts'
      Subscription:
        - Endpoint: !Ref NotificationEmail
          Protocol: email

  DataAnalyzerErrorAlarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmName: DataAnalyzer-Errors
      AlarmDescription: 'Data analyzer function is experiencing errors'
      MetricName: Errors
      Namespace: AWS/Lambda
      Statistic: Sum
      Period: 60
      EvaluationPeriods: 1
      Threshold: 1
      ComparisonOperator: GreaterThanOrEqualToThreshold
      Dimensions:
        - Name: FunctionName
          Value: !Ref DataAnalyzerFunction
      AlarmActions:
        - !Ref AlertTopic
      TreatMissingData: notBreaching

Outputs:
  LambdaFunctionName:
    Description: 'Lambda Function Name'
    Value: !Ref DataAnalyzerFunction
    Export:
      Name: !Sub '${AWS::StackName}-FunctionName'

  CloudWatchAlarmName:
    Description: 'CloudWatch Alarm Name'
    Value: !Ref DataAnalyzerErrorAlarm
    Export:
      Name: !Sub '${AWS::StackName}-AlarmName'

  SNSTopicArn:
    Description: 'SNS Topic ARN'
    Value: !Ref AlertTopic
    Export:
      Name: !Sub '${AWS::StackName}-SNSTopicArn'
      

実際にアラーム原因をDevOps Agentに調査させてみる

  • コンソールの検索窓で、『DevOps Agent』と調べた後、『Begin setup』ボタンを押下する
    01_devOps最初の画面.png

  • 『オペレーターアクセス』ボタンを押下する
    02_オペレーションアクセス.png

  • 調査内容を英語で入力して、『Start Investigation』ボタンを押下する
    ※この時、英語で入力することと、対象アラームのリージョンを指定しないと、
     バージニア北部だけで調査をしてしまうので、注意が必要です。
    ※また、ここではChromeの拡張機能で日本語に翻訳した画面を貼っていますが、実際はまだプレビュー段階のサービスのため、英語でしか使えません。(2025年12月15日現在)
    05_調査内容03.png

  • 調査結果が、簡単なものだと5分くらいで表示されます。
     ※長いので、間は割愛します。
    06_調査結果02.png
    06_調査結果02のコピー.png

  • 『緩和計画』タブに移動すると、今後どんな対応が必要なのか、細かくステップに分かれて記載してくれます。
     個人的には、今後の対応中で費用がどれくらい増えるのかも明記してくれているのが、とても便利だと思いました。
    06_調査結果03.png

まとめ

DevOps Agentを使うメリット

今回の検証を通じて、以下のメリットを実感しました

  1. 調査時間の大幅短縮
    • 手動なら30分以上かかる可能性もある調査が数分で完了
    • 今までAIにコピペでログを渡していた作業がなくなり、質問するだけで原因と今後の対応方法がわかるようになった
  2. 初心者でもプロ並みの調査ができる
    • 複数のAWSサービスを横断的に分析してくれるため、初学者が見落としがちなポイントも指摘してくれる
  3. 具体的な解決策の提案
    • 単に原因を教えるだけでなく、修正方法まで提案してくれる
9
1
0

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
9
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?