AWS DevOps AgentがどこまでCDKの設定ミスを特定してくれるのか試してみた #AWSreInvent

AWS DevOps AgentがどこまでCDKの設定ミスを特定してくれるのか試してみた #AWSreInvent

問題のあるCDKコード上の問題を特定してくれた!まさにDevOps!
2025.12.05

re:Invent 2025のキーノートで AWS DevOps Agent のプレビューが発表されました。
DevelopersIOもたいへん盛り上がっております!

https://dev.classmethod.jp/articles/aws-devops-agent-25/

https://dev.classmethod.jp/articles/reinvent2025-report-cop362/

https://dev.classmethod.jp/articles/aws-devops-agent-datadog-mcp-connect/

https://dev.classmethod.jp/articles/aws-devops-agent-preview-pagerduty-webhook-integration/

https://dev.classmethod.jp/articles/aws-devops-agent-slack-integration/

https://dev.classmethod.jp/articles/aws-devops-agent-preview-awsreinvent-troubleshooting/

この子の力を最大化するために、問題があったら原因となったリリースを特定させて、コードまで分析させられないかと試してみました。

前提となるアプリケーション

以下のような単純なアプリケーションを想定します。

1分ごとのlambda起動 → DynamoDBに書き込み

それだけです。

import * as cdk from "aws-cdk-lib";
import * as dynamodb from "aws-cdk-lib/aws-dynamodb";
import * as events from "aws-cdk-lib/aws-events";
import * as targets from "aws-cdk-lib/aws-events-targets";
import * as nodejs from "aws-cdk-lib/aws-lambda-nodejs";

const app = new cdk.App();
const stack = new cdk.Stack(app, "PlayDevopsAgentsStack", {
	env: {
		region: "us-east-1",
	},
});

// DynamoDB Tableを用意して
const table = new dynamodb.TableV2(stack, "Table", {
	partitionKey: { name: "pk", type: dynamodb.AttributeType.STRING },
	sortKey: { name: "sk", type: dynamodb.AttributeType.STRING },
	removalPolicy: cdk.RemovalPolicy.DESTROY,
});

// Tableにデータを書き込むLambdaを用意して
const fn = new nodejs.NodejsFunction(stack, "Function", {
	environment: {
		TABLE_NAME: table.tableName,
	},
});
table.grantReadWriteData(fn);

// Lambdaを定期実行する
const rule = new events.Rule(stack, "Rule", {
	schedule: events.Schedule.rate(cdk.Duration.minutes(1)),
});
rule.addTarget(new targets.LambdaFunction(fn));

// Lambdaのエラーにアラームをセット
fn.metricErrors().createAlarm(stack, "FunctionErrorAlarm", {
	threshold: 1,
	evaluationPeriods: 1,
});

Lambdaの中身は、適当な値でDynamoDBに書き込むだけの簡単なものです。

import { DynamoDBClient } from "@aws-sdk/client-dynamodb";
import { DynamoDBDocument } from "@aws-sdk/lib-dynamodb";

const client = new DynamoDBClient({});
const doc = DynamoDBDocument.from(client);

const TABLE_NAME = process.env.TABLE_NAME;

export const handler = async () => {
	await doc.put({
		TableName: TABLE_NAME,
		Item: {
			pk: "1",
			sk: new Date().toISOString(),
			val: Math.random() * 100,
		},
	});
};

エラーを起こしてみる

AWS DevOps Agentのspaceを作成してから、Lambdaの権限を剥奪してエラーを起こしてみます。
以下のコードをコメントアウトします。
Agentにはぜひこの差分(コメントアウト)を特定してほしい。。。

// Lambdaから書き込み権限を剥奪
// table.grantReadWriteData(fn);

CDKをデプロイすると想定通りCloudWatch Alarmが鳴りはじめました。

スクリーンショット 2025-12-04 10.05.18

AWS DevOps Agentに調査を依頼する

Agentに調査開始を依頼します。
(ここ自動にならないのかな。。。)

スクリーンショット 2025-12-04 9.57.55

以下が調査結果です。

スクリーンショット 2025-12-04 10.30.33

意訳:

Lambda関数がDynamoDB Tableに書き込もうとしてAccessDeniedExceptionエラーになりました。
このLambda関数のロールはdynamodb:PutItemを実行する権限を持っていません。
17:42-17:43Z にインフラがデプロイされたけど、この権限は付与されていなかった。
DynamoDBへの書き込みが不要だった8分間は成功してたけど、書き込みが始まってからは失敗するようになった。

関数は最初から書き込みを行っていて、権限がなくなったことによりエラーが始まったので、分析が間違ってますね 🤔
コード差分を理解できるようになればもっと正確な分析が行えるはず。

Migration Planも考えてもらいましたが、提案されたのはCLIを用いて権限を付与するというものでした。

aws iam put-role-policy ...

もっと正しく分析してほしい。具体的な修正を出してほしい。

Pipelineを設定して、リリースを特定させる

Agentが問題のあったリリースとそれ以前のリリースを特定できるように、DevOps AgentのPipelineを設定します。

この機能はGitHubやGitLabと連携してあげることで、ワークフローを確認できるようにする機能です。

https://docs.aws.amazon.com/devopsagent/latest/userguide/configuring-capabilities-connecting-ci-cd-pipelines-index.html

PipelineはAWS DevOps Agentのコンソール → Agent Spaceを選択 → Capabilitiesタブ → Pipelineセクションから追加できます。

スクリーンショット 2025-12-04 11.21.43

スクリーンショット 2025-12-04 11.22.24

スクリーンショット 2025-12-04 11.23.49

GitHub Actionでのデプロイもセットアップしていざ。

一度CDKを正しい状態に戻してデプロイし、再度コメントアウトしてエラーを発生させます。

// 今一度、Lambdaから書き込み権限を剥奪
// table.grantReadWriteData(fn);

AWS DevOps Agentに調査を依頼する v2

CloudWatch Alarmが鳴ったのを確認してから、Start Investigationしました。

スクリーンショット 2025-12-04 12.20.58

意訳:

Lambda関数はdynamodb:PutItemしようとしてAccessDeniedExceptionエラーになりました。原因は実行roleに必要な権限が足りなかったからです。
この権限欠落はCloudFormationデプロイによって引き起こされました。19:36:26Zにpolicyを削除しています。

ここでもCDKとかGitHub Actionsの話はでてきませんね。
修正案を提案させてみます。

スクリーンショット 2025-12-04 12.28.56

おお!GitHub Actionに言及してくれています!

意訳:

Lambdaが落ち始める前のIAMの状態に戻すべく、ワークフローを再デプロイしましょう
GitHub repository https://github.com/yamatatsu/play-devops-agents に遷移 → Actions → Deploy workflow → 前回うまく動いてたときの実行 → 'Re-run all jobs'をクリックしてロールバックを実行 → 成功するのを眺める → CloudFormationがUPDATE_COMPLETEになるのを待つ

リポジトリも特定してくれていますね 👀
実行ジョブまで特定してくれてもよかったのにな。。。

MCPとRunBookを設定する

まだまだ、これではプロダクト利用可能とは言えません。
AWS CDKの思想は「クラウドにデプロイされるものはコードリポジトリの完全な断面。ロールバックするならリポジトリのコードをロールバックするのだ」なので、過去jobの再デプロイではなくコードの修正を提案してほしいところです。

そのためにまずはgithub-mcp-serverを設定して、Agentが詳しくコードの変更を分析できるようにしてみました。
(Pipelineを設定した時点でできるように鳴っているのかもしれない。。別途実験します。)

MCP ServerはAWS DevOps Agentのコンソール → Agent Spaceを選択 → Capabilitiesタブ → MCP Serverセクションから追加できます。

スクリーンショット 2025-12-04 14.26.29

スクリーンショット 2025-12-04 14.18.10

スクリーンショット 2025-12-04 14.18.25

スクリーンショット 2025-12-04 14.20.39

加えてRunBookも設定してみます。
RunBookは今までの設定とは異なり、AWS DevOps AgentのWebApp(正式名称はなんだろう。。)から設定できます。

スクリーンショット 2025-12-04 14.33.32

スクリーンショット 2025-12-04 14.33.47

設定したRunBookはGitHubにコミットしてあります。

AWS DevOps Agentに調査を依頼する v3

同じ手順で再度エラーを発生させてから、AWS DevOps Agentに調査させました。

結果はこちら
スクリーンショット 2025-12-04 15.12.25

意訳:

CloudFormationによってLambdaの権限なくなったから起きた

RunBookは使ってくれなかったようです。。。いちおうMigration Planを考えてもらいました。

スクリーンショット 2025-12-04 15.15.13

意訳:

直ちに実行できる運用上の緩和措置は特定できません。
根本原因とCloudFormationテンプレートの分析により、これはロールバック可能なデプロイメントではなく、既存のInfrastructure as Code構成の欠陥であることが判明しました。
Lambda関数は、2025-12-04T19:19:11Zに、DynamoDBテーブルへの書き込みを試みるコードと共にデプロイされましたが、CloudFormationテンプレートには必要なIAM権限が含まれていませんでした。
この設定ギャップは、ソースのCloudFormation/CDKテンプレート自体に存在します。Lambda関数のデプロイをロールバックしても、最初のデプロイ時のIAMロール設定が不十分だったため、問題は解決しません。
この問題を解決するには、Infrastructure-as-Codeテンプレートを更新し、Lambda実行ロールにDynamoDB権限を追加した上で、スタックを再デプロイする必要があります。
これは、即時の運用ロールバックや設定調整ではなく、コード変更と開発作業です。

おお!?急に良くなってるぞ?RunBookが読み込まれた感じがしますね!
でも調査段階で使ってくれていればコード分析もしっかりできたのでは。。。?

AWS DevOps Agentに調査を依頼する v4

調査段階でRunBookを使ってくれないものかと公式ページを調べると、どうやらチャット欄から「RunBookを使って再調査してくれ」って依頼できるようです。

https://docs.aws.amazon.com/devopsagent/latest/userguide/userguide-devops-agent-runbooks.html

依頼してみました。

スクリーンショット 2025-12-04 15.25.27

調査してくれそう!

スクリーンショット 2025-12-04 15.25.47

MCP Server使って調査してる!

スクリーンショット 2025-12-04 15.27.07

きたあぁぁーーーー!!

スクリーンショット 2025-12-04 15.34.16

意訳:

CDK codeのgrantのとこがコメントアウトされてるよ
根本原因はpackages/cdk/src/app.tsです。26行目のtable.grantReadWriteData(fn);がコメントアウトされてます。
これはLambda関数にDynamoDBテーブルのread&write権限を付与するコードです。コメントアウトすると権限がなくなりAccessDeniedExceptionエラーが発生するようになります。

完全に正解です!💯

これでAWS障害発生時にAWS DevOps Agentが勝手にコード上の主原因を見つけてくれる夢に近づきました!

まとめ

今回はAWS DevOps AgentとGitHubを連携させて、コード上のミスを特定させることに成功しました。
ゆくゆくは、夜中に問題が発生しても朝には修正PRが出されているような世界にぜひともたどり着きたいものです。

そのためにもまず、CloudWatch Alarmから自動的に調査を開始してくれないと。。。
そしてChatで依頼されなくてもRunBookを引き当てて調査してくれないと。。。
引き続きやりかたを調べてみます。

以上でした!

この記事をシェアする

FacebookHatena blogX

関連記事