Amazon RedshiftとEIPの関連性について

2014.11.15

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Amazon Redshiftでは、クラスタに対してEIPを割り振る事ができます。割と初歩的な内容ではあるため見落としがちな部分ではありますが、当然の事ながらEIPを割り当てている場合とそうでない場合では挙動が異なって来ますので、当エントリではその違いについて実際に試して見ながら見て行きたいと思います。

目次

EIPを割り当てないケース

クラスタ作成の過程では、以下の様にPublic IPを選ぶかどうか聞かれます。まずは指定しない状態でクラスタを作成してみましょう。[Choose a Public IP Address]は『No』のまま、またPublic Accessible属性もデフォルト値の『Yes』のままです。また、ちなみに作成したクラスタのスペックはdw2.large 3ノードとなります。

redshift-eip-01

クラスタが起動しました。管理コンソールには以下の様にIPアドレスが割り振られています。

redshift-eip-02

以下はAWS CLIで確認した場合の内容です。

$ aws redshift describe-clusters \
 --cluster-identifier cm-test-no-eip \
 | jq '.Clusters[0].ClusterNodes'
[
  {
    "PublicIPAddress": "54.86.55.93",
    "PrivateIPAddress": "10.0.0.99",
    "NodeRole": "LEADER"
  },
  {
    "PublicIPAddress": "54.172.95.57",
    "PrivateIPAddress": "10.0.0.124",
    "NodeRole": "COMPUTE-0"
  },
  {
    "PublicIPAddress": "54.172.201.147",
    "PrivateIPAddress": "10.0.0.175",
    "NodeRole": "COMPUTE-1"
  },
  {
    "PublicIPAddress": "54.172.249.117",
    "PrivateIPAddress": "10.0.0.89",
    "NodeRole": "COMPUTE-2"
  }
]

クラスタの属性値変更

まずは問題無さそうな『クラスタ属性値の変更』から。AWS CLIコマンドで『マイナーバージョンのアップグレードを行わない』『自動スナップショットの期間を14日間』『メンテナンスウインドウの時刻を水曜日07:30 - 08:00』にそれぞれ変更した後、改めて内容を確認してみました。値は変わっていません。

$ aws redshift modify-cluster \
> --cluster-identifier cm-test-no-eip \
> --no-allow-version-upgrade \
> --automated-snapshot-retention-period 14 \
> --preferred-maintenance-window wed:07:30-wed:08:00

$ aws redshift describe-clusters \
--cluster-identifier cm-test-no-eip \
| jq '.Clusters[0].ClusterNodes'
[
  {
    "PublicIPAddress": "54.86.55.93",
    "PrivateIPAddress": "10.0.0.99",
    "NodeRole": "LEADER"
  },
  {
    "PublicIPAddress": "54.172.95.57",
    "PrivateIPAddress": "10.0.0.124",
    "NodeRole": "COMPUTE-0"
  },
  {
    "PublicIPAddress": "54.172.201.147",
    "PrivateIPAddress": "10.0.0.175",
    "NodeRole": "COMPUTE-1"
  },
  {
    "PublicIPAddress": "54.172.249.117",
    "PrivateIPAddress": "10.0.0.89",
    "NodeRole": "COMPUTE-2"
  }
]

クラスタのリブート

次いでクラスタのリブート(再起動)です。これも平気そう。

$ aws redshift reboot-cluster --cluster-identifier cm-test-no-eip
$ aws redshift describe-clusters \
--cluster-identifier cm-test-no-eip \
| jq '.Clusters[0].ClusterNodes'
[
  {
    "PublicIPAddress": "54.86.55.93",
    "PrivateIPAddress": "10.0.0.99",
    "NodeRole": "LEADER"
  },
  {
    "PublicIPAddress": "54.172.95.57",
    "PrivateIPAddress": "10.0.0.124",
    "NodeRole": "COMPUTE-0"
  },
  {
    "PublicIPAddress": "54.172.201.147",
    "PrivateIPAddress": "10.0.0.175",
    "NodeRole": "COMPUTE-1"
  },
  {
    "PublicIPAddress": "54.172.249.117",
    "PrivateIPAddress": "10.0.0.89",
    "NodeRole": "COMPUTE-2"
  }
]

クラスタのリサイズ

クラスタのリサイズはどうでしょうか。AWS CLIでリサイズ処理を行うには『クラスタタイプ』『ノードタイプ』『ノード数』をそれぞれ指定する必要があります。

$ aws redshift modify-cluster \
--cluster-identifier cm-test-no-eip \
--cluster-type multi-node \
--node-type dw2.large \
--number-of-nodes 4

リサイズ処理完了を以って、クラスタの内容を確認してみましょう。こちらは以下ドキュメント『概要』の項にも記載があるように、既存のクラスタの内容をコピーするという手順を踏んでいる為、IPアドレスが変わってしまうのは確かにやむ無し、ではありますね。

$ aws redshift describe-clusters \
--cluster-identifier cm-test-no-eip \
| jq '.Clusters[0].ClusterNodes'
[
  {
    "PublicIPAddress": "54.86.193.100",
    "PrivateIPAddress": "10.0.0.99",
    "NodeRole": "LEADER"
  },
  {
    "PublicIPAddress": "54.164.163.223",
    "PrivateIPAddress": "10.0.0.124",
    "NodeRole": "COMPUTE-0"
  },
  {
    "PublicIPAddress": "54.173.183.105",
    "PrivateIPAddress": "10.0.0.175",
    "NodeRole": "COMPUTE-1"
  },
  {
    "PublicIPAddress": "54.172.41.149",
    "PrivateIPAddress": "10.0.0.89",
    "NodeRole": "COMPUTE-2"
  },
  {
    "PublicIPAddress": "54.173.99.71",
    "PrivateIPAddress": "10.0.0.220",
    "NodeRole": "COMPUTE-3"
  }
]

EIPを割り当てるケース

次は、クラスタ作成時にEIPを割り当てた状態で作成します。

redshift-eip-11

こちらが作成時のクラスタに割り振られているIPの状態です。

redshift-eip-12

$ aws redshift describe-clusters \
--cluster-identifier cm-test-use-eip \
| jq '.Clusters[0].ClusterNodes'
[
  {
    "PublicIPAddress": "54.172.249.133",
    "PrivateIPAddress": "10.0.0.128",
    "NodeRole": "LEADER"
  },
  {
    "PublicIPAddress": "54.174.10.100",
    "PrivateIPAddress": "10.0.0.4",
    "NodeRole": "COMPUTE-0"
  },
  {
    "PublicIPAddress": "54.172.251.46",
    "PrivateIPAddress": "10.0.0.170",
    "NodeRole": "COMPUTE-1"
  },
  {
    "PublicIPAddress": "54.165.90.92",
    "PrivateIPAddress": "10.0.0.129",
    "NodeRole": "COMPUTE-2"
  }
]

クラスタのリサイズ

EIP無しの時と同様にノード数を増やしてみます。

$ aws redshift modify-cluster \
--cluster-identifier cm-test-use-eip \
--cluster-type multi-node \
--node-type dw2.large \
--number-of-nodes 4

改めて確認してみると、Public/PrivateIPアドレスの内容は変わってしまっていますが...

$ aws redshift describe-clusters \
--cluster-identifier cm-test-use-eip \
| jq '.Clusters[0].ClusterNodes'
[
  {
    "PublicIPAddress": "54.172.200.78",
    "PrivateIPAddress": "10.0.0.128",
    "NodeRole": "LEADER"
  },
  {
    "PublicIPAddress": "54.173.80.50",
    "PrivateIPAddress": "10.0.0.4",
    "NodeRole": "COMPUTE-0"
  },
  {
    "PublicIPAddress": "54.88.75.147",
    "PrivateIPAddress": "10.0.0.170",
    "NodeRole": "COMPUTE-1"
  },
  {
    "PublicIPAddress": "54.173.251.251",
    "PrivateIPAddress": "10.0.0.129",
    "NodeRole": "COMPUTE-2"
  },
  {
    "PublicIPAddress": "54.173.155.90",
    "PrivateIPAddress": "10.0.0.132",
    "NodeRole": "COMPUTE-3"
  }
]

クラスタ情報にElasticIpStatusという情報が増え、設定したEIPを保持している事を確認出来ました!

$ aws redshift describe-clusters \
--cluster-identifier cm-test-use-eip \
| jq '.Clusters[0].ElasticIpStatus'
{
  "ElasticIp": "54.165.182.220",
  "Status": "active"
}

クラスタのリストア

次はリストアです。その前にスナップショットを取得します。

$ aws redshift create-cluster-snapshot \
--snapshot-identifier cm-test-snapthot01 \
--cluster-identifier cm-test-use-eip
{
    "Snapshot": {
        "EstimatedSecondsToCompletion": -1, 
        "OwnerAccount": "XXXXXXXXXXXX", 
        "CurrentBackupRateInMegaBytesPerSecond": 0.0, 
        "ActualIncrementalBackupSizeInMegaBytes": -1.0, 
        "NumberOfNodes": 4, 
        "Status": "creating", 
        "VpcId": "vpc-XXXXXXXXX", 
        "ClusterVersion": "1.0", 
        "MasterUsername": "root", 
        "TotalBackupSizeInMegaBytes": -1.0, 
        "DBName": "testdb", 
        "BackupProgressInMegaBytes": 0.0, 
        "ClusterCreateTime": "2014-11-14T16:55:28.972Z", 
        "EncryptedWithHSM": false, 
        "ClusterIdentifier": "cm-test-use-eip", 
        "SnapshotCreateTime": "2014-11-14T17:51:15.575Z", 
        "AvailabilityZone": "us-east-1a", 
        "NodeType": "dw2.large", 
        "Encrypted": false, 
        "ElapsedTimeInSeconds": 0, 
        "SnapshotType": "manual", 
        "Port": 5439, 
        "SnapshotIdentifier": "cm-test-snapthot01"
    }
}

そしてクラスタを削除。スナップショットは上記手順で取得しているので削除時はスナップショットを取らない設定としました。

$ aws redshift delete-cluster \
--cluster-identifier cm-test-use-eip \
--skip-final-cluster-snapshot

削除後、管理コンソールでEC2メニューを選択し、EIPの状況を確認。先程使ったEIPが削除されずに残っている事を確認出来ました。

redshift-eip-13

AWS CLIでリストアを実行します。オプション指定--elastic-ipでEIPを指定する事で所定のEIPでの起動が可能となっています。

$ aws redshift restore-from-cluster-snapshot \
--snapshot-identifier cm-test-snapthot01 \
--cluster-identifier cm-test-use-eip \
--elastic-ip 54.165.182.220
{
    "Cluster": {
        "ClusterVersion": "1.0", 
        "NumberOfNodes": 4, 
        "VpcId": "vpc-29fc144c", 
        "NodeType": "dw2.large", 
        "PubliclyAccessible": true, 
        "MasterUsername": "root", 
        "ClusterParameterGroups": [
            {
                "ParameterGroupName": "default.redshift-1.0", 
                "ParameterApplyStatus": "in-sync"
            }
        ], 
        "Encrypted": false, 
        "ClusterSecurityGroups": [], 
        "AllowVersionUpgrade": true, 
        "VpcSecurityGroups": [], 
        "ElasticIpStatus": {
            "Status": "active", 
            "ElasticIp": "54.165.182.220"
        }, 
        "ClusterSubnetGroupName": "default", 
        "AutomatedSnapshotRetentionPeriod": 1, 
        "ClusterStatus": "creating", 
        "ClusterIdentifier": "cm-test-use-eip", 
        "DBName": "testdb", 
        "PreferredMaintenanceWindow": "sun:03:00-sun:03:30", 
        "PendingModifiedValues": {}
    }
}

起動完了後、クラスタのEIPを確認してみます。指定のEIPが設定されていますね。

$ aws redshift describe-clusters \
--cluster-identifier cm-test-use-eip \
| jq '.Clusters[0].ElasticIpStatus'
{
  "ElasticIp": "54.165.182.220",
  "Status": "active"
}

参考:クラスタ新規作成時

ちなみにクラスタ作成時にもEIPの指定は可能です。リストア時同様、オプション--elastic-ipを指定する事で指定のEIPによる起動する事が出来ます。

$ aws redshift create-cluster help

       managing clusters, go to Amazon Redshift Clusters in  the  Amazon  Red-
       shift Management Guide .

SYNOPSIS
            create-cluster
          [--db-name <value>]
          --cluster-identifier <value>
          [--cluster-type <value>]
          --node-type <value>
          --master-username <value>
          --master-user-password <value>
          [--cluster-security-groups <value>]
          [--vpc-security-group-ids <value>]
          [--cluster-subnet-group-name <value>]
          [--availability-zone <value>]
          [--preferred-maintenance-window <value>]
          [--cluster-parameter-group-name <value>]
          [--automated-snapshot-retention-period <value>]
          [--port <value>]
          [--cluster-version <value>]
          [--allow-version-upgrade | --no-allow-version-upgrade]
          [--number-of-nodes <value>]
          [--publicly-accessible | --no-publicly-accessible]
          [--encrypted | --no-encrypted]
          [--hsm-client-certificate-identifier <value>]
          [--hsm-configuration-identifier <value>]
          [--elastic-ip <value>]
          [--cli-input-json <value>]
          [--generate-cli-skeleton]

まとめ

以上、RedshiftにおけるEIPの設定内容とその利用方法についての紹介でした。EIPを割り当てておく事で、諸動作におけるIPアドレス情報が変わってしまう事は無くなるので、特に問題無ければEIPをAmazon Redshiftに割り当てて運用していく方が無難ですね。こちらからは以上です。