Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

個人で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 <秘密鍵>

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

mayuki12
メーカーのIT子会社 → Web系企業でインフラエンジニアやっていて、個人ではiOSアプリを作っています。AWS周りの話が多くなりそう。かゆい所に手が届くようなちょっとした記事を書いていく予定。
http://mayuki12.com/
feedforce
『「働く」を豊かにする。』というミッションを掲げ、企業向けネットサービスを開発・提供しています。
https://www.feedforce.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした