前置き
ボタン一つでEC2とRDSの起動や停止をしたいとユーザーからリクエストがありました。
ユーザーの端末にAWS CLIをインストールし、バッチファイルで実行してもらうことにしました。
アクセスキーの払い出しは推奨されませんが、今回はユーザー要件を考慮し、
IAMポリシーを必要最低限に絞ることでセキュリティリスクを軽減しています。
前提条件
- AWS CLIがインストール済み
- AWS CLIの認証情報が設定済み(
aws configure実行済み) - Windows環境(バッチファイル実行可能)
- 対象のEC2・RDSリソースへのアクセス権限
IAMポリシー
EC2インスタンスが暗号化されたEBSボリュームを使用している場合、
KMS権限を忘れがち。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "SpecificEC2StartStop",
"Effect": "Allow",
"Action": [
"ec2:StartInstances",
"ec2:StopInstances"
],
"Resource": [
"arn:aws:ec2:ap-northeast-1:123456789012:instance/i-xxxxxxxxxxxxxxxxx",
"arn:aws:ec2:ap-northeast-1:123456789012:instance/i-yyyyyyyyyyyyyyyyy"
]
},
{
"Sid": "EC2DescribeForStatus",
"Effect": "Allow",
"Action": [
"ec2:DescribeInstances",
"ec2:DescribeInstanceStatus",
"ec2:DescribeVolumes"
],
"Resource": "*"
},
{
"Sid": "KMSPermissionsForEncryptedEBS",
"Effect": "Allow",
"Action": [
"kms:Decrypt",
"kms:DescribeKey",
"kms:CreateGrant"
],
"Resource": [
"arn:aws:kms:ap-northeast-1:123456789012:key/*"
],
"Condition": {
"StringEquals": {
"kms:ViaService": [
"ec2.ap-northeast-1.amazonaws.com"
]
}
}
},
{
"Sid": "SpecificRDSStartStop",
"Effect": "Allow",
"Action": [
"rds:StartDBInstance",
"rds:StopDBInstance"
],
"Resource": [
"arn:aws:rds:ap-northeast-1:123456789012:db:your-rds-instance-id"
]
},
{
"Sid": "RDSDescribeForStatus",
"Effect": "Allow",
"Action": [
"rds:DescribeDBInstances"
],
"Resource": "*"
}
]
}
起動スクリプト
Windows バッチファイル(.bat)形式
@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion
REM ========================================
REM EC2・RDS起動スクリプト
REM ========================================
REM 設定
set "RDS_INSTANCE_ID=your-rds-instance-id"
set "EC2_INSTANCE_1=i-xxxxxxxxxxxxxxxxx"
set "EC2_NAME_1=your-ec2-name-1"
set "EC2_INSTANCE_2=i-yyyyyyyyyyyyyyyyy"
set "EC2_NAME_2=your-ec2-name-2"
set "AWS_REGION=ap-northeast-1"
set "RDS_START_TIMEOUT=1800"
set "EC2_START_TIMEOUT=600"
set "CHECK_INTERVAL=15"
REM ログ出力先ディレクトリ
set "LOG_DIR=%USERPROFILE%\aws-scripts\log"
REM ログディレクトリが存在しない場合は作成
if not exist "%LOG_DIR%" (
mkdir "%LOG_DIR%" 2>nul
if errorlevel 1 (
set "LOG_DIR=%~dp0"
)
)
REM ログファイル名生成
set "TIMESTAMP=%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2%"
set "TIMESTAMP=%TIMESTAMP: =0%"
set "LOG_FILE=%LOG_DIR%\start_%TIMESTAMP%.log"
REM カレントディレクトリをバッチファイルの場所に変更
cd /d "%~dp0"
echo ================================================================
echo 起動スクリプト
echo ================================================================
echo.
echo 実行時刻: %date% %time%
echo ログファイル: %LOG_FILE%
echo.
REM ログファイルに記録開始
echo ========================================== > "%LOG_FILE%"
echo 起動スクリプト >> "%LOG_FILE%"
echo ========================================== >> "%LOG_FILE%"
echo 実行時刻: %date% %time% >> "%LOG_FILE%"
echo. >> "%LOG_FILE%"
REM 実行確認
echo ================================================================
echo 実行確認
echo ================================================================
echo.
echo 以下のAWSリソースを起動します:
echo.
echo 対象リソース:
echo - RDS: %RDS_INSTANCE_ID%
echo - EC2: %EC2_NAME_1% %EC2_INSTANCE_1%
echo - EC2: %EC2_NAME_2% %EC2_INSTANCE_2%
echo.
echo リージョン: %AWS_REGION%
echo.
set /p CONFIRM="本当に実行しますか? yes と入力してください: "
if /i not "%CONFIRM%"=="yes" (
echo.
echo [INFO] 実行がキャンセルされました
echo [INFO] 実行がキャンセルされました >> "%LOG_FILE%"
echo.
pause
exit /b 0
)
echo. >> "%LOG_FILE%"
echo ========================================== >> "%LOG_FILE%"
echo 起動処理開始 >> "%LOG_FILE%"
echo ========================================== >> "%LOG_FILE%"
echo. >> "%LOG_FILE%"
REM ========================================
REM ステップ1: RDS起動と完了待機
REM ========================================
echo.
echo ================================================================
echo [ステップ 1/2] RDSインスタンスの起動
echo ================================================================
echo.
echo [ステップ 1/2] RDSインスタンスの起動 >> "%LOG_FILE%"
echo [1/3] RDS状態を確認中...
aws rds describe-db-instances --db-instance-identifier %RDS_INSTANCE_ID% --region %AWS_REGION% --query "DBInstances[0].DBInstanceStatus" --output text > temp_rds.txt 2>&1
set /p RDS_STATUS=<temp_rds.txt
del temp_rds.txt 2>nul
echo 現在の状態: %RDS_STATUS%
echo RDS状態: %RDS_STATUS% >> "%LOG_FILE%"
echo.
if "%RDS_STATUS%"=="available" (
echo OK RDSは既に起動しています
echo OK RDS既に起動済み >> "%LOG_FILE%"
goto RDS_COMPLETE
)
if "%RDS_STATUS%"=="stopped" (
echo [2/3] RDS起動コマンドを実行中...
aws rds start-db-instance --db-instance-identifier %RDS_INSTANCE_ID% --region %AWS_REGION% > temp_rds_start.txt 2>&1
set "RDS_START_RESULT=%errorlevel%"
if !RDS_START_RESULT! neq 0 (
echo ERROR RDS起動コマンドが失敗しました
echo ERROR RDS起動コマンド失敗 >> "%LOG_FILE%"
type temp_rds_start.txt >> "%LOG_FILE%"
del temp_rds_start.txt 2>nul
echo.
pause
exit /b 1
) else (
echo OK RDS起動コマンドを実行しました
echo OK RDS起動コマンド実行完了 >> "%LOG_FILE%"
del temp_rds_start.txt 2>nul
)
echo.
) else if "%RDS_STATUS%"=="starting" (
echo [2/3] RDSは既に起動処理中です
echo RDS既に起動処理中 >> "%LOG_FILE%"
echo.
) else (
echo ERROR RDSの状態が起動可能ではありません: %RDS_STATUS%
echo ERROR RDS起動不可: %RDS_STATUS% >> "%LOG_FILE%"
echo.
pause
exit /b 1
)
echo [3/3] RDS起動完了を待機中...
echo max wait time: %RDS_START_TIMEOUT% seconds
echo check interval: 30 seconds
echo.
set /a RDS_MAX_ATTEMPTS=%RDS_START_TIMEOUT% / 30
set "RDS_ATTEMPT=0"
:RDS_WAIT_LOOP
if %RDS_ATTEMPT% GEQ %RDS_MAX_ATTEMPTS% goto RDS_TIMEOUT
set /a RDS_ELAPSED=%RDS_ATTEMPT% * 30
aws rds describe-db-instances --db-instance-identifier %RDS_INSTANCE_ID% --region %AWS_REGION% --query "DBInstances[0].DBInstanceStatus" --output text > temp_rds_status.txt 2>nul
set /p RDS_CURRENT_STATUS=<temp_rds_status.txt
del temp_rds_status.txt 2>nul
echo %RDS_ELAPSED%/%RDS_START_TIMEOUT%sec RDS status: %RDS_CURRENT_STATUS%
if "%RDS_CURRENT_STATUS%"=="available" (
echo.
echo OK RDS started in %RDS_ELAPSED% seconds
echo OK RDS startup completed %RDS_ELAPSED%sec >> "%LOG_FILE%"
goto RDS_COMPLETE
)
timeout /t 30 /nobreak >nul
set /a RDS_ATTEMPT+=1
goto RDS_WAIT_LOOP
:RDS_TIMEOUT
echo.
echo ERROR RDS起動処理がタイムアウトしました
echo ERROR RDS起動タイムアウト >> "%LOG_FILE%"
echo 最終状態: %RDS_CURRENT_STATUS%
echo.
pause
exit /b 1
:RDS_COMPLETE
REM ========================================
REM ステップ2: EC2起動
REM ========================================
echo.
echo ================================================================
echo [ステップ 2/2] EC2インスタンスの起動
echo ================================================================
echo.
echo [ステップ 2/2] EC2インスタンスの起動 >> "%LOG_FILE%"
set "NEED_START_1=0"
set "NEED_START_2=0"
REM EC2インスタンス1の状態確認
echo [1/3] %EC2_NAME_1% status check...
aws ec2 describe-instances --instance-ids %EC2_INSTANCE_1% --region %AWS_REGION% --query "Reservations[0].Instances[0].State.Name" --output text > temp_ec2_1.txt 2>&1
set /p EC2_STATUS_1=<temp_ec2_1.txt
del temp_ec2_1.txt 2>nul
echo 現在の状態: %EC2_STATUS_1%
echo %EC2_NAME_1%: %EC2_STATUS_1% >> "%LOG_FILE%"
if "%EC2_STATUS_1%"=="stopped" (
set "NEED_START_1=1"
echo 起動対象に追加
) else if "%EC2_STATUS_1%"=="pending" (
set "NEED_START_1=1"
echo 起動処理中 待機対象に追加
) else if "%EC2_STATUS_1%"=="running" (
echo 既に起動済み
) else (
echo 起動スキップ 状態: %EC2_STATUS_1%
)
echo.
REM EC2インスタンス2の状態確認
echo [2/3] %EC2_NAME_2% status check...
aws ec2 describe-instances --instance-ids %EC2_INSTANCE_2% --region %AWS_REGION% --query "Reservations[0].Instances[0].State.Name" --output text > temp_ec2_2.txt 2>&1
set /p EC2_STATUS_2=<temp_ec2_2.txt
del temp_ec2_2.txt 2>nul
echo 現在の状態: %EC2_STATUS_2%
echo %EC2_NAME_2%: %EC2_STATUS_2% >> "%LOG_FILE%"
if "%EC2_STATUS_2%"=="stopped" (
set "NEED_START_2=1"
echo 起動対象に追加
) else if "%EC2_STATUS_2%"=="pending" (
set "NEED_START_2=1"
echo 起動処理中 待機対象に追加
) else if "%EC2_STATUS_2%"=="running" (
echo 既に起動済み
) else (
echo 起動スキップ 状態: %EC2_STATUS_2%
)
echo.
if "%NEED_START_1%"=="0" if "%NEED_START_2%"=="0" (
echo OK 起動が必要なEC2インスタンスはありません
echo 起動が必要なEC2インスタンスなし >> "%LOG_FILE%"
goto EC2_COMPLETE
)
REM 起動対象のインスタンスIDを構築
set "START_INSTANCES="
set "START_NAMES="
if "%NEED_START_1%"=="1" (
set "START_INSTANCES=%START_INSTANCES% %EC2_INSTANCE_1%"
set "START_NAMES=%START_NAMES%%EC2_NAME_1% "
)
if "%NEED_START_2%"=="1" (
set "START_INSTANCES=%START_INSTANCES% %EC2_INSTANCE_2%"
set "START_NAMES=%START_NAMES%%EC2_NAME_2% "
)
echo [3/3] 起動コマンドを実行中...
echo 起動対象: %START_NAMES%
echo 実行コマンド: aws ec2 start-instances --instance-ids%START_INSTANCES% --region %AWS_REGION% >> "%LOG_FILE%"
aws ec2 start-instances --instance-ids%START_INSTANCES% --region %AWS_REGION% > temp_start_result.txt 2>&1
set "START_RESULT=%errorlevel%"
if %START_RESULT% neq 0 (
echo ERROR EC2起動コマンドが失敗しました
echo ERROR EC2起動コマンド失敗 >> "%LOG_FILE%"
type temp_start_result.txt >> "%LOG_FILE%"
del temp_start_result.txt 2>nul
echo.
pause
exit /b 1
) else (
echo OK EC2起動コマンドを実行しました
echo OK EC2起動コマンド実行完了 >> "%LOG_FILE%"
del temp_start_result.txt 2>nul
)
echo.
echo 起動完了を待機中...
echo max wait time: %EC2_START_TIMEOUT% seconds
echo check interval: %CHECK_INTERVAL% seconds
echo.
set /a MAX_ATTEMPTS=%EC2_START_TIMEOUT% / %CHECK_INTERVAL%
set "ATTEMPT=0"
:EC2_WAIT_LOOP
if %ATTEMPT% GEQ %MAX_ATTEMPTS% goto EC2_TIMEOUT
set /a ELAPSED_EC2=%ATTEMPT% * %CHECK_INTERVAL%
REM インスタンス1の状態確認
if "%NEED_START_1%"=="1" (
aws ec2 describe-instances --instance-ids %EC2_INSTANCE_1% --region %AWS_REGION% --query "Reservations[0].Instances[0].State.Name" --output text > temp_status_1.txt 2>nul
set /p CURRENT_STATUS_1=<temp_status_1.txt
del temp_status_1.txt 2>nul
) else (
set "CURRENT_STATUS_1=%EC2_STATUS_1%"
)
REM インスタンス2の状態確認
if "%NEED_START_2%"=="1" (
aws ec2 describe-instances --instance-ids %EC2_INSTANCE_2% --region %AWS_REGION% --query "Reservations[0].Instances[0].State.Name" --output text > temp_status_2.txt 2>nul
set /p CURRENT_STATUS_2=<temp_status_2.txt
del temp_status_2.txt 2>nul
) else (
set "CURRENT_STATUS_2=%EC2_STATUS_2%"
)
REM startup complete check
set "ALL_RUNNING=1"
if "%NEED_START_1%"=="1" if not "!CURRENT_STATUS_1!"=="running" set "ALL_RUNNING=0"
if "%NEED_START_2%"=="1" if not "!CURRENT_STATUS_2!"=="running" set "ALL_RUNNING=0"
REM 進捗表示
echo !ELAPSED_EC2!/%EC2_START_TIMEOUT%sec %EC2_NAME_1%:!CURRENT_STATUS_1! / %EC2_NAME_2%:!CURRENT_STATUS_2!
if "!ALL_RUNNING!"=="1" (
echo.
echo OK All EC2 instances started in !ELAPSED_EC2! seconds
echo OK EC2 startup completed !ELAPSED_EC2!sec >> "%LOG_FILE%"
goto EC2_COMPLETE
)
timeout /t %CHECK_INTERVAL% /nobreak >nul
set /a ATTEMPT+=1
goto EC2_WAIT_LOOP
:EC2_TIMEOUT
echo.
echo WARN EC2起動処理がタイムアウトしました
echo WARN EC2起動タイムアウト >> "%LOG_FILE%"
echo.
echo 最終状態:
echo %EC2_NAME_1%: !CURRENT_STATUS_1!
echo %EC2_NAME_2%: !CURRENT_STATUS_2!
echo.
:EC2_COMPLETE
REM ========================================
REM 完了
REM ========================================
echo.
echo ================================================================
echo 起動コマンドの実行が完了しました
echo ================================================================
echo.
echo ========================================== >> "%LOG_FILE%"
echo 最終状態確認 >> "%LOG_FILE%"
echo ========================================== >> "%LOG_FILE%"
echo 最終状態確認:
echo.
REM RDS最終状態
aws rds describe-db-instances --db-instance-identifier %RDS_INSTANCE_ID% --region %AWS_REGION% --query "DBInstances[0].DBInstanceStatus" --output text > temp_final_rds.txt 2>nul
set /p FINAL_RDS=<temp_final_rds.txt
del temp_final_rds.txt 2>nul
echo RDS %RDS_INSTANCE_ID%: %FINAL_RDS%
echo RDS %RDS_INSTANCE_ID%: %FINAL_RDS% >> "%LOG_FILE%"
REM EC2最終状態
aws ec2 describe-instances --instance-ids %EC2_INSTANCE_1% --region %AWS_REGION% --query "Reservations[0].Instances[0].State.Name" --output text > temp_final_1.txt 2>nul
set /p FINAL_EC2_1=<temp_final_1.txt
del temp_final_1.txt 2>nul
echo %EC2_NAME_1%: %FINAL_EC2_1%
echo %EC2_NAME_1%: %FINAL_EC2_1% >> "%LOG_FILE%"
aws ec2 describe-instances --instance-ids %EC2_INSTANCE_2% --region %AWS_REGION% --query "Reservations[0].Instances[0].State.Name" --output text > temp_final_2.txt 2>nul
set /p FINAL_EC2_2=<temp_final_2.txt
del temp_final_2.txt 2>nul
echo %EC2_NAME_2%: %FINAL_EC2_2%
echo %EC2_NAME_2%: %FINAL_EC2_2% >> "%LOG_FILE%"
echo.
echo 実行完了時刻: %date% %time%
echo ログファイル: %LOG_FILE%
echo.
echo 実行完了時刻: %date% %time% >> "%LOG_FILE%"
REM 一時ファイルのクリーンアップ
del temp_*.txt 2>nul
echo.
echo ウィンドウを閉じるには何かキーを押してください...
pause >nul
exit /b 0
停止スクリプト
Windows バッチファイル(.bat)形式
@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion
REM ========================================
REM 設定項目 - 環境に合わせて変更してください
REM ========================================
REM AWS リソース設定
set "RDS_INSTANCE_ID=your-rds-instance-id"
set "EC2_INSTANCE_1=i-xxxxxxxxxxxxxxxxx"
set "EC2_NAME_1=your-ec2-name-1"
set "EC2_INSTANCE_2=i-yyyyyyyyyyyyyyyyy"
set "EC2_NAME_2=your-ec2-name-2"
set "AWS_REGION=ap-northeast-1"
REM タイムアウト設定(秒)
set "EC2_STOP_TIMEOUT=600"
set "CHECK_INTERVAL=15"
REM ログ出力先ディレクトリ
set "LOG_DIR=%USERPROFILE%\aws-scripts\log"
REM ========================================
REM EC2・RDS停止スクリプト
REM ========================================
REM ログディレクトリが存在しない場合は作成
if not exist "%LOG_DIR%" (
mkdir "%LOG_DIR%" 2>nul
if errorlevel 1 (
set "LOG_DIR=%~dp0"
)
)
REM ログファイル名生成
set "TIMESTAMP=%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2%"
set "TIMESTAMP=%TIMESTAMP: =0%"
set "LOG_FILE=%LOG_DIR%\stop_%TIMESTAMP%.log"
REM カレントディレクトリをバッチファイルの場所に変更
cd /d "%~dp0"
echo ================================================================
echo 停止スクリプト
echo ================================================================
echo.
echo 実行時刻: %date% %time%
echo ログファイル: %LOG_FILE%
echo.
REM ログファイルに記録開始
echo ========================================== > "%LOG_FILE%"
echo 停止スクリプト >> "%LOG_FILE%"
echo ========================================== >> "%LOG_FILE%"
echo 実行時刻: %date% %time% >> "%LOG_FILE%"
echo. >> "%LOG_FILE%"
REM 実行確認
echo ================================================================
echo 実行確認
echo ================================================================
echo.
echo 以下のAWSリソースを停止します:
echo.
echo 対象リソース:
echo - EC2: %EC2_NAME_1% %EC2_INSTANCE_1%
echo - EC2: %EC2_NAME_2% %EC2_INSTANCE_2%
echo - RDS: %RDS_INSTANCE_ID%
echo.
echo リージョン: %AWS_REGION%
echo.
set /p CONFIRM="本当に実行しますか? yes と入力してください: "
if /i not "%CONFIRM%"=="yes" (
echo.
echo [INFO] 実行がキャンセルされました
echo [INFO] 実行がキャンセルされました >> "%LOG_FILE%"
echo.
pause
exit /b 0
)
echo. >> "%LOG_FILE%"
echo ========================================== >> "%LOG_FILE%"
echo 停止処理開始 >> "%LOG_FILE%"
echo ========================================== >> "%LOG_FILE%"
echo. >> "%LOG_FILE%"
REM ========================================
REM ステップ1: EC2状態確認
REM ========================================
echo.
echo ================================================================
echo [ステップ 1/3] EC2インスタンスの状態確認
echo ================================================================
echo.
echo [ステップ 1/3] EC2インスタンスの状態確認 >> "%LOG_FILE%"
set "NEED_STOP_1=0"
set "NEED_STOP_2=0"
REM EC2インスタンス1の状態確認
echo [1/2] %EC2_NAME_1% status check...
aws ec2 describe-instances --instance-ids %EC2_INSTANCE_1% --region %AWS_REGION% --query "Reservations[0].Instances[0].State.Name" --output text > temp_ec2_1.txt 2>&1
set /p EC2_STATUS_1=<temp_ec2_1.txt
del temp_ec2_1.txt 2>nul
echo 現在の状態: %EC2_STATUS_1%
echo %EC2_NAME_1%: %EC2_STATUS_1% >> "%LOG_FILE%"
if "%EC2_STATUS_1%"=="running" (
set "NEED_STOP_1=1"
echo 停止対象に追加
) else if "%EC2_STATUS_1%"=="stopping" (
set "NEED_STOP_1=1"
echo 停止処理中 待機対象に追加
) else if "%EC2_STATUS_1%"=="stopped" (
echo 既に停止済み
) else (
echo 停止スキップ 状態: %EC2_STATUS_1%
)
echo.
REM EC2インスタンス2の状態確認
echo [2/2] %EC2_NAME_2% status check...
aws ec2 describe-instances --instance-ids %EC2_INSTANCE_2% --region %AWS_REGION% --query "Reservations[0].Instances[0].State.Name" --output text > temp_ec2_2.txt 2>&1
set /p EC2_STATUS_2=<temp_ec2_2.txt
del temp_ec2_2.txt 2>nul
echo 現在の状態: %EC2_STATUS_2%
echo %EC2_NAME_2%: %EC2_STATUS_2% >> "%LOG_FILE%"
if "%EC2_STATUS_2%"=="running" (
set "NEED_STOP_2=1"
echo 停止対象に追加
) else if "%EC2_STATUS_2%"=="stopping" (
set "NEED_STOP_2=1"
echo 停止処理中 待機対象に追加
) else if "%EC2_STATUS_2%"=="stopped" (
echo 既に停止済み
) else (
echo 停止スキップ 状態: %EC2_STATUS_2%
)
echo.
REM ========================================
REM ステップ2: EC2停止実行と待機
REM ========================================
echo ================================================================
echo [ステップ 2/3] EC2インスタンスの停止
echo ================================================================
echo.
echo [ステップ 2/3] EC2インスタンスの停止 >> "%LOG_FILE%"
if "%NEED_STOP_1%"=="0" if "%NEED_STOP_2%"=="0" (
echo OK 停止が必要なEC2インスタンスはありません
echo 停止が必要なEC2インスタンスなし >> "%LOG_FILE%"
echo.
goto SKIP_EC2
)
REM 停止対象のインスタンスIDを構築
set "STOP_INSTANCES="
set "STOP_NAMES="
if "%NEED_STOP_1%"=="1" (
set "STOP_INSTANCES=%STOP_INSTANCES% %EC2_INSTANCE_1%"
set "STOP_NAMES=%STOP_NAMES%%EC2_NAME_1% "
)
if "%NEED_STOP_2%"=="1" (
set "STOP_INSTANCES=%STOP_INSTANCES% %EC2_INSTANCE_2%"
set "STOP_NAMES=%STOP_NAMES%%EC2_NAME_2% "
)
echo 停止対象: %STOP_NAMES%
echo 停止対象: %STOP_NAMES% >> "%LOG_FILE%"
echo.
echo [1/2] 停止コマンドを実行中...
echo 実行コマンド: aws ec2 stop-instances --instance-ids%STOP_INSTANCES% --region %AWS_REGION% >> "%LOG_FILE%"
aws ec2 stop-instances --instance-ids%STOP_INSTANCES% --region %AWS_REGION% > temp_stop_result.txt 2>&1
set "STOP_RESULT=%errorlevel%"
if %STOP_RESULT% neq 0 (
echo ERROR EC2停止コマンドが失敗しました
echo ERROR EC2停止コマンド失敗 >> "%LOG_FILE%"
type temp_stop_result.txt >> "%LOG_FILE%"
del temp_stop_result.txt 2>nul
echo.
goto SKIP_EC2
) else (
echo OK EC2停止コマンドを実行しました
echo OK EC2停止コマンド実行完了 >> "%LOG_FILE%"
del temp_stop_result.txt 2>nul
)
echo.
echo [2/2] 停止完了を待機中...
echo max wait time: %EC2_STOP_TIMEOUT% seconds
echo check interval: %CHECK_INTERVAL% seconds
echo.
set /a MAX_ATTEMPTS=%EC2_STOP_TIMEOUT% / %CHECK_INTERVAL%
set "ATTEMPT=0"
:EC2_WAIT_LOOP
if %ATTEMPT% GEQ %MAX_ATTEMPTS% goto EC2_TIMEOUT
set /a ELAPSED=%ATTEMPT% * %CHECK_INTERVAL%
REM インスタンス1の状態確認
if "%NEED_STOP_1%"=="1" (
aws ec2 describe-instances --instance-ids %EC2_INSTANCE_1% --region %AWS_REGION% --query "Reservations[0].Instances[0].State.Name" --output text > temp_status_1.txt 2>nul
set /p CURRENT_STATUS_1=<temp_status_1.txt
del temp_status_1.txt 2>nul
) else (
set "CURRENT_STATUS_1=%EC2_STATUS_1%"
)
REM インスタンス2の状態確認
if "%NEED_STOP_2%"=="1" (
aws ec2 describe-instances --instance-ids %EC2_INSTANCE_2% --region %AWS_REGION% --query "Reservations[0].Instances[0].State.Name" --output text > temp_status_2.txt 2>nul
set /p CURRENT_STATUS_2=<temp_status_2.txt
del temp_status_2.txt 2>nul
) else (
set "CURRENT_STATUS_2=%EC2_STATUS_2%"
)
REM 停止完了check
set "ALL_STOPPED=1"
if "%NEED_STOP_1%"=="1" if not "!CURRENT_STATUS_1!"=="stopped" set "ALL_STOPPED=0"
if "%NEED_STOP_2%"=="1" if not "!CURRENT_STATUS_2!"=="stopped" set "ALL_STOPPED=0"
REM 進捗表示
echo !ELAPSED!/%EC2_STOP_TIMEOUT%sec %EC2_NAME_1%:!CURRENT_STATUS_1! / %EC2_NAME_2%:!CURRENT_STATUS_2!
if "!ALL_STOPPED!"=="1" (
echo.
echo OK All EC2 instances stopped in !ELAPSED! seconds
echo OK EC2停止完了 !ELAPSED!sec >> "%LOG_FILE%"
goto EC2_COMPLETE
)
timeout /t %CHECK_INTERVAL% /nobreak >nul
set /a ATTEMPT+=1
goto EC2_WAIT_LOOP
:EC2_TIMEOUT
echo.
echo WARN EC2停止処理がタイムアウトしました
echo WARN EC2停止タイムアウト >> "%LOG_FILE%"
echo.
echo 最終状態:
echo %EC2_NAME_1%: !CURRENT_STATUS_1!
echo %EC2_NAME_2%: !CURRENT_STATUS_2!
echo.
:EC2_COMPLETE
:SKIP_EC2
REM ========================================
REM ステップ3: RDS停止
REM ========================================
echo.
echo ================================================================
echo [ステップ 3/3] RDSインスタンスの停止
echo ================================================================
echo.
echo [ステップ 3/3] RDSインスタンスの停止 >> "%LOG_FILE%"
echo [1/2] RDS状態を確認中...
aws rds describe-db-instances --db-instance-identifier %RDS_INSTANCE_ID% --region %AWS_REGION% --query "DBInstances[0].DBInstanceStatus" --output text > temp_rds.txt 2>&1
set /p RDS_STATUS=<temp_rds.txt
del temp_rds.txt 2>nul
echo 現在の状態: %RDS_STATUS%
echo RDS状態: %RDS_STATUS% >> "%LOG_FILE%"
echo.
if "%RDS_STATUS%"=="stopped" (
echo OK RDSは既に停止しています
echo OK RDS既に停止済み >> "%LOG_FILE%"
goto RDS_COMPLETE
)
if "%RDS_STATUS%"=="available" (
echo [2/2] RDS停止コマンドを実行中...
aws rds stop-db-instance --db-instance-identifier %RDS_INSTANCE_ID% --region %AWS_REGION% > temp_rds_stop.txt 2>&1
set "RDS_STOP_RESULT=%errorlevel%"
if !RDS_STOP_RESULT! neq 0 (
echo ERROR RDS停止コマンドが失敗しました
echo ERROR RDS停止コマンド失敗 >> "%LOG_FILE%"
type temp_rds_stop.txt >> "%LOG_FILE%"
del temp_rds_stop.txt 2>nul
goto RDS_COMPLETE
) else (
echo OK RDS停止コマンドを実行しました
echo OK RDS停止コマンド実行完了 >> "%LOG_FILE%"
del temp_rds_stop.txt 2>nul
)
echo.
) else if "%RDS_STATUS%"=="stopping" (
echo [2/2] RDSは既に停止処理中です
echo RDS既に停止処理中 >> "%LOG_FILE%"
echo.
) else (
echo WARN RDSの状態が停止可能ではありません: %RDS_STATUS%
echo WARN RDS停止不可: %RDS_STATUS% >> "%LOG_FILE%"
goto RDS_COMPLETE
)
:RDS_COMPLETE
REM ========================================
REM 完了
REM ========================================
echo.
echo ================================================================
echo 停止コマンドの実行が完了しました
echo ================================================================
echo.
echo ========================================== >> "%LOG_FILE%"
echo 最終状態確認 >> "%LOG_FILE%"
echo ========================================== >> "%LOG_FILE%"
echo 最終状態確認:
echo.
REM EC2最終状態
aws ec2 describe-instances --instance-ids %EC2_INSTANCE_1% --region %AWS_REGION% --query "Reservations[0].Instances[0].State.Name" --output text > temp_final_1.txt 2>nul
set /p FINAL_EC2_1=<temp_final_1.txt
del temp_final_1.txt 2>nul
echo %EC2_NAME_1%: %FINAL_EC2_1%
echo %EC2_NAME_1%: %FINAL_EC2_1% >> "%LOG_FILE%"
aws ec2 describe-instances --instance-ids %EC2_INSTANCE_2% --region %AWS_REGION% --query "Reservations[0].Instances[0].State.Name" --output text > temp_final_2.txt 2>nul
set /p FINAL_EC2_2=<temp_final_2.txt
del temp_final_2.txt 2>nul
echo %EC2_NAME_2%: %FINAL_EC2_2%
echo %EC2_NAME_2%: %FINAL_EC2_2% >> "%LOG_FILE%"
REM RDS最終状態
aws rds describe-db-instances --db-instance-identifier %RDS_INSTANCE_ID% --region %AWS_REGION% --query "DBInstances[0].DBInstanceStatus" --output text > temp_final_rds.txt 2>nul
set /p FINAL_RDS=<temp_final_rds.txt
del temp_final_rds.txt 2>nul
echo RDS %RDS_INSTANCE_ID%: %FINAL_RDS%
echo RDS %RDS_INSTANCE_ID%: %FINAL_RDS% >> "%LOG_FILE%"
echo.
echo 実行完了時刻: %date% %time%
echo ログファイル: %LOG_FILE%
echo.
echo 実行完了時刻: %date% %time% >> "%LOG_FILE%"
REM 一時ファイルのクリーンアップ
del temp_*.txt 2>nul
echo.
echo ウィンドウを閉じるには何かキーを押してください...
pause >nul
exit /b 0