[JAWS-UG CLI] EC2 #11  Elastic IPの付与

前提条件
========


EC2への権限
-----------

EC2に対してフル権限があること。


AWS CLIのバージョン
-------------------

以下のバージョンで動作確認済

- AWS CLI 1.11.24

```bash:コマンド:
aws --version
```

結果(例):

      aws-cli/1.11.19 Python/2.7.10 Darwin/15.6.0 botocore/1.4.76

バージョンが古い場合は最新版に更新しましょう。

```bash:コマンド:
sudo -H pip install -U awscli
```


0. 準備
=======


0.1. リージョンの決定
---------------------

```bash:変数の設定:
export AWS_DEFAULT_REGION='ap-northeast-1'
```


0.2. 変数の確認
---------------

プロファイルが想定のものになっていることを確認します。

```bash:変数の確認:
aws configure list
```

結果(例):

            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile       ec2as_full-prjZ-mbp13        env    AWS_DEFAULT_PROFILE
      access_key     ****************XXXX shared-credentials-file
      secret_key     ****************XXXX shared-credentials-file
          region        ap-northeast-1        env    AWS_DEFAULT_REGION


0.3. インスタンスIDの指定
-------------------------

既存のインスタンスに割り当てられているIPアドレスを確認します。

ここでは、10.192.0.8を割り当てられているインスタンスを選択します。

```bash:変数の設定:
EC2_PRIVATE_ADDR='10.192.0.8'
```

インスタンスIDを取得します。

```bash:コマンド:
EC2_INSTANCE_ID=$( \
        aws ec2 describe-instances \
          --filters Name=private-ip-address,Values=${EC2_PRIVATE_ADDR} \
          --query 'Reservations[].Instances[].InstanceId' \
          --output text \
) \
        && echo ${EC2_INSTANCE_ID}
```

結果(例):

      i-xxxxxxxxxxxxxxxxx


1. 事前作業
===========


1.1. EIPの確認
--------------

```bash:コマンド:
aws ec2 describe-addresses 
```

結果(例):

      {
        "Addresses": []
      }


1.2. アサインするネットワークインタフェースの指定
-------------------------------------------------

```bash:変数の設定:
EC2_INSTANCE_NETIF_ID=$( \
        aws ec2 describe-instances \
          --instance-ids $EC2_INSTANCE_ID \
          --query "Reservations[].Instances[].NetworkInterfaces[?PrivateIpAddress == \`${EC2_PRIVATE_ADDR}\`].NetworkInterfaceId" \
          --output text \
) \
        && echo ${EC2_INSTANCE_NETIF_ID}
```


結果(例):

      eni-xxxxxxxx


2. EIPの取得
============


2.1. EIPの取得
--------------

```bash:コマンド:
aws ec2 allocate-address 
```

結果(例):

      {
        "PublicIp": "xxx.xxx.xxx.xxx",
        "Domain": "vpc",
        "AllocationId": "eipalloc-xxxxxxxx"
      }


2.2. パブリックIPアドレスの確認
-------------------------------

```bash:コマンド:
aws ec2 describe-addresses \
        --query 'Addresses[].PublicIp'
```

結果(例):

      [
        "xxx.xxx.xxx.xxx"
      ]

```bash:変数の設定:
VPC_EIP_ADDR='<利用するEIPのIPアドレス>'
```

```bash:変数の設定:
VPC_EIP_ALLOC_ID=$( \
        aws ec2 describe-addresses \
          --query "Addresses[?PublicIp == \`${VPC_EIP_ADDR}\`].AllocationId" \
          --output text \
) \
        && echo ${VPC_EIP_ALLOC_ID}
```

結果(例):

      eipalloc-xxxxxxxx


3. EIPのアサイン
================

```bash:変数の確認:
cat << ETX

        VPC_EIP_ALLOC_ID:      ${VPC_EIP_ALLOC_ID}
        EC2_INSTANCE_NETIF_ID: ${EC2_INSTANCE_NETIF_ID}

ETX
```

```bash:コマンド:
aws ec2 associate-address \
        --allocation-id ${VPC_EIP_ALLOC_ID} \
        --network-interface-id ${EC2_INSTANCE_NETIF_ID}
```

結果(例):

      {
        "AssociationId": "eipassoc-xxxxxxxx"
      }


4. 事後確認
===========


パブリックIPアドレスの取得
--------------------------

```bash:コマンド:
EC2_PUBLIC_IP=$( \
        aws ec2 describe-instances \
          --instance-id ${EC2_INSTANCE_ID} \
          --query "Reservations[].Instances[].PublicIpAddress" \
          --output text \
) \
        && echo ${EC2_PUBLIC_IP}
```

結果(例):

      xxx.xxx.xxx.xxx

パブリックIPアドレスとEIPが同じアドレスになっているはずです。

```bash:変数の確認:
cat << ETX

        EC2_PUBLIC_IP: ${EC2_PUBLIC_IP}
        VPC_EIP_ADDR:  ${VPC_EIP_ADDR}

ETX
```


完了
====