たぶん動く...

多分GIS系の人。あくまで個人的見解であり、所属団体を代表するものではありません。

EC2 Auto Scalingとプレイスメントグループを組み合わせる

プレイスメントグループを勉強したところ、Auto Scalingグループの可用性について気になったので勉強しなおしました。
Auto Scalingグループとプレイスメントグループを組み合わせて使用することを考えてみます。

EC2 Auto Scaling について

他のブログでも散々触れられているので、詳細な説明は省きます。ざっくり言うと複数のEC2インスタンスをスケーリング、管理するためのサービスです。

EC2 Auto Scalingの可用性について

EC2 Auto Scalingの回復力 の説明によれば、

Auto Scaling グループを複数のアベイラビリティーゾーンにわたって配置します。

との説明があります。AWSのプレイスメントグループ、Azureの障害ドメインを勉強して、この説明では同一のサーバーラックインスタンスが配置される可能性もあるのでは?と疑問が湧きました。ドキュメント読む限り、Auto Scalingを作成したとき、アベイラビリティゾーン内でのインスタンスの配置については明示されて無いようです。プレイスメントグループを利用するとアベイラビリティゾーン内でのインスタンス配置を明示できて可用性が向上するよね?と考えました。
今回はAuto Scalingにプレイスメントグループを導入してみたいと思います。

プレイスメントグループ作成

パーティションプレイスメントグループを作成します。今回はパーティションの個数を7個で作成しました。

$ aws ec2 describe-placement-groups --group-names tty6335-test-PG
{
    "PlacementGroups": [
        {
            "GroupName": "tty6335-test-PG",
            "State": "available",
            "Strategy": "partition",
            "PartitionCount": 7,
            "GroupId": "pg-0d7611cd2ceff627f",
            "GroupArn": "arn:aws:ec2:ap-northeast-1:XXXXXXXXXXXX:placement-group/tty6335-test-PG"
        }
    ]
}

起動テンプレート作成

今回の実験では、単純にEC2インスタンスを複数起動するだけなので、ここにあるチュートリアル を参考に、起動テンプレートを作成しました。 高度な詳細の中からプレイスメントグループを指定します。

Auto Scaling グループ作成 EC2起動

さきほど作成した起動テンプレートを使用して、Auto Scaling グループを作成します。 今回の構成はざっくり図にすると以下のような感じです。


今回は計8台のインスタンスを起動します。

結果確認

AWSコンソールで確認するのが面倒くさいのでcliで確認します。

$ aws ec2 describe-instances --filters "Name=placement-group-name,Values=tty6335-test-PG" --query "Reservations[].Instances[].{InstanceID: InstanceId, Status: State.Name,PartitionNumber: Placement.PartitionNumber,AZ: Placement.AvailabilityZone}" --output table
--------------------------------------------------------------------------
|                            DescribeInstances                           |
+-----------------+-----------------------+-------------------+----------+
|       AZ        |      InstanceID       |  PartitionNumber  | Status   |
+-----------------+-----------------------+-------------------+----------+
|  ap-northeast-1d|  i-09a4819193cc25b1b  |  1                |  running |
|  ap-northeast-1d|  i-0fb77376b52d47803  |  2                |  running |
|  ap-northeast-1d|  i-076ba04acf7f503aa  |  3                |  running |
|  ap-northeast-1a|  i-0a3da8d42d539680b  |  1                |  running |
|  ap-northeast-1a|  i-0600294354ea00a0b  |  2                |  running |
|  ap-northeast-1a|  i-09c2a157a3a3180be  |  3                |  running |
|  ap-northeast-1c|  i-04b83d3235ea72f22  |  2                |  running |
|  ap-northeast-1c|  i-0ee5bc46965f33a25  |  1                |  running |
+-----------------+-----------------------+-------------------+----------+

あれ?7このパーティションに分かれない?! 一度インスタンスをすべて終了して設定をいろいろ試してみます。
あ、公式の説明に以下のようにありましたね。

パーティションプレイスメントグループは、同じリージョン内の複数のアベイラビリティーゾーンにパーティションを持つことができます。パーティションプレイスメントグループは、アベイラビリティーゾーンごとに最大 7 つのパーティションを持つことができます。パーティションプレイスメントグループで起動できるインスタンス数の制限は、アカウントの制限のみです。

ということは、さっき試したときは3つのアベイラビリティゾーンにそれぞれ3つのインスタンスが各アベイラビリティゾーンで3つのパーティションに分かれたから挙動としては正しいのか。
次はアベイラビリティゾーンを1つに絞り、8個のインスタンスを起動してみます。
図にするとこんな感じです。

$ aws ec2 describe-instances  --filters "Name=instance-state-name,Values=running" --query "Reservations[].Instances[].{InstanceID: InstanceId, Status: State.Name,PartitionNumber: Placement.PartitionNumber,AZ: Placement.AvailabilityZone}" --output table
--------------------------------------------------------------------------
|                            DescribeInstances                           |
+-----------------+-----------------------+-------------------+----------+
|       AZ        |      InstanceID       |  PartitionNumber  | Status   |
+-----------------+-----------------------+-------------------+----------+
|  ap-northeast-1d|  i-0323e1d94cead8e47  |  2                |  running |
|  ap-northeast-1d|  i-09c0c43561fcabb59  |  3                |  running |
|  ap-northeast-1d|  i-0b7881ea61c805ceb  |  4                |  running |
|  ap-northeast-1d|  i-0421ea05e12dec6da  |  5                |  running |
|  ap-northeast-1d|  i-08ef844d88167da54  |  6                |  running |
|  ap-northeast-1d|  i-0cb873420f249e77c  |  7                |  running |
|  ap-northeast-1d|  i-07acdb824677a166b  |  1                |  running |
|  ap-northeast-1d|  i-00baa2f8ac7865241  |  1                |  running |
+-----------------+-----------------------+-------------------+----------+

1つのアベイラビリティゾーン内で7個のパーティションに分散されましたね。

所感

今回、EC2 Auto Scalingグループにプレイスメントグループを導入して、EC2配置の明示的な分散を図りました。書き手の経験から話すと、そんなに配置を分散してどうする?というのが正直な感想です。(すまん、使いどころがわからん)。まぁ、費用面でいえばプレイスメントグループは無料なので導入して損は無いのではないかなと思いました。

参考文献

サーバからリージョンまでをおさらいしてみた | DevelopersIO
Amazon EC2 Auto Scaling のレジリエンス - Amazon EC2 Auto Scaling
起動テンプレートを使用して Auto Scaling グループを作成する - Amazon EC2 Auto Scaling
Amazon EC2 Auto Scaling ⼊⾨編 AWS Black Belt Online Seminar