ShellScript
AWS
EC2
aws-cli

AWS EC2の起動時にpublicDNSを取得する

個人でAWSのEC2を利用する時は、お金の節約のために使わない時は都度インスタンスを停止するかと思います。EC2にWebサーバを立てて接続する時にはPublic DNSにアクセスするかと思いますが、再起動をする度に変わるので変更をするのは面倒くさいですよね。

Elastic IPアドレスをつければ良いと思いきや、インスタンスに紐づいてなければ地味に課金されていきます。意外と高くつきます。


Elastic IP アドレスを効率的に使用するため、Elastic IP アドレスが実行中のインスタンスに関連付けられていない場合や、停止しているインスタンスやアタッチされていないネットワークインターフェイスに関連付けられている場合は、時間毎に小額の料金が請求されます。


という事で、AWS CLIを利用してインスタンス起動時にpublic IPを取得するスクリプトを利用するようにしました。


処理の流れ

スクリプトの概要は下記の流れです。

前提: EC2のインスタンスIDは元々知っている事


  1. EC2インスタンスを起動する

  2. runnning状態になるまで待つ

  3. インスタンスのPublic DNSを取得する

  4. 環境変数を更新する

  5. ステータスチェックを終わるまで待つ


利用手順

事前にinstance_idを環境変数にsetするための .envファイルを作成する


.env

export instance_id=<instance_id>

export public_ip=<ひとまず空欄で良い>

環境変数を読み込む

source .env

下記のec2-start.shスクリプトを作成して実行する。


ec2-start.sh

echo "---instance start---"

aws ec2 start-instances --instance-ids $instance_id
aws ec2 wait instance-running --instance-ids $instance_id
echo "---instance running---"

# public DNSの取得
export public_ip=$(aws ec2 describe-instances --instance-ids $instance_id --query "Reservations[].Instances[].PublicDnsName| [0]"|sed "s/\"//g")
echo "public_ip="$public_ip

# public_ipの更新
sed -i -e "/public_ip/d" .env #過去のpublic_ipを削除している
echo "export public_ip="$public_ip >> .env #public_ipを更新している

# インスタンスのstatusがokになるのを待つ
aws ec2 wait instance-status-ok --instance-ids $instance_id
echo "---instance status ok---"


実行結果の例

mayu$ ./script/ec2-start.sh

---instance start---
{
"StartingInstances": [
{
"CurrentState": {
"Code": 0,
"Name": "pending"
},
"InstanceId": "i-013cfe9040886878c",
"PreviousState": {
"Code": 80,
"Name": "stopped"
}
}
]
}
---instance running---
public_ip=ec2-13-114-36-228.ap-northeast-1.compute.amazonaws.com
---instance status ok---


.env

export instance_id="i-013cfe9040886878c"

export public_ip=ec2-13-114-36-228.ap-northeast-1.compute.amazonaws.com

環境変数 public_ipにインスタンスのpublic DNSが取れるようになりました。

単純に処理だけのメモにしたかったのでエラーハンドリングは何もしてないので、適宜改良してください。

ついでに私はsshをするのに楽したいので下記設定をしています


~/.ssh/config

#EC2 instance

Host <ホスト名>
User ec2-user
HostName $public_ip
IdentityFile <秘密鍵>

もっとスマートな方法があれば知りたい。