2&>1

AWSとかGCPとかGolangとかとか

EC2のEIPを動的に取得して接続できるマクロ作った

背景

EC2インスタンスを立ててElasticIPつけてSSHで接続する。

これをよくやるんですけどたまにしか使わないやつだけど消すまでじゃないやつとかシャットダウンするじゃないですか?

そうするとEIPが密かに金取っていくじゃないですか?

だからEIP開放するじゃないですか?

また使うときに違うEIPになるじゃないですか。

EIP書き直すのめんどくせ。

やること

バッチファイルでAWSCLI実行させてEIP取得してteratermマクロで接続する

環境

OS : Windows10

ターミナル ; cmder

SSH Client : TeraTerm

事前準備

1 . AWS CLIをインストール  

docs.aws.amazon.com

2 . IAMでユーザー作成

 既存のでもいいです。「EC2readonly」権限だけあれば良いです。

3 . 2のユーザーでアクセスキーを発行

ソース

EIPを取得するバッチファイル

@echo of
cd /d %~dp0
aws ec2 --profile [アクセスキーファイル] describe-instances --filters "Name=tag:Name,Values=%1" --query "Reservations[*].Instances[*].PublicIpAddress" --output text > ip.txt

バッチはこんな感じで出力されてます

server1     53.xx.xx.xx
server2     10.xx.xx.xx
server3     13.x.x.x

アクセスキーファイルの作り方

aws configure --profile sample
AWS Access Key ID [None]: XXXXXXXXXXXXXXXX 
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXX
Default region name [None]: ap-northeast-1
Default output format [None]: json

TeraTermマクロ

・EIP取得するバッチファイルのパスは適宜変更

・接続するインスタンス名も適宜(インスタンス名はユニークな事

秘密鍵へのパスも適宜変更

; バッチを実行してEIP取得
exec 'cmd /c c:\path\to\bat\get_ec2_ip.bat [接続先インスタンス名] '
; EIP取得までの時間待ち(これないとEIP取得前に接続しようとしてエラー)
;時間は環境によって要調整
pause 2

fileopen FH 'ip.txt' 0 0
filereadln FH HOST_ADDR
fileclose FH

; ユーザ名/秘密鍵を設定
USER_NAME = 'ec2-user'
getenv 'HOME' KEY_FILE
strconcat KEY_FILE 'C:\path\to\key.pem'

strconcat COMMAND ':22 /ssh /2 /auth=publickey /user=' 
strconcat COMMAND USER_NAME 
strconcat COMMAND ' /keyfile="' 

strconcat COMMAND KEY_FILE


; サーバへ接続 
connect COMMAND


end

これでTeraTermマクロ実行するとバッチが実行してEIP取得してそのIPに接続されます。

インスタンスごとにTeraTermマクロを用意します。

ハマったこと

Cmderで作業しててこっちからはバッチを正常に実行できるけどバッチをダブルクリックで実行するとエラーになる状況でした。

原因はバッチ直で実行する場合にアクセスキーが設定されてませんでした。

Cmderではaws configureから設定してたんですけど。。 bash環境との違いですかね。。。

そんなわけで--profileで指定するようにしました。

ソースはココ

GitHub - piyoji333/ssh-teraterm

以上