クラウドインテグレーションサービス「雲斗」のブログ

芝公園にある創研情報株式会社がAWS を 中心にクラウドの基本から便利な使いかたまでをお伝えしていきます。

Amazon EC2 AWS CLI

AWS CLIを利用してEC2のElasticIPを【もっとお手軽に】節約ぅ!

2018/08/31

先日掲載した記事(AWS CLIを利用してEC2のElasticIPを節約ぅ!)ではAmazon Route53(DNS)を利用してEC2起動時の動的グローバルIPをドメインに割り当てるバッチをご紹介いたしましたが、「自分一人でしか使わないから、DNSとか使わないでもう少しお手軽にできないかなぁ」という方もいらっしゃるかと思い、今回は、さらにお手軽なものをご紹介いたします。

今回の方法は、Route53を利用する必要のないものとなります。諸般の事情でRoute53を操作する権限をもてないIAMユーザの方には朗報です。(笑)

----------

【どんな感じに変わったの?】

動きとしては、以下のとおりとなります。前回の記事からは(3)と(4)が変わってます。

(1)当該EC2サーバを起動。
(2)(1)のサーバに割り当てられたグローバルIP(Public IP)を取得。
(3)(2)のIPを、操作中のWindows端末のhostsファイルに反映。
(4)(3)のhostsファイルに反映したホスト名でサーバに接続する。

実現にあたっては、AWSのコマンドラインインターフェース(=CLI)を利用します。
普段はLinuxのコマンドのほうが慣れているのでシェルスクリプトで作りたかったのですが、営業担当が使っているPCがWindowsということもあるので、一部追加アプリケーションをインストールし、Linuxベースで作ったものを移植する形にしております。

<EC2起動ならびにhosts割り当てバッチの材料>
AWS CLI
jq
sed
④EC2サーバの起動/停止/情報確認が可能な権限を持つIAMアカウント
⑤起動/停止制御するEC2インスタンスのインスタンスID
⑥管理者権限でバッチ実行できるWindows端末のユーザ

<下ごしらえ>
(1)①~③のインストール、セットアップを完了しておきます。
(2)④のアカウント情報をAWS CLIの定義情報として登録しておきます。
(3)hostsファイル(=C:\Windows\System32\drivers\etc\hosts)に以下の1行を追加しておきます。

workip hogehoge

* hogehogeはIPを割り当てるホスト名です。
** workipの部分が動的に割り当てられたIPに変換されます。

<作ったWindows用バッチ>
以下のファイル群をすべて同じフォルダに配備します。
バッチを起動する際は、hostsファイルの書き換えのため、管理者権限で起動します。
※デスクトップにショートカットを作成し、ショートカットの「プロパティ」-「ショートカット」-「詳細設定」で「管理者として実行」にチェックを入れておけば、このショートカットをダブルクリックするだけで起動できます。

[startServer.bat] ※起動バッチ本体となります。

@echo off

rem 対象EC2インスタンスの起動
call startInstance

echo ec2起動処理完了。

rem hosts書き換え
call changeHostsFile

echo hosts設定が完了しました。
echo サーバ環境の準備が完了しました。
echo 「hogehoge」に接続してください。
echo 何かキーを押してください。
pause > NUL
exit

* 「hogehoge」はIPを割り当てるホスト名です。

[startInstance.bat]

@echo off

rem 変数設定
set INSTANCEID=i-xxxxxxxxxxxxxxxxx

rem 対象EC2インスタンスの起動
aws ec2 start-instances --instance-ids %INSTANCEID%
echo サーバ起動中です。しばらくお待ちください。 
rem 対象EC2インスタンスの起動待ち
aws ec2 wait instance-running --instance-ids %INSTANCEID%

* INSTANCEIDに⑤のインスタンスIDをセットします。

[changeHostsFile.bat]

@echo off

rem 変数設定
set INSTANCEID=i-xxxxxxxxxxxxxxxxx
set HNAME=workip
set HOSTSFILE=C:\Windows\System32\drivers\etc\hosts

rem AWS CLIを使って、PublicIPを取得
for /f "usebackq tokens=*" %%i in (`aws ec2 describe-instances --instance-ids %INSTANCEID% ^| jq ".Reservations[0].Instances[0].NetworkInterfaces[0].PrivateIpAddresses[0].Association.PublicIp"`) do set PUBLICIP=%%i

chcp 932
echo 起動したサーバのIPアドレス: %PUBLICIP%

rem hosts.tmpがあれば削除
if EXIST "hosts.tmp" (
del hosts.tmp
)

rem IP変換後のhostsファイル作成
sed -e "s/%HNAME%/%PUBLICIP%/" %HOSTSFILE% > hosts.tmp
copy /Y hosts.tmp %HOSTSFILE%

* INSTANCEIDに⑤のインスタンスIDをセットします。

[stopServer.bat] ※停止バッチ本体となります。

@echo off

rem hosts書き換え
call restoreHostsFile

rem 対象EC2インスタンスの停止
call stopInstance

echo ec2停止処理完了
echo お疲れ様でした。
echo よろしければ何かキーを押してください。
pause > NUL
exit

[restoreHostsFile.bat]

@echo off

rem 変数設定
set INSTANCEID=i-xxxxxxxxxxxxxxxxx
set HNAME=workip
set HOSTSFILE=c:\Windows\System32\drivers\etc\hosts

rem AWS CLIを使って、PublicIPを取得
for /f "usebackq tokens=*" %%i in (`aws ec2 describe-instances --instance-ids %INSTANCEID% ^| jq ".Reservations[0].Instances[0].NetworkInterfaces[0].PrivateIpAddresses[0].Association.PublicIp"`) do set PUBLICIP=%%i

chcp 932 > NUL
rem echo Server IP Address: %PUBLICIP%
echo サーバIPアドレス: %PUBLICIP%

rem hosts.tmpを削除
if EXIST "hosts.tmp" (
del hosts.tmp
)

rem IPリセット後のhostsファイル作成
sed -e "s/%PUBLICIP%/%HNAME%/" %HOSTSFILE% > hosts.tmp
copy /Y hosts.tmp %HOSTSFILE%

[stopInstance.bat]

@echo off

rem 変数設定
set INSTANCEID=i-xxxxxxxxxxxxxxxxx

rem 対象EC2インスタンスの停止
aws ec2 stop-instances --instance-ids %INSTANCEID%

-Amazon EC2, AWS CLI

Bitnami