Amazon Q Developer CLI Agentを試してみた

目次
はじめに
こんにちは、CloudBuildersのsugawaraです。
みなさん、生成AIを活用していますか?正直、自分はあまり活用できていません。ここ最近は生成AIやAIエージェントの技術が急速に進化・普及している中、その波に完全に乗り遅れてしまっています。社内外で話題になるたびに「やばい。。。やらなきゃ。。。」と感じる日々。
そんなとき、Amazon Q DeveloperにAIエージェント機能が追加されたという記事を見て、これを機に試してみようと思いました。今回はAmazon Qの概要とAmazon Q DeveloperのWSL2へのインストール方法、そして実際にAmazon Q Developer CLI Agentを活用してCDKのコードを書いてもらうまでやっていきます。
概要
Amazon Qとは?
Amazon Qとは、AWSが提供する生成AIを活用したAIアシスタントサービスです。自然言語を用いた対話を通して、質問への回答やアカウント内のリソースについての問い合わせ、AWSサービスの仕様確認などが可能です。Microsoft Copilotに対抗するようなサービスと言えますね。
下記の画像のように、Amazon Qはコンソール画面に組み込まれています。ただし、使用可能な言語は英語のみのため、現状では日本語で対話することはできません。日本語対応のアップデートが待ち遠しいですね。

Amazon Qは大まかに2種類に分けられます。
サービス名 | 対象者 |
Amazon Q Developer | 開発者やITプロフェッショナル |
Amazon Q Business | 組織データを活用するビジネスユーザー |
他にも、クラウドコンタクトセンター支援向けのAmazon Q in Amazon Connectや、ビジネスインテリジェンスおよびデータ分析向けAmazon Q in Amazon QuickSightなど、AWSサービスに強く結びついた様々なサービスがあります。
今回はAmazon Q Developerに絞って扱いたいと思います。
Amazon Q Developerとは?
Amazon Q Developerは、AWSが提供する生成AIを活用した開発者向けのコーディングアシスタントです。自然言語での対話を通じて、開発者がAWSリソースを理解し、アプリケーションを構築・運用するのを支援します。発表当初はAmazon CodeWhispererという名前でしたが、現在はAmazon Qに統合されました。
料金プランには、無料利用枠とAmazon Q Developer Proのサブスクリプションの2種類があります。今回は無料版を使っていきます。

Amazon Q Developerの利用には、IDEの拡張機能かCLIの2種類から選べます。前者はVisual Studio Code(VSCode)などのIDEに統合されたものですが、現在はまだ日本語には未対応のようです。一方、後者のCLIはコマンドライン環境で実行するもので、こちらでは日本語が利用可能です。したがって、今回はVSCode拡張機能ではなく、CLIのほうでやってみます。
Amazon Q Developer CLI Agentとは?
Amazon Q Developer CLI Agentとは、Amazon Q Developer CLI 内に導入された最新のエージェントです。CLI Agentの特長は、自然言語による操作とマルチターン対話サポートです。CLI上で英語や日本語などの自然言語を使った指示が可能になり、よりインタラクティブに開発を進めることができるようになりました。また、マルチターン対話に対応しているため、複数の指示を連続して実行できます。
また、CLI Agentはローカルファイルの読み取りや書き込み、AWS リソースへのクエリ、自動デバッグもサポートしています。現在、この基盤にはAmazon BedrockのClaude 3.7 Sonnetが利用されています。
CLI Agentを導入することで、従来 ChatGPTなどの生成AIにコマンドやコードをコピペする手間が省け、ターミナル上で直接操作できるため、開発効率が大幅に向上します。
やってみた
では、実際にAmazon Q Developerをインストールしてみます。インストールできるのはmacOSかLinuxのみであり、Windowsは対応していません。自分はWindowsユーザーのため、今回はWSL2にインストールします。WSL2(Ubuntu 24)やAWS CLI v2はすでにインストールされている前提で進めていきます。
WSL2にAmazon Q インストール
下記のコマンドを実行し、コマンドラインdeb パッケージ用の Amazon Q をインストールします。
$ curl --proto '=https' --tlsv1.2 -sSf https://desktop-release.q.us-east-1.amazonaws.com/latest/amazon-q.deb -o amazon-q.deb
$ sudo apt install -y ./amazon-q.deb
qコマンドを実行すると、Amazon Q CLIでできることが簡易表示されます。

helpコマンドでコマンド全体が確認ができます。サブコマンドのissueでは、GitHubにissueを作成もできるようですね!
$ sugawara@cb-sugawara:~$ q --help-all
USAGE:
q [OPTIONS] [SUBCOMMAND]
Commands:
debug Debug the app
settings Customize appearance & behavior
setup Setup cli components
update Update the Amazon Q application
diagnostic Run diagnostic tests
init Generate the dotfiles for the given shell
theme Get or set theme
issue Create a new Github issue
login Login
logout Logout
whoami Prints details about the current user
user Manage your account
doctor Fix and diagnose common issues
launch Launch the desktop app
quit Quit the desktop app
restart Restart the desktop app
integrations Manage system integrations
translate Natural Language to Shell translation
dashboard Open the dashboard
chat AI assistant in your terminal
inline Inline shell completions
help Print this message or the help of the given
subcommand(s)
Options:
-v, --verbose...
Increase logging verbosity
--help-all
Print help for all subcommands
-h, --help
Print help
-V, --version
Print version
サブコマンドなどを実行するにはログインする必要があるため、q loginコマンドを実行してログインします。今回はBuilder IDを用いた無料版を利用します。Use for Free with Builder IDを選択します。

Open this URLと表示されるので、URLにアクセスします。

AWS Builder IDを持っていない場合には新規作成、持っている場合には下部にあるサインインへ。今回はすでに持っている状態でログインします。
登録済みのメールアドレスで認証を行うと、下記の画面に遷移します。マスクしているコード部分が一致していれば、そのまま確認して続行をクリックします。
こちらも問題なければアクセスを許可をクリックします。
これでAmazon Q Developerへのログインは完了です。
次は環境設定をしていきます。q doctorコマンドを実行すると、PATHに関するエラーが表示されました。エラーに従い、指定された~/.local/binをPATHに含めます。

再度q doctorコマンドを実行してみると、Everything looks good!というメッセージが表示されました。

利用するプロファイルを指定してからchatコマンドを実行します。
$ export AWS_PROFILE=XXXXX
$ q chat
Hi, I'm Amazon Q. Ask me anything.
Things to try
• Fix the build failures in this project.
• List my s3 buckets in us-west-2.
• Write unit tests for my application.
• Help me understand my git status
/acceptall Toggles acceptance prompting for the session.
/profile (Beta) Manage profiles for the chat session
/context (Beta) Manage context files for a profile
/help Show the help dialogue
/quit Quit the application
>
サンプルにもある指定したリージョンのS3バケットのリストを取得するように英語で指示を出してみました。
> List my s3 buckets in ap-northeast-1.
I'll help you list your S3 buckets in the ap-northeast-1 region. Let me run the AWS CLI command for
you.
Use AWS CLI
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Running aws cli command:
Service name: s3api
Operation name: list-buckets
Parameters:
Profile name: default
Region: ap-northeast-1
Label: Listing S3 buckets
Using AWS CLI...
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
🟢 Completed in 1.238s
Here are your S3 buckets in the ap-northeast-1 region:
• cdk-XXXXX-XXXXX-XXXXX-ap-northeast-1 (Created: 2024-12-23)
• cdk-XXXXX-XXXXX-XXXXX-ap-northeast-1 (Created: 2024-12-23)
• cf-XXXXX-XXXXX-ap-northeast-1 (Created: 2024-11-20)
• custom-s3-bucket-20241223 (Created: 2024-12-23)
• XXXXX-s3bucket07682993-vpk72slrikxu (Created: 2024-11-13)
• XXXXX-dev-XXXXX-XXXXX-bucket (Created: 2025-02-15)
These buckets are owned by the account with DisplayName "sugawara".
問題なくAmazon Q DeveloperのCLIが実行できることが確認できました。
ちなみに、Amazon Q for CLIは日本語で指示を出すと日本語で返してくれます。上記と同様にS3バケットの一覧を日本語で求めるてみると、下記のような結果になります。
> 東京リージョンにあるS3バケットの一覧を取得して
S3バケットの一覧を東京リージョン(ap-northeast-1)から取得します。
Use AWS CLI
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Running aws cli command:
Service name: s3api
Operation name: list-buckets
Parameters:
Profile name: default
Region: ap-northeast-1
Label: List S3 buckets in Tokyo region
Using AWS CLI...
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
🟢 Completed in 0.961s
東京リージョン(ap-northeast-1)にある S3 バケットの一覧です:
1. cdk-XXXXX-XXXXX-XXXXX-ap-northeast-1 (Created: 2024-12-23)
2. cdk-XXXXX-XXXXX-XXXXX-ap-northeast-1 (Created: 2024-12-23)
3. cf-XXXXX-XXXXX-ap-northeast-1 (Created: 2024-11-20)
4. custom-s3-bucket-20241223 (Created: 2024-12-23)
5. XXXXX-s3bucket07682993-vpk72slrikxu (Created: 2024-11-13)
6. XXXXX-dev-XXXXX-XXXXX-bucket (Created: 2025-02-15)
バケットの所有者は「sugawara」で、合計6つのバケットが東京リージョンに存在しています。
なお、VSCode拡張機能の場合、
CDKコードの生成
では、実際にAmazon Q DeveloperにCDKのコードを生成してもらいましょう。まずはシンプルなEC2とRDSの構成で指示を出してみます。まずはディレクトリ作成と初期化です。実行するコマンドを示してくれるので、問題がなければyで先に進みます。

実行結果もちゃんと表示してくれます。

次はnpm installコマンドの実行です。こちらも問題なければyを。何度かこのやりとりをして、CDK実行のために必要なディレクトリやファイルなどを適宜作成してくれます。

下記は実際に作成されたディレクトリ構成となります。README.mdまで作成してくれてますね。
bin配下のコードは下記のように生成されました。

続いてlib配下のコードです。
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as ec2 from 'aws-cdk-lib/aws-ec2';
import * as rds from 'aws-cdk-lib/aws-rds';
import * as iam from 'aws-cdk-lib/aws-iam';
export class Ec2RdsStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// VPCの作成
const vpc = new ec2.Vpc(this, 'MyVPC', {
maxAzs: 2, // 2つのアベイラビリティゾーンを使用
natGateways: 1,
subnetConfiguration: [
{
cidrMask: 24,
name: 'public',
subnetType: ec2.SubnetType.PUBLIC,
},
{
cidrMask: 24,
name: 'private',
subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS,
},
{
cidrMask: 24,
name: 'isolated',
subnetType: ec2.SubnetType.PRIVATE_ISOLATED,
}
]
});
// EC2インスタンスのセキュリティグループ
const ec2SecurityGroup = new ec2.SecurityGroup(this, 'EC2SecurityGroup', {
vpc,
description: 'Allow SSH access to EC2 instances',
allowAllOutbound: true,
});
ec2SecurityGroup.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(22), 'Allow SSH access from anywhere');
// RDSのセキュリティグループ
const rdsSecurityGroup = new ec2.SecurityGroup(this, 'RDSSecurityGroup', {
vpc,
description: 'Allow MySQL access from EC2 instances',
allowAllOutbound: true,
});
rdsSecurityGroup.addIngressRule(ec2SecurityGroup, ec2.Port.tcp(3306), 'Allow MySQL access from EC2');
// EC2インスタンスのIAMロール
const ec2Role = new iam.Role(this, 'EC2Role', {
assumedBy: new iam.ServicePrincipal('ec2.amazonaws.com'),
managedPolicies: [
iam.ManagedPolicy.fromAwsManagedPolicyName('AmazonSSMManagedInstanceCore'),
],
});
// EC2インスタンスの作成
const instance = new ec2.Instance(this, 'WebServer', {
vpc,
vpcSubnets: {
subnetType: ec2.SubnetType.PUBLIC,
},
instanceType: ec2.InstanceType.of(ec2.InstanceClass.T3, ec2.InstanceSize.MICRO),
machineImage: ec2.MachineImage.latestAmazonLinux2023(),
securityGroup: ec2SecurityGroup,
role: ec2Role,
keyName: 'my-key-pair', // 既存のキーペア名を指定するか、新しく作成する必要があります
});
// RDS MySQL インスタンスの作成
const dbInstance = new rds.DatabaseInstance(this, 'MyRdsInstance', {
engine: rds.DatabaseInstanceEngine.mysql({
version: rds.MysqlEngineVersion.VER_8_0,
}),
instanceType: ec2.InstanceType.of(ec2.InstanceClass.T3, ec2.InstanceSize.MICRO),
vpc,
vpcSubnets: {
subnetType: ec2.SubnetType.PRIVATE_ISOLATED,
},
securityGroups: [rdsSecurityGroup],
allocatedStorage: 20,
storageType: rds.StorageType.GP2,
databaseName: 'mydb',
credentials: rds.Credentials.fromGeneratedSecret('admin'), // 自動生成されたパスワードを使用
backupRetention: cdk.Duration.days(7),
deleteAutomatedBackups: true,
removalPolicy: cdk.RemovalPolicy.DESTROY, // 注意: 本番環境ではSNAPSHOTを使用することをお勧めします
deletionProtection: false, // 注意: 本番環境ではtrueに設定することをお勧めします
});
// EC2インスタンスのユーザーデータスクリプト
const userData = ec2.UserData.forLinux();
userData.addCommands(
'yum update -y',
'yum install -y mysql',
'echo "RDS endpoint: ' + dbInstance.dbInstanceEndpointAddress + '" > /home/ec2-user/rds-info.txt'
);
instance.addUserData(userData.render());
// 出力
new cdk.CfnOutput(this, 'EC2PublicIP', {
value: instance.instancePublicIp,
description: 'EC2インスタンスのパブリックIP',
});
new cdk.CfnOutput(this, 'RDSEndpoint', {
value: dbInstance.dbInstanceEndpointAddress,
description: 'RDSインスタンスのエンドポイント',
});
new cdk.CfnOutput(this, 'RDSPort', {
value: dbInstance.dbInstanceEndpointPort,
description: 'RDSインスタンスのポート',
});
new cdk.CfnOutput(this, 'SecretName', {
value: dbInstance.secret?.secretName || 'No secret created',
description: 'RDSの認証情報を含むシークレットの名前',
});
}
}
一通り作成し終えたAmazon Q Developerが概要説明をしてくれます。
これでEC2インスタンスとRDS for MySQLを使用したCDKプロジェクトが完成しました。以下に作成した
コードの概要を説明します:
## プロジェクト構造
ec2-rds-cdk/
├── bin/
│ └── ec2-rds-app.ts # CDKアプリケーションのエントリーポイント
├── lib/
│ └── ec2-rds-stack.ts # EC2とRDSリソースを定義するスタック
├── cdk.json # CDK設定ファイル
├── package.json # プロジェクト依存関係
├── tsconfig.json # TypeScript設定
└── README.md # プロジェクト説明
## 主な機能
1. VPC設定:
• パブリック、プライベート、分離サブネットを持つVPC
• 2つのアベイラビリティゾーンにまたがる構成
2. EC2インスタンス:
• Amazon Linux 2023 AMI
• t3.microインスタンスタイプ
• パブリックサブネットに配置
• SSM接続用のIAMロール
• MySQLクライアントがインストール済み
3. RDS MySQL:
• MySQL 8.0
• t3.microインスタンスタイプ
• 分離サブネットに配置
• 自動バックアップ(7日間保持)
• シークレットマネージャーによるパスワード管理
4. セキュリティ設定:
• EC2インスタンス用のセキュリティグループ(SSH接続許可)
• RDS用のセキュリティグループ(EC2からのMySQL接続のみ許可)
## デプロイ方法
プロジェクトをデプロイするには、以下のコマンドを実行します:
bash
cd /home/sugawara/learn/amazon-q-developer/ec2-rds-cdk
npm install
npm run build
cdk bootstrap # 初回のみ必要
cdk deploy
## カスタマイズポイント
1. EC2キーペア: ec2-rds-stack.tsのkeyNameパラメータを、既存のキーペア名に変更するか、新しい
キーペアを作成してください。
2. インスタンスタイプ: 必要に応じてEC2やRDSのインスタンスタイプを変更できます。
3. RDS設定: データベース名、ストレージサイズ、バックアップ保持期間などを調整できます。
4. セキュリティ設定: 本番環境では、より厳格なセキュリティ設定を検討してください。
このCDKコードは、EC2とRDS MySQLを連携させる基本的な環境を構築します。実際の運用では、必要に
応じてさらにカスタマイズすることをお勧めします。
次は冗長化のために、このコードにALBを追加するように指示してみます。すると、修正案を出してくれるのでyで実行してもらいます。再びlib配下のec2-rds-stack.tsを確認すると、AutoScaling GroupやALBが追加されているのがわかります。
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as ec2 from 'aws-cdk-lib/aws-ec2';
import * as rds from 'aws-cdk-lib/aws-rds';
import * as iam from 'aws-cdk-lib/aws-iam';
import * as elbv2 from 'aws-cdk-lib/aws-elasticloadbalancingv2';
import * as autoscaling from 'aws-cdk-lib/aws-autoscaling';
export class Ec2RdsStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// VPCの作成
const vpc = new ec2.Vpc(this, 'MyVPC', {
maxAzs: 2, // 2つのアベイラビリティゾーンを使用
natGateways: 1,
subnetConfiguration: [
{
cidrMask: 24,
name: 'public',
subnetType: ec2.SubnetType.PUBLIC,
},
{
cidrMask: 24,
name: 'private',
subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS,
},
{
cidrMask: 24,
name: 'isolated',
subnetType: ec2.SubnetType.PRIVATE_ISOLATED,
}
]
});
// EC2インスタンスのセキュリティグループ
const ec2SecurityGroup = new ec2.SecurityGroup(this, 'EC2SecurityGroup', {
vpc,
description: 'Allow HTTP and SSH access to EC2 instances',
allowAllOutbound: true,
});
ec2SecurityGroup.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(22), 'Allow SSH access from anywhere');
ec2SecurityGroup.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(80), 'Allow HTTP access from anywhere');
// ALBのセキュリティグループ
const albSecurityGroup = new ec2.SecurityGroup(this, 'ALBSecurityGroup', {
vpc,
description: 'Allow HTTP access to ALB',
allowAllOutbound: true,
});
albSecurityGroup.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(80), 'Allow HTTP access from anywhere');
// RDSのセキュリティグループ
const rdsSecurityGroup = new ec2.SecurityGroup(this, 'RDSSecurityGroup', {
vpc,
description: 'Allow MySQL access from EC2 instances',
allowAllOutbound: true,
});
rdsSecurityGroup.addIngressRule(ec2SecurityGroup, ec2.Port.tcp(3306), 'Allow MySQL access from EC2');
// EC2インスタンスのIAMロール
const ec2Role = new iam.Role(this, 'EC2Role', {
assumedBy: new iam.ServicePrincipal('ec2.amazonaws.com'),
managedPolicies: [
iam.ManagedPolicy.fromAwsManagedPolicyName('AmazonSSMManagedInstanceCore'),
],
});
// RDS MySQL インスタンスの作成
const dbInstance = new rds.DatabaseInstance(this, 'MyRdsInstance', {
engine: rds.DatabaseInstanceEngine.mysql({
version: rds.MysqlEngineVersion.VER_8_0,
}),
instanceType: ec2.InstanceType.of(ec2.InstanceClass.T3, ec2.InstanceSize.MICRO),
vpc,
vpcSubnets: {
subnetType: ec2.SubnetType.PRIVATE_ISOLATED,
},
securityGroups: [rdsSecurityGroup],
allocatedStorage: 20,
storageType: rds.StorageType.GP2,
databaseName: 'mydb',
credentials: rds.Credentials.fromGeneratedSecret('admin'), // 自動生成されたパスワードを使用
backupRetention: cdk.Duration.days(7),
deleteAutomatedBackups: true,
removalPolicy: cdk.RemovalPolicy.DESTROY, // 注意: 本番環境ではSNAPSHOTを使用することをお勧めします
deletionProtection: false, // 注意: 本番環境ではtrueに設定することをお勧めします
});
// EC2インスタンスのユーザーデータスクリプト
const userData = ec2.UserData.forLinux();
userData.addCommands(
'yum update -y',
'yum install -y httpd mysql',
'systemctl start httpd',
'systemctl enable httpd',
'echo "<html><body><h1>Hello from $(hostname -f)</h1><p>RDS endpoint: ' + dbInstance.dbInstanceEndpointAddress + '</p></body></html>" > /var/www/html/index.html',
'echo "RDS endpoint: ' + dbInstance.dbInstanceEndpointAddress + '" > /home/ec2-user/rds-info.txt'
);
// Auto Scaling Groupの作成
const asg = new autoscaling.AutoScalingGroup(this, 'ASG', {
vpc,
instanceType: ec2.InstanceType.of(ec2.InstanceClass.T3, ec2.InstanceSize.MICRO),
machineImage: ec2.MachineImage.latestAmazonLinux2023(),
securityGroup: ec2SecurityGroup,
role: ec2Role,
keyName: 'my-key-pair', // 既存のキーペア名を指定するか、新しく作成する必要があります
desiredCapacity: 2,
minCapacity: 2,
maxCapacity: 4,
vpcSubnets: {
subnetType: ec2.SubnetType.PUBLIC,
},
userData: userData,
});
// ALBの作成
const alb = new elbv2.ApplicationLoadBalancer(this, 'ALB', {
vpc,
internetFacing: true,
securityGroup: albSecurityGroup,
});
// ALBのリスナーとターゲットグループの作成
const listener = alb.addListener('Listener', {
port: 80,
open: true,
});
listener.addTargets('WebTarget', {
port: 80,
targets: [asg],
healthCheck: {
path: '/',
interval: cdk.Duration.seconds(60),
timeout: cdk.Duration.seconds(5),
healthyHttpCodes: '200',
},
});
// Auto Scaling Policyの設定
asg.scaleOnCpuUtilization('CpuScaling', {
targetUtilizationPercent: 70,
cooldown: cdk.Duration.seconds(300),
});
// 出力
new cdk.CfnOutput(this, 'LoadBalancerDNS', {
value: alb.loadBalancerDnsName,
description: 'ALBのDNS名',
});
new cdk.CfnOutput(this, 'RDSEndpoint', {
value: dbInstance.dbInstanceEndpointAddress,
description: 'RDSインスタンスのエンドポイント',
});
new cdk.CfnOutput(this, 'RDSPort', {
value: dbInstance.dbInstanceEndpointPort,
description: 'RDSインスタンスのポート',
});
new cdk.CfnOutput(this, 'SecretName', {
value: dbInstance.secret?.secretName || 'No secret created',
description: 'RDSの認証情報を含むシークレットの名前',
});
}
}
修正完了後は、Amazon Q Developerが修正箇所や新アーキテクチャの特徴をまとめてくれました。
EC2を2台構成に変更し、ALB (Application Load Balancer) を使って冗長化し
たCDKコードを作成しました。以下に主な変更点と新しいアーキテクチャの特徴
を説明します。
## 主な変更点
1. 個別のEC2インスタンスから Auto Scaling Group へ変更:
• 固定の2台のEC2インスタンスではなく、Auto Scaling Group (ASG) を使
用
• 最小2台、最大4台のインスタンスを設定
• 複数のアベイラビリティゾーンにまたがるデプロイ
2. Application Load Balancer (ALB) の追加:
• インターネット向けのALBを設定
• EC2インスタンスへのトラフィック分散
• ヘルスチェックによる自動障害検出
3. セキュリティグループの拡張:
• EC2インスタンス用のセキュリティグループにHTTPトラフィック(ポート80
)を許可
• ALB専用のセキュリティグループを追加
4. スケーリングポリシーの設定:
• CPU使用率に基づく自動スケーリング(70%を超えると新しいインスタンス
を追加)
## 新しいアーキテクチャの特徴
### 高可用性
• 複数のアベイラビリティゾーンにまたがるEC2インスタンス
• ALBによる負荷分散と障害検出
• 自動スケーリングによる需要変動への対応
### 耐障害性
• 1台のEC2インスタンスが停止しても、サービスは継続
• ヘルスチェックによる異常インスタンスの自動検出と切り離し
### スケーラビリティ
• CPU使用率に基づく自動スケーリング
• 最小2台から最大4台までのキャパシティ調整
### ユーザーエクスペリエンス
• 各EC2インスタンスにはホスト名を表示するシンプルなWebページを設定
• RDSエンドポイント情報も表示
## デプロイ方法
プロジェクトをデプロイするには、以下のコマンドを実行します:
bash
cd /home/sugawara/learn/amazon-q-developer/ec2-rds-cdk
npm install
npm run build
cdk bootstrap # 初回のみ必要
cdk deploy
デプロイが完了すると、ALBのDNS名が出力されます。このDNS名をブラウザで開
くと、負荷分散されたEC2インスタンスのいずれかにアクセスできます。
## カスタマイズポイント
1. インスタンス数の調整: Auto Scaling GroupのdesiredCapacity、
minCapacity、maxCapacityを変更することで、EC2インスタンスの数を調整でき
ます。
2. スケーリングポリシーの調整: targetUtilizationPercentやcooldownを変更
することで、スケーリングの挙動を調整できます。
3. ヘルスチェック設定: intervalやtimeoutを変更することで、ヘルスチェック
の頻度や判定基準を調整できます。
この冗長化されたアーキテクチャにより、単一障害点を排除し、より高い可用
性と耐障害性を実現できます。
最後に、リファクタリングをしてみます。現状はEC2、RDS、ALBはすべてlib配下に1ファイルで記述されているため、リソースごとに分割してもらいます。リソースごとに修正案を出してくれるので、さらっと修正内容を見つつひたすらyを押していきます。
最終的には下記のようなディレクトリ構成となりました。
ec2-rds-stack.tsを確認してみると、constructsディレクトリから各リソースを呼び出すように修正されていますね。
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import { VpcConstruct } from './constructs/vpc-construct';
import { SecurityGroupsConstruct } from './constructs/security-groups-construct';
import { RdsConstruct } from './constructs/rds-construct';
import { Ec2Construct } from './constructs/ec2-construct';
import { AlbConstruct } from './constructs/alb-construct';
export class Ec2RdsStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// VPCの作成
const vpcConstruct = new VpcConstruct(this, 'VpcResources');
// セキュリティグループの作成
const securityGroupsConstruct = new SecurityGroupsConstruct(this, 'SecurityGroupResources', {
vpc: vpcConstruct.vpc,
});
// RDSの作成
const rdsConstruct = new RdsConstruct(this, 'RdsResources', {
vpc: vpcConstruct.vpc,
securityGroup: securityGroupsConstruct.rdsSecurityGroup,
});
// EC2の作成
const ec2Construct = new Ec2Construct(this, 'Ec2Resources', {
vpc: vpcConstruct.vpc,
securityGroup: securityGroupsConstruct.ec2SecurityGroup,
dbInstance: rdsConstruct.dbInstance,
});
// ALBの作成
const albConstruct = new AlbConstruct(this, 'AlbResources', {
vpc: vpcConstruct.vpc,
securityGroup: securityGroupsConstruct.albSecurityGroup,
autoScalingGroup: ec2Construct.autoScalingGroup,
});
}
}
今回も修正内容などについて報告してくれています。
AWSリソースごとにファイルを分割し、モジュール化したCDKプロジェクトを作成しました。この構造により、コー
ドの保守性と再利用性が大幅に向上します。
## リファクタリングの概要
元のコードを以下のように分割しました:
1. VPC (vpc-construct.ts)
• VPCとサブネット構成を管理
2. セキュリティグループ (security-groups-construct.ts)
• EC2、ALB、RDS用のセキュリティグループを定義
3. RDS (rds-construct.ts)
• MySQLデータベースインスタンスの設定
4. EC2 (ec2-construct.ts)
• Auto Scaling Group、IAMロール、ユーザーデータの設定
5. ALB (alb-construct.ts)
• ロードバランサー、リスナー、ターゲットグループの設定
6. メインスタック (ec2-rds-stack.ts)
• 各コンストラクトを組み合わせてスタックを構成
## モジュール化の利点
### 1. コードの整理と可読性
各リソースタイプが独自のファイルに分離されているため、コードが整理され、理解しやすくなっています。
### 2. 責任の分離
各モジュールは特定の責任を持ち、単一責任の原則に従っています。
### 3. 再利用性
各コンストラクトは独立しており、他のプロジェクトで再利用できます。例えば、同じVPC構成を別のスタックで
使用することが可能です。
### 4. 保守性の向上
特定のリソースに変更が必要な場合、そのモジュールだけを修正すればよく、他のコードに影響を与えません。
### 5. テスト容易性
各モジュールを個別にテストできるため、テストが容易になります。
## 依存関係の管理
各コンストラクトは必要な依存関係を明示的にプロパティとして受け取ります:
typescript
export interface Ec2ConstructProps {
vpc: ec2.Vpc;
securityGroup: ec2.SecurityGroup;
dbInstance: rds.DatabaseInstance;
}
これにより、依存関係が明確になり、コンポーネント間の関係が理解しやすくなります。
## メインスタックの簡素化
メインスタック(ec2-rds-stack.ts)は、各コンストラクトをインスタンス化して接続するだけのシンプルなコー
ドになりました:
typescript
// VPCの作成
const vpcConstruct = new VpcConstruct(this, 'VpcResources');
// セキュリティグループの作成
const securityGroupsConstruct = new SecurityGroupsConstruct(this, 'SecurityGroupResources', {
vpc: vpcConstruct.vpc,
});
// 以下同様...
## 使用方法
このモジュール化されたプロジェクトは、元のプロジェクトと同じように使用できます:
bash
cd /home/sugawara/learn/amazon-q-developer/ec2-rds-cdk
npm install
npm run build
cdk deploy
## カスタマイズの容易さ
この構造では、特定のリソースの設定を変更したい場合、対応するコンストラクトファイルだけを修正すればよい
ため、カスタマイズが容易です。例えば、RDSのインスタンスタイプを変更したい場合は、rds-construct.tsだけ
を修正します。
このモジュール化されたアプローチにより、コードの品質と保守性が向上し、将来の拡張も容易になります。
Amazon Q Developer CLI AgentにシンプルなWeb三層構造のCDKコードを書いてもらい、さらにはリファクタリングまでしてもらいました。インストールなどの設定後は、自分は指示文を書いてyを押すだけでここまでできました。AIエージェントは本当に強力ですね。
※ここまでのCDKコードを実際にcdk deployをして確認することはしていません!
参考資料
- Amazon Q Developer, now generally available, includes previews of new capabilities to reimagine developer experience
- Amazon Q Developer CLI での超高速な新しいエージェント型のコーディング体験
- A lightning fast, new agentic coding experience within the Amazon Q Developer CLI(上記記事の英語版)
- Amazon Q Developer とは?
- Amazon Q for command line を WSL で試す
- Amazon Q DeveloperのCLI エージェントを検証
おわりに
今回はAmazon Q Developer CLI Agentを試してみました。指示を出すだけでコーディングからリファクタリングまですべてをやってくれるAIエージェント。活用する側としてはとっても心強い味方ですが、IaCなどのコードを書くのが好きだった自分としてはちょっと複雑な心境です。。。
とはいえ、AIエージェントも万能ではないため、生成されたコードのすべてを鵜呑みにすることはせず、活用していきたいと思います!