- 公開日
- 最終更新日
【Amazon EC2】Kiro IDE サーバー構築ハンズオン
この記事を共有する
目次
パーソル&サーバーワークスの印鑰です。
AWSを中心としたクラウドインフラの設計・構築・運用を担当しています。 エージェント開発にも注力しているエンジニアです。
このハンズオンで学べること
このハンズオンでは、Amazon EC2 上に Windows Server 2025 の開発環境を自動構築し、Kiro IDE を利用する一連の流れを体験できます。
| 学べること | 内容 |
|---|---|
| AWS CloudFormation によるIaC実践 | Amazon VPC、AWS IAM、Amazon EC2 リソースを統合管理し、再現可能な環境を構築 |
| Amazon EC2 での開発環境自動構築 | AWS CloudFormation の UserData で Python、Node.js、Git、AWS CLI、VS Code、uv を一括セットアップ。日本語化も自動で実施 |
どんな人向け?
- Kiro IDEを試してみたい方。Amazon EC2 上に自由な開発環境を用意し、Kiro IDE を試せます。
- AWS マネジメントコンソールの基本操作ができて、Windows操作の基礎がわかる方なら大丈夫です。
- AWS CloudFormation の知識があるとさらに楽しめますが、なくてもバッチファイルの実行で進められます。
1.概要
このシステムのポイントは次のとおりです。
| 特徴 | 説明 |
|---|---|
| Kiro IDE on EC2 | ローカル環境の制約に関係なく、Amazon EC2 上のWindows Server 2025 で Kiro IDE を自由に利用できる開発環境を提供 |
| IaCによる自動構築 | AWS CloudFormation で Amazon VPC・AWS IAM・Amazon EC2 を統合管理し、再現性の高いインフラ自動構築を実現 |
| 自動セットアップ | Python(Ver3.13)、Node.js、Git、AWS CLI、VS Code、Google Chrome、uv を UserData で一括インストール。日本語化も自動で実施し、すぐに開発作業を開始できる |
| セキュアアクセス | AWS Systems Manager Session Manager ポートフォワーディング経由でリモートデスクトップ接続。リモートデスクトップ ポートをインターネットに公開せず、安全にアクセス |
| バッチファイルによるデプロイ | deploy.batを実行するだけで、基盤スタックとEC2インスタンススタックを順番にデプロイ。パスワード生成や SSM Agent 待機も自動化 |
補足: Kiro IDE 環境をクラウド側に構築することで、インストール権限の問題などを気にせず、最新の開発ツールが利用可能です。
2.システムアーキテクチャ
全体構成図

3.前提条件
ハンズオンをはじめる前に、以下をお読みください。
所要時間
- 約 2 時間 45 分
- 構築作業:約 70 分(UserData の実行に時間がかかります)
- 動作確認:約 80 分(Specモード にて開発する場合に時間がかかります)
- 環境削除:約 15 分
必要な権限
以下の権限が必要です。
- AWS CLI が利用できること(認証設定済み)
- AWS CloudFormation スタックをデプロイできること
- Amazon EC2、AWS IAM を操作できること
必要な契約
- Kiro Free プランでも問題ありません。わたしは AWS IAM Identity Center 経由で Pro プランを契約していますので、本ハンズオンではその環境に準じた手順をご説明します。
リージョン
東京リージョン(ap-northeast-1) にリソースを作成してください。
開発環境
ローカルPC に以下がインストール・設定済みであることをご確認してください。
- Windows 11
- AWS CLI(認証設定済み)
- Session Manager Plugin
費用について
このハンズオンの費用の目安は、東京リージョン(t3.medium、3時間利用)で AWS 利用料が約 1 USD、Kiro のクレジット消費が約 50〜150 クレジットです。
大事なポイント: 作業が終わったら、必ず環境削除の手順を実行してください。そのままにしておくと課金が続きます。また、為替やログ量、リージョン価格差で変動します。また、Kiro にて開発や修正するとその分の Kiro のクレジット消費が発生します。
4.構築手順
さあ、ここからが構築をはじめます。一緒に作っていきましょう。
ステップ一覧
- ファイルの準備
- AMI IDの確認
- バッチファイルの設定確認
- デプロイの実行
ステップ1: ファイルの準備
以下の3つのファイルをローカルPC の同じフォルダに配置してください。
1-1. 基盤スタックテンプレート
ec2-kiro-base-stack.yaml という名前のファイルを作って、以下の内容をコピー&ペーストしてください。
ここを押すと展開します
AWSTemplateFormatVersion: '2010-09-09'
Description: 'Base stack: VPC, IAM, KeyPair'
Parameters:
Environment:
Type: String
Default: dev
ProjectId:
Type: String
Default: '001'
ProjectInfix:
Type: String
Default: 'kiro-ide'
VpcCidr:
Type: String
Default: '10.0.0.0/16'
PublicSubnetCidr:
Type: String
Default: '10.0.1.0/24'
Metadata:
AWS::CloudFormation::Interface:
ParameterGroups:
-
Label:
default: Stack Configuration
Parameters:
- Environment
- ProjectId
- ProjectInfix
-
Label:
default: Network Configuration
Parameters:
- VpcCidr
- PublicSubnetCidr
Resources:
VPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: !Ref VpcCidr
EnableDnsHostnames: true
EnableDnsSupport: true
Tags:
- Key: Name
Value: !Sub '${Environment}-${ProjectId}-${ProjectInfix}-vpc'
InternetGateway:
Type: AWS::EC2::InternetGateway
AttachGateway:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
VpcId: !Ref VPC
InternetGatewayId: !Ref InternetGateway
PublicSubnet:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
CidrBlock: !Ref PublicSubnetCidr
AvailabilityZone: !Select [0, !GetAZs '']
MapPublicIpOnLaunch: true
Tags:
- Key: Name
Value: !Sub '${Environment}-${ProjectId}-${ProjectInfix}-public-subnet'
PublicRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref VPC
PublicRoute:
Type: AWS::EC2::Route
DependsOn: AttachGateway
Properties:
RouteTableId: !Ref PublicRouteTable
DestinationCidrBlock: '0.0.0.0/0'
GatewayId: !Ref InternetGateway
PublicSubnetRouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PublicSubnet
RouteTableId: !Ref PublicRouteTable
EC2SecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: 'Security Group for SSM-only'
VpcId: !Ref VPC
SecurityGroupEgress:
- IpProtocol: tcp
FromPort: 443
ToPort: 443
CidrIp: '0.0.0.0/0'
Description: 'Allow HTTPS outbound for SSM and AWS services'
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: '0.0.0.0/0'
Description: 'Allow HTTP outbound for package downloads'
- IpProtocol: tcp
FromPort: 53
ToPort: 53
CidrIp: '0.0.0.0/0'
Description: 'Allow DNS TCP queries'
- IpProtocol: udp
FromPort: 53
ToPort: 53
CidrIp: '0.0.0.0/0'
Description: 'Allow DNS UDP queries'
- IpProtocol: tcp
FromPort: 123
ToPort: 123
CidrIp: '0.0.0.0/0'
Description: 'Allow NTP for time synchronization'
- IpProtocol: udp
FromPort: 123
ToPort: 123
CidrIp: '0.0.0.0/0'
Description: 'Allow NTP UDP for time synchronization'
EC2KeyPair:
Type: AWS::EC2::KeyPair
Properties:
KeyName: !Sub '${Environment}-${ProjectId}-${ProjectInfix}-ec2-keypair'
KeyType: rsa
KeyFormat: pem
EC2Role:
Type: AWS::IAM::Role
Properties:
RoleName: !Sub '${Environment}-${ProjectId}-${ProjectInfix}-ec2-ssm-rl'
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: Environment
Value: !Ref Environment
- Key: ProjectId
Value: !Ref ProjectId
EC2AWSMCPPolicy:
Type: AWS::IAM::Policy
Properties:
PolicyName: !Sub '${Environment}-${ProjectId}-${ProjectInfix}-ec2-awsmcp-pl'
Roles:
- !Ref EC2Role
PolicyDocument:
Version: "2012-10-17"
Statement:
- Sid: AllowAWSMCPAccess
Effect: Allow
Action:
- aws-mcp:InvokeMcp
- aws-mcp:CallReadOnlyTool
- aws-mcp:CallReadWriteTool
Resource:
- "*"
EC2InstanceProfile:
Type: AWS::IAM::InstanceProfile
Properties:
InstanceProfileName: !Sub '${Environment}-${ProjectId}-${ProjectInfix}-ec2-instance-profile'
Roles:
- !Ref EC2Role
Outputs:
PublicSubnetId:
Value: !Ref PublicSubnet
Export:
Name: !Sub '${Environment}-${ProjectId}-${ProjectInfix}-public-subnet-id'
SecurityGroupId:
Value: !Ref EC2SecurityGroup
Export:
Name: !Sub '${Environment}-${ProjectId}-${ProjectInfix}-ec2-sg-id'
EC2InstanceProfile:
Value: !Ref EC2InstanceProfile
Export:
Name: !Sub '${Environment}-${ProjectId}-${ProjectInfix}-ec2-instance-profile-name'
KeyPairName:
Value: !Ref EC2KeyPair
Export:
Name: !Sub '${Environment}-${ProjectId}-${ProjectInfix}-ec2-keypair-name'
1-2. Amazon EC2 インスタンススタックテンプレート
ec2-kiro-ide-instance-stack.yaml という名前のファイルを作って、以下の内容をコピー&ペーストしてください。
ここを押すと展開します
AWSTemplateFormatVersion: '2010-09-09'
Description: 'EC2 instance stack'
Parameters:
Environment:
Type: String
Default: dev
ProjectId:
Type: String
Default: '001'
ProjectInfix:
Type: String
Default: 'kiro-ide'
InstanceIndex:
Type: String
Default: '01'
Description: Instance Index
InstanceType:
Type: String
Default: t3.medium
AllowedValues: [ t3.micro, t3.small, t3.medium, t3.large ]
ImageId:
Type: String
AllowedPattern: "^ami-[0-9a-f]{17}$"
Description: Windows Server 2025 AMI ID
EbsVolumeSize:
Type: Number
Default: 40
MinValue: 30
MaxValue: 100
RdpUserPassword:
Type: String
NoEcho: true
Description: Password for rdpuser (generated by deploy script)
Metadata:
AWS::CloudFormation::Interface:
ParameterGroups:
-
Label:
default: Stack Configuration
Parameters:
- Environment
- ProjectId
- ProjectInfix
-
Label:
default: EC2 Configuration
Parameters:
- InstanceIndex
- InstanceType
- ImageId
- EbsVolumeSize
-
Label:
default: OS Configuration
Parameters:
- RdpUserPassword
Resources:
RdpUserPasswordParameter:
Type: AWS::SSM::Parameter
Properties:
Name: !Sub '/${Environment}/${ProjectId}/${ProjectInfix}/${InstanceIndex}/windows-server/rdpuser-password'
Type: String
Value: !Ref RdpUserPassword
Description: 'RDP user password for Windows Server'
Tags:
Environment: !Ref Environment
ProjectId: !Ref ProjectId
EC2Instance:
Type: AWS::EC2::Instance
Properties:
ImageId: !Ref ImageId
InstanceType: !Ref InstanceType
KeyName:
Fn::ImportValue: !Sub '${Environment}-${ProjectId}-${ProjectInfix}-ec2-keypair-name'
IamInstanceProfile:
Fn::ImportValue: !Sub '${Environment}-${ProjectId}-${ProjectInfix}-ec2-instance-profile-name'
NetworkInterfaces:
- AssociatePublicIpAddress: true
DeviceIndex: 0
GroupSet:
- Fn::ImportValue: !Sub '${Environment}-${ProjectId}-${ProjectInfix}-ec2-sg-id'
SubnetId:
Fn::ImportValue: !Sub '${Environment}-${ProjectId}-${ProjectInfix}-public-subnet-id'
BlockDeviceMappings:
- DeviceName: /dev/sda1
Ebs:
VolumeSize: !Ref EbsVolumeSize
VolumeType: gp3
DeleteOnTermination: true
Encrypted: true
UserData:
Fn::Base64: !Sub |
<powershell>
# ============================================================
# UserData Bootstrap Script for Windows Server 2025
# ============================================================
# This script runs once at first boot under the SYSTEM account.
# It performs the following tasks:
# 1. Set timezone to JST (Tokyo Standard Time)
# 2. Create an RDP user with administrator privileges
# 3. Enable and configure Remote Desktop connections
# 4. Install Chocolatey package manager and development tools
# 5. Install Japanese language pack and configure locale
# 6. Register a RunOnce script for per-user locale finalization
# and Windows Update enablement
# 7. Reboot to apply language settings
#
# Log file: C:\Windows\Temp\UserData.log
# ============================================================
Start-Transcript -Path "C:\Windows\Temp\UserData.log" -Append
Write-Output "UserData script started: $(Get-Date)"
# ----------------------------------------------------------
# Execution Policy
# ----------------------------------------------------------
# Allow all scripts to run in this session without restriction.
# This is required because the default policy on Windows Server
# may block unsigned scripts downloaded from the internet.
Set-ExecutionPolicy Bypass -Scope Process -Force
# ----------------------------------------------------------
# Timezone Configuration
# ----------------------------------------------------------
# Set the system timezone to Japan Standard Time (UTC+09:00).
Write-Output "Setting timezone to Tokyo Standard Time..."
Set-TimeZone -Id "Tokyo Standard Time"
Write-Output "Timezone set to: $(Get-TimeZone)"
# ----------------------------------------------------------
# RDP User Creation
# ----------------------------------------------------------
# Create a dedicated local user "rdpuser" for Remote Desktop access.
# The password is passed from the CloudFormation parameter and also
# stored in SSM Parameter Store for later retrieval.
# The user is added to Administrators, Remote Desktop Users, and
# Users groups to allow full RDP access with admin privileges.
$RdpUserPasswordPlain = "${RdpUserPassword}"
Write-Output "Using passwords from CloudFormation parameters"
$RdpUserPasswordSecure = ConvertTo-SecureString $RdpUserPasswordPlain -AsPlainText -Force
try {
$existingRdpUser = Get-LocalUser -Name "rdpuser" -ErrorAction SilentlyContinue
if ($existingRdpUser) {
Write-Output "RDP user already exists, updating password..."
Set-LocalUser -Name "rdpuser" -Password $RdpUserPasswordSecure
} else {
Write-Output "Creating new RDP user..."
New-LocalUser -Name "rdpuser" -Password $RdpUserPasswordSecure -FullName "RDP User" -Description "RDP Access User with Administrator privileges" -PasswordNeverExpires
}
Add-LocalGroupMember -Group "Remote Desktop Users" -Member "rdpuser" -ErrorAction SilentlyContinue
Add-LocalGroupMember -Group "Users" -Member "rdpuser" -ErrorAction SilentlyContinue
Add-LocalGroupMember -Group "Administrators" -Member "rdpuser" -ErrorAction SilentlyContinue
Write-Output "RDP user configured successfully with administrator privileges and RDP access"
} catch {
Write-Output "RDP user creation/update failed: $_"
}
# ----------------------------------------------------------
# Remote Desktop Protocol (RDP) Configuration
# ----------------------------------------------------------
# Enable RDP connections by setting fDenyTSConnections to 0,
# open the Windows Firewall rules for RDP (port 3389), and
# explicitly set the RDP listening port.
# Firewall rules are matched by Name pattern instead of
# DisplayGroup to avoid dependency on the OS display language.
Write-Output "Configuring RDP settings..."
Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server' -Name "fDenyTSConnections" -Value 0
Get-NetFirewallRule -Name "RemoteDesktop-*" | Enable-NetFirewallRule
# Set RDP listening port to the default 3389
Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name "PortNumber" -Value 3389
# Disable automatic logon for security hardening
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon' -Name "AutoAdminLogon" -Value "0"
# ----------------------------------------------------------
# Windows Update
# ----------------------------------------------------------
# AWS AMI has Windows Update disabled by default.
# It will be enabled via RunOnce after first RDP login.
Write-Output "RDP and security configuration completed"
# ----------------------------------------------------------
# Chocolatey Package Manager Installation
# ----------------------------------------------------------
# Install Chocolatey, a Windows package manager, to automate
# the installation of development tools. TLS 1.2 is enforced
# for secure download of the installer script.
Write-Output "Installing Chocolatey package manager..."
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072
try {
Invoke-Expression ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
Write-Output "Chocolatey installed successfully"
} catch {
Write-Output "Chocolatey installation failed: $_"
}
# Reload system PATH after Chocolatey installation so that
# the 'choco' command is available in the current session.
$machinePath = [System.Environment]::GetEnvironmentVariable("Path","Machine")
$userPath = [System.Environment]::GetEnvironmentVariable("Path","User")
$env:Path = $machinePath + ";" + $userPath
# ----------------------------------------------------------
# Development Tools Installation (via Chocolatey)
# ----------------------------------------------------------
# Each package is installed individually inside its own
# try-catch block so that a single package failure does not
# prevent the remaining packages from being installed.
Write-Output "Installing development tools..."
$chocoPackages = @(
@{ Name = "python3"; Args = "--version=3.13 -y --no-progress" },
@{ Name = "nodejs-lts"; Args = "-y --no-progress" },
@{ Name = "git"; Args = "-y --no-progress" },
@{ Name = "awscli"; Args = "-y --no-progress" },
@{ Name = "vscode"; Args = "-y --no-progress" },
@{ Name = "googlechrome"; Args = "-y --no-progress --ignore-checksums" },
@{ Name = "uv"; Args = "-y --no-progress" }
)
foreach ($pkg in $chocoPackages) {
try {
Write-Output "Installing $($pkg.Name)..."
$expression = "choco install $($pkg.Name) $($pkg.Args)"
Invoke-Expression $expression
Write-Output "$($pkg.Name) installed successfully"
} catch {
Write-Output "$($pkg.Name) installation failed: $_"
}
}
# ----------------------------------------------------------
# Japanese Localization (Phase 1: System-wide defaults)
# ----------------------------------------------------------
# Install the Japanese language pack with -CopyToSettings to
# apply display language, regional format, and locale settings
# system-wide in a single step. Additional cmdlets configure
# the preferred UI language, system locale, home location,
# input method, and copy settings to the welcome screen and
# new user profile template.
# Note: This runs under the SYSTEM account. Per-user settings
# for rdpuser are handled by the RunOnce script in Phase 2.
Write-Output "Installing Japanese language pack with CopyToSettings..."
$maxRetry = 3
$langInstalled = $false
for ($retry = 1; $retry -le $maxRetry; $retry++) {
try {
Write-Output "Install-Language attempt $retry of $maxRetry..."
Install-Language -Language "ja-JP" -CopyToSettings -ErrorAction Stop
$langInstalled = $true
Write-Output "Japanese language pack installed successfully on attempt $retry"
break
} catch {
Write-Output "Install-Language attempt $retry failed: $_"
if ($retry -lt $maxRetry) {
Write-Output "Waiting 30 seconds before retry..."
Start-Sleep -Seconds 30
}
}
}
Write-Output "Installed language packs:"
Get-InstalledLanguage | Out-String | Write-Output
Write-Output "Configuring system-wide Japanese locale settings..."
if ($langInstalled) {
Set-SystemPreferredUILanguage -Language "ja-JP"
} else {
Write-Output "WARNING: Language pack not fully installed. Skipping Set-SystemPreferredUILanguage."
}
Set-WinSystemLocale -SystemLocale "ja-JP"
Set-WinHomeLocation -GeoId 0x7A
Set-WinUILanguageOverride -Language "ja-JP"
Set-WinUserLanguageList -LanguageList ja-JP,en-US -Force
Set-WinDefaultInputMethodOverride -InputTip "0411:00000411"
Copy-UserInternationalSettingsToSystem -WelcomeScreen $true -NewUser $true
Write-Output "System-wide Japanese locale settings configured"
# ----------------------------------------------------------
# Japanese Localization (Phase 2: Per-user RunOnce script)
# ----------------------------------------------------------
# Since UserData runs under the SYSTEM account, per-user
# locale settings (language list, culture, input method) may
# not apply to interactive logon users such as rdpuser.
# This RunOnce script acts as a safety net: it runs once at
# the first interactive logon and applies Japanese locale
# settings in the context of the logged-in user.
# Log file: C:\Windows\Temp\RunOnce-JapaneseLocale.log
$RunOnceScriptPath = "C:\Windows\Temp\ApplyJapaneseLocale.ps1"
@'
Start-Transcript -Path "C:\Windows\Temp\RunOnce-JapaneseLocale.log" -Append
Write-Output "RunOnce Japanese locale configuration started: $(Get-Date)"
Set-WinUserLanguageList -LanguageList ja-JP,en-US -Force
Set-WinHomeLocation -GeoId 0x7A
Set-Culture ja-JP
Set-WinUILanguageOverride -Language "ja-JP"
Set-WinDefaultInputMethodOverride -InputTip "0411:00000411"
Copy-UserInternationalSettingsToSystem -WelcomeScreen $true -NewUser $true
# Enable Windows Update service (disabled by default in AWS AMI)
Write-Output "Enabling Windows Update service..."
Set-Service -Name wuauserv -StartupType Automatic
Start-Service -Name wuauserv
Write-Output "RunOnce Japanese locale configuration completed: $(Get-Date)"
Stop-Transcript
'@ | Out-File -Encoding UTF8 $RunOnceScriptPath
# Register the RunOnce script in HKLM so it executes for
# the first user who logs on interactively after reboot.
Write-Output "Registering RunOnce for Japanese locale finalize..."
reg add "HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce" /v ApplyJapaneseLocale /t REG_SZ /d "powershell -ExecutionPolicy Bypass -File $RunOnceScriptPath" /f
Write-Output "RunOnce registered successfully"
# ----------------------------------------------------------
# Reboot
# ----------------------------------------------------------
# A reboot is required for the Japanese language pack and
# locale changes to take full effect. After reboot, the
# RunOnce script will finalize per-user settings on first logon.
Write-Output "UserData script completed: $(Get-Date)"
Write-Output "System will reboot to apply Japanese language settings..."
Stop-Transcript
Restart-Computer -Force
</powershell>
Tags:
- Key: Name
Value: !Sub '${Environment}-${ProjectId}-${ProjectInfix}-${InstanceIndex}'
- Key: Environment
Value: !Ref Environment
- Key: ProjectId
Value: !Ref ProjectId
1-3. デプロイ用バッチファイル
deploy.bat という名前のファイルを作って、以下の内容をコピー&ペーストしてください。
ここを押すと展開します
@echo off
REM Keep window open: re-launch with cmd /k when double-clicked
if not defined DEPLOY_RUNNING (
set DEPLOY_RUNNING=1
cmd /k "%~f0" %*
exit /b
)
setlocal enabledelayedexpansion
echo Kiro AWS Development Environment Deployment Script
echo ================================================
echo.
echo Note: This deployment uses SSM port forwarding for RDP connections.
echo Direct RDP port (3389) is not exposed to the internet.
echo Note: This script uses the default AWS CLI profile.
echo.
set ENVIRONMENT=dev
set PROJECT_ID=001
set PROJECT_INFIX=kiro-ide
set INSTANCE_INDEX=01
set REGION=ap-northeast-1
set AMI_ID=ami-0ffac53afaf6a405e
REM Stack names
set BASE_STACK_NAME=%ENVIRONMENT%-%PROJECT_ID%-%PROJECT_INFIX%-base
set INSTANCE_STACK_NAME=%ENVIRONMENT%-%PROJECT_ID%-%PROJECT_INFIX%-instance-%INSTANCE_INDEX%
REM Template files
set BASE_TEMPLATE=ec2-kiro-base-stack.yaml
set INSTANCE_TEMPLATE=ec2-kiro-ide-instance-stack.yaml
echo Configuration:
echo - Environment: %ENVIRONMENT%
echo - Project ID: %PROJECT_ID%
echo - Project Infix: %PROJECT_INFIX%
echo - Region: %REGION%
echo - Instance Index: %INSTANCE_INDEX%
echo - AMI ID: %AMI_ID%
echo - Base Stack: %BASE_STACK_NAME%
echo - Instance Stack: %INSTANCE_STACK_NAME%
echo.
pause
echo Testing AWS CLI connection...
aws sts get-caller-identity --region %REGION% >nul 2>&1
if !errorlevel! neq 0 echo AWS CLI connection failed. Please check your credentials. & echo Run: aws sts get-caller-identity --region %REGION% & pause & goto end
echo AWS CLI connection successful
echo.
echo ================================================
echo Starting Staged Deployment
echo ================================================
echo.
REM ================================================
REM Stage 1: Base Stack (VPC, IAM, KeyPair)
REM ================================================
echo Checking Base stack status...
for /f "delims=" %%i in ('aws cloudformation describe-stacks --stack-name %BASE_STACK_NAME% --region %REGION% --query "Stacks[0].StackStatus" --output text 2^>nul') do set BASE_STATUS=%%i
if defined BASE_STATUS (
echo Base stack found. Status: !BASE_STATUS!
if "!BASE_STATUS!"=="CREATE_COMPLETE" (
echo Base stack is ready. Proceeding to Instance deployment...
goto check_instance
)
if "!BASE_STATUS!"=="UPDATE_COMPLETE" (
echo Base stack is ready. Proceeding to Instance deployment...
goto check_instance
)
echo Base stack status: !BASE_STATUS!
echo Please wait for Base stack to complete or check for errors.
pause
goto check_instance
) else (
echo Base stack not found. Starting Base deployment...
goto deploy_base
)
:deploy_base
echo.
echo ================================================
echo Stage 1: Deploying Base Infrastructure
echo ================================================
echo.
echo Ready to deploy Base infrastructure stack.
echo This will create VPC, subnets, security groups, IAM roles, and KeyPair.
echo Press Enter to continue with Base stack deployment...
pause >nul
echo Deploying Base stack...
aws cloudformation create-stack ^
--stack-name %BASE_STACK_NAME% ^
--template-body file://%BASE_TEMPLATE% ^
--parameters ParameterKey=Environment,ParameterValue=%ENVIRONMENT% ParameterKey=ProjectId,ParameterValue=%PROJECT_ID% ParameterKey=ProjectInfix,ParameterValue=%PROJECT_INFIX% ^
--capabilities CAPABILITY_NAMED_IAM ^
--region %REGION%
if !errorlevel! neq 0 echo Base stack deployment failed. Please check the error above. & pause & goto end
echo Waiting for Base stack creation to complete...
aws cloudformation wait stack-create-complete ^
--stack-name %BASE_STACK_NAME% ^
--region %REGION%
if !errorlevel! neq 0 echo Base stack creation failed or timed out. Check CloudFormation console. & pause & goto end
echo Base stack deployment completed successfully.
echo.
REM ================================================
REM Stage 2: Instance Stack (EC2)
REM ================================================
:check_instance
echo Checking Instance stack status...
for /f "delims=" %%i in ('aws cloudformation describe-stacks --stack-name %INSTANCE_STACK_NAME% --region %REGION% --query "Stacks[0].StackStatus" --output text 2^>nul') do set INSTANCE_STATUS=%%i
if defined INSTANCE_STATUS (
echo Instance stack found. Status: !INSTANCE_STATUS!
if "!INSTANCE_STATUS!"=="CREATE_COMPLETE" (
echo Instance is ready. Proceeding to final checks...
goto final_checks
)
if "!INSTANCE_STATUS!"=="UPDATE_COMPLETE" (
echo Instance is ready. Proceeding to final checks...
goto final_checks
)
echo Instance stack status: !INSTANCE_STATUS!
echo Please wait for Instance stack to complete or check for errors.
pause
goto final_checks
) else (
echo Instance stack not found. Starting Instance deployment...
goto deploy_instance
)
:deploy_instance
echo.
echo ================================================
echo Stage 2: Deploying EC2 Instance
echo ================================================
echo.
echo Generating random password for RDP user...
for /f "delims=" %%i in ('powershell -Command "$chars = 'ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789'; $symbols = '!@#%%^*-_=+'; $password = ''; for($i=0; $i -lt 12; $i++) { $password += $chars[(Get-Random -Maximum $chars.Length)] }; for($i=0; $i -lt 4; $i++) { $password += $symbols[(Get-Random -Maximum $symbols.Length)] }; $charArray = $password.ToCharArray(); [System.Random]$rng = New-Object System.Random; for($i=$charArray.Length-1; $i -gt 0; $i--) { $j=$rng.Next($i+1); $tmp=$charArray[$i]; $charArray[$i]=$charArray[$j]; $charArray[$j]=$tmp }; Write-Output (-join $charArray)"') do set RDP_PASSWORD=%%i
echo Password generated successfully.
echo.
echo Password will be stored in SSM Parameter Store:
echo - /%ENVIRONMENT%/%PROJECT_ID%/%PROJECT_INFIX%/%INSTANCE_INDEX%/windows-server/rdpuser-password
echo.
echo Ready to deploy EC2 Instance stack.
echo Press Enter to continue with Instance stack deployment...
pause >nul
echo Deploying Instance stack...
aws cloudformation create-stack ^
--stack-name %INSTANCE_STACK_NAME% ^
--template-body file://%INSTANCE_TEMPLATE% ^
--parameters ParameterKey=Environment,ParameterValue=%ENVIRONMENT% ParameterKey=ProjectId,ParameterValue=%PROJECT_ID% ParameterKey=ProjectInfix,ParameterValue=%PROJECT_INFIX% ParameterKey=InstanceIndex,ParameterValue=%INSTANCE_INDEX% ParameterKey=RdpUserPassword,ParameterValue=%RDP_PASSWORD% ParameterKey=ImageId,ParameterValue=%AMI_ID% ^
--region %REGION%
if !errorlevel! neq 0 echo Instance stack deployment failed. Please check the error above. & pause & goto end
echo Waiting for Instance stack creation to complete...
aws cloudformation wait stack-create-complete ^
--stack-name %INSTANCE_STACK_NAME% ^
--region %REGION%
if !errorlevel! neq 0 echo Instance stack creation failed or timed out. Check CloudFormation console. & pause & goto end
echo Instance stack deployment completed successfully.
echo.
REM ================================================
REM Final Checks and Connection Info
REM ================================================
:final_checks
echo.
echo ================================================
echo Final Deployment Checks
echo ================================================
echo.
echo Getting EC2 instance information...
for /f "delims=" %%i in ('aws cloudformation describe-stack-resources --stack-name %INSTANCE_STACK_NAME% --logical-resource-id EC2Instance --query "StackResources[0].PhysicalResourceId" --output text --region %REGION% 2^>nul') do set INSTANCE_ID=%%i
if not defined INSTANCE_ID (
echo ERROR: Could not retrieve instance ID.
echo Please check if the Instance stack was created successfully.
pause
goto end
)
echo Instance ID: !INSTANCE_ID!
echo.
echo Getting instance details...
aws ec2 describe-instances --instance-ids !INSTANCE_ID! --region %REGION% --query "Reservations[0].Instances[0].[State.Name,PublicIpAddress,PrivateIpAddress]" --output table
echo.
echo ========================================
echo Waiting for SSM Agent to come online
echo ========================================
echo.
set ATTEMPT=0
set MAX_ATTEMPTS=200
set WAIT_SECONDS=30
echo Checking SSM Agent status (max 200 attempts, 30s interval)...
:CHECK_SSM_LOOP
set /a ATTEMPT+=1
if !ATTEMPT! geq !MAX_ATTEMPTS! echo WARNING: SSM Agent did not come online after !MAX_ATTEMPTS! attempts. & goto SHOW_INFO
for /f "tokens=*" %%i in ('aws ssm describe-instance-information --filters "Key=InstanceIds,Values=!INSTANCE_ID!" --query "InstanceInformationList[0].PingStatus" --output text --region %REGION% 2^>nul') do set PING_STATUS=%%i
if "!PING_STATUS!"=="Online" echo SSM Agent is online. & goto SSM_ONLINE
echo Attempt !ATTEMPT!/!MAX_ATTEMPTS! - Status: !PING_STATUS! - Waiting !WAIT_SECONDS!s...
timeout /t !WAIT_SECONDS! /nobreak >nul
goto CHECK_SSM_LOOP
:SSM_ONLINE
echo.
echo ========================================
echo Deployment completed successfully
echo ========================================
echo.
:SHOW_INFO
echo.
echo ========================================
echo Connection Commands
echo ========================================
echo.
echo Step 1: Retrieve RDP password
echo aws ssm get-parameter --name "/%ENVIRONMENT%/%PROJECT_ID%/%PROJECT_INFIX%/%INSTANCE_INDEX%/windows-server/rdpuser-password" --with-decryption --query "Parameter.Value" --output text --region %REGION%
echo.
echo Step 2: RDP via SSM port forwarding
echo.
echo [PowerShell]
echo $INSTANCE_ID = "!INSTANCE_ID!"
echo aws ssm start-session --target $INSTANCE_ID --document-name AWS-StartPortForwardingSession --parameters "portNumber=3389,localPortNumber=13389" --region %REGION%
echo.
echo [Cmd]
echo set INSTANCE_ID=!INSTANCE_ID!
echo aws ssm start-session --target %%INSTANCE_ID%% --document-name AWS-StartPortForwardingSession --parameters "portNumber=3389,localPortNumber=13389" --region %REGION%
echo.
echo Step 3: Connect with Remote Desktop
echo ----------------------------------------
echo RDP endpoint: localhost:13389
echo Username: rdpuser
echo Password: (retrieved in Step 1)
echo ----------------------------------------
echo.
echo ========================================
echo Next Steps
echo ========================================
echo.
echo 1. Wait for Windows to fully complete initialization (first boot may take 10-15 minutes)
echo 2. Use the SSM commands above to connect to the instance
echo 3. After first RDP login, Japanese locale and Windows Defender/Update will be re-enabled automatically
echo.
:end
echo.
echo Press any key to exit...
pause >nul
ステップ2: AMI IDの確認
デプロイ前に、使用する Windows Server 2025 の AMI ID をマネジメントコンソールで確認します。
- AWS マネジメントコンソールで「Amazon EC2」を開く
- 左メニューから「AMI カタログ」を選択
- 検索欄に Microsoft Windows Server 2025 Base と入力し、Enterキーを押下
- 検索結果から最新の AMI を確認し、「AMI ID」(ami-xxxxxxxxxxxxxxxxx 形式)をコピー

補足: AMI ID はリージョンごとに異なります。必ず東京リージョン(ap-northeast-1)で確認してください。
大事なポイント: AMI は定期的に更新されます。ハンズオン実施時点の最新の AMI ID を使用してください。
ステップ3: バッチファイルの設定確認
deploy.bat をテキストエディタで開き、以下の設定値を環境に合わせて確認・変更してください。AMI_ID にはステップ2で確認した値を設定します。
| 変数名 | デフォルト値 | 説明 |
|---|---|---|
| ENVIRONMENT | dev |
環境識別子 |
| PROJECT_ID | 001 |
プロジェクトID |
| PROJECT_INFIX | kiro-ide |
リソース名の接中辞 |
| INSTANCE_INDEX | 01 |
インスタンス識別用の連番(複数台デプロイ時に変更) |
| REGION | ap-northeast-1 |
デプロイ先リージョン |
| AMI_ID | ami-xxxxxxxxxxxxxxxxx |
Windows Server 2025 の AMI ID(ステップ2で確認した値を設定) |
ステップ4: デプロイの実行
4-1. AWS CLI の認証確認
バッチファイルを実行する前に、AWS CLI の認証情報が正しく設定されていることを確認します。
- コマンドプロンプトを起動
- 以下のコマンドを実行し、想定のAWSアカウント情報が表示されることを確認
aws sts get-caller-identity --region ap-northeast-1
大事なポイント: 表示された Account や Arn が想定のアカウントと一致しない場合は、AWS CLI の認証設定を見直してください。
【aws login による認証情報の設定方法】:
認証情報が未設定、またはセッションが期限切れの場合は、aws login コマンドで 一時認証情報を取得できます。
- 対象のアカウントのマネジメントコンソールを開く
- コマンドプロンプトにて、以下を入力し、Enterキーを押下
aws login
- 初回のみ「You are able to change the region~」とリージョンの指定が求められるため、以下を入力し、Enterキーを押下
ap-northeast-1
- ブラウザが開き「Continue with an active session(=アクティブなセッションで続行)」と表示されるため、対象のアカウントを選択
- ブラウザに「Your credentials have been shared successfully and can be used until your session expires. You can now close this tab.」と表示されたらタブを閉じる
- コマンドプロンプトに戻り、以下のコマンドを実行し認証情報を確認
aws sts get-caller-identity --region ap-northeast-1
4-2. バッチファイルの実行
- エクスプローラーでファイルを配置したフォルダを開く
- deploy.bat をダブルクリックして実行
- 設定内容が表示されるので確認し、Enterキーを押下
補足: 基盤スタックおよび Amazon EC2 インスタンスのスタックが既にデプロイ済みの場合、該当のデプロイ処理は自動的にスキップされます。複数の Amazon EC2 インスタンスをデプロイする場合は、基盤スタックがデプロイ済みの状態で、deploy.bat の
INSTANCE_INDEXを変更(例:02)してから再度実行してください。

4-3. Stage 1: 基盤スタックのデプロイ
- AWS CLI の接続テストが実行される
- 「Press Enter to continue」と表示されたらEnterキーを押下
- 基盤スタック(Amazon VPC、AWS IAM、Amazon EC2 key pair、セキュリティグループ)のデプロイが開始
- デプロイ完了まで約3~5分待機

4-4. Stage 2: Amazon EC2 インスタンスのデプロイ
- リモートデスクトップ ユーザー用のパスワードが自動生成される(AWS Systems Manager Parameter Storeに保存)
- 「Press Enter to continue」と表示されたらEnterキーを押下
- Amazon EC2 インスタンススタックのデプロイが開始
- デプロイ完了まで約3分待機

4-5. SSM Agent のオンライン確認
- デプロイ完了後、SSM Agent のオンライン確認が自動で開始
- 約60分待機「SSM Agent is online.」と表示されたら接続準備完了

補足: UserData の実行(ソフトウェアインストール、日本語化、再起動)には約50分かかります。SSM Agent がオンラインになった時点では UserData がまだ実行中の場合があります。リモートデスクトップ接続は、デプロイ開始から60分程度待ってから行うことを推奨します。
4-6. 接続情報の確認
デプロイ完了後、以下の接続コマンドが表示されます。
======================================== Connection Commands ======================================== Step 1: Retrieve RDP password aws ssm get-parameter --name "/dev/001/kiro-ide/01/windows-server/rdpuser-password" --with-decryption --query "Parameter.Value" --output text --region ap-northeast-1 Step 2: RDP via SSM port forwarding [PowerShell] $INSTANCE_ID = "i-xxxxxxxxxxxxxxxxx" aws ssm start-session --target $INSTANCE_ID --document-name AWS-StartPortForwardingSession --parameters "portNumber=3389,localPortNumber=13389" --region ap-northeast-1 [Cmd] set INSTANCE_ID=i-xxxxxxxxxxxxxxxxx aws ssm start-session --target %INSTANCE_ID% --document-name AWS-StartPortForwardingSession --parameters "portNumber=3389,localPortNumber=13389" --region ap-northeast-1 Step 3: Connect with Remote Desktop ---------------------------------------- RDP endpoint: localhost:13389 Username: rdpuser Password: (retrieved in Step 1) ----------------------------------------
5.リモートデスクトップ接続
AWS Systems Manager Session Manager のポートフォワーディング機能を使って、ローカルPC から リモートデスクトップ接続する方法を説明します。

ステップ一覧
- リモートデスクトップ パスワードの取得
- AWS Systems Manager Session Manager ポートフォワーディングの開始
- リモートデスクトップ接続
ステップ1: リモートデスクトップ パスワードの取得
- コマンドプロンプトまたは PowerShell を開き、以下のコマンドを実行し、表示したパスワードを控える
aws ssm get-parameter --name "/dev/001/kiro-ide/01/windows-server/rdpuser-password" --with-decryption --query "Parameter.Value" --output text --region ap-northeast-1
補足: パス内の
/01/はINSTANCE_INDEXの値に対応しています。deploy.bat でINSTANCE_INDEXを変更した場合は、この部分も合わせて変更してください(例:INSTANCE_INDEX=02の場合は/02/)。
ステップ2: AWS Systems Manager Session Manager ポートフォワーディングの開始
ポートフォワーディングを開始するには、Amazon EC2 インスタンス ID が必要です。以下の手順でマネジメントコンソールから確認してください。
インスタンスID の確認手順:
- AWS マネジメントコンソールで「Amazon EC2」を開く
- 左メニューから「インスタンス」を選択
- インスタンス名 dev-001-kiro-ide-01 を探す
- 「インスタンスID」列に表示されている i-xxxxxxxxxxxxxxxxx 形式の値をコピー
- PowerShellまたはコマンドプロンプトを開き、ポートフォワーディングのコマンドを実行
補足: deploy.bat のデプロイ時にもインスタンスIDは表示されますが、ウィンドウを閉じてしまった場合はマネジメントコンソールから確認してください。また、インスタンス名の末尾
01はINSTANCE_INDEXの値に対応しています。deploy.bat でINSTANCE_INDEXを変更した場合は、これらも合わせて読み替えてください(例:INSTANCE_INDEX=02の場合はdev-001-kiro-ide-02)。
PowerShellの場合:
$INSTANCE_ID = "{マネジメントコンソールで確認したインスタンスID}"
aws ssm start-session --target $INSTANCE_ID --document-name AWS-StartPortForwardingSession --parameters "portNumber=3389,localPortNumber=13389" --region ap-northeast-1
コマンドプロンプト(cmd)の場合:
set INSTANCE_ID={マネジメントコンソールで確認したインスタンスID}
aws ssm start-session --target %INSTANCE_ID% --document-name AWS-StartPortForwardingSession --parameters "portNumber=3389,localPortNumber=13389" --region ap-northeast-1
成功すると以下のように表示されます
Starting session with SessionId: your-session-id Port 13389 opened for sessionId your-session-id. Waiting for connections...
大事なポイント: このウィンドウは閉じないでください。ポートフォワーディングが動作し続けます。
ステップ3: リモートデスクトップ接続
- Windowsの「リモート デスクトップ接続」を開く(mstscで検索)
- コンピューター名に以下を入力
localhost:13389
- 「接続」を選択
- 以下の資格情報を入力
ユーザー名: .\rdpuser パスワード: {ステップ1で取得した値} - 証明書の警告が表示された場合は「はい」を選択
6.Kiro IDE のセットアップ
Kiroのセットアップ方法をご説明します。
ステップ一覧
- Kiro のセットアップ
- Kiro のカスタマイズ
前提条件
- 「4.構築手順」が実施済みであること
ステップ1: Kiro のセットアップ
1-1. Google Chrome の設定
Kiro のダウンロードやサインインにブラウザを使用するため、Google Chrome を既定のブラウザに設定します。
- Windowsマーク を右クリックし、設定 > アプリ > 既定のアプリ > Google Chrome を選択
- 「Google Chromeを既定のブラウザに設定する」にて「既定の設定」を押下
- 右上の「×」を押下し、設定を閉じる
- デスクトップの Google Chrome をダブルクリックして開く
- 「Chromeにログイン」にて、「ログインしない」を選択
1-2. Kiro のインストール
OS上に Kiro をインストールします。
- Google Chrome にて以下のURLを開く
https://kiro.dev/downloads/
- 以下を押下して、実行ファイルをダウンロード
Download for Windows (x64)
- Google Chrome にて開いたURLのタブを閉じる
- ダウンロードした実行ファイルをダブルクリック
- 「使用許諾契約書の同意」にて、以下を設定し「次へ」を押下
同意する:選択する
- 「インストール先の指定」にて「次へ」を押下
- 「スタートメニューフォルダーの指定」にて「次へ」を押下
- 「追加タスクの選択」にて、以下を設定し「次へ」を押下
デスクトップ上にアイコンを作成する:チェックを入れる
- 「インストール準備完了」にて「インストール」を押下
- 「Kiro セットアップウィザードの完了」にて「完了」を押下
1-3. SSO 開始 URL の確認
Kiro のサインインに必要な SSO の開始 URL を、AWS access portal から確認します。
- ローカルPC のブラウザで AWS access portal を開く
- 使用する AWS アカウントの「アクセスキー」を押下
- 「AWS IAM Identity Center 認証情報 (推奨)」セクションに表示されている「SSO の開始 URL」をコピーして控える。SSO の開始 URL は以下の形式です。
https://xxxxxxxx.awsapps.com/start

1-4. Kiro の初期セットアップ
Kiroのインストール後、Kiro IDE が起動します。 もし、Kiro IDE が起動していなければ、デスクトップの Kiro をダブルクリックしてください。
- Kiroにて、「Sign in」を押下
- 「You organization」を選択
- 「Sign in with your organization」にて、以下を選択
Sign in via IAM Identity Center instead
- 「Sign in with AWS IAM Identity Center」にて、以下を入力し「Continue」を選択
① 項目:Start URL 入力内容:{1-3. SSO開始URLの確認にて確認した「SSO の開始 URL」} ② 項目:Region 入力内容:ap-northeast-1 - Google Chrome が起動するため以下を入力
ユーザー名:{AWSアカウントのユーザー名} - Google Chrome にて以下を入力
パスワード:{AWSアカウントのパスワード} - 「パスワードを保存しますか」にて「使用しない」を押下
- Google Chrome にて以下を入力
MFAコード:{AWSアカウントのMFAコード} - Google Chrome にて「Kiro IDE がデータにアクセスすることを許可しますか?」と表示するため、「アクセスを許可」を押下
- Google Chrome にて「You can close this page now.」と表示されたらタブを閉じる
- Kiro IDE へ遷移し「Import configuration」にて「Next」を押下
- 「Choose your theme」配色テーマを選択し「Continue」を押下
- 「Set up shell」にて「Skip All」を押下
- Kiro IDE の左ペインにて「拡張機能」(Extensions)選択
- 検索欄に以下を入力し、検索された拡張機能を選択
Japanese Language Pack for Visual Studio Code
- Install を押下
- 「Do you Trust the~」にて「Trust Publisher & Install」を選択
- 右下にポップアップが表示するため、「Change Language and Restart」を押下し、Kiro IDE を再起動させます
- エクスプローラーを開き、Kiro 向けにフォルダを作成
例) Path: ドキュメント、フォルダ名: kiro-handson
- Kiro IDE に遷移し Open a project を押下し、先ほどのフォルダを選択し、「フォルダーの選択(Select Folder)」
- ポップアップが表示するため、「はい、作成者を信頼します」を押下
- 「Let's build」にて、チャット欄に以下を入力
こんにちは

ステップ2: Kiro のカスタマイズ
本ハンズオンでは、エージェントの動作をカスタマイズする主な4つの項目を設定します。
| 設定項目 | 説明 |
|---|---|
| AGENT HOOKS | ファイル保存やコマンド実行などのイベントをトリガーに、エージェントへの指示やコマンド実行を自動化 |
| AGENT STEERING | エージェントの回答言語や出力フォーマットなど、動作方針をルールとして定義 |
| MCP SERVERS | 外部ツールやサービスと連携するための MCP サーバーを設定し、エージェントの機能を拡張 |
| POWERS | ドキュメント・ワークフローガイド・MCP サーバーをパッケージ化した拡張機能をインストール |
2-1. AGENT HOOKS
ファイル保存時、自動でセキュリティスキャンを行うため、設定を行います。
- Kiro IDE の左ペインにて Kiro 選択
- AGENT HOOKS の「+」ボタン(Open Kiro Hook UI)を押下
- 「Manually create a hook」を選択
- 「Describe a hook using natural language」にて、以下のエージェントの仕様を入力し、「Create Hook」を押下
- Security Scanner のタブを閉じる
ここを押すと展開します
Title: Security Scanner(入力する) Description: ファイル保存時にAPIキーや秘密情報が含まれていないかチェックし、環境変数への移行を提案します(入力する) Event: File Saved(選択する) File path(s) to watch: */* (入力後、Enterキーを押下) Action: Ask Kiro(選択する) Instructions for Kiro agent:(入力する) ファイルを精査して、以下のような機密情報を検出: 1. ハードコードされた認証情報 - APIキー(AWS、Google、OpenAIなど) - パスワード - 秘密鍵 - データベース接続文字列 2. 見つかった場合の対処 - 該当行をハイライト - 環境変数への移行方法を提案 - .envファイルへの追加例を表示 - .gitignoreに.envが含まれているか確認 3. プライベートなURL - 内部APIのエンドポイント - 開発環境のURL - これらも環境変数化を提案 4. コミット前の最終チェック - git diffで機密情報が含まれていないか確認 - 問題があればコミットを中断するよう警告
補足: お好みでカスタマイズ可能です。


2-2. AGENT STEERING
チャット回答の日本語化と成果物のフォーマット調整するため、設定を行います。
【日本語化ポリシーの作成】:
- Kiro IDEの左ペインにて Kiro 選択
- AGENT STEERING の「+」ボタン(Generate a custom steering document or import an agent skill)を選択
- Global agent steering を選択
- ファイル名に以下を入力し、Enter キーを押下
Japanese Localization Policy
- 以下のエージェントの仕様を入力し、Ctrl + S キーを押下し保存
- 日本語化ポリシー のタブを閉じる
ここを押すと展開します
--- inclusion: always --- # Steering: ドキュメントとKiroの回答は日本語で出力する ## 目的 Kiroが生成する文書およびユーザーとのやり取りの言語方針を明確化し、日本国内の利用者にとって理解しやすいコミュニケーションとドキュメントを一貫して提供する。 ## スコープ - **Kiroの回答**: ユーザーとのすべてのやり取り、説明、提案、エラーメッセージの説明 - **プロジェクト文書**: 要件定義、基本/詳細設計、運用手順、README、API仕様、トラブルシューティング、セットアップ手順、テスト計画、ユーザーガイド、リリースノートなど ## 方針 ### 1. **Kiroの回答は日本語で行う** - ユーザーとのやり取りはすべて日本語で行う - 技術的な説明や提案も日本語で提供する - エラーメッセージの説明も日本語で行う ### 2. **ドキュメントはすべて日本語で記述する** - 技術用語は必要に応じて適切な日本語訳を併記し、表記を統一する - 見出しレベル、番号付き手順、強調の使い方を統一する - 誤字脱字チェック、初心者にも理解できる説明を行う ### 3. **技術用語の扱い** - **英語のまま使用**: AWSサービス名(S3、Lambda、EC2など)、技術スタック名、プログラミング言語名、フレームワーク名 - **日本語化**: 一般的な技術概念や操作手順の説明 ### 4. **コード内識別子は英語可** - 変数名・関数名・クラス名などは可読性を優先し英語を許容する - コードコメントは英語で記述する ## 禁止事項 - 文書の英語のみ記述(利用者向け最終成果物) - Kiroの回答を英語で行うこと - 表現・用語の統一ルールからの逸脱 - AWSサービス名や技術スタック名の不適切な日本語翻訳 - CloudFormationテンプレートでは、日本語を使用しない。説明は英語にて記載すること
補足: inclusion: always は必ず記載してください。その他お好みでカスタマイズ可能です。
【ローカルポリシーの作成】:
- AGENT STEERING の「+」ボタン(Generate a custom steering document)を選択
- Global agent steering を選択
- ファイル名に以下を入力し、Enter キーを押下
Local Policy
- 以下のエージェントの仕様を入力し、Ctrl + S キーを押下し保存
- ローカルポリシー のタブを閉じる
ここを押すと展開します
--- inclusion: always --- # Kiro Steering ## 前提条件 - 本Steeringは **Windows環境での利用を前提**とする ## 目的 Kiroが生成するすべての回答およびドキュメントを日本語で統一し、 Windows環境で作業する日本国内利用者にとって 理解しやすく一貫性のある出力を提供する。 ## 適用範囲 本Steeringは以下すべてに自動的に適用される。 - Kiroによるユーザーへの回答 - 技術的な説明、設計提案、レビュー - エラーメッセージおよびトラブルシューティングの説明 - プロジェクト内のすべてのドキュメント ## 出力言語ルール ### 1. Kiroの回答 - すべて **日本語で出力**する - 技術的内容も日本語で説明する - ユーザー入力が英語であっても、日本語で回答する ### 2. ドキュメント - すべて日本語で記述する - 見出し構造、手順、表現を統一する - 初心者にも理解できる説明を心がける ### 3. 技術用語の扱い - 以下は英語表記のまま使用する - AWSサービス名(S3、Lambda、EC2 など) - プログラミング言語名 - フレームワーク名 - OSS・ライブラリ名 - 一般的な技術概念や操作説明は日本語で行う ### 4. コード記述ルール - 変数名・関数名・クラス名は英語を使用してよい - コードコメントは英語で記述する


2-3. MCP SERVERS
MCP(Model Context Protocol)サーバーを設定することで、Kiro が外部ツールやサービスと連携できるようになります。ここでは、AWS ドキュメント参照やドキュメント検索、逐次思考、作図、ブラウザ操作などの機能を追加します。
- Kiro IDEの左ペインにて Kiro 選択
- MCP SERVERS のアイコン(Open MCP Config)を選択
- 以下、MCPサーバーの設定を入力し、Ctrl + S キーを押下し保存
- mcp.json のタブを閉じる
- MCP SERVERS にて以下の設定が追加されます。ステータスが「×」(赤)表示の場合は、1分程度待機してから、「Retry」を押下し、ステータスが「✓」(緑)となることを確認
ここを押すと展開します
{
"mcpServers": {
"aws-mcp": {
"command": "uvx",
"timeout": 100000,
"transport": "stdio",
"args": [
"mcp-proxy-for-aws@latest",
"https://aws-mcp.us-east-1.api.aws/mcp",
"--metadata",
"AWS_REGION=us-west-2"
]
},
"Context7": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@upstash/context7-mcp@latest"
]
},
"sequential-thinking": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-sequential-thinking"
]
},
"drawio": {
"command": "npx",
"args": ["-y", "@drawio/mcp"]
},
"playwright": {
"command": "npx",
"args": ["-y", "@executeautomation/playwright-mcp-server"]
}
}
}
補足: 各MCPサーバーの概要は、本ブログの 付録 > 1.MCPサーバー をご参照ください。



2-4. POWERS
Powers は、ドキュメント・ワークフローガイド・MCP サーバーをパッケージ化した拡張機能です。インストールするだけで、Kiro に特定分野の専門知識やツールを追加できます。本ハンズオンでは、AWS CDK / AWS CloudFormation によるインフラ構築を支援する Power を追加します。
- Kiro IDEの左ペインにて Powers 選択
- 「AVAILABLE」にて「Build AWS infrastructure with CDK and CloudFormation」を選択
- 「Install」を押下
- Build AWS infrastructure with CDK and CloudFormation のタブを閉じる
- Kiro IDEの左ペインにて Kiro 選択
- MCP SERVERS にて以下の設定が追加されます。ステータスが「×」(赤)表示の場合は、1分程度待機してから、「Retry」を押下し、ステータスが「✓」(緑)となることを確認
power-aws-infrastructure-as-code-awslabs.aws-iac-mcp-server


2-5. エディタ設定
エディタ設定で、ファイル保存時に自動フォーマットを有効にします。コードの整形を手動で行う手間を省けます。
- 左ペイン下のギアのマークをクリックし、設定 を押下
- 「設定の検索」欄に以下を入力
format on save
- 以下を設定し、設定 タブを閉じる
Editor: Format On Save:チェック入れる
- 設定 のタブを閉じる

7.Kiro IDEで開発
ここからは、構築した Amazon EC2 上の Kiro IDE を使って実際に開発を体験します。Kiro IDE には Vibe モードと Spec モードの2つの開発スタイルがあり、本章ではそれぞれのモードで簡単な成果物を作成し、操作の流れを確認します。
補足: 本章の画面や機能の説明は、2026年3月時点の Kiro IDE の情報に基づいています。Kiro IDE は頻繁にアップデートされるため、実際の画面や操作が異なる場合があります。
ステップ一覧
- Vibeモード
- Specモード
前提条件
- 「4.構築手順」が実施済みであること
- 「6.Kiro IDEのセットアップ」が実施済みであること
Kiro IDE の Vibe モードと Spec モード
Kiro IDE には、開発スタイルに応じて使い分けられる2つのモードがあります。
| 項目 | Kiro IDE(Spec 機能) | Kiro IDE(Vibe 機能) |
|---|---|---|
| 開発スタイル | チャットセッションでの仕様駆動開発 | チャットセッションでのバイブコーディング開発 |
| 機能 | ・3つの主要ファイル作成 requirements.md design.md tasks.md ・要件~実行までのタスク実行 ・インタラクティブな Q&A 形式 |
・クイックアシスタンス ・コンテキスト理解 ・柔軟なアプローチ |
| ユースケース | 要件定義~実装までをワークフローとして一貫性をもって開発したい場合 | 会話的なアプローチで簡単な質問、説明などを受けたい場合 |
クレジット
Kiro Proプランの場合、1000 クレジットが割り当てられています。クレジットをすべて消費すると、Kiro が使用できなくなります。この場合、クレジットの追加が必要です。
クレジット消費量の目安は、以下をご参照ください。
クレジットの確認方法
Kiro IDEの場合、Kiro のクレジットの消費状況は、右下のステータスバーで確認できます。
ステップ1: Vibeモード
Vibeモードは、チャット形式で気軽にコードを生成・修正できるモードです。
| 項目 | 内容 |
|---|---|
| 使いどころ | ちょっとした質問、コードの生成・修正、アイデアの壁打ちなど |
| 進め方 | チャットに自然言語で指示を入力するだけ。計画や設計は不要 |
| 特徴 | 即座にコードを生成・修正。差分確認や変更の取り消しもワンクリック |
1-1. セッションの開始
- 右上の「+」(New Session)を押下
- Kiroにて「Let's build」の「Vibe」を選択
補足: 「Let's build」が表示していない場合、右上のチャットマークを押下し、次に「New Session」を押下してください。
1-2. HTMLファイルの作成
- チャットで以下を入力し、Enter キーまたは上矢印を押下
シンプルな HTML ファイルを作成してください。
1-3. 成果物の確認
- チャットの赤線または、Kiroのエクスプローラーから成果物を選択
- 右クリックし、「エクスプローラーで表示する」を選択
- HTMLファイルをダブルクリックして、ブラウザで開く
- 「アプリを選択して.htmlファイルを開く」にて「Google Chrome」を選択し、「常に使う」を押下
- シンプルな HTML ファイルが作成されたことを確認


1-4. 修正の実施
- チャットに以下を入力し、Enterキーまたは上矢印を押下
TailwindCSSをCDNで読み込んで、視覚的に変化がわかる様に修正してください。
- チャットの View diff を押下
- 差分が表示するため、内容を確認し差分のタブを閉じる
- 手順1-3の3~5を行い、HTMLファイルが変更されたことを確認
- タブを閉じる


1-5. 変更の取り消し
- チャットの Undo changes を押下
- 手順1-3の3~5を行い、HTMLファイルが変更前に戻ったことを確認
- タブを閉じる

1-6. クリーンアップ
- Google Chromeのブラウザを閉じる
- エクスプローラーを閉じる
- 成果物が不要であれば、Kiroのエクスプローラーにて、成果物を選択し「削除」を押下
- Kiroにて右上のチャットマークを押下し、現在のセッション右側の「×」(close)を押下
ステップ2: Specモード
Specモードは、要件定義 → デザイン文書(=設計) → 実装タスクというワークフローに沿って、計画的に開発を進めるモードです。
| 項目 | 内容 |
|---|---|
| 使いどころ | 機能追加や新規プロジェクトなど、要件から実装まで一貫して進めたい場合 |
| 進め方 | Kiroが対話形式で質問し、回答をもとに要件・設計・タスクを整理 |
| 自動生成されるドキュメント | requirements.md(要件)、design.md(設計)、tasks.md(実装タスク) |
| 実装 | タスクリストに基づき、Kiroが順番にコードを生成・修正 |
2-1. セッションの開始
- 右上の「+」(New Session)を押下
- 「Let's build」の「Spec」を選択
2-2. 要件の入力
- チャットに以下を入力し、Enterキーまたは上矢印を押下
AWSのエディタであるKiroに関するLPを作成したい。
- チャット欄で質問があった場合は、選択または回答します。
- 選択にて回答する場合、項目を選択後「Submit answer」を押下
回答例:
| 質問項目 | 回答例 |
|---|---|
| これは新機能の構築ですか、それともバグ修正ですか? | 新機能を構築する |
| 何から始めますか? | 要件定義 |
2-3. 要件文書の確認
- チャットにて、要件文書の概要が表示
- 詳細を確認するため、SPECS:kiro-landing-page > 1 Requirements を選択
- Ctrl + Shift + V キーを押下して、プレビューを表示
- 要件文書の内容を確認します。修正が必要であれば、チャットからKiroに依頼
- プレビューのタブを閉じる
- 内容に問題なければ承認するため、Continue > Generate Design を押下


2-4. デザイン文書の確認
- チャットにて、デザイン文書(=設計)の概要が表示
- 詳細を確認するため、SPECS:kiro-landing-page > 2 Design を選択
- Ctrl + Shift + V キーを押下して、プレビューを表示
- デザイン文書の内容を確認します。修正が必要であれば、チャットから Kiro に依頼
- プレビューのタブを閉じる
- 内容に問題なければ承認するため、Continue > Generate Tasks を押下
補足: わたしの場合、初期のデザイン文書で、スタイリング設定が「CSS Modules」でしたので、好みの「TailwindCSS」にするため、Kiroに「スタイリング は TailwindCSS でお願いします」と依頼しました。


2-5. 実装タスクリストの確認
- チャットにて、実装タスクリストの概要が表示
- 詳細を確認するため、SPECS:kiro-landing-page > 3 Task list を選択
- 実装タスクリストの内容を確認します。修正が必要であれば、チャットからKiroに依頼
- チャット欄で質問があった場合は、回答を入力し、Enterキーまたは上矢印を押下
補足: チャット欄に「Waiting on your input..」が表示している場合は、回答待ちの状態です。

2-6. タスクの実行
タスクの実行方法は2種類あります。
| 選択肢 | 実行対象 | 説明 |
|---|---|---|
| Run all tasks > Run required tasks | 必須タスクのみ | オプションタスクをスキップし、最小限の実装で素早く完成させる(MVP向け) |
| Run all tasks > Run required and optional tasks | 必須+オプションタスク | オプションタスクも含めてすべて実行し、より完成度の高い成果物を作成する |
- 必須タスクのみを実行するため、SPECS:kiro-landing-page > 3 Task list にて Run all tasks > Run required tasks を押下
補足: 個別にタスクを実行する場合は、3 Task list にて該当タスクの Start task を押下

2-7. タスクの進捗確認
- チャットに処理の状況が表示
- 確認が表示した場合は、都度、内容確認し選択する
- コマンドの確認があった場合は内容を確認し、以下の基準で信頼範囲を選択します。
選択パターンの例:
| 選択肢 | 説明 |
|---|---|
| Trust command and accept(青枠) | 今後も同じコマンドを自動で許可する。選択後、信頼範囲(Full command / Partial / Base)を指定する画面が表示される |
| Accept command(赤枠) | 今回のみ許可する。次回同じコマンドが実行される際は再度確認が表示される |
| Reject command(黄枠) | コマンドの実行を拒否する。Kiroはコマンドを実行せず、別のアプローチを検討する |
| Modify command(緑枠) | コマンドの内容を編集してから実行する。引数やオプションを変更したい場合に使用 |

信頼範囲を選択
| 選択肢 | 信頼範囲 | 選択する場合 | 例 |
|---|---|---|---|
| Full command | 表示されたコマンド全体を許可 | 実行・インストール・変更系のコマンド。引数を含めて厳密に許可したい場合 | npm create vite@latest temp-project -- --template react-ts |
| Partial | コマンドの先頭部分をワイルドカードで許可 | 同じコマンドで引数が変わる可能性がある実行・インストール系のコマンド | npm create *(npm create で始まるコマンドをすべて許可) |
| Base | ベースコマンド全体をワイルドカードで許可 | 読み込み・参照系のコマンド。広く許可しても安全な場合 | npm *(npm で始まるコマンドをすべて許可) |

大事なポイント: 読み込み・参照系(Get-、ls、cat など)は Base で広く許可しても問題ありません。実行・インストール・変更系(create、install、rm など)は Full command または Partial を選択し、許可範囲を限定してください。
実行タスクの留意事項: 処理が終わらない場合は、チャットで「処理の状況を教えて」を入力し、Enterキー押下します。Kiro が状況を教えてくれます。
補足: 実行タスクの実行中、ターミナルにて入力を求められる場合があります。内容を確認しガイダンスに従い、入力してください。

2-8. 成果物の確認
- タスクが完了すると 3 Task list にて、実行対象のタスクが Task completed に更新され、チャットに完了のメッセージが表示
- チャットに成果物の確認の方法が記載されている場合は、その指示に従います。もし、確認方法が未記載の場合は、チャットで動作確認の方法を質問
- 成果物を確認します。もし、修正が必要であれば、チャットで指示



2-9. クリーンアップ
- Google Chromeのブラウザを閉じる
- エクスプローラーを閉じる
- 成果物が不要であれば、Kiroのエクスプローラーにて、成果物を選択し「削除」を押下
- Kiroにて右上のチャットマークを押下し、現在のセッション右側の「×」(close)を押下
8.環境削除手順
テストが完了したら、以下の手順で環境をきれいにお掃除しましょう。
ステップ一覧
- リモートデスクトップ 接続の終了
- EC2 インスタンスの停止
- AWS CloudFormation スタックの削除
ステップ1: リモートデスクトップ 接続の終了
- リモートデスクトップ 接続を閉じる
- ポートフォワーディングを実行しているウィンドウで Ctrl + C キーを押下
ステップ2: Amazon EC2 インスタンスの停止
- AWS マネジメントコンソールで「Amazon EC2」を開く
- dev-001-kiro-ide-01 インスタンスを選択
- 「インスタンスの状態」→「インスタンスを停止」を選択
- インスタンスが「停止済み」になるまで待つ
補足: インスタンス名の末尾
01はINSTANCE_INDEXの値に対応しています。deploy.bat でINSTANCE_INDEXを変更した場合は、この部分も合わせて読み替えてください(例:INSTANCE_INDEX=02の場合はdev-001-kiro-ide-02)。
ステップ3: AWS CloudFormation スタックの削除
3-1. Amazon EC2 スタックの削除
- AWS マネジメントコンソールで「AWS CloudFormation」を開く
- スタック名: dev-001-kiro-ide-instance-01 を選択
- 「削除」ボタンを選択
- 確認ダイアログで「削除」を選択
- ステータスが「DELETE_COMPLETE」になるまで待つ(約3~5分)
補足: スタック名の末尾
01はINSTANCE_INDEXの値に対応しています。deploy.bat でINSTANCE_INDEXを変更した場合は、この部分も合わせて読み替えてください(例:INSTANCE_INDEX=02の場合はdev-001-kiro-ide-instance-02)。
3-2. 基盤スタックの削除
- 3-1. Amazon EC2 スタックの削除 の手順を参考に、スタック名: dev-001-kiro-ide-base を削除します。
大事なポイント: スタックは必ず上記の順序で削除してください。Amazon EC2 スタックが基盤スタックのリソースに依存しているので、逆順で削除するとエラーになります。
まとめ
お疲れさまでした。Kiro IDE サーバー構築ハンズオンは以上です。いかがでしたでしょうか。
このハンズオンでは、以下の技術・サービスを組み合わせて、Amazon EC2 上の Windows Server 2025 で Kiro IDE を安全かつ再現性高く利用できる開発環境を構築しました。
| 技術・サービス | 役割 |
|---|---|
| AWS CloudFormation | インフラのコード化と再現性確保(Amazon VPC、AWS IAM、Amazon EC2 key pair、セキュリティグループ、Amazon EC2 など) |
| Amazon EC2 + UserData | 開発環境の自動構築(Python 3.13、Node.js、Git、AWS CLI、VS Code、Google Chrome、uv のインストールと日本語化) |
| AWS Systems Manager Session Manager | リモートデスクトップ ポート開放不要のセキュアな接続(ポートフォワーディングを用いたリモートデスクトップ 接続) |
| AWS IAM(最小権限) | MCP関連権限の最小化(aws-mcp:InvokeMcp、CallReadOnlyTool、CallReadWriteToolに限定) |
| デプロイ用バッチファイル | AWS CLIによる自動デプロイ(パスワード生成、スタック作成、SSM Agent待機を一括実行) |
補足: 必要に応じて、インスタンスタイプや Amazon EBS サイズを調整し、ワークロードに合わせた最適化を行ってください。
付録
1.MCPサーバーのご説明
| サーバー名 | 目的・概要 |
|---|---|
| AWS MCP Server | AWS の公式MCPプロキシ。IAMロールの認証情報を利用し、AWS サービスのドキュメントや操作を支援するMCPサーバーです。 |
| Context7 MCP | 参照ドキュメントのコンテキストを調整し、最新で正確な情報をAIに渡すためのMCPサーバーです。 |
| Sequential Thinking MCP | 段階的な思考(Chain of Thought)を支援し、推論プロセスを明示化して精度の高い回答やコード生成を可能にするMCPサーバーです。 |
| drawio MCP | 図の作成・編集をAIから操作するためのMCPサーバーで、アーキテクチャ図やフローの自動生成に役立ちます。 |
| Playwright MCP | ブラウザの自動操作をAIから実行するためのMCPサーバーで、Webアプリケーションのテスト自動化に役立ちます。 |
2.Trusted Commands の確認方法
Kiro IDE では、エージェントが実行するコマンドの許可設定を管理できます。「Trust command and accept」で許可したコマンドは Kiro IDE の設定画面に保存されており、いつでも確認・削除が可能です。
- 左ペイン下のギアのマークをクリックし、設定 を押下
- 「設定の検索」欄に以下を入力
Trusted Commands - Kiro Agent: Trusted Commands に、許可済みのコマンド一覧が表示
- 不要なコマンドがあれば「×」を押下して削除
- 設定 のタブを閉じる
補足: 意図せず広い範囲で許可してしまった場合は、ここから該当コマンドを削除し、次回実行時に改めて信頼範囲を選択し直してください。
この記事は私が書きました
印鑰 幸太
記事一覧全ての AWS 認定を取得。AWSサービスでは、AWS CloudFormationが好きです。ジム通いが趣味です。