はじめに
AWS DevOps Agent は、2026年3月31日にGA(一般提供)となったサービスです。
CloudWatchアラームなどのインシデントを検知すると、
自動で原因を調査し、復旧手順まで提案してくれます。
今回は公式のテスト環境を使ってEC2にCPU負荷をかけてアラームを発火させ、
DevOps Agentがどう動くかを確認するハンズオンを実施してみました。
料金と対応リージョン
GAリリース後に最初の運用タスクを実行した時点から、2ヶ月間の無料トライアルが開始されます(パブリックプレビュー参加者も対象)。トライアル中の月あたりの上限は以下のとおりです。
| 項目 | 無料枠(月あたり) |
|---|---|
| Agent Space 数 | 最大 10 |
| 調査(Incident Response) | 20 時間 |
| 予防(Evaluations) | 15 時間 |
| チャット(SRE) | 20 時間 |
トライアル終了後は $0.0083/agent-second(約 $29.88/時間)の従量課金です。
対応リージョンは6つで、東京(ap-northeast-1)も含まれています。
このハンズオンでは東京リージョンを使います。
Agent Space を作成する
Agent Space は、DevOps Agent がアクセスできるAWSリソースの範囲を定義する「作業空間」です。
マネジメントコンソールの検索バーで「DevOps Agent」と入力し、サービスを開きます。
Create Agent Space をクリックし、以下を入力します。
| 項目 | 値 |
|---|---|
| Name | my-first-agent-space |
| Description | 任意(空欄でもOK) |
| Agent response language | Japanese (Japan) |
IAM ロールの設定では Auto-create a new AWS DevOps Agent role を選択します。
DevOps Agent がアカウント内のリソースを調査するためのロールが自動作成されます。
続けて「Enable Web App」セクションでも同様に Auto-create を選択し、Submit をクリックします

1〜2分でステータスが「Active」になれば完了です。
Operator access リンクから Web App が開けることを確認しておきます。
テスト環境を構築する
AWS公式のCloudFormationテンプレートを使って、CPU高負荷を発生させるEC2インスタンスを立ち上げます。テンプレートには以下が含まれています。
- EC2インスタンス(t3.micro) -- 起動後にCPUストレスを自動実行
- CloudWatch Alarm -- CPU使用率の閾値超過で発火
- 安全機構 -- 一定時間後に自動シャットダウン
具体的なパラメータ(閾値やタイミング)はテンプレートの版によって異なる場合があるため、公式ドキュメントの記載を確認してください。
コストはFree Tier対象、または約$0.02程度です。
テンプレートは以下の公式ドキュメントからコピーしてください。
今回はテストオプションA:EC2CPU容量テストをしていきます。
しかし公式ドキュメントに載ったCFNテンプレートをそのままデプロイして、
10分ほど待ちましたがCPU負荷が上昇しませんでした。
CFNの中身を確認すると諸々足りなそうだったので、下記のように修正しました。
今回はこちらを使っていきます。
修正したCFNテンプレート
AWSTemplateFormatVersion: '2010-09-09'
Description: 'AWS DevOps Agent EC2 CPU Test Stack (Fixed)'
Parameters:
MyIP:
Type: String
Description: Your current IP address for SSH access (find at https://whatismyipaddress.com)
Default: '0.0.0.0/0'
Resources:
# -------------------------------------------------------
# IAM Role + Instance Profile for SSM (Session Manager)
# -------------------------------------------------------
TestInstanceRole:
Type: AWS::IAM::Role
Properties:
RoleName: AWS-DevOpsAgent-Test-InstanceRole
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service: ec2.amazonaws.com
Action: sts:AssumeRole
ManagedPolicyArns:
- arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
Tags:
- Key: Name
Value: AWS-DevOpsAgent-Test-InstanceRole
- Key: Purpose
Value: AWS-DevOpsAgent-Testing
TestInstanceProfile:
Type: AWS::IAM::InstanceProfile
Properties:
InstanceProfileName: AWS-DevOpsAgent-Test-InstanceProfile
Roles:
- !Ref TestInstanceRole
# -------------------------------------------------------
# Security Group for SSH access
# -------------------------------------------------------
TestSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupName: AWS-DevOpsAgent-test-sg
GroupDescription: AWS DevOps Agent beta testing security group
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: !Ref MyIP
Description: SSH access from your IP
Tags:
- Key: Name
Value: AWS-DevOpsAgent-Test-SG
- Key: Purpose
Value: AWS-DevOpsAgent-Testing
# -------------------------------------------------------
# Key Pair for SSH access
# -------------------------------------------------------
TestKeyPair:
Type: AWS::EC2::KeyPair
Properties:
KeyName: AWS-DevOpsAgent-test-key
KeyType: rsa
Tags:
- Key: Name
Value: AWS-DevOpsAgent-Test-Key
- Key: Purpose
Value: AWS-DevOpsAgent-Testing
# -------------------------------------------------------
# EC2 Instance for CPU testing
# -------------------------------------------------------
TestInstance:
Type: AWS::EC2::Instance
Properties:
InstanceType: t3.micro
ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64}}'
KeyName: !Ref TestKeyPair
SecurityGroupIds:
- !Ref TestSecurityGroup
IamInstanceProfile: !Ref TestInstanceProfile # FIX: SSM接続に必要
UserData:
Fn::Base64: !Sub |
#!/bin/bash
yum update -y
yum install -y htop
# Create the CPU stress test script
cat > /home/ec2-user/cpu-stress-test.sh << 'EOF'
#!/bin/bash
echo "Starting AWS DevOpsAgent CPU Stress Test"
echo "Time: $(date)"
echo "Instance: $(curl -s http://169.254.169.254/latest/meta-data/instance-id)"
echo ""
# Get number of CPU cores
CORES=$(nproc)
echo "CPU Cores: $CORES"
echo ""
echo "Starting stress test (5 minutes)..."
echo "This will generate >70% CPU usage to trigger CloudWatch alarm"
echo ""
# Create CPU load using yes command
echo "Starting CPU load processes..."
for i in $(seq 1 $CORES); do
(yes > /dev/null) &
CPU_PID=$!
echo "Started CPU load process $i (PID: $CPU_PID)"
echo $CPU_PID >> /tmp/cpu_test_pids
done
# Auto-cleanup after 5 minutes
(sleep 300 && echo "Stopping CPU load processes..." && kill $(cat /tmp/cpu_test_pids 2>/dev/null) 2>/dev/null && rm -f /tmp/cpu_test_pids) &
echo ""
echo "CPU load processes started for 5 minutes"
echo "Check CloudWatch for alarm trigger in 3-5 minutes"
EOF
chmod +x /home/ec2-user/cpu-stress-test.sh
chown ec2-user:ec2-user /home/ec2-user/cpu-stress-test.sh
# Create auto-shutdown script (safety mechanism)
cat > /home/ec2-user/auto-shutdown.sh << 'SHUTDOWN_EOF'
#!/bin/bash
echo "Auto-shutdown scheduled for 2 hours from now: $(date)"
sleep 7200
echo "Auto-shutdown executing at: $(date)"
sudo shutdown -h now
SHUTDOWN_EOF
chmod +x /home/ec2-user/auto-shutdown.sh
nohup /home/ec2-user/auto-shutdown.sh > /home/ec2-user/auto-shutdown.log 2>&1 &
# FIX: 5分後にCPUストレステストを自動実行
(sleep 300 && /home/ec2-user/cpu-stress-test.sh > /home/ec2-user/stress-test.log 2>&1) &
echo "AWS DevOpsAgent test setup completed at $(date)" > /home/ec2-user/setup-complete.txt
Tags:
- Key: Name
Value: AWS-DevOpsAgent-Test-Instance
- Key: Purpose
Value: AWS-DevOpsAgent-Testing
# -------------------------------------------------------
# CloudWatch Alarm for CPU utilization
# -------------------------------------------------------
CPUAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmName: AWS-DevOpsAgent-EC2-CPU-Test
AlarmDescription: AWS-DevOpsAgent beta test - EC2 CPU utilization alarm
MetricName: CPUUtilization
Namespace: AWS/EC2
Statistic: Average
Period: 60
EvaluationPeriods: 1
Threshold: 70
ComparisonOperator: GreaterThanThreshold
Dimensions:
- Name: InstanceId
Value: !Ref TestInstance
TreatMissingData: notBreaching
Outputs:
InstanceId:
Description: EC2 Instance ID for testing
Value: !Ref TestInstance
SecurityGroupId:
Description: Security Group ID
Value: !Ref TestSecurityGroup
AlarmName:
Description: CloudWatch Alarm Name
Value: !Ref CPUAlarm
SSHCommand:
Description: SSH command to connect to instance
Value: !Sub 'ssh -i "AWS-DevOpsAgent-test-key.pem" ec2-user@${TestInstance.PublicDnsName}'
CloudFormationコンソールで Create stack > With new resources (standard) を選択し、修正したテンプレートをアップロードします。
| 項目 | 値 |
|---|---|
| Stack name | AWS-DevOpsAgent-EC2-Test |
| MyIP | デフォルトのまま(SSH全開放になる場合あり。気になる場合は自分のIPに変更) |
あとは Next を進め、最後に I acknowledge that AWS CloudFormation might create IAM resources にチェックを入れて Submit します。
3〜5分でステータスが CREATE_COMPLETE になれば準備完了です。Agent Spaceと同じAWSアカウントにデプロイしてください。
アラーム発火 → 調査開始
EC2インスタンスは起動後、しばらくすると自動でCPUストレステストを開始します。
手動操作は不要です。数分〜10分ほどで、CloudWatch Alarmが In alarm 状態になります。
Web Appを開いて Incident Response タブを確認します。
アラームが発火すると、DevOps Agentが自動で調査を開始します。
公式ドキュメントでは上記のように説明があるものの、
私の環境では自動で調査が開始されなかったため、今回は調査を開始を自分でクリックしました。
(あえて今回は何の指示も与えませんでした。)
調査結果には以下の情報が表示されます。
| 項目 | 内容 |
|---|---|
| Investigation Journal | 調査の時系列ログ。何をどの順で調べたかがわかる |
| Root Cause Analysis | 根本原因の特定結果 |
| Topology | 関連リソースの依存関係マップ |
| Mitigation Steps | 推奨される復旧手順 |
CloudFormationで管理されたリソースは自動的にトポロジーとして認識され、関連リソースを紐付けて調査してくれます。人間がやると数十分かかる初動調査を、数分で終わらせているのは本当に便利だなと思いました。
クリーンアップ
テスト完了後はリソースを削除します。
CloudFormationコンソールで AWS-DevOpsAgent-EC2-Test を選択し、Delete をクリックします。
ステータスが DELETE_COMPLETE になれば完了です。
Agent Spaceは無料トライアル期間中なら残しておいても課金されません。不要なら同様に削除してください。
まとめ
AWS DevOps Agentを使って、EC2のCPU高負荷インシデントを自動調査させる一連の流れを実施しました。
根本原因の特定や復旧手順の提案まで自動で行ってくれるので、インシデント対応の初動を大幅に短縮できる可能性を感じました。
他にもいろいろな機能があるので試してみたいと思います。









