1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

EC2やRDSをWindows バッチファイル(.bat)形式で起動や停止する

Posted at

前置き

ボタン一つで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
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?