AWS DevOps Agent (Preview)のマルチアカウントアクセスをやってみた #AWSreInvent

AWS DevOps Agent (Preview)のマルチアカウントアクセスをやってみた #AWSreInvent

2025.12.03

こんにちは。たかやまです。

re:Invent2025 でリリースされた AWS DevOps Agent(Preview)がリリースされましたね

すでに AWS DevOps Agent については弊社ブログでも以下の記事が出ています。

https://dev.classmethod.jp/articles/aws-devops-agent-25/
https://dev.classmethod.jp/articles/aws-devops-agent-preview-awsreinvent-troubleshooting/
https://dev.classmethod.jp/articles/aws-devops-agent-test-ec2-alert/

AWS DevOps Agentですが、エージェントの機能を最大化させるために以下の機能(Capabilitie)が追加できます。
各機能について紹介しているブログのリンクを貼っているのでこちらも参考にしてください。

機能カテゴリ 説明 参考ブログ
AWS EKS アクセス設定 パブリックとプライベート両方の EKS 環境で、Kubernetes クラスター、ポッドログ、クラスターイベントの検査を有効化する AWS DevOps Agent (Preview)のEKSアクセス設定をやってみた
CI/CD パイプライン統合 GitHub と GitLab パイプラインを接続してデプロイメントをインシデントと関連付け、調査中のコード変更を追跡する AWS DevOps AgentがどこまでCDKの設定ミスを特定してくれるのか試してみた
MCP サーバー接続 Model Context Protocol を通じて外部の可観測性ツールおよびカスタム監視システムを接続して、調査機能を拡張する AWS DevOps AgentがどこまでCDKの設定ミスを特定してくれるのか試してみた
マルチアカウントAWSアクセス インシデント対応中に組織全体のリソースを調査するためにセカンダリ AWS アカウントを設定する AWS DevOps Agent (Preview)のマルチアカウントアクセスをやってみた
テレメトリーソース統合 Datadog、New Relic、Splunk などの監視プラットフォームを接続して、包括的な可観測性データへのアクセスを実現する AWS DevOps Agent(Preview)の Datadog MCP サーバ連携をやってみた
チケティングおよびチャット統合 ServiceNow、PagerDuty、Slack を接続してインシデント対応ワークフローを自動化し、チーム コラボレーションを実現する こちらのブログ
Webhook 設定 外部システムが HTTP リクエストを通じて DevOps Agent の調査を自動的にトリガーできるようにする AWS DevOps Agent (Preview)のPagerDuty連携とWebhook設定をやってみようとした

Configuring capabilities for AWS DevOps Agent - AWS DevOps Agent

今回はこのDevOps Agentで複数のAWSアカウントを横断して調査できるマルチアカウント機能を設定し、実際にセカンダリアカウントのLambdaエラーを調査してみました。

やってみる

前提条件

  • AWS DevOps Agentがセットアップ済みであること(プライマリアカウント)
  • セカンダリアカウントへのアクセス権限があること

DevOps Agentの初期設定

まずはプライマリアカウントでDevOps Agentの初期設定を行います。

初期設定画面から基本情報を入力してエージェントを作成します。

CleanShot 2025-12-03 at 13.12.24@2x.png

作成が完了すると、DevOps Agentのダッシュボードが表示されます。

CleanShot 2025-12-03 at 17.13.43@2x.png

セカンダリアカウントの設定

ここからがマルチアカウント設定の本題です。

「Capabilities」タブから、「Cloud」セクションを開きます。「Secondary Sources」に「Add source」ボタンがあるのでクリックします。

CleanShot 2025-12-03 at 22.50.23@2x.png

すると、セカンダリソースで作成するべきIAMロールの情報が表示されます。この情報をもとにセカンダリアカウント側でIAMロールを作成します。

CleanShot 2025-12-03 at 22.53.44@2x.png

セカンダリアカウントでのIAMロール作成

セカンダリアカウントに切り替えて、画面に表示された情報をもとにIAMロールを作成します。

IAMロール名はプライマリソースで表示されていたIAMロール名と一致される必要があります。

CleanShot 2025-12-03 at 22.58.39@2x.png

プライマリアカウントでの連携設定

プライマリアカウントに戻って、セカンダリアカウントのアカウントIDを入力し紐付けを行います。

セカンダリアカウントに接続するためにAssumeRole用のポリシーをプライマリアカウント側のIAMロールに追加する必要があります。

IAMロールにAssumeRole用のポリシーを追加するのが面倒な場合は、IAMロール自動更新するオプションが用意されているのでそちらを利用すると便利です。

CleanShot 2025-12-03 at 23.01.37@2x.png

設定が問題なければ、セカンダリアカウントのアカウントIDが表示され、連携が完了します。

CleanShot 2025-12-03 at 23.09.10@2x.png

テスト障害用のリソースデプロイ

鈴木のブログにてテストオプションAを試していたので、こちらではテストオプションBの「Lambda error rate test」を試してみます。

セカンダリアカウントで、DevOps Agentのテスト用にエラーを意図的に発生させるLambda関数をデプロイします。

CloudFormationテンプレートの作成

以下のCloudFormationテンプレートを作成します。このテンプレートは、エラーを意図的に発生させるLambda関数とそのエラーを検知するCloudWatchアラームを作成します。

CloudFormationテンプレート(AWS-AIDevOps-lambda-test.yaml)
AWSTemplateFormatVersion: '2010-09-09'
Description: 'AWS AIDevOps Lambda Error Test Stack'

Resources:
  # IAM Role for Lambda function
  LambdaExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: AWS-AIDevOpsLambdaTestRole
      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
      Tags:
        - Key: Name
          Value: AWS-AIDevOps-Lambda-Test-Role
        - Key: Purpose
          Value: AWS-AIDevOps-Testing

  # Lambda function that generates errors
  TestLambdaFunction:
    Type: AWS::Lambda::Function
    Properties:
      FunctionName: AWS-AIDevOps-test-lambda
      Runtime: python3.12
      Handler: index.lambda_handler
      Role: !GetAtt LambdaExecutionRole.Arn
      Code:
        ZipFile: |
          import json
          import random
          import time
          from datetime import datetime

          def lambda_handler(event, context):
              print(f"AWS AIDevOps Test Lambda - {datetime.now()}")
              print(f"Event: {json.dumps(event)}")

              # Intentionally generate errors for testing
              error_scenarios = [
                  "Simulated database connection timeout",
                  "Test API rate limit exceeded",
                  "Intentional validation error for AWS AIDevOps testing"
              ]

              # Always throw an error for testing purposes
              error_message = random.choice(error_scenarios)
              print(f"Generating test error: {error_message}")

              # This will create a Lambda error that CloudWatch will detect
              raise Exception(f"AWS AIDevOps Test Error: {error_message}")
      Description: AWS AIDevOps beta test function - intentionally generates errors
      Timeout: 30
      Tags:
        - Key: Name
          Value: AWS-AIDevOps-Test-Lambda
        - Key: Purpose
          Value: AWS-AIDevOps-Testing

  # CloudWatch Alarm for Lambda errors
  LambdaErrorAlarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmName: AWS-AIDevOps-Lambda-Error-Test
      AlarmDescription: AWS-AIDevOps beta test - Lambda error rate alarm
      MetricName: Errors
      Namespace: AWS/Lambda
      Statistic: Sum
      Period: 60
      EvaluationPeriods: 1
      Threshold: 0
      ComparisonOperator: GreaterThanThreshold
      Dimensions:
        - Name: FunctionName
          Value: !Ref TestLambdaFunction
      TreatMissingData: notBreaching

Outputs:
  LambdaFunctionName:
    Description: Lambda Function Name for testing
    Value: !Ref TestLambdaFunction

  LambdaFunctionArn:
    Description: Lambda Function ARN
    Value: !GetAtt TestLambdaFunction.Arn

  AlarmName:
    Description: CloudWatch Alarm Name
    Value: !Ref LambdaErrorAlarm

  TestCommand:
    Description: AWS CLI command to test the function
    Value: !Sub 'aws lambda invoke --function-name ${TestLambdaFunction} --payload "{\"test\":\"AWS AIDevOps validation\"}" response.json'

スタックのデプロイ

CloudFormationテンプレートをデプロイします。

aws cloudformation deploy --stack-name AWS-AIDevOps-Lambda-Test \
--template-file AWS-AIDevOps-lambda-test.yaml \
--capabilities CAPABILITY_NAMED_IAM \
--region us-east-1

Lambda関数のテスト実行

デプロイが完了したら、Lambda関数を実行してエラーを発生させます。

aws lambda invoke \
  --function-name AWS-AIDevOps-test-lambda \
  --cli-binary-format raw-in-base64-out \
  --payload '{"test": "AWS AIDevOps validation", "timestamp": "2024-01-01T00:00:00Z"}' \
  --region us-east-1 \
  /dev/stdout | jq .

実行結果は以下の通りです。意図的にエラーが発生していることが確認できます。

{
  "errorMessage": "AWS AIDevOps Test Error: Test API rate limit exceeded",
  "errorType": "Exception",
  "requestId": "0efdd918-9026-4f27-ab89-ddffbe73f82a",
  "stackTrace": [
    "  File \"/var/task/index.py\", line 22, in lambda_handler\n    raise Exception(f\"AWS AIDevOps Test Error: {error_message}\")\n"
  ]
}
{
  "StatusCode": 200,
  "FunctionError": "Unhandled",
  "ExecutedVersion": "$LATEST"
}

CloudWatchアラームの確認

CloudWatchコンソールでアラームを確認すると、無事アラート状態になっています。

CleanShot 2025-12-03 at 17.34.55@2x.png

DevOps Agentでの調査

DevOps Agentを使ってセカンダリアカウントのエラーを調査してみます。

調査の開始

CloudWatchアラームの詳細画面から「Operator access」をクリックします。

CleanShot 2025-12-03 at 17.38.14@2x.png

「Start Investigation」をクリックして、DevOps Agentの調査を開始します。

CleanShot 2025-12-03 at 17.39.21@2x.png

調査内容の入力

「Start an investigation」フォームが開くので、以下の情報を入力します。

Field Input
Investigation details Error occurred in Lambda function "AWS-AIDevOps-test-lambda". Purpose: identify root cause and verify logs
Investigation starting point CloudWatch Alarm "AWS-AIDevOps-Lambda-Error-Test" (ALARM state)
Date and time of incident 2025-12-03T08:40:06.292Z
Name your investigation Investigation 2025-12-03T08:40:06.292Z
AWS Account ID セカンダリアカウントのアカウントIDを入力
Region us-east-1
Priority Low or Medium (for testing purposes)

重要なのは、AWS Account IDにセカンダリアカウントのIDを指定することです。これにより、DevOps Agentがセカンダリアカウントのリソースに対して調査を実行します。

CleanShot 2025-12-03 at 23.07.32@2x.png

「Start investigating...」ボタンをクリックすると調査が開始されます。

CleanShot 2025-12-03 at 17.47.28@2x.png

調査結果の確認

調査が完了すると「Root cause」が表示されます。今回は調査は10分程度で完了しました。

CleanShot 2025-12-03 at 17.58.04@2x.png

内容を確認すると、Lambda関数が意図的にテストエラーを生成していることが正確に特定されていますね。

Lambda function intentionally generates test errors as designed

The Lambda function 'AWS-AIDevOps-test-lambda' was explicitly designed to generate errors for testing purposes. The function code intentionally raises a Python Exception with the message 'AWS AIDevOps Test Error: Simulated database connection timeout' at line 22 of index.py. The function's description field states it 'intentionally generates errors,' confirming this is expected test behavior. When the function experienced its first-ever invocation at 2025-12-03T08:30:44Z, it executed as designed and threw the intentional exception, which triggered the CloudWatch alarm 'AWS-AIDevOps-Lambda-Error-Test' (configured with threshold > 0.0 to detect any errors). The alarm correctly detected the error and transitioned to ALARM state at 08:31:59Z. This is not a production incident but rather the expected operational behavior of a test Lambda function validating error detection and alarm functionality.

日本語訳すると以下のような内容です。

Lambda関数は設計通り意図的にテストエラーを生成します

Lambda関数「AWS-AIDevOps-test-lambda」は、テスト目的でエラーを生成するよう明示的に設計されています。関数コードはindex.pyの22行目で、メッセージ「AWS AIDevOps Test Error: Simulated database connection timeout」を含むPython例外を意図的に発生させます。関数の説明欄には「意図的にエラーを生成する」と記載されており、これが期待されるテスト動作であることを確認しています。2025-12-03T08:30:44Zに本関数が初めて呼び出された際、設計通り実行され意図的な例外をスローしました。これによりCloudWatchアラーム「AWS-AIDevOps-Lambda-Error-Test」(閾値>0.0で設定され、あらゆるエラーを検知)がトリガーされました。アラームはエラーを正しく検知し、08:31:59ZにALARM状態に移行しました。これは本番環境のインシデントではなく、エラー検出とアラーム機能を検証するテスト用Lambda関数の想定される動作です。

DevOps Agentは、Lambda関数のコード内容、関数の説明、CloudWatchアラームの設定、エラーログの内容など、複数の情報源を統合的に分析して根本原因を特定していることがわかります。

セカンダリアカウントのリソースに対しても、プライマリアカウントと同様の精度で調査が実行されていますね。

最後に

AWS DevOps Agent(Preview)のマルチアカウントアクセス機能を試してみました。

セカンダリアカウント側でIAMロールを作成し、プライマリアカウントから信頼関係を設定することで、複数のAWSアカウントを横断してDevOps Agentが自動調査を実行できることを確認しました。

調査精度も高く、マルチアカウント環境での運用でも活躍しそうです。

まだまだ、エージェントのCapabilityがあるのでいろいろ試してみたいと思います。

このブログがどなたかの参考になれば幸いです。

以上、たかやま(@nyan_kotaroo)でした。

この記事をシェアする

FacebookHatena blogX

関連記事