EC2へのElastic IP(固定IP)の割り当てとDDNS

# [自分用メモ] EC2へのElastic IP(固定IP)の割り当てとDDNS
+ 本ページはEC2への固定IP割り振りを忘れないように作成した自分用のメモです。
+ EC2インスタンスは作成済みで、IPv4パブリックIPが割り振られた状態から説明を開始します。
+ Qiitaの書き方の勉強も兼ねてます。
+ 一部、ID等を記載したままの部分がありますが、この環境は削除済みです。


__～目次～__
[__1, IPv4パブリックIPの確認 >>> 開放 >>> 再割当__](#1-ipv4パブリックipの確認--開放--再割当)
[1-1, IPv4パブリックIPの確認](#1-1-ipv4パブリックipの確認)
[1-2, IPv4パブリックIPの開放 (EC2インスタンスの停止)](#1-2-ipv4パブリックipの開放-ec2インスタンスの停止)
[1-3, IPv4パブリックIPの再割当 (EC2インスタンスの起動)](#1-3-ipv4パブリックipの再割当-ec2インスタンスの起動)
[__2, Elastic IP(固定IP)の割り当て__](#2-elastic-ip固定ipの割り当て)
[2-1, Elastic IP(固定IP)の作成](#2-1-elastic-ip固定ipの作成)
[2-2, Elastic IP(固定IP)をインスタンスへ割り当てる](#2-2-elastic-ip固定ipをインスタンスへ割り当てる)
[__3, Elastic IPの確認 >>> EC2の停止 >>> 変わらないことの確認__](#3-elastic-ipの確認--ec2の停止--変わらないことの確認)
[3-1, Elastic IPおよびIPv4パブリックIPの確認](#3-1-elastic-ipおよびipv4パブリックipの確認)
[3-2, EC2インスタンスの停止とIPの確認](#3-2-ec2インスタンスの停止とipの確認)
[3-3, EC2インスタンスの起動とIPの確認](#3-3-ec2インスタンスの起動とipの確認)
[__4, DDNS(DynamicDNS, 動的DNS)__](#4-ddnsdynamicdns-動的dns)
[4-1, DDNSサーバ(no-ip)へ登録する](#4-1-ddnsサーバno-ipへ登録する)
[4-2, AWS Amazon Linux AMIでの設定](#4-2-aws-amazon-linux-amiでの設定)
[4-3, DDNSの動作状態確認](#4-3-ddnsの動作状態確認)
[4-4, EC2インスタンスの停止 >>> 起動 >>> 確認](#4-4-ec2インスタンスの停止--起動--確認)
[4-5, おまけ](#4-5-おまけ)

---
## 1, IPv4パブリックIPの確認 >>> 開放 >>> 再割当
+ IPv4パブリックIPは、再起動や停止の度に変わるもの。と思ってたら違いました。 
再起動の場合は基本的に、IPv4パブリックIPは変更されません。再起動時にインスタンスは同じ物理ホスト上で保持されるためデータも保持されるとのことです。ということは、物理の移動が発生するような再起動では変わるということですね。
<https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instance-reboot.html>

+ EC2インスタンスのパブリックIP変更について、AWSの方が回答しているものを見つけたのでリンクを貼ります。
<https://forums.aws.amazon.com/thread.jspa?messageID=235216>

<br>
### 1-1, IPv4パブリックIPの確認
+ EC2ダッシュボード >>> 左のリストから「インスタンス」を選択

+ 赤枠部分のIPv4パブリックIPが割り当てられていることを確認
  - IPv4パブリックIP  =  10.179.51.123

|![01_before.png](https://qiita-image-store.s3.amazonaws.com/0/238650/15dec012-a15e-9763-95e9-56ff097af01c.png)|
|:-:|

<br>
### 1-2, IPv4パブリックIPの開放 (EC2インスタンスの停止)
+ 対象のインスタンスを右クリック >>> インスタンスの状態 >>> 停止

+ インスタンスの停止を確認されるので「停止する」をクリック

+ 数分待つ >>> インスタンスの状態が「stopped」になり、IPv4パブリックIPが消えたこと確認

|![02_stop_no-publicIP.png](https://qiita-image-store.s3.amazonaws.com/0/238650/e8f66b0c-b407-204e-cace-60077af83530.png)|
|:-:|

<br>
### 1-3, IPv4パブリックIPの再割当 (EC2インスタンスの起動)
+ 対象のインスタンスを右クリック >>> インスタンスの状態 >>> 開始

+ インスタンスの開始を確認されるので「開始する」をクリック

+ 赤枠部分から__”さっきと違うIPv4パブリックIP”__が割り当てられたことを確認。
  - IPv4パブリックIP  =  10.179.51.123　※ さっき
  - IPv4パブリックIP  =  13.230.28.163　※ 今

|![03_start_publicIP.png](https://qiita-image-store.s3.amazonaws.com/0/238650/9e2ea968-9b84-2f26-8737-34929b811a7b.png)|
|:-:|

<br>
<br>
## 2, Elastic IP(固定IP)の割り当て
個人的に気になることはやはり料金ですね。。。

+ Elastic IPで料金が発生**しない**パターン
  - 1つのEC2インスタンスに、1つのElasticIPを割り当て、そのインスタンスを起動している。
+ Elastic IPで料金が発生**する**パターン
  - 発生しないパターンで書いたインスタンスが停止している。
  - 関連付けしていないで放置しているElastic IP。
  - ２つ目以降のElastic IP。   　　等

※Elastic IP(固定IP)の料金をわかりやすくまとめているサイトがあったのでリンクを貼ります。
[EIPで料金発生するパターンとしないパターン #AWS](https://dev.classmethod.jp/cloud/aws/cost-of-eip/)

<br>
### 2-1, Elastic IP(固定IP)の作成
+ EC2ダッシュボード >>> 左のリストから「Elastic IP」を選択

+ 「新しいアドレスの割り当て」をクリック

|![2-1_create.png](https://qiita-image-store.s3.amazonaws.com/0/238650/352e099d-5902-258b-eb78-3e927a52aa25.png)|
|:-:|

+ 特に何も指定せずに「割り当て」をクリック

|![2-1_create2.png](https://qiita-image-store.s3.amazonaws.com/0/238650/c8f38275-056d-f5c6-d22e-2108fb59518e.png)|
|:-:|

+ Elastic IP(固定IP)が割り当てられますので、確認したら「閉じる」をクリック

|![2-1_create3.png](https://qiita-image-store.s3.amazonaws.com/0/238650/9daf0558-00c1-17a7-cf06-f16993c2a238.png)|
|:-:|

<br>
### 2-2, Elastic IP(固定IP)をインスタンスへ割り当てる
+ Elastic IPのページを確認すると、先ほど作成されたElastic IPが一覧へ表示

|![2-2_1.png](https://qiita-image-store.s3.amazonaws.com/0/238650/d1c86496-4837-cd55-cd6a-c88994992a65.png)|
|:-:|

+ リスト上部から、アクション >>> アドレスの関連付け
  - リソースタイプ　：　インスタンス(デフォルト)
  - インスタンス　　：　Elastic IPを割り当てたいEC2インスタンスを選択
  - プライベートIP　：　※空白のままでOK。自動で上記インスタンスが反映
  - 再関連付け　　　：　レ点無し(デフォルト)

|![2-2_2.png](https://qiita-image-store.s3.amazonaws.com/0/238650/079fb74a-0ea5-3432-6fa5-204ecde580bf.png)|
|:-:|

+ 「関連付け」をクリックし、アドレスの関連付けが成功することを確認して閉じる

|![2-2_3.png](https://qiita-image-store.s3.amazonaws.com/0/238650/06a85e1f-5fb1-9f3a-3661-e335983f0e85.png)|
|:-:|

+ インスタンス列に指定したインスタンスが追加されていることを確認

|![2-2_4.png](https://qiita-image-store.s3.amazonaws.com/0/238650/54bf04cc-5073-3afb-e90f-a59177d2ba01.png)|
|:-:|

<br>
## 3, Elastic IPの確認 >>> EC2の停止 >>> 変わらないことの確認

<br>
### 3-1, Elastic IPおよびIPv4パブリックIPの確認
+ EC2ダッシュボード >>> 左のリストから「インスタンス」を選択

+ 赤枠部分からElastic IPがIPv4パブリックIPへ割り当てられていることを確認
  - Elastic IP & IPv4パブリックIP  =  52.197.210.34

|![3-1.png](https://qiita-image-store.s3.amazonaws.com/0/238650/125f43e4-027a-b6f3-b76d-61a37fdb5846.png)|
|:-:|

<br>
### 3-2, EC2インスタンスの停止とIPの確認
+ 対象のインスタンスを右クリック >>> インスタンスの状態 >>> 停止

+ インスタンスの停止を確認されるので「停止する」をクリック

+ 数分待つ >>> インスタンスの状態が「stopped」になっても、 
Elastic IPおよびIPv4パブリックIPが消えないことを確認

|![3-2.png](https://qiita-image-store.s3.amazonaws.com/0/238650/bddda7f5-5378-3cb0-69a1-c630bc82b520.png)|
|:-:|

<br>
### 3-3, EC2インスタンスの起動とIPの確認
+ 対象のインスタンスを右クリック >>> インスタンスの状態 >>> 開始

+ インスタンスの開始を確認されるので「開始する」をクリック

+ 赤枠部分から__”Elastic IPおよびIPv4パブリックIP”が変わらない__ことを確認
  - Elastic IP & IPv4パブリックIP  =  52.197.210.34　※さっき
  - Elastic IP & IPv4パブリックIP  =  52.197.210.34　※今

|![3-3.png](https://qiita-image-store.s3.amazonaws.com/0/238650/3c8759b7-7365-6575-c51a-f9ae49df3043.png)|
|:-:|

<br>
## 4, DDNS(DynamicDNS, 動的DNS)
Elastic IP(固定IP)を割り当ててる時にふと思いました。
__「AWS で DDNS(DynamicDNS) は使えるのか？」__

EC2インスタンスを作成する際にパブリックDNSというのが割り当てられますが(VPCの設定による)、こちらはDNS名内にパブリックIPが入るため、パブリックIPが変更する度にパブリックDNSも変更されます。
　　例) ec2-203-0-113-25.compute-1.amazonaws.com
これでは停止の度にIPもDNSも変わってしまい使いづらい。。。無料のDDNSサービスを使って、IPの変更を気にせずに運用したい。。。。。
<br>
DDNSをざっくり説明すると、

+ IPアドレスが変動するものへ接続したい場合等に使用する
  - 自宅サーバへアクセスしたいけど固定IPアドレスをもらってない
  - 自宅のペットカメラでペットの様子を見たいけど固定うんぬん
  - Webサーバのくせに変動IPアドレス
+ 接続される側が、IPアドレスが変わる度にDDNSサーバへ伝える
+ DNSへ登録するドメイン名は固定だがIPアドレスは変わる
  - とある日：www.test-aws.co.jp  =  1.2.3.4
  - 別の日　：www.test-aws.co.jp  =  9.8.7.6
+ 無料で使えるサービスもいっぱいある

でもデメリットもあって、

+ IPアドレスの変更を登録し直してから、それがインターネット全体へ反映されるまでに時間がかかる。  
※DDNSサービスによりける。数十分？数時間？
+ IPアドレスの変更タイミングは環境によりけり。

安定した接続は望めないですね。タダで自宅にアクセス出来ればいいや、くらいの感じで使うものだと思ってます。


__■参考にさせていただいたサイトのURL__
[__Linux インスタンスの動的な DNS のセットアップ__](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/dynamic-dns.html)

[__no-ip Knowledge Base / How to Install the Dynamic Update Client on Linux__](https://www.noip.com/support/knowledgebase/installing-the-linux-dynamic-update-client/)

[__長生村本郷Engineers'Blog / no-ipでAWSインスタンスの動的ip更新対応 ~いつも同じドメイン名でアクセスしたい~__](http://kenzo0107.hatenablog.com/entry/2016/02/04/101002)

<br>
### 4-1, DDNSサーバ(no-ip)へ登録する

+ [no-ip](https://www.noip.com/free) へアクセスし「Sign UP Now」をクリック

|![4-2.png](https://qiita-image-store.s3.amazonaws.com/0/238650/e48b6a9c-1610-52a5-194d-6fad694cf8b4.png)|
|:-:|

+ 以下の情報を入力し画面下方の「Free Sign Up」をクリック
  - 登録用のe-mailアドレス  ※後で確認用のメールが届きます
  - パスワード
  - ドメイン名に使うホスト名  ※今回は「awsddns.hopto.org」にしました
  - 広告メール不要の場合は「Email Opt-in」のチェックを外す

|![4-3.png](https://qiita-image-store.s3.amazonaws.com/0/238650/a66a4e08-9d7d-2dba-7270-05051d8fba46.png)|
|:-:|

|![4-5.png](https://qiita-image-store.s3.amazonaws.com/0/238650/bc23c0a3-8bea-b791-7f2f-d29d18725ce8.png)|
|:-:|

+ 登録したメールアドレスへ確認用のメールが届くので「Confirm Account」をクリック

|![4-6.png](https://qiita-image-store.s3.amazonaws.com/0/238650/72bb65fd-04c9-4847-5345-5bb01afcc982.png)|
|:-:|

<br>
### 4-2, AWS Amazon Linux AMIでの設定

> 試験のため、さっき設定したEC2インスタンスのElastic IPを解除します。
> ・EC2ダッシュボード >>> Elastic IP >>> 対象のElastic IPで右クリック >>> アドレスの関連付けの解除
> ・確認が出るので「アドレスの関連付けの解除」をクリック
> ・EC2ダッシュボード >>> インスタンス
> ・Elastic IPが消えたことを確認

ターミナルソフトで対象のEC2インスタンスへアクセスしてコマンド入力します。
僕が使用しているEC2インスタンスのAMIは、
__「Amazon Linux 2 AMI (HVM), SSD Volume Type 64bit」__です。

+ コマンド操作  
※見るサイト、見るサイトでコマンドラインが違ってて混乱しながらやったため一部抜けてます、、、あくまでも参考程度に見てください・・・。

```windows:DDNS(no-ip)登録のコマンド一覧
; Extra Packages for Enterprise Linux (EPEL) リポジトリを有効化
; ※noip2 クライアントにアクセスするため
sudo su
sudo yum-config-manager --enable epel

; noipのサイトからパッケージをダウンロード
cd /usr/local/src
wget http://www.no-ip.com/client/linux/noip-duc-linux.tar.gz
tar xzf noip-duc-linux.tar.gz
cd noip-2.1.9-1
    ; 他のサイトは「cd noip-2.1.9」と記載。cd の前に ls で確認してください。

; noipパッケージのインストール
yum install gcc
    ; 自分はmakeの時に「gcc(コンパイラ)が無い」と言われたため先に入れました
make
make install
    ; noipで登録した「Login email / Password」を聞かれます。

; アクセス権の設定
cp redhat.noip.sh /etc/init.d/noip
chmod 755 /etc/init.d/noip

; noipの起動設定と開始
/sbin/chkconfig noip on
/etc/init.d/noip start

; 起動設定の確認
chkconfig --list noip
```

<br>
### 4-3, DDNSの動作状態確認

+ no-ipのサイトで確認する

[Dynamic DNS](https://my.noip.com/#!/dynamic-dns) このリンクから入って >>> Login >>> 左のリストの「Dynamic DNS![4-3_6.png](https://qiita-image-store.s3.amazonaws.com/0/238650/9e044fcd-4bc5-4e1a-0c0a-d2fec3ee69b1.png)
」

  - IP/TargetにEC2インスタンスのパブリックIPが表示されていること

|![4-3_2.png](https://qiita-image-store.s3.amazonaws.com/0/238650/b4d9f624-81fa-3cbf-36de-e4ebb0f390c5.png)|
|:-:|

+ WindowsPCのnslookupコマンドで正引きを実行する

```Windows:nslookup(正引き)
C:\>nslookup awsddns.hopto.org 8.8.8.8
サーバー:  google-public-dns-a.google.com
Address:  8.8.8.8

権限のない回答:
名前:    awsddns.hopto.org
Address:  18.179.208.41


C:\>
```

+ 逆引きをすると、AWSのパブリックDNSが表示されるようです。

```Windows:nslookup(逆引き)
C:\>nslookup 18.179.208.41 8.8.8.8
サーバー:  google-public-dns-a.google.com
Address:  8.8.8.8

名前:    ec2-18-179-208-41.ap-northeast-1.compute.amazonaws.com
Address:  18.179.208.41


C:\>
```


+ 実際にドメイン名でEC2インスタンスへログインしてみる(TeraTerm使用)

|![4-3_3.png](https://qiita-image-store.s3.amazonaws.com/0/238650/9ae937d9-608d-c657-9b42-844685a6eb9e.png)|
|:-:|

|![4-3_4.png](https://qiita-image-store.s3.amazonaws.com/0/238650/84762fa7-c08f-667e-5503-fd3929daa8ea.png)|
|:-:|

|![4-3_5.png](https://qiita-image-store.s3.amazonaws.com/0/238650/f42922ed-7caf-b2ee-aba2-b80b96ea07de.png)|
|:-:|

接続出来たぁ！！！

<br>
### 4-4, EC2インスタンスの停止 >>> 起動 >>> 確認

+ EC2インスタンスの停止 >>> 起動をして、パブリックIPを変更してみました。
  - 停止前のIPv4パブリックIP  ： 18.179.208.41
  - 起動後のIPv4パブリックIP  ： 18.179.208.65

|![4-3_7.png](https://qiita-image-store.s3.amazonaws.com/0/238650/97bc5a06-1fbf-3846-616b-be4b660986e5.png)|
|:-:|

+ no-ipサイトで変更を確認

|![4-3_6.png](https://qiita-image-store.s3.amazonaws.com/0/238650/8e069630-1a73-401f-36a5-d4addf321d61.png)|
|:-:|

+ WindowsPCのnslookupコマンドで正引きを実行する

```Windows:nslookup(正引き)
C:\>nslookup awsddns.hopto.org 8.8.8.8
サーバー:  google-public-dns-a.google.com
Address:  8.8.8.8

権限のない回答:
名前:    awsddns.hopto.org
Address:  18.179.208.65


C:\>
```

パブリックIPが変更されても問題なくDDNSで反映されているようです。

<br>
### 4-5, おまけ

ログイン確認ついでにTeraTermマクロを作成したので載せてみます。
★のところを変えれば他の環境でも使えます。

```terminal:awsddns_login-macro_20180918.ttl
;; ■概要
;;   AWSの勉強用で、EC2インスタンス(AmazonLinux)へログインするTeraTermマクロです。
;;   ログは以下の場所へ出力されます。
;;     'C:\teraterm\HOSTNAME_YYYYMMDD_HHMMSS.log'
;;
;; ==============================================
;; ★変数やパスの定義(接続先毎にパラメータが変わる)
AWS_DDNS = 'awsddns.hopto.org'   ; IPaddressでも可
HOSTNAME = 'ec2-user'
KEY_FILE = '★自分の秘密鍵ファイル名'
KEY_PATH = '★秘密鍵を置いてるフォルダ'
 
;; ==============================================
;; ■変数やパスの定義(各装置共通)
;; ログ保存先指定
LOG_FILE = 'C:\teraterm'

;; ログファイル名の設定
getdate DATETIME '_%Y%m%d_%H%M%S.log'
FULLPATH = LOG_FILE
strconcat FULLPATH '\'
strconcat FULLPATH HOSTNAME
strconcat FULLPATH DATETIME

;; プロンプトの作成
PP_LINUX = '^\[.+\][$#]'

;; SSH接続コマンド作成(鍵認証)
COMMAND = AWS_DDNS
strconcat COMMAND ':22 /ssh /2 /auth=publickey /user='
strconcat COMMAND HOSTNAME
strconcat COMMAND ' /keyfile='
strconcat COMMAND KEY_PATH
strconcat COMMAND KEY_FILE

;; ==============================================
;; ■マクロの実働～終了
;; ログ保存先のフォルダが無ければ作成。失敗したら終了。
foldersearch LOG_FILE
if result = 0 then
    foldercreate LOG_FILE
    if result <> 0 then
        messagebox 'Folder Error'
        end
    endif
endif


;; SSH接続
connect COMMAND

;; 接続判定(接続が出来たか確認。）
if result <> 2 then
    messagebox 'Connection Error'
    end
endif

;; 接続判定(5秒以内にプロンプトが表示されないと終了)
timeout = 5
wait '$' '#'
if result = 0 then
    disconnect
    end
endif

;; ログの取得開始(ログが取得されているかの確認)
loginfo logfilename
if result <> -1 then
   ;; ログが取得中→ログ停止して再度ログ取得を開始
   logclose
   logopen FULLPATH 0 1
else
   ;; ログが未取得→ログ取得を開始
   logopen FULLPATH 0 1
endif
sendln ''

;; コマンドの実行
waitregex PP_LINUX
pause 1
sendln ''
sendln 'date'

waitregex PP_LINUX
pause 1
sendln ''
sendln 'uname -a'

;; 接続先に接続したままにするため、SSH接続とログはそのまま

;; マクロ終了
end
```



DDNSが思った以上に面倒でグダグダになってしまいましたが、以上です。